Skip to content
Snippets Groups Projects
SingleDialogComponent.svelte 2.33 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 type { DialogOption } from "./types";
    
    Jonas Zohren's avatar
    Jonas Zohren committed
      import { createEventDispatcher } from "svelte";
    
    Jonas Zohren's avatar
    Jonas Zohren committed
      import { gameFactsStore, addGameFactToFactArray } from "./gameFacts";
      import Typewriter from "svelte-typewriter";
    
    Jonas Zohren's avatar
    Jonas Zohren committed
    
      const dispatch = createEventDispatcher();
    
      export let imageUrl: string;
      export let title: string | undefined;
      export let text: string;
    
    Jonas Zohren's avatar
    Jonas Zohren committed
      export let options: DialogOption[] = [];
    
    Jonas Zohren's avatar
    Jonas Zohren committed
      $: usableOptions = options.filter((option) =>
        isDialogOptionAllowedByGameFacts(option, $gameFactsStore)
      );
    
    Jonas Zohren's avatar
    Jonas Zohren committed
      export let addFacts: String[] = [];
    
    Jonas Zohren's avatar
    Jonas Zohren committed
      $: {
        if (Array.isArray(addFacts)) {
    
    Jonas Zohren's avatar
    Jonas Zohren committed
          const gameFactsAfterAddedFacts = addFacts.reduce(
            (accFacts, factToAdd) => addGameFactToFactArray(factToAdd, accFacts),
            $gameFactsStore
          );
    
    Jonas Zohren's avatar
    Jonas Zohren committed
          $gameFactsStore = gameFactsAfterAddedFacts;
        }
      }
    
    Jonas Zohren's avatar
    Jonas Zohren committed
      export let removeFacts: String[] = [];
    
    Jonas Zohren's avatar
    Jonas Zohren committed
      $: {
        if (Array.isArray(removeFacts)) {
    
    Jonas Zohren's avatar
    Jonas Zohren committed
          const gameFactsAfterRemovedFacts = removeFacts.reduce(
            (accFacts, factToRemove) => accFacts.filter((f) => f !== factToRemove),
            $gameFactsStore
          );
    
    Jonas Zohren's avatar
    Jonas Zohren committed
          $gameFactsStore = gameFactsAfterRemovedFacts;
        }
      }
    
    
    Jonas Zohren's avatar
    Jonas Zohren committed
      function isDialogOptionAllowedByGameFacts(
        option: DialogOption,
        gameFacts: String[]
      ): boolean {
    
    Jonas Zohren's avatar
    Jonas Zohren committed
        // Check if all required facts are given
        if (Array.isArray(option.requiredFacts)) {
    
    Jonas Zohren's avatar
    Jonas Zohren committed
          const isOk = option.requiredFacts.every((requiredFact) =>
            gameFacts.includes(requiredFact)
          );
    
    Jonas Zohren's avatar
    Jonas Zohren committed
          if (!isOk) {
            return false;
          }
        }
    
        // Check if no forbidden facts are given
        if (Array.isArray(option.forbiddenFacts)) {
    
    Jonas Zohren's avatar
    Jonas Zohren committed
          const isOk = option.forbiddenFacts.every(
            (forbiddenFact) => !gameFacts.includes(forbiddenFact)
          );
    
    Jonas Zohren's avatar
    Jonas Zohren committed
          if (!isOk) {
            return false;
          }
        }
    
        return true;
      }
    
      function handleDialogOptionClick(option: DialogOption): void {
    
    Jonas Zohren's avatar
    Jonas Zohren committed
        dispatch("switchToDialog", option.linksToDialog);
    
    Jonas Zohren's avatar
    Jonas Zohren committed
      }
    
    Jonas Zohren's avatar
    Jonas Zohren committed
    </script>
    
    {#if typeof title === "string"}
    
    Jonas Zohren's avatar
    Jonas Zohren committed
        {title}
    
    Jonas Zohren's avatar
    Jonas Zohren committed
    {/if}
    
    <img src={imageUrl} alt="Portrait" />
    
    <div>
    
    Jonas Zohren's avatar
    Jonas Zohren committed
      <Typewriter cascade interval={10} cursor={false}>
    
        {#each text.split("\n") as para}
    
    Jonas Zohren's avatar
    Jonas Zohren committed
          <p>{para}</p>
    
        {/each}
      </Typewriter>
    
    Jonas Zohren's avatar
    Jonas Zohren committed
    </div>
    <hr />
    <div>
    
    Jonas Zohren's avatar
    Jonas Zohren committed
      {#each usableOptions as option}
        <button on:click={() => handleDialogOptionClick(option)}>
          {option.text}
        </button>
    
        <br />
    
    Jonas Zohren's avatar
    Jonas Zohren committed
      {/each}
    </div>