Skip to content
Snippets Groups Projects
Debugger.svelte 2.74 KiB
Newer Older
Jonas Zohren's avatar
Jonas Zohren committed
<script lang="ts">
Jonas Zohren's avatar
Jonas Zohren committed
  import {
    gameFactsStore,
    addGameFactToFactArray,
    toggleFactInFactArray,
  } from "./gameFacts";
  import type { Dialog, DialogMap, DialogSet } from "./types";
  import { findDialogSetProblems } from "./utils";

Jonas Zohren's avatar
Jonas Zohren committed
  export let currentDialog: Dialog;
  export let dialogSet: DialogSet;
Jonas Zohren's avatar
Jonas Zohren committed
  $: dialogNames = Object.keys(dialogSet.dialogs);
  export let selectedDialogName: string;
Jonas Zohren's avatar
Jonas Zohren committed

  /**
   * Collect all facts referenced in these dialogs
   */
Jonas Zohren's avatar
Jonas Zohren committed
  function getDialogFacts(dialogMap: DialogMap): String[] {
    const dialogs: Dialog[] = [];
Jonas Zohren's avatar
Jonas Zohren committed
    for (const dmKey of Object.keys(dialogMap)) dialogs.push(dialogMap[dmKey]);
    const allFacts = dialogs
      .map((dialog) => [
        ...(dialog.addFacts || []),
        ...(dialog.removeFacts || []),
        ...dialog.options.map((opt) => opt.requiredFacts).flat(),
        ...dialog.options.map((opt) => opt.forbiddenFacts).flat(),
      ])
      .flat();
    // Deduplicate entries
    const factsSet = new Set(allFacts);
    return [...factsSet].filter((e) => e !== undefined);
Jonas Zohren's avatar
Jonas Zohren committed
  }

Jonas Zohren's avatar
Jonas Zohren committed
  let seenFactIds = new Set<String>([
    ...$gameFactsStore,
    ...getDialogFacts(dialogSet.dialogs),
  ]);
  $: seenFactIdsArray = Array.from(seenFactIds);
Jonas Zohren's avatar
Jonas Zohren committed
  let addFactInputValue: string;
</script>

<div>
Jonas Zohren's avatar
Jonas Zohren committed
  <h3>Dialog-Debugger</h3>
  Jump to dialog:
  <!-- svelte-ignore a11y-no-onchange -->
  <select
    bind:value={selectedDialogName}
    on:change={() => (currentDialog = dialogSet.dialogs[selectedDialogName])}
  >
    {#each dialogNames as dialogName}
      <option value={dialogName} selected={dialogName === selectedDialogName}>
        {dialogName}
      </option>
    {/each}
  </select>
  <br />
  <ol>
    {#each findDialogSetProblems(dialogSet) as { sourceDialog, text }}
      <li>
        {sourceDialog}: <code style="color: orange">{text}</code>
      </li>
Jonas Zohren's avatar
Jonas Zohren committed
  </ol>
Jonas Zohren's avatar
Jonas Zohren committed

Jonas Zohren's avatar
Jonas Zohren committed
  <hr />
Jonas Zohren's avatar
Jonas Zohren committed

Jonas Zohren's avatar
Jonas Zohren committed
  <h3>Quest-Debugger</h3>
  <b>GameFacts:</b>
  <ul>
    {#each seenFactIdsArray as gameFact}
      <li>
        <input
          type="checkbox"
          checked={$gameFactsStore.includes(gameFact)}
          on:change={() =>
            gameFactsStore.set(
              toggleFactInFactArray(gameFact, $gameFactsStore)
            )}
        />
        {gameFact}
      </li>
    {/each}
  </ul>
  Add fact:
  <input type="text" bind:value={addFactInputValue} />
  <button
    style="width: 3rem;"
    on:click={() => {
      gameFactsStore.set(
        addGameFactToFactArray(addFactInputValue, $gameFactsStore)
      );
      seenFactIds = seenFactIds.add(addFactInputValue);
      addFactInputValue = "";
    }}>Add</button
  >
  <button style="width: 13rem;" on:click={() => gameFactsStore.set([])}
    >Reset facts</button
  >
Jonas Zohren's avatar
Jonas Zohren committed
</div>

<style>
Jonas Zohren's avatar
Jonas Zohren committed
  div {
    border: 1px solid;
    padding: 10px;
    margin: 5px;
  }
</style>