Skip to content
Snippets Groups Projects
Debugger.svelte 2.9 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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);
    
    Jonas Zohren's avatar
    Jonas Zohren committed
      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>
    
      <details>
    
    Jonas Zohren's avatar
    Jonas Zohren committed
        <summary>Show debug tools</summary>
        <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>
          {/each}
        </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
        >
    
      </details>
    
    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>