Skip to content
Snippets Groups Projects
Debugger.svelte 2.54 KiB
Newer Older
Jonas Zohren's avatar
Jonas Zohren committed
<script lang="ts">
  import { gameFactsStore, addGameFactToFactArray, toggleFactInFactArray } from './gameFacts'
Jonas Zohren's avatar
Jonas Zohren committed
  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;
  $: dialogNames = Object.keys(dialogSet.dialogs)
  export let selectedDialogName: string

  /**
   * 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];
Jonas Zohren's avatar
Jonas Zohren committed
  }

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

<div>
    <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
    <hr>

    <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>

</div>

<style>
    div {
        border: 1px solid;
        padding: 10px;
        margin: 5px;
    }
</style>