Newer
Older
import { gameFactsStore, addGameFactToFactArray } from './gameFacts'
import Typewriter from 'svelte-typewriter'
const dispatch = createEventDispatcher();
export let imageUrl: string;
export let title: string | undefined;
export let text: string;
export let options: DialogOption[] = [];
$: usableOptions = options.filter(option => isDialogOptionAllowedByGameFacts(option, $gameFactsStore))
$: {
if (Array.isArray(addFacts)) {
const gameFactsAfterAddedFacts = addFacts.reduce((accFacts, factToAdd) => addGameFactToFactArray(factToAdd, accFacts), $gameFactsStore)
$gameFactsStore = gameFactsAfterAddedFacts;
}
}
$: {
if (Array.isArray(removeFacts)) {
const gameFactsAfterRemovedFacts = removeFacts.reduce((accFacts, factToRemove) => accFacts.filter(f => f !== factToRemove), $gameFactsStore)
$gameFactsStore = gameFactsAfterRemovedFacts;
}
}
function isDialogOptionAllowedByGameFacts(option: DialogOption, gameFacts: String[]): boolean {
// Check if all required facts are given
if (Array.isArray(option.requiredFacts)) {
const isOk = option.requiredFacts.every(requiredFact => gameFacts.includes(requiredFact));
if (!isOk) {
return false;
}
}
// Check if no forbidden facts are given
if (Array.isArray(option.forbiddenFacts)) {
const isOk = option.forbiddenFacts.every(forbiddenFact => !gameFacts.includes(forbiddenFact));
if (!isOk) {
return false;
}
}
return true;
}
function handleDialogOptionClick(option: DialogOption): void {
dispatch("switchToDialog", option.linksToDialog)
}
{/if}
<img src={imageUrl} alt="Portrait" />
<div>
{#each usableOptions as option}
<button on:click={() => handleDialogOptionClick(option)}>
{option.text}
</button>