@novely/core 0.51.0 → 0.52.0-next
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +18 -11
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -7
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -231,14 +231,17 @@ type RendererInit<$Language extends Lang, $Characters extends Record<string, Cha
|
|
|
231
231
|
setLanguage: (language: string) => void;
|
|
232
232
|
};
|
|
233
233
|
|
|
234
|
-
type
|
|
235
|
-
key: string;
|
|
236
|
-
};
|
|
237
|
-
type NovelyStorage = {
|
|
234
|
+
type StorageAdapter = {
|
|
238
235
|
get: () => Promise<StorageData>;
|
|
239
236
|
set: (data: StorageData) => Promise<void>;
|
|
240
237
|
};
|
|
241
|
-
|
|
238
|
+
type StorageAdapterLocalOptions = {
|
|
239
|
+
key: string;
|
|
240
|
+
};
|
|
241
|
+
/**
|
|
242
|
+
* Stores data in localStorage
|
|
243
|
+
*/
|
|
244
|
+
declare const storageAdapterLocal: ({ key }: StorageAdapterLocalOptions) => StorageAdapter;
|
|
242
245
|
|
|
243
246
|
type PluralType = Intl.LDMLPluralRule;
|
|
244
247
|
type Pluralization = Partial<Record<PluralType, string>>;
|
|
@@ -454,9 +457,9 @@ interface NovelyInit<$Language extends Lang, $Characters extends Record<string,
|
|
|
454
457
|
characterAssetSizes?: CharacterAssetSizes<NoInfer<$Characters>>;
|
|
455
458
|
/**
|
|
456
459
|
* An object that provides access to the game's storage system.
|
|
457
|
-
* @default
|
|
460
|
+
* @default storageAdapterLocal({ key: 'novely-game-storage' })
|
|
458
461
|
*/
|
|
459
|
-
storage?:
|
|
462
|
+
storage?: StorageAdapter;
|
|
460
463
|
/**
|
|
461
464
|
* Delay loading data until Promise is resolved
|
|
462
465
|
*/
|
|
@@ -517,7 +520,7 @@ interface NovelyInit<$Language extends Lang, $Characters extends Record<string,
|
|
|
517
520
|
migrations?: Migration[];
|
|
518
521
|
/**
|
|
519
522
|
* For saves Novely uses `throttle` function. This might be needed if you want to control frequency of saves to the storage
|
|
520
|
-
* @default
|
|
523
|
+
* @default 850
|
|
521
524
|
*/
|
|
522
525
|
throttleTimeout?: number;
|
|
523
526
|
/**
|
|
@@ -682,11 +685,15 @@ type CustomHandlerFunctionParameters<L extends string, S extends State> = {
|
|
|
682
685
|
*/
|
|
683
686
|
getDomNodes: CustomHandlerFunctionGetFn;
|
|
684
687
|
/**
|
|
685
|
-
*
|
|
688
|
+
* @deprecated use `getSave` instead
|
|
689
|
+
*/
|
|
690
|
+
getPath: () => Path;
|
|
691
|
+
/**
|
|
692
|
+
* Function to get current Save. It can be mutated.
|
|
686
693
|
*
|
|
687
694
|
* Only use it when you know what you do
|
|
688
695
|
*/
|
|
689
|
-
|
|
696
|
+
getSave: () => Save<S>;
|
|
690
697
|
/**
|
|
691
698
|
* Renderer Context
|
|
692
699
|
*/
|
|
@@ -1142,4 +1149,4 @@ declare const pauseOnBlur: (engine: {
|
|
|
1142
1149
|
unsubscribe: () => void;
|
|
1143
1150
|
};
|
|
1144
1151
|
|
|
1145
|
-
export { type ActionChoiceChoice, type ActionChoiceChoiceObject, type ActionInputOnInputMeta, type ActionInputSetup, type ActionInputSetupCleanup, type ActionProxy, type AllowedContent, type AudioHandle, type BackgroundImage, type BaseTranslationStrings, type Character, type CharacterAssetSizes, type CharacterHandle, type CharactersData, type ChoiceCheckFunction, type ChoiceCheckFunctionProps, type ChoiceOnSelectFunction, type ChoiceOnSelectFunctionProps, type ChoiceParams, type ConditionCheckFunction, type ConditionParams, type Context, type CoreData, type CustomActionHandle, type CustomHandler, type CustomHandlerFunction, type CustomHandlerFunctionGetFn, type CustomHandlerFunctionParameters, type CustomHandlerGetResult, type CustomHandlerGetResultDataFunction, type CustomHandlerInfo, type Data, type DeepPartial, type DefaultActionProxy, type Derived, EN, type Emotions, type EngineTypes, type FunctionParams, type FunctionableValue, type GetActionParameters, type InputHandler, type Lang, type NovelyAsset, type NovelyInit, type NovelyScreen, type
|
|
1152
|
+
export { type ActionChoiceChoice, type ActionChoiceChoiceObject, type ActionInputOnInputMeta, type ActionInputSetup, type ActionInputSetupCleanup, type ActionProxy, type AllowedContent, type AudioHandle, type BackgroundImage, type BaseTranslationStrings, type Character, type CharacterAssetSizes, type CharacterHandle, type CharactersData, type ChoiceCheckFunction, type ChoiceCheckFunctionProps, type ChoiceOnSelectFunction, type ChoiceOnSelectFunctionProps, type ChoiceParams, type ConditionCheckFunction, type ConditionParams, type Context, type CoreData, type CustomActionHandle, type CustomHandler, type CustomHandlerFunction, type CustomHandlerFunctionGetFn, type CustomHandlerFunctionParameters, type CustomHandlerGetResult, type CustomHandlerGetResultDataFunction, type CustomHandlerInfo, type Data, type DeepPartial, type DefaultActionProxy, type Derived, EN, type Emotions, type EngineTypes, type FunctionParams, type FunctionableValue, type GetActionParameters, type InputHandler, type Lang, type NovelyAsset, type NovelyInit, type NovelyScreen, type Path, type PathItem, type PluralType, type Pluralization, RU, type Renderer, type RendererInit, type RendererInitPreviewReturn, type Save, type Stack, type StackHolder, type State, type StateFunction, type StorageAdapter, type StorageData, type StorageMeta, type Stored, type Story, type TextContent, type Thenable, type TranslationActions, type TypeEssentials, type TypesFromEngine, type TypewriterSpeed, type ValidAction, asset, extendAction, novely, pauseOnBlur, storageAdapterLocal };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/store.d.ts","../src/translations.d.ts","../src/renderer.d.ts","../src/storage.d.ts","../src/translation.d.ts","../src/utilities/internationalization.d.ts","../src/types.d.ts","../src/character.d.ts","../src/action.d.ts","../src/type-utils.d.ts","../src/novely.d.ts","../src/extend-actions.d.ts","../src/asset.d.ts","../src/browser-events.d.ts"],"sourcesContent":["type Stored<T> = {\n subscribe: (cb: (value: T) => void) => () => void;\n update: (fn: (prev: T) => T) => void;\n set: (val: T) => void;\n get: () => T;\n};\ntype Derived<T> = {\n subscribe: (cb: (value: T) => void) => () => void;\n get: () => T;\n};\ndeclare const store: <T>(current: T, subscribers?: Set<(value: T) => void>) => Stored<T>;\ndeclare const derive: <T, K>(input: Stored<T>, map: (value: T) => K) => Derived<K>;\ndeclare const immutable: <T>(value: T) => Derived<T>;\nexport { store, derive, immutable };\nexport type { Stored, Derived };\n","declare const RU: {\n NewGame: string;\n HomeScreen: string;\n ToTheGame: string;\n Language: string;\n NoSaves: string;\n LoadSave: string;\n Saves: string;\n Settings: string;\n Sumbit: string;\n GoBack: string;\n DoSave: string;\n Auto: string;\n Stop: string;\n Exit: string;\n Automatic: string;\n Manual: string;\n Remove: string;\n LoadASaveFrom: string;\n DeleteASaveFrom: string;\n TextSpeed: string;\n TextSpeedSlow: string;\n TextSpeedMedium: string;\n TextSpeedFast: string;\n TextSpeedAuto: string;\n CompleteText: string;\n GoForward: string;\n ExitDialogWarning: string;\n ExitDialogExit: string;\n ExitDialogBack: string;\n OpenMenu: string;\n CloseMenu: string;\n MusicVolume: string;\n SoundVolume: string;\n VoiceVolume: string;\n Close: string;\n DialogOverview: string;\n};\ntype BaseTranslationStrings = keyof typeof RU;\ndeclare const EN: Record<BaseTranslationStrings, string>;\nexport { RU, EN };\nexport type { BaseTranslationStrings };\n","import type { ActionInputOnInputMeta, ActionInputSetup, CustomHandler, DefaultActionProxy, ValidAction } from './action';\nimport type { Character } from './character';\nimport type { Derived, Stored } from './store';\nimport type { BaseTranslationStrings } from './translations';\nimport type { CharacterAssetSizes, CharactersData, CoreData, Data, Lang, NovelyScreen, Save, State, StateFunction, StorageData, DialogOverview } from './types';\ntype CharacterHandle = {\n emotion: (emotion: string, render: boolean) => void;\n append: (className?: string, style?: string, restoring?: boolean) => void;\n remove: (className?: string, style?: string, duration?: number, restoring?: boolean) => Promise<void>;\n animate: (classes: string[]) => void;\n emotions: Record<string, HTMLImageElement[]>;\n};\ntype CustomActionHandle = {\n /**\n * Function to remove custom action from screen (and from your state if any completely)\n */\n remove: () => void;\n /**\n * Function that will give action root (element which you should add to the screen because custom actions rendered into that element)\n */\n setMountElement: (mountElement: null | HTMLDivElement) => void;\n /**\n * Function that will give you clean function provided by custom action.\n */\n setClear: (clear: () => void) => void;\n};\ntype AudioHandle = {\n stop: () => void;\n pause: () => void;\n play: (loop: boolean) => void;\n};\ntype Context = {\n id: string;\n get root(): HTMLElement;\n set root(value: HTMLElement);\n character: (character: string) => CharacterHandle;\n background: (background: Record<string, string>) => void;\n dialog: (content: string, name: string, character: string | undefined, emotion: string | undefined, resolve: () => void) => void;\n choices: (question: string, choices: [\n name: string,\n active: Stored<boolean>,\n visible: Stored<boolean>,\n onselect: () => void,\n image: string\n ][], resolve: (selected: number) => void) => void;\n input: (question: string, onInput: (meta: ActionInputOnInputMeta<Lang, State>) => void, setup: ActionInputSetup, resolve: () => void) => void;\n clear: (keep: Set<keyof DefaultActionProxy>, keepCharacters: Set<string>, keepAudio: {\n music: Set<string>;\n sounds: Set<string>;\n }, resolve: () => void) => void;\n custom: (fn: CustomHandler<Lang, State>) => CustomActionHandle;\n /**\n * Clears all mentioned actions except for preserved one\n * @param preserve Action that should not be cleared\n */\n clearBlockingActions: (preserve: 'dialog' | 'choice' | 'input' | 'text' | undefined) => void;\n text: (str: string, resolve: () => void) => void;\n vibrate: (pattern: VibratePattern) => void;\n audio: {\n voice: (source: string, paused: Derived<boolean>) => void;\n voiceStop: () => void;\n music: (source: string, paused: Derived<boolean>, method: 'music' | 'sound') => AudioHandle;\n /**\n * Stop all sounds\n */\n clear: () => void;\n /**\n * Destroy\n */\n destroy: () => void;\n /**\n * Initialize audio service, attach events, etc\n */\n start: () => void;\n };\n loading: (shown: boolean) => void;\n meta: {\n get restoring(): boolean;\n set restoring(value: boolean);\n get preview(): boolean;\n set preview(value: boolean);\n get goingBack(): boolean;\n set goingBack(value: boolean);\n };\n};\ntype Renderer = {\n misc: {\n /**\n * Function to preload image sync\n * @param image Image URL\n * @returns Image URL\n */\n preloadImage: <T extends string>(image: T) => T;\n /**\n * Function to preload image async\n * @param image Image URL\n * @returns Promise\n */\n preloadImageBlocking: (image: string) => Promise<void>;\n /**\n * Function to preload audio\n * @param source <url> pointing to the audio\n */\n preloadAudioBlocking: (source: string) => Promise<void>;\n };\n ui: {\n /**\n * Shows the screen\n */\n showScreen(name: NovelyScreen): void;\n /**\n * Returns current screen\n */\n getScreen(): NovelyScreen | (string & Record<never, never>);\n /**\n * Shows loading\n *\n * Unline `showScreen('loading')` does not change screen\n */\n showLoading(): void;\n /**\n * Hides loading\n */\n hideLoading(): void;\n /**\n * Shows prompt to exit\n */\n showExitPrompt(): void;\n /**\n * Render the game\n */\n start(): {\n /**\n * Unmount\n */\n unmount(): void;\n };\n };\n actions: Record<string, (...args: any[]) => ValidAction>;\n getContext: (context: string) => Context;\n removeContext: (context: string) => void;\n};\ntype RendererInitPreviewReturn = {\n /**\n * Assets that was used in game preview\n */\n assets: string[];\n};\ntype RendererInit<$Language extends Lang, $Characters extends Record<string, Character<$Language>>> = {\n characters: CharactersData<$Characters>;\n characterAssetSizes: CharacterAssetSizes<$Characters>;\n set: (save: Save<State>) => Promise<void>;\n restore: (save?: Save<State>) => Promise<void>;\n save: (type: Save<State>[2][1]) => void;\n newGame: () => void;\n exit: (force?: boolean) => void;\n back: () => Promise<void>;\n languages: $Language[];\n /**\n * Translation function\n */\n t: (key: BaseTranslationStrings, lang: Lang) => string;\n /**\n * Store that tracks data updates\n */\n storageData: Stored<StorageData<Lang, Data>>;\n /**\n * Store that used to communicate between renderer and core\n */\n coreData: Stored<CoreData>;\n /**\n * There is different context, and the main one which is used for game\n */\n mainContextKey: string;\n preview: (save: Save<State>, name: string) => Promise<RendererInitPreviewReturn>;\n removeContext: (name: string) => void;\n getStateFunction: (context: string) => StateFunction<State>;\n clearCustomAction: (ctx: Context, customAction: CustomHandler) => void;\n getLanguageDisplayName: (lang: Lang) => string;\n getCharacterColor: (character: string) => string;\n getCharacterAssets: (character: string, emotion: string) => string[];\n getDialogOverview: () => Promise<DialogOverview>;\n getResourseType: (url: string) => Promise<'image' | 'audio' | 'other'>;\n setLanguage: (language: string) => void;\n};\nexport type { CharacterHandle, AudioHandle, Renderer, RendererInit, Context, CustomActionHandle, RendererInitPreviewReturn, };\n","import type { StorageData } from './types';\ntype LocalStorageStorageSettings = {\n key: string;\n};\ntype NovelyStorage = {\n get: () => Promise<StorageData>;\n set: (data: StorageData) => Promise<void>;\n};\ndeclare const localStorageStorage: (options: LocalStorageStorageSettings) => NovelyStorage;\nexport type { NovelyStorage };\nexport { localStorageStorage };\n","import type { Data, State } from './types';\ntype PluralType = Intl.LDMLPluralRule;\ntype Pluralization = Partial<Record<PluralType, string>>;\ntype AllowedContent = string | ((state: State | Data) => string | string[]) | string[] | (string | ((state: State | Data) => string | string[]))[];\ntype TranslationActions = Partial<Record<string, (str: string) => string>>;\n/**\n * Turns any allowed content into string\n * @param c Content\n */\ndeclare const flattenAllowedContent: (c: AllowedContent, state: State | Data) => string;\ndeclare const replace: (input: string, data: Record<string, unknown>, pluralization?: Record<string, Pluralization>, actions?: TranslationActions, pr?: Intl.PluralRules) => string;\nexport { flattenAllowedContent, replace };\nexport type { AllowedContent, PluralType, Pluralization, TranslationActions };\n","import type { Lang } from '../types';\ndeclare const getLanguage: (languages: string[]) => string;\ndeclare const getIntlLanguageDisplayName: ((lang: Lang) => string) & {\n cache: import(\"es-toolkit/function\").MemoizeCache<any, string>;\n};\n/**\n * Capitalizes the string\n * @param str String without emojis or complex graphemes\n */\ndeclare const capitalize: (str: string) => string;\nexport { getLanguage, getIntlLanguageDisplayName, capitalize };\n","import type { DefaultActionProxy, Story, ValidAction } from './action';\nimport type { Character } from './character';\nimport type { Renderer, RendererInit } from './renderer';\nimport type { NovelyStorage } from './storage';\nimport type { Pluralization, TranslationActions } from './translation';\nimport type { BaseTranslationStrings } from './translations';\nimport type { getLanguage as defaultGetLanguage } from './utilities';\ntype NovelyAsset = {\n readonly source: string;\n readonly id: string;\n readonly type: 'audio' | 'image';\n};\ntype Thenable<T> = T | Promise<T>;\ntype PathItem = [null, number] | ['jump', string] | ['choice', number] | ['choice:exit'] | ['condition', string] | ['condition:exit'] | ['exit'] | ['block', string] | ['block:exit'];\ntype Path = PathItem[];\ntype State = Record<string, any>;\ntype Data = Record<string, any>;\ntype SaveDate = number;\ntype SaveType = 'manual' | 'auto';\ntype SaveMeta = [date: SaveDate, type: SaveType];\ntype Save<S extends State = State> = [path: Path, state: S, meta: SaveMeta, state_snapshots: S[]];\ntype Lang = string;\ntype TypewriterSpeed = 'Slow' | 'Medium' | 'Fast' | 'Auto';\ntype SoundVolume = number;\ntype StorageMeta<L extends Lang = string> = [\n lang: L,\n typewriter_speed: TypewriterSpeed,\n music_volume: SoundVolume,\n sound_volume: SoundVolume,\n voice_volume: SoundVolume\n];\ntype Migration = (save: unknown) => unknown;\ntype StorageData<L extends Lang = string, D extends Data = Data> = {\n saves: Save[];\n data: D;\n meta: StorageMeta<L>;\n};\ntype Stack = {\n value: Save;\n back(): void;\n push(value: Save): void;\n clear(): void;\n};\ntype NovelyScreen = 'mainmenu' | 'game' | 'saves' | 'settings';\n/**\n * @see https://pendletonjones.com/deep-partial\n */\ntype DeepPartial<T> = unknown extends T ? T : T extends object ? {\n [P in keyof T]?: T[P] extends Array<infer U> ? Array<DeepPartial<U>> : T[P] extends ReadonlyArray<infer U> ? ReadonlyArray<DeepPartial<U>> : DeepPartial<T[P]>;\n} : T;\n/**\n *\n */\ntype Assign<A extends object, B extends object> = Pick<A, Exclude<keyof A, keyof B>> & B;\ntype ActionFN = DefaultActionProxy[keyof DefaultActionProxy];\ntype NonEmptyRecord<T extends Record<PropertyKey, unknown>> = keyof T extends never ? never : T;\ntype CoreData = {\n dataLoaded: boolean;\n paused: boolean;\n focused: boolean;\n};\ntype UseStackFunctionReturnType = {\n /**\n * Save that was after current value before `back` was used\n */\n get previous(): Save | undefined;\n value: Save;\n back(): void;\n push(value: Save): void;\n clear(): void;\n};\ntype StackHolder = Save[] & {\n previous: Save | undefined;\n};\ntype TranslationDescription = {\n internal: Record<BaseTranslationStrings, string>;\n /**\n * IETF BCP 47 language tag\n */\n tag?: string;\n /**\n * Custom name\n */\n nameOverride?: string;\n plural?: Record<string, Pluralization>;\n actions?: TranslationActions;\n};\ntype DefaultEmotions<$Characters extends Record<string, Character<Lang>>> = {\n [Character in keyof $Characters]?: keyof $Characters[Character]['emotions'] & string;\n};\ntype CharacterAssetSizes<$Characters extends Record<string, Character<Lang>>> = {\n [Character in keyof $Characters]?: {\n width: number;\n height: number;\n };\n};\ntype CharactersData<$Characters extends Record<string, Character<Lang>>> = {\n [Character in keyof $Characters]: {\n name: $Characters[Character]['name'];\n emotions: Array<keyof $Characters[Character]['emotions']>;\n };\n};\ntype AssetsPreloading = 'lazy' | 'automatic';\ntype CloneFN = <T>(value: T) => T;\ntype StoryOptionsStatic = {\n /**\n * Static mode means that story is static\n */\n mode: 'static';\n};\ntype StoryOptionsDynamic = {\n /**\n * Dynamic mode means that story parts can be loaded dynamically\n */\n mode: 'dynamic';\n /**\n * Number of saves to preload story for\n * @default 4\n */\n preloadSaves?: number;\n /**\n * Function to dynamically load story parts.\n *\n * When engine find's unknown scene it will run this function.\n * @example\n * ```\n * const load = async (scene: string): Promise<Story> => {\n * if (['part_2__act_1', 'part_2__act_2', 'part_2__act_3'].includes(scene)) {\n * const { getStory } = await import('./part-2.ts');\n *\n * return getStory(engine.action);\n * }\n *\n * if (scene === 'end') {\n * return {\n * 'end': [\n * engine.action.text('The End')\n * ]\n * }\n * }\n *\n * throw new Error(`Unknown scene: ${scene}`);\n * }\n * ```\n */\n load: (scene: string) => Promise<Story>;\n};\ntype StoryOptions = StoryOptionsStatic | StoryOptionsDynamic;\ntype OnLanguageChange<$Lang extends Lang> = (language: $Lang) => void;\ninterface NovelyInit<$Language extends Lang, $Characters extends Record<string, Character<NoInfer<$Language>>>, $State extends State, $Data extends Data, $Actions extends Record<string, (...args: any[]) => ValidAction>> {\n /**\n * An object containing the characters in the game.\n * @example\n * ```ts\n * const engine = novely({\n * characters: {\n * // Character ID\n * Alexei: {\n * name: 'Alexei',\n * color: '#f60002',\n * emotions: {\n * hopeful: './hopeful.png'\n * }\n * }\n * }\n * })\n * ```\n */\n characters: $Characters;\n /**\n * Define default emotions for characters\n * @example\n * ```ts\n * const engine = novely({\n * characters: {\n * Yuki: {\n * name: 'Yuki',\n * color: '#f595f6',\n * emotions: {\n * normal: './normal.png'\n * }\n * }\n * },\n * defaultEmotions: {\n * Yuki: 'normal'\n * }\n * });\n *\n * engine.script({\n * start: [\n * // Without emotion!\n * engine.action.showCharacter('Yuki')\n * ]\n * })\n * ```\n */\n defaultEmotions?: DefaultEmotions<NoInfer<$Characters>>;\n /**\n * Character asset sizes. We need width-height pair to render character, but we get it only after the assets are loaded. However, using that option we can use width-height before load.\n * @example\n * ```\n * import peter_the_great from './assets/peter_the_great.png?width=800&height=1200';\n *\n * const engine = novely({\n * characters: {\n * Peter: {\n * name: 'Peter',\n * color: '#c04931',\n * emotions: {\n * normal: peter_the_great\n * }\n * }\n * },\n * characterAssetSizes: {\n * Peter: {\n * width: 800,\n * height: 1200\n * }\n * }\n * })\n * ```\n */\n characterAssetSizes?: CharacterAssetSizes<NoInfer<$Characters>>;\n /**\n * An object that provides access to the game's storage system.\n * @default localStorage // at key `novely-game-storage`\n */\n storage?: NovelyStorage;\n /**\n * Delay loading data until Promise is resolved\n */\n storageDelay?: Promise<void>;\n /**\n * A function that returns a Renderer object used to display the game's content\n */\n renderer: (initializationData: RendererInit<NoInfer<$Language>, NoInfer<$Characters>>) => Renderer & {\n actions: $Actions;\n };\n /**\n * An optional property that specifies the initial screen to display when the game starts\n */\n initialScreen?: NovelyScreen;\n /**\n * An object containing the translation functions used in the game\n * @see https://novely.pages.dev/guide/translation.html Docs\n * @example\n * ```ts\n * import { novely, EN } from 'novely';\n *\n * const engine = novely({\n * translation: {\n * internal: EN,\n * // Optional IETF BCP 47 language tag\n * tag: 'en-US',\n * plural: {\n *\n * },\n * actions: {\n *\n * }\n * }\n * })\n * ```\n */\n translation: Record<$Language, TranslationDescription>;\n /**\n * Initial state value\n *\n * State is a local value bound to one save\n */\n state?: $State;\n /**\n * Initial data value\n *\n * Data is a global value shared between saves\n */\n data?: $Data;\n /**\n * Enable autosaves or disable\n * @default true\n */\n autosaves?: boolean;\n /**\n * Migration from old saves to newer\n */\n migrations?: Migration[];\n /**\n * For saves Novely uses `throttle` function. This might be needed if you want to control frequency of saves to the storage\n * @default 799\n */\n throttleTimeout?: number;\n /**\n * Limits how many assets can be downloaded parallelly\n * @default 15\n */\n parallelAssetsDownloadLimit?: number;\n /**\n * Custom language detector\n * @param languages Supported languages\n * @param original Original function that novely, could be used as fallback\n * @example\n * ```ts\n * const engine = novely({\n * \tgetLanguage(languages, original) {\n * \t\tif (!sdk) return original(languages);\n *\n * \t\treturn sdk.environment.i18n.lang // i.e. custom language from some sdk\n * \t}\n * })\n * ```\n */\n getLanguage?: (languages: NoInfer<$Language>[], original: typeof defaultGetLanguage) => $Language | (string & Record<never, never>);\n /**\n * Ignores saved language, and uses `getLanguage` to get it on every engine start\n * @default false\n */\n overrideLanguage?: boolean;\n /**\n * Show a prompt before exiting a game\n * @default true\n */\n askBeforeExit?: boolean;\n /**\n * \"automatic\" will try to preload assets when possible\n *\n * \"lazy\" will load assets only when they are shown\n *\n * @default \"automatic\"\n */\n preloadAssets?: AssetsPreloading;\n /**\n * Fetching function\n */\n fetch?: typeof fetch;\n /**\n * Function for clonning operations\n */\n cloneFunction?: CloneFN;\n /**\n * When page is going to be unloaded will call `storage.set` method\n * If 'prod' is passed enable only in production env.\n * @default true\n */\n saveOnUnload?: boolean | 'prod';\n /**\n * The key that signifies the start of the game. It is not recommended to override this parameter.\n *\n * @default 'start'\n * @example\n * ```ts\n * const engine = novely({\n * ...,\n * startKey: 'PART_1'\n * })\n *\n * engine.script({\n * // now game will start from here\n * PART_1: [\n *\n * ]\n * })\n * ```\n */\n startKey?: 'start' | (string & Record<never, never>);\n /**\n * Typewriter speed set by default\n */\n defaultTypewriterSpeed?: TypewriterSpeed;\n /**\n * Options to control story loading behaviour\n */\n storyOptions?: StoryOptions;\n /**\n * Will be called ONLY when language was changed by player\n */\n onLanguageChange?: OnLanguageChange<NoInfer<$Language>>;\n}\ntype StateFunction<S extends State> = {\n (value: DeepPartial<S> | ((prev: S) => S)): void;\n (): S;\n};\n/**\n * @deprecated `EngineTypes` should be used instead\n */\ntype TypeEssentials<$Lang extends Lang, $State extends State, $Data extends Data, $Characters extends Record<string, Character<$Lang>>> = {\n readonly l: $Lang | null;\n readonly s: $State | null;\n readonly d: $Data | null;\n readonly c: $Characters | null;\n};\ntype EngineTypes<$Lang extends Lang = Lang, $State extends State = State, $Data extends Data = Data, $Characters extends Record<string, Character<$Lang>> = Record<string, Character<$Lang>>> = {\n readonly l: $Lang;\n readonly s: $State;\n readonly d: $Data;\n readonly c: $Characters;\n};\ntype DialogOverviewEntry = {\n /**\n * Link to character voice\n */\n voice: string | undefined;\n /**\n * Character name\n */\n name: string;\n /**\n * Text that character says\n */\n text: string;\n};\ntype DialogOverview = DialogOverviewEntry[];\nexport type { Thenable, PathItem, Path, Save, State, Stack, StorageData, StorageMeta, TypewriterSpeed, Lang, DeepPartial, NovelyScreen, Migration, Data, ActionFN, NonEmptyRecord, CoreData, UseStackFunctionReturnType, StackHolder, NovelyInit, StateFunction, TypeEssentials, DefaultEmotions, Assign, CharacterAssetSizes, NovelyAsset, CharactersData, AssetsPreloading, CloneFN, DialogOverview, DialogOverviewEntry, EngineTypes, };\n","import type { Lang, NovelyAsset } from './types';\ntype Name<$Lang extends Lang> = string | Record<$Lang, string>;\ntype Emotions<Emotion extends string = string> = Record<Emotion, string | NovelyAsset | (string | NovelyAsset)[]>;\ntype Character<$Lang extends Lang = string> = {\n name: Name<$Lang>;\n color: string;\n emotions: Emotions;\n};\nexport type { Emotions, Character };\n","import type { Character } from './character';\nimport type { Context } from './renderer';\nimport type { Derived } from './store';\nimport type { Lang, NonEmptyRecord, NovelyAsset, Path, Save, State, StateFunction, Thenable } from './types';\ntype ValidAction = ['choice', string | undefined, ...[string, unknown[], (() => boolean)?, (() => boolean)?, string?][]] | ['clear', Set<keyof DefaultActionProxy>?, Set<string>?, {\n music: Set<string>;\n sounds: Set<string>;\n}?] | ['condition', (state: State) => boolean, Record<string, ValidAction[]>] | ['dialog', string | undefined, TextContent<string, State>, string | undefined] | ['end'] | ['showBackground', string | NovelyAsset | BackgroundImage] | ['playMusic', string | NovelyAsset] | ['stopMusic', string | NovelyAsset] | ['pauseMusic', string | NovelyAsset] | ['playSound', audio: string | NovelyAsset, loop?: boolean] | ['pauseSound', string | NovelyAsset] | ['stopSound', string | NovelyAsset] | ['voice', string | NovelyAsset | Record<string, string | NovelyAsset>] | ['stopVoice'] | ['jump', string] | ['showCharacter', string, keyof Character['emotions'], string?, string?] | ['hideCharacter', string, string?, string?, number?] | ['animateCharacter', string, number, ...string[]] | ['wait', number | ((state: State) => number)] | ['function', FunctionAction<string, State>] | ['input', string, (meta: ActionInputOnInputMeta<string, State>) => void, ActionInputSetup?] | ['custom', CustomHandler<string, State>] | ['vibrate', ...number[]] | ['next'] | ['text', ...TextContent<string, State>[]] | ['exit'] | ['preload', string | NovelyAsset] | ['block', string] | ValidAction[];\ntype Story = Record<string, ValidAction[]>;\ntype TextContent<L extends string, S extends State> = string | ((state: S) => string) | Record<L, string | ((state: S) => string)>;\ntype FunctionableValue<T> = T | (() => T);\ntype CustomHandlerGetResultDataFunction = <T = Record<string, unknown>>(data?: T) => T;\ntype CustomHandlerGetResult<I extends boolean> = {\n /**\n * Element for the custom action to be rendered into\n */\n element: I extends true ? HTMLDivElement : null;\n /**\n * Root node\n */\n root: HTMLElement;\n};\ntype CustomHandlerFunctionGetFn = <I extends boolean = true>(insert?: I) => CustomHandlerGetResult<I>;\ntype CustomHandlerFunctionParameters<L extends string, S extends State> = {\n /**\n * Returns:\n * - Root where entire novely is mounted\n * - Element in which custom action could be mounted\n *\n * @example\n * ```ts\n * // pass `true` to insert element to the DOM\n * const { root, element } = getDomNodes(true);\n * ```\n */\n getDomNodes: CustomHandlerFunctionGetFn;\n /**\n * @deprecated use `getSave` instead\n */\n getPath: () => Path;\n /**\n * Function to get current Save. It can be mutated.\n *\n * Only use it when you know what you do\n */\n getSave: () => Save<S>;\n /**\n * Renderer Context\n */\n rendererContext: Context;\n /**\n * Context key in which action is running\n */\n contextKey: string;\n /**\n * Function to work with custom action's state\n */\n data: CustomHandlerGetResultDataFunction;\n /**\n * Function to set cleanup handler\n */\n clear: (fn: () => void) => void;\n /**\n * Remove's custom handler instance\n */\n remove: () => void;\n /**\n * Context's state function\n */\n state: StateFunction<S>;\n /**\n * Game flags (aka game states)\n */\n flags: {\n restoring: boolean;\n goingBack: boolean;\n preview: boolean;\n };\n /**\n * Game language\n */\n lang: L;\n /**\n * Function to replace template content\n */\n templateReplace: (content: TextContent<L, State>, values?: State) => string;\n /**\n * Is game currently paused\n */\n paused: Derived<boolean>;\n};\ntype CustomHandlerFunction<L extends string, S extends State> = (parameters: CustomHandlerFunctionParameters<L, S>) => Thenable<void>;\ntype CustomHandlerCalling = {\n /**\n * Call only the last custom action of this type or not. Does not affect other custom actions\n * @example\n * ```ts\n * ['custom', customSomething1]\n * ['custom', customSomething1]\n * ['custom', customSomething1] <-- Run only that\n * ```\n */\n callOnlyLatest?: boolean;\n /**\n * Manually check should be skipped or not during restore\n * @param nextActions Next actions in the restoring queue\n */\n skipOnRestore?: (nextActions: Exclude<ValidAction, ValidAction[]>[]) => boolean;\n};\ntype CustomHandlerInfo = CustomHandlerCalling & {\n /**\n * Assets (pictures, audio files) used by action\n */\n assets?: (NovelyAsset | string)[];\n /**\n * When true interacting with it will be saved in history\n */\n requireUserAction?: boolean;\n /**\n * When player is going back we clear every custom action. But we can ignore clearing that.\n */\n skipClearOnGoingBack?: boolean;\n /**\n * Id by which we will determine what action is which\n */\n id: string | symbol;\n /**\n * Key by which we will save the data in the `get` function provided to custom action.\n *\n * It can be a name of action or more specific thing. In example for custom `showCharacter` it may be `show-character-${character}\n */\n key: string;\n};\ntype CustomHandler<L extends string = string, S extends State = State> = CustomHandlerFunction<L, S> & CustomHandlerInfo;\ninterface ActionInputOnInputMeta<L extends string, S extends State> {\n /**\n * Input Element itself\n */\n input: HTMLInputElement;\n /**\n * Function to show error message or hide it\n * @param error Error message or empty string to remove it\n */\n error: (error: string) => void;\n /**\n * Input Event\n */\n event: InputEvent & {\n currentTarget: HTMLInputElement;\n };\n /**\n * Sanitized `input.value`\n */\n value: string;\n /**\n * Language\n */\n lang: L;\n /**\n * State function\n */\n state: StateFunction<S>;\n}\ntype FunctionActionProps<L extends Lang, S extends State> = {\n restoring: boolean;\n goingBack: boolean;\n preview: boolean;\n /**\n * Language\n */\n lang: L;\n /**\n * State function\n */\n state: StateFunction<S>;\n};\ntype ChoiceCheckFunctionProps<L extends Lang, S extends State> = {\n /**\n * Language\n */\n lang: L;\n /**\n * State\n */\n state: S;\n};\ntype ChoiceOnSelectFunctionProps = {\n /**\n * Triggers `active` and `visible` properties computation\n */\n recompute: () => void;\n};\ntype ChoiceCheckFunction<L extends Lang, S extends State> = (props: ChoiceCheckFunctionProps<L, S>) => boolean;\ntype ChoiceOnSelectFunction = (props: ChoiceOnSelectFunctionProps) => void;\ntype ConditionCheckFunction<S extends State, R extends string | true | false> = (state: S) => R;\ntype FunctionAction<L extends string, S extends State> = (props: FunctionActionProps<L, S>) => Thenable<void>;\ntype ActionInputSetupCleanup = () => void;\ntype ActionInputSetup = (input: HTMLInputElement) => ActionInputSetupCleanup | void;\ntype BackgroundImage = Record<string, string | NovelyAsset>;\ntype VoiceAction<L extends Lang> = (params: string | NovelyAsset | Partial<Record<L, string | NovelyAsset>>) => ValidAction;\ntype ActionChoiceChoiceObject<L extends Lang, S extends State> = {\n title: TextContent<L, S>;\n children: ValidAction[];\n active?: ChoiceCheckFunction<L, S>;\n visible?: ChoiceCheckFunction<L, S>;\n onSelect?: ChoiceOnSelectFunction;\n image?: string | NovelyAsset;\n};\ntype ActionChoiceChoice<L extends Lang, S extends State> = [\n title: TextContent<L, S>,\n actions: ValidAction[],\n active?: ChoiceCheckFunction<L, S>,\n visible?: ChoiceCheckFunction<L, S>,\n onSelect?: ChoiceOnSelectFunction,\n image?: string | NovelyAsset\n];\ntype ActionProxy<Characters extends Record<string, Character>, Languages extends Lang, S extends State> = {\n choice: {\n (...choices: ActionChoiceChoice<Languages, S>[]): ValidAction;\n (question: TextContent<Languages, S>, ...choices: ActionChoiceChoice<Languages, S>[]): ValidAction;\n };\n clear: (keep?: Set<keyof DefaultActionProxy>, keepCharacters?: Set<string>, keepAudio?: {\n music: Set<string>;\n sounds: Set<string>;\n }) => ValidAction;\n condition: <T extends string | true | false>(condition: ConditionCheckFunction<S, T>, variants: Record<T extends true ? 'true' : T extends false ? 'false' : T, ValidAction[]>) => ValidAction;\n exit: () => ValidAction;\n dialog: {\n <C extends keyof Characters>(character: C, content: TextContent<Languages, S>, emotion?: keyof Characters[C]['emotions']): ValidAction;\n (character: undefined, content: TextContent<Languages, S>, emotion?: undefined): ValidAction;\n (character: string, content: TextContent<Languages, S>, emotion?: undefined): ValidAction;\n };\n end: () => ValidAction;\n showBackground: {\n (background: string | NovelyAsset): ValidAction;\n <T extends Record<string, string | NovelyAsset>>(background: NonEmptyRecord<T>): ValidAction;\n };\n playMusic: (audio: string | NovelyAsset) => ValidAction;\n pauseMusic: (audio: string | NovelyAsset) => ValidAction;\n stopMusic: (audio: string | NovelyAsset) => ValidAction;\n playSound: (audio: string | NovelyAsset, loop?: boolean) => ValidAction;\n pauseSound: (audio: string | NovelyAsset) => ValidAction;\n stopSound: (audio: string | NovelyAsset) => ValidAction;\n /**\n * Plays voice\n *\n * @example\n * ```\n * engine.script({\n * start: [\n * engine.action.voice('./rick-astley-never-gonna-give-you-up.mp3'),\n * engine.action.say('Rick', 'Never gonna give you up'),\n * ]\n * })\n * ```\n */\n voice: VoiceAction<Languages>;\n /**\n * Stops currently playing voice\n */\n stopVoice: () => ValidAction;\n jump: (scene: string) => ValidAction;\n showCharacter: <C extends keyof Characters>(character: C, emotion?: keyof Characters[C]['emotions'], className?: string, style?: string) => ValidAction;\n hideCharacter: (character: keyof Characters, className?: string, style?: string, duration?: number) => ValidAction;\n animateCharacter: (character: keyof Characters, classes: string) => ValidAction;\n wait: (time: number | ((state: State) => number)) => ValidAction;\n function: (fn: FunctionAction<Languages, S>) => ValidAction;\n input: (question: TextContent<Languages, S>, onInput: (meta: ActionInputOnInputMeta<Languages, S>) => void, setup?: ActionInputSetup) => ValidAction;\n custom: (handler: CustomHandler<Languages, S> | CustomHandler) => ValidAction;\n vibrate: (...pattern: number[]) => ValidAction;\n next: () => ValidAction;\n text: (...text: TextContent<Languages, S>[]) => ValidAction;\n preload: (source: string | NovelyAsset) => ValidAction;\n block: (scene: string) => ValidAction;\n};\ntype DefaultActionProxy = ActionProxy<Record<string, Character>, Lang, State>;\ntype GetActionParameters<T extends Capitalize<keyof DefaultActionProxy>> = Parameters<DefaultActionProxy[Uncapitalize<T>]>;\ntype VirtualActions<$Characters extends Record<string, Character>, $Lang extends Lang, $State extends State> = {\n choice: (question: TextContent<$Lang, $State>, ...choices: ActionChoiceChoiceObject<$Lang, $State>[]) => ValidAction;\n say: (character: keyof $Characters, content: TextContent<$Lang, $State>) => ValidAction;\n};\nexport type { ValidAction, Story, ActionProxy, DefaultActionProxy, GetActionParameters, TextContent, CustomHandler, CustomHandlerGetResult, CustomHandlerGetResultDataFunction, FunctionableValue, ActionInputOnInputMeta, BackgroundImage, ActionInputSetup, ActionInputSetupCleanup, ActionChoiceChoiceObject, ActionChoiceChoice, CustomHandlerFunctionGetFn, CustomHandlerFunction, CustomHandlerFunctionParameters, CustomHandlerInfo, ConditionCheckFunction, ChoiceCheckFunction, ChoiceCheckFunctionProps, ChoiceOnSelectFunctionProps, ChoiceOnSelectFunction, FunctionActionProps, FunctionAction, VirtualActions, };\n","import type { ActionInputOnInputMeta, ChoiceCheckFunctionProps, FunctionActionProps } from './action';\nimport type { EngineTypes } from './types';\ntype ConditionParams<T> = T extends EngineTypes<any, infer $State, any, any> ? $State : never;\ntype ChoiceParams<T> = T extends EngineTypes<infer $Lang, infer $State, any, any> ? ChoiceCheckFunctionProps<$Lang, $State> : never;\ntype FunctionParams<T> = T extends EngineTypes<infer $Lang, infer $State, any, any> ? FunctionActionProps<$Lang, $State> : never;\ntype InputHandler<T> = T extends EngineTypes<infer $Lang, infer $State, any, any> ? ActionInputOnInputMeta<$Lang, $State> : never;\n/**\n * @example\n * ```ts\n * type Types = TypesFromEngine<typeof engine>;\n * ```\n */\ntype TypesFromEngine<T> = T extends {\n types: EngineTypes<infer $Lang, infer $State, infer $Data, infer $Characters> | null;\n} ? EngineTypes<$Lang, $State, $Data, $Characters> : never;\nexport type { TypesFromEngine, ConditionParams, InputHandler, FunctionParams, ChoiceParams };\n","import type { ActionProxy, Story, TextContent, ValidAction, VirtualActions } from './action';\nimport type { Character } from './character';\nimport type { Data, EngineTypes, NovelyInit, State, StateFunction, StorageData, TypeEssentials } from './types';\ndeclare const novely: <$Language extends string, $Characters extends Record<string, Character<$Language>>, $State extends State, $Data extends Data, $Actions extends Record<string, (...args: any[]) => ValidAction>>({ characters, characterAssetSizes, defaultEmotions, storage, storageDelay, renderer: createRenderer, initialScreen, translation, state: defaultState, data: defaultData, autosaves, migrations, throttleTimeout, getLanguage, overrideLanguage, askBeforeExit, preloadAssets, parallelAssetsDownloadLimit, fetch: request, cloneFunction: clone, saveOnUnload, startKey, defaultTypewriterSpeed, storyOptions, onLanguageChange, }: NovelyInit<$Language, $Characters, $State, $Data, $Actions>) => {\n /**\n * Function to set game script\n *\n * @example\n * ```ts\n * engine.script({\n * start: [\n * action.function(() => {})\n * ]\n * })\n * ```\n */\n script: (part: Story) => Promise<void>;\n /**\n * Get actions\n *\n * @example\n * ```ts\n * engine.script({\n * start: [\n * action.function(() => {})\n * ]\n * })\n * ```\n */\n action: $Actions & ActionProxy<$Characters, $Language, $State> & VirtualActions<$Characters, $Language, $State>;\n /**\n * State bound to `$MAIN` game context\n * @deprecated Use `state` function provided from action arguments\n */\n state: StateFunction<State>;\n /**\n * Store data between games\n *\n * @example\n * ```ts\n * engine.script({\n * start: [\n * action.function(() => {\n * // Paid content should be purchased only once\n * // So it will be available in any save\n * data({ paid_content_purchased: true })\n * })\n * ]\n * })\n * ```\n */\n data: StateFunction<$Data>;\n /**\n * Used in combination with type utilities\n * @deprecated Use `engine.types` instead\n * @example\n * ```ts\n * import type { ConditionParams, StateFunction } from '@novely/core';\n *\n * const conditionCheck = (state: StateFunction<ConditionParams<typeof engine.typeEssintials>>) => {\n * return state.age >= 18;\n * }\n * ```\n */\n typeEssentials: TypeEssentials<$Language, $State, $Data, $Characters>;\n /**\n * Used in combination with type utilities\n * @example\n * ```ts\n * import type { TypesFromEngine, ConditionParams, StateFunction } from '@novely/core';\n *\n * type Types = TypesFromEngine<typeof engine>;\n *\n * const conditionCheck = (state: StateFunction<ConditionParams<Types>>) => {\n * return state.age >= 18;\n * }\n * ```\n */\n types: EngineTypes<$Language, $State, $Data, $Characters> | null;\n /**\n * Replaces content inside {{braces}} using global data\n * @example\n * ```ts\n * data({ name: 'Alexei' })\n *\n * templateReplace('{{name}} is our hero')\n * templateReplace({\n * en: (data) => 'Hello, ' + data.name\n * })\n * ```\n */\n templateReplace(content: TextContent<$Language, $Data>): string;\n /**\n * Same as `templateReplace` but uses state and requires explicitly providing it\n */\n templateReplaceState(content: TextContent<$Language, $State>, state: State): string;\n /**\n * Cancel data loading, hide UI, ignore page change events\n * Data updates still will work in case Novely already was loaded\n */\n destroy(): void;\n /**\n * Funtion to get current storage data\n *\n * @example\n * ```ts\n * const currentStorageData = engine.getCurrentStorageData();\n * ```\n */\n getCurrentStorageData: () => StorageData<$Language, $Data> | null;\n /**\n * Function to set storage data. Using this function is not recommended.\n *\n * @deprecated\n * @example\n * ```ts\n * const currentStorageData = engine.getCurrentStorageData();\n *\n * if (currentStorageData) {\n * // update music volume\n * currentStorageData.meta[2] = 1;\n *\n * setStorageData(currentStorageData)\n * }\n * ```\n */\n setStorageData: (data: StorageData<$Language, $Data>) => void;\n /**\n * Function to control paused state. Custom Actions are provided with `paused` store they can subscribe to.\n * This function will notify Custom Actions. Pause state can be used when showing ads.\n * @example\n * ```ts\n * sdk.on('pause' () => engine.setPaused(true));\n * sdk.on('resume', () => engine.setPaused(false));\n * ```\n */\n setPaused: (paused: boolean) => void;\n /**\n * Function to control focused state. It will affect `paused` store passed to Custom Actions.\n * This function can be used to pause game when it's not focused.\n * @example\n * ```ts\n * import { pauseOnBlur } from '@novely/core';\n *\n * // Will subscribe to blur/focus events and call `setFocused`\n * pauseOnBlur(engine);\n *\n * // OR\n *\n * sdk.on('focus' () => engine.setFocused(true));\n * sdk.on('blur', () => engine.setFocused(false));\n * ```\n */\n setFocused: (focused: boolean) => void;\n};\nexport { novely };\n","import type { ValidAction } from './action';\nimport type { Assign } from './types';\ntype Part = Record<string, (...args: any[]) => ValidAction>;\n/**\n * Extens core action with custom actions\n * @param base Actions object you will extend, `engine.action`\n * @param extension Actions object you will extend with\n * @example\n * ```ts\n * const action = extendAction(engine.action, {\n * particles: (options: Parameters<typeof particles>[0]) => {\n * return ['custom', particles(options)]\n * }\n * })\n * ```\n */\ndeclare const extendAction: <Part0 extends Part, Part1 extends Part>(base: Part0, extension: Part1) => Readonly<Assign<Part0, Part1>>;\nexport { extendAction };\n","import type { NovelyAsset } from './types';\n/**\n * Memoizes and returns an asset selection object based on provided file variants.\n * The selected asset depends on the client's support for various formats.\n *\n * @param {...string} variants - A variable number of strings, each representing a potential asset file URL.\n * @returns {NovelyAsset} An object representing the selected asset with `source` and `type` properties.\n *\n * @throws {Error} If in DEV mode and no arguments are provided.\n * @example\n * ```\n * import { asset } from 'novely';\n *\n * // Passed first have higher priority\n * const classroom = asset(\n * 'classroom.avif',\n * 'classroom.webp',\n * 'classroom.jpeg'\n * );\n *\n * setTimeout(() => {\n * console.log(classroom.source);\n * }, 100);\n * ```\n */\ndeclare const asset: {\n (...variants: string[]): NovelyAsset;\n image(source: string): NovelyAsset;\n audio(source: string): NovelyAsset;\n};\ndeclare const unwrapAsset: (asset: string | NovelyAsset) => string;\ndeclare const unwrapAudioAsset: (asset: string | NovelyAsset) => string;\ndeclare const unwrapImageAsset: (asset: string | NovelyAsset) => string;\nexport { asset, unwrapAsset, unwrapAudioAsset, unwrapImageAsset };\n","declare const pauseOnBlur: (engine: {\n setFocused: (focused: boolean) => void;\n}) => {\n unsubscribe: () => void;\n};\nexport { pauseOnBlur };\n"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -281,6 +281,9 @@ var getType = memoize(
|
|
|
281
281
|
if (extensions.every((extension) => SUPPORTED_IMAGE_FILE_FORMATS.has(extension))) {
|
|
282
282
|
return "image";
|
|
283
283
|
}
|
|
284
|
+
if (DEV) {
|
|
285
|
+
throw new Error(`Unsupported file extensions: ${JSON.stringify(extensions)}`);
|
|
286
|
+
}
|
|
284
287
|
throw extensions;
|
|
285
288
|
},
|
|
286
289
|
{
|
|
@@ -1066,6 +1069,9 @@ var handleCustomAction = (ctx, fn, {
|
|
|
1066
1069
|
const getPath = () => {
|
|
1067
1070
|
return stack.value[0];
|
|
1068
1071
|
};
|
|
1072
|
+
const getSave = () => {
|
|
1073
|
+
return stack.value;
|
|
1074
|
+
};
|
|
1069
1075
|
return fn({
|
|
1070
1076
|
flags,
|
|
1071
1077
|
lang,
|
|
@@ -1076,6 +1082,7 @@ var handleCustomAction = (ctx, fn, {
|
|
|
1076
1082
|
remove,
|
|
1077
1083
|
rendererContext: ctx,
|
|
1078
1084
|
getDomNodes,
|
|
1085
|
+
getSave,
|
|
1079
1086
|
getPath,
|
|
1080
1087
|
contextKey: ctx.id,
|
|
1081
1088
|
paused: flags.preview ? immutable(false) : paused
|
|
@@ -1188,12 +1195,12 @@ var huntAssets = ({ volume, lang, characters, action, props, handle }) => {
|
|
|
1188
1195
|
};
|
|
1189
1196
|
|
|
1190
1197
|
// src/storage.ts
|
|
1191
|
-
var
|
|
1198
|
+
var storageAdapterLocal = ({ key }) => {
|
|
1192
1199
|
return {
|
|
1193
1200
|
async get() {
|
|
1194
1201
|
const fallback = { saves: [], data: {}, meta: [] };
|
|
1195
1202
|
try {
|
|
1196
|
-
const value = localStorage.getItem(
|
|
1203
|
+
const value = localStorage.getItem(key);
|
|
1197
1204
|
return value ? JSON.parse(value) : fallback;
|
|
1198
1205
|
} catch {
|
|
1199
1206
|
return fallback;
|
|
@@ -1201,7 +1208,7 @@ var localStorageStorage = (options) => {
|
|
|
1201
1208
|
},
|
|
1202
1209
|
async set(data) {
|
|
1203
1210
|
try {
|
|
1204
|
-
localStorage.setItem(
|
|
1211
|
+
localStorage.setItem(key, JSON.stringify(data));
|
|
1205
1212
|
} catch {
|
|
1206
1213
|
}
|
|
1207
1214
|
}
|
|
@@ -1361,7 +1368,7 @@ var novely = ({
|
|
|
1361
1368
|
characters,
|
|
1362
1369
|
characterAssetSizes = {},
|
|
1363
1370
|
defaultEmotions = {},
|
|
1364
|
-
storage =
|
|
1371
|
+
storage = storageAdapterLocal({ key: "novely-game-storage" }),
|
|
1365
1372
|
storageDelay = Promise.resolve(),
|
|
1366
1373
|
renderer: createRenderer,
|
|
1367
1374
|
initialScreen = "mainmenu",
|
|
@@ -1370,7 +1377,7 @@ var novely = ({
|
|
|
1370
1377
|
data: defaultData = {},
|
|
1371
1378
|
autosaves = true,
|
|
1372
1379
|
migrations = [],
|
|
1373
|
-
throttleTimeout =
|
|
1380
|
+
throttleTimeout = 850,
|
|
1374
1381
|
getLanguage: getLanguage2 = getLanguage,
|
|
1375
1382
|
overrideLanguage = false,
|
|
1376
1383
|
askBeforeExit = true,
|
|
@@ -2594,8 +2601,8 @@ export {
|
|
|
2594
2601
|
RU,
|
|
2595
2602
|
asset,
|
|
2596
2603
|
extendAction,
|
|
2597
|
-
localStorageStorage,
|
|
2598
2604
|
novely,
|
|
2599
|
-
pauseOnBlur
|
|
2605
|
+
pauseOnBlur,
|
|
2606
|
+
storageAdapterLocal
|
|
2600
2607
|
};
|
|
2601
2608
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/.pnpm/dequal@2.0.3/node_modules/dequal/lite/index.mjs","../src/novely.ts","../../../node_modules/.pnpm/klona@2.0.6/node_modules/klona/full/index.mjs","../src/constants.ts","../src/shared.ts","../src/utilities/assertions.ts","../src/utilities/match-action.ts","../src/asset.ts","../src/audio-codecs.ts","../src/image-formats.ts","../src/utilities/actions-processing.ts","../src/utilities/controlled-promise.ts","../src/utilities/resources.ts","../src/utilities/stack.ts","../src/utilities/story.ts","../src/utilities/internationalization.ts","../src/utilities/functions.ts","../src/utilities/store.ts","../src/utilities/array.ts","../src/utilities/else.ts","../src/store.ts","../src/custom-action.ts","../src/preloading.ts","../src/storage.ts","../src/translation.ts","../src/utilities/actions.ts","../src/utilities/dialog-overview.ts","../src/utilities/document.ts","../src/extend-actions.ts","../src/translations.ts","../src/browser-events.ts"],"sourcesContent":["var has = Object.prototype.hasOwnProperty;\n\nexport function dequal(foo, bar) {\n\tvar ctor, len;\n\tif (foo === bar) return true;\n\n\tif (foo && bar && (ctor=foo.constructor) === bar.constructor) {\n\t\tif (ctor === Date) return foo.getTime() === bar.getTime();\n\t\tif (ctor === RegExp) return foo.toString() === bar.toString();\n\n\t\tif (ctor === Array) {\n\t\t\tif ((len=foo.length) === bar.length) {\n\t\t\t\twhile (len-- && dequal(foo[len], bar[len]));\n\t\t\t}\n\t\t\treturn len === -1;\n\t\t}\n\n\t\tif (!ctor || typeof foo === 'object') {\n\t\t\tlen = 0;\n\t\t\tfor (ctor in foo) {\n\t\t\t\tif (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false;\n\t\t\t\tif (!(ctor in bar) || !dequal(foo[ctor], bar[ctor])) return false;\n\t\t\t}\n\t\t\treturn Object.keys(bar).length === len;\n\t\t}\n\t}\n\n\treturn foo !== foo && bar !== bar;\n}\n","import { dequal } from 'dequal/lite';\nimport { memoize, throttle } from 'es-toolkit/function';\nimport { merge as deepmerge } from 'es-toolkit/object';\nimport { DEV } from 'esm-env';\nimport { klona } from 'klona/full';\nimport pLimit from 'p-limit';\nimport type {\n\tActionChoiceChoice,\n\tActionProxy,\n\tChoiceCheckFunction,\n\tCustomHandler,\n\tStory,\n\tTextContent,\n\tValidAction,\n\tVirtualActions,\n} from './action';\nimport type { Character } from './character';\nimport { DEFAULT_TYPEWRITER_SPEED, EMPTY_SET, MAIN_CONTEXT_KEY } from './constants';\nimport { getCustomActionHolder, handleCustomAction } from './custom-action';\nimport { enqueueAssetForPreloading, handleAssetsPreloading, huntAssets } from './preloading';\nimport type { Context, RendererInitPreviewReturn } from './renderer';\nimport { PRELOADED_ASSETS, STACK_MAP } from './shared';\nimport { localStorageStorage } from './storage';\nimport type { Stored } from './store';\nimport { derive, store } from './store';\nimport { flattenAllowedContent, replace as replaceTranslation } from './translation';\nimport type { BaseTranslationStrings } from './translations';\nimport type {\n\tCoreData,\n\tData,\n\tEngineTypes,\n\tLang,\n\tNovelyInit,\n\tSave,\n\tState,\n\tStateFunction,\n\tStorageData,\n\tTypeEssentials,\n} from './types';\nimport type { ControlledPromise } from './utilities';\nimport {\n\tisAction,\n\tisAudioAction,\n\tisBlockingAction,\n\tisEmpty,\n\tisFunction,\n\tisPromise,\n\tisString,\n\tisAsset,\n\tmatchAction,\n\tcreateQueueProcessor,\n\tgetActionsFromPath,\n\tcreateReferFunction,\n\texitPath,\n\tcollectActionsBeforeBlockingAction,\n\tnextPath,\n\tcreateControlledPromise,\n\tgetResourseType,\n\tcreateUseStackFunction,\n\tflatStory,\n\tcapitalize,\n\tgetLanguage as defaultGetLanguage,\n\tgetCharactersData,\n\tgetIntlLanguageDisplayName,\n\tgetLanguageFromStore,\n\tgetVolumeFromStore,\n\tnoop,\n\ttoArray,\n} from './utilities';\nimport type { MatchActionHandlers } from './utilities';\nimport { buildActionObject } from './utilities/actions';\nimport { unwrapAsset, unwrapAudioAsset, unwrapImageAsset } from './asset';\nimport { getDialogOverview } from './utilities/dialog-overview';\nimport { setDocumentLanguage } from './utilities/document';\n\nconst novely = <\n\t$Language extends string,\n\t$Characters extends Record<string, Character<$Language>>,\n\t$State extends State,\n\t$Data extends Data,\n\t$Actions extends Record<string, (...args: any[]) => ValidAction>,\n>({\n\tcharacters,\n\tcharacterAssetSizes = {},\n\tdefaultEmotions = {},\n\tstorage = localStorageStorage({ key: 'novely-game-storage' }),\n\tstorageDelay = Promise.resolve(),\n\trenderer: createRenderer,\n\tinitialScreen = 'mainmenu',\n\ttranslation,\n\tstate: defaultState = {} as $State,\n\tdata: defaultData = {} as $Data,\n\tautosaves = true,\n\tmigrations = [],\n\tthrottleTimeout = 799,\n\tgetLanguage = defaultGetLanguage,\n\toverrideLanguage = false,\n\taskBeforeExit = true,\n\tpreloadAssets = 'automatic',\n\tparallelAssetsDownloadLimit = 15,\n\tfetch: request = fetch,\n\tcloneFunction: clone = klona,\n\tsaveOnUnload = true,\n\tstartKey = 'start',\n\tdefaultTypewriterSpeed = DEFAULT_TYPEWRITER_SPEED,\n\tstoryOptions = { mode: 'static' },\n\tonLanguageChange,\n}: NovelyInit<$Language, $Characters, $State, $Data, $Actions>) => {\n\ttype $ActionProxy = ActionProxy<$Characters, $Language, $State>;\n\ttype $VirtualActions = VirtualActions<$Characters, $Language, $State>;\n\n\t// All action functions\n\ttype Actions = $Actions & $ActionProxy & $VirtualActions;\n\n\tconst languages = Object.keys(translation) as $Language[];\n\n\tconst limitScript = pLimit(1);\n\tconst limitAssetsDownload = pLimit(parallelAssetsDownloadLimit);\n\n\tconst story: Story = {};\n\n\tconst times = new Set<number>();\n\n\tconst dataLoaded = createControlledPromise();\n\n\tlet initialScreenWasShown = false;\n\tlet destroyed = false;\n\n\tif (storyOptions.mode === 'dynamic') {\n\t\tstoryOptions.preloadSaves ??= 4;\n\t}\n\n\tconst storyLoad = storyOptions.mode === 'static' ? noop : storyOptions.load;\n\tconst onUnknownSceneHit = memoize(async (scene: string) => {\n\t\tconst part = await storyLoad(scene);\n\n\t\tif (part) {\n\t\t\tawait script(part);\n\t\t}\n\t});\n\n\t/**\n\t * Saves timestamps created in this session\n\t */\n\tconst intime = (value: number) => {\n\t\treturn times.add(value), value;\n\t};\n\n\tconst scriptBase = async (part: Story) => {\n\t\t// In case script was called after destroy\n\t\tif (destroyed) return;\n\n\t\tObject.assign(story, flatStory(part));\n\n\t\t// This is the first `script` call, likely data did not loaded yet\n\t\tif (!initialScreenWasShown) {\n\t\t\trenderer.ui.showLoading();\n\t\t}\n\n\t\tawait dataLoaded.promise;\n\n\t\trenderer.ui.hideLoading();\n\n\t\tif (!initialScreenWasShown) {\n\t\t\tinitialScreenWasShown = true;\n\n\t\t\tif (initialScreen === 'game') {\n\t\t\t\trestore(undefined);\n\t\t\t} else {\n\t\t\t\trenderer.ui.showScreen(initialScreen);\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Setup your story here\n\t *\n\t * Call more than once to merge different story parts\n\t *\n\t * @example\n\t *\n\t * ```js\n\t * engine.script({\n\t * start: [action.jump('another-part')]\n\t * })\n\t *\n\t * engine.script({\n\t * 'another-part': []\n\t * })\n\t * ```\n\t */\n\tconst script = (part: Story) => {\n\t\treturn limitScript(() => scriptBase(part));\n\t};\n\n\tconst getDefaultSave = (state: $State) => {\n\t\treturn [\n\t\t\t[\n\t\t\t\t['jump', startKey],\n\t\t\t\t[null, 0],\n\t\t\t],\n\t\t\tstate,\n\t\t\t[intime(Date.now()), 'auto'],\n\t\t\t[],\n\t\t] as Save<$State>;\n\t};\n\n\t/**\n\t * Calls `getLanguage`, passes needed arguments\n\t * @returns language\n\t */\n\tconst getLanguageWithoutParameters = () => {\n\t\tconst language = getLanguage(languages, defaultGetLanguage);\n\n\t\t// This is valid language\n\t\tif (languages.includes(language as $Language)) {\n\t\t\tsetDocumentLanguage(language);\n\n\t\t\treturn language as $Language;\n\t\t}\n\n\t\tif (DEV) {\n\t\t\tthrow new Error(\n\t\t\t\t`Attempt to use unsupported language \"${language}\". Supported languages: ${languages.join(', ')}.`,\n\t\t\t);\n\t\t}\n\n\t\tthrow 0;\n\t};\n\n\t/**\n\t * 1) Novely rendered using the `initialData`, but you can't start new game or `load` an empty one - this is scary, imagine losing your progress\n\t * 2) Actual stored data is loaded, language and etc is changed\n\t */\n\tconst initialData: StorageData<$Language, $Data> = {\n\t\tsaves: [],\n\t\tdata: clone(defaultData),\n\t\tmeta: [getLanguageWithoutParameters(), DEFAULT_TYPEWRITER_SPEED, 1, 1, 1],\n\t};\n\n\tconst storageData = store(initialData);\n\tconst coreData = store<CoreData>({\n\t\tdataLoaded: false,\n\t\tpaused: false,\n\t\tfocused: document.visibilityState === 'visible',\n\t});\n\n\tconst paused = derive(coreData, (s) => s.paused || !s.focused);\n\n\tconst onDataLoadedPromise = async ({ cancelled }: Awaited<ControlledPromise<void>>) => {\n\t\t/**\n\t\t * Promise cancelled? Re-subscribe\n\t\t */\n\t\tif (cancelled) {\n\t\t\tdataLoaded.promise.then(onDataLoadedPromise);\n\t\t\treturn;\n\t\t}\n\n\t\tconst preload = () => {\n\t\t\tconst saves = [...storageData.get().saves].reverse();\n\t\t\tconst sliced = saves.slice(0, storyOptions.mode === 'dynamic' ? storyOptions.preloadSaves : 0);\n\n\t\t\tfor (const [path] of sliced) {\n\t\t\t\treferGuarded(path);\n\t\t\t}\n\t\t};\n\n\t\tpreload();\n\n\t\t/**\n\t\t * When promise is resolved data is marked loaded\n\t\t */\n\t\tcoreData.update((data) => {\n\t\t\tdata.dataLoaded = true;\n\n\t\t\treturn data;\n\t\t});\n\t};\n\n\tdataLoaded.promise.then(onDataLoadedPromise);\n\n\tconst onStorageDataChange = (value: StorageData) => {\n\t\tif (!coreData.get().dataLoaded) return;\n\n\t\tconst data = clone(value);\n\n\t\t/**\n\t\t * Empty out data snapshots\n\t\t */\n\t\tfor (const save of data.saves) {\n\t\t\tsave[3] = [];\n\t\t}\n\n\t\tstorage.set(data);\n\t};\n\n\t/**\n\t * Short one is used in conditions like `beforeunload` when waiting for too long is not a case\n\t * Another one relies on short one to prevent double saving\n\t */\n\tconst throttledShortOnStorageDataChange = throttle(() => onStorageDataChange(storageData.get()), 10);\n\tconst throttledOnStorageDataChange = throttle(throttledShortOnStorageDataChange, throttleTimeout);\n\n\tstorageData.subscribe(throttledOnStorageDataChange);\n\n\tif (saveOnUnload === true || (saveOnUnload === 'prod' && !DEV)) {\n\t\taddEventListener('beforeunload', throttledShortOnStorageDataChange);\n\t}\n\n\tconst getStoredData = async () => {\n\t\tlet stored = await storage.get();\n\n\t\tfor (const migration of migrations) {\n\t\t\tstored = migration(stored) as StorageData;\n\n\t\t\tif (DEV && !stored) {\n\t\t\t\tthrow new Error('Migrations should return a value.');\n\t\t\t}\n\t\t}\n\n\t\tif (overrideLanguage || !stored.meta[0]) {\n\t\t\tstored.meta[0] = getLanguageWithoutParameters();\n\t\t}\n\n\t\t/**\n\t\t * Default `localStorageStorage` returns empty array\n\t\t */\n\t\tstored.meta[1] ||= defaultTypewriterSpeed;\n\n\t\t/**\n\t\t * Sound Volumes\n\t\t */\n\t\tstored.meta[2] ??= 1;\n\t\tstored.meta[3] ??= 1;\n\t\tstored.meta[4] ??= 1;\n\n\t\t/**\n\t\t * When data is empty replace it with `defaultData`\n\t\t * It also might be empty (default to empty)\n\t\t */\n\t\tif (isEmpty(stored.data)) {\n\t\t\tstored.data = defaultData as Data;\n\t\t}\n\n\t\t/**\n\t\t * Now the next store updates will entail saving via storage.set\n\t\t */\n\t\tdataLoaded.resolve();\n\n\t\tstorageData.set(stored as StorageData<$Language, $Data>);\n\t};\n\n\t/**\n\t * By default this is resolved immediately, but also can be delayed.\n\t * I.e. storage has not loaded yet\n\t */\n\tstorageDelay.then(getStoredData);\n\n\tconst initial = getDefaultSave(clone(defaultState));\n\n\t// #region Save Function\n\tconst save = (type: Save[2][1]) => {\n\t\tif (!coreData.get().dataLoaded) return;\n\n\t\t/**\n\t\t * When autosaves diabled just return\n\t\t */\n\t\tif (!autosaves && type === 'auto') return;\n\n\t\t/**\n\t\t * Saves only possible in main context, so there is no reason for context to be used here\n\t\t */\n\t\tconst stack = useStack(MAIN_CONTEXT_KEY);\n\t\tconst current = clone(stack.value);\n\n\t\tstorageData.update((prev) => {\n\t\t\tconst replace = () => {\n\t\t\t\tprev.saves[prev.saves.length - 1] = current;\n\n\t\t\t\treturn prev;\n\t\t\t};\n\n\t\t\tconst add = () => {\n\t\t\t\tprev.saves.push(current);\n\n\t\t\t\treturn prev;\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * Get latest\n\t\t\t */\n\t\t\tconst last = prev.saves.at(-1);\n\n\t\t\t/**\n\t\t\t * We cannot compare anything here, thus just reutrn\n\t\t\t */\n\t\t\tif (!last) return add();\n\n\t\t\t/**\n\t\t\t * Update type and time information\n\t\t\t */\n\t\t\tcurrent[2][0] = intime(Date.now());\n\t\t\tcurrent[2][1] = type;\n\n\t\t\t/**\n\t\t\t * Empty out state snapshots\n\t\t\t */\n\t\t\tcurrent[3] = [];\n\n\t\t\tconst isIdentical = dequal(last[0], current[0]) && dequal(last[1], current[1]);\n\t\t\tconst isLastMadeInCurrentSession = times.has(last[2][0]);\n\n\t\t\t/**\n\t\t\t * Even if override is false, we will replace auto save with manual, because they are the same thing basically\n\t\t\t */\n\t\t\tif (isLastMadeInCurrentSession && last[2][1] === 'auto' && type === 'manual') {\n\t\t\t\treturn replace();\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Player has made a manual save, novely decided to make an auto save\n\t\t\t * But it is identical to previously created manual save so completely not wanted\n\t\t\t */\n\t\t\tif (last[2][1] === 'manual' && type === 'auto' && isIdentical) {\n\t\t\t\treturn prev;\n\t\t\t}\n\n\t\t\tif (isLastMadeInCurrentSession && last[2][1] === 'auto' && type === 'auto') {\n\t\t\t\treturn replace();\n\t\t\t}\n\n\t\t\treturn add();\n\t\t});\n\t};\n\t// #endregion\n\n\t// #region New Game\n\tconst newGame = () => {\n\t\tif (!coreData.get().dataLoaded) return;\n\n\t\tconst save = getDefaultSave(clone(defaultState));\n\n\t\t/**\n\t\t * Initial save is automatic, and should be ignored when autosaves is turned off\n\t\t */\n\t\tif (autosaves) {\n\t\t\tstorageData.update((prev) => {\n\t\t\t\treturn prev.saves.push(save), prev;\n\t\t\t});\n\t\t}\n\n\t\tconst context = renderer.getContext(MAIN_CONTEXT_KEY);\n\t\tconst stack = useStack(context);\n\n\t\tstack.value = save;\n\t\tcontext.meta.restoring = context.meta.goingBack = false;\n\n\t\trenderer.ui.showScreen('game');\n\n\t\trender(context);\n\t};\n\t// #endregion\n\n\t/**\n\t * Set's the save and restores onto it\n\t */\n\tconst set = (save: Save, ctx?: Context) => {\n\t\tconst stack = useStack(ctx || MAIN_CONTEXT_KEY);\n\n\t\tstack.value = save;\n\n\t\treturn restore(save);\n\t};\n\n\tlet interacted = 0;\n\n\t// #region Restore Function\n\t/**\n\t * Restore save or if none is passed then look for latest save, if there is no saves will create a new save\n\t */\n\tconst restore = async (save: Save | undefined) => {\n\t\tif (isEmpty(story)) {\n\t\t\tif (DEV) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Story is empty. You should call an `enine.script` function [https://novely.pages.dev/guide/story.html]',\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (!coreData.get().dataLoaded) return;\n\n\t\tlet latest = save || storageData.get().saves.at(-1);\n\n\t\t/**\n\t\t * When there is no save, make a new save\n\t\t */\n\t\tif (!latest) {\n\t\t\tlatest = clone(initial);\n\n\t\t\tstorageData.update((prev) => {\n\t\t\t\t/**\n\t\t\t\t * `latest` will be not undefined because this callback called immediately and variable is not changed\n\t\t\t\t */\n\t\t\t\tprev.saves.push(latest!);\n\n\t\t\t\treturn prev;\n\t\t\t});\n\t\t}\n\n\t\tconst context = renderer.getContext(MAIN_CONTEXT_KEY);\n\t\tconst stack = useStack(context);\n\n\t\tcontext.meta.restoring = true;\n\n\t\tconst previous = stack.previous;\n\n\t\tconst [path] = (stack.value = latest);\n\n\t\trenderer.ui.showScreen('game');\n\n\t\tconst { found } = await refer(path);\n\n\t\tif (found) context.loading(true);\n\n\t\tconst { queue, skip, skipPreserve } = await getActionsFromPath({\n\t\t\tstory,\n\t\t\tpath,\n\t\t\tfilter: false,\n\t\t\treferGuarded,\n\t\t});\n\n\t\tconst {\n\t\t\trun,\n\t\t\tkeep: { keep, characters, audio },\n\t\t} = createQueueProcessor(queue, {\n\t\t\tskip,\n\t\t\tskipPreserve,\n\t\t});\n\n\t\tif (previous) {\n\t\t\tconst { queue: prevQueue } = await getActionsFromPath({\n\t\t\t\tstory,\n\t\t\t\tpath: previous[0],\n\t\t\t\tfilter: false,\n\t\t\t\treferGuarded,\n\t\t\t});\n\n\t\t\tfor (let i = prevQueue.length - 1; i > queue.length - 1; i--) {\n\t\t\t\tconst element = prevQueue[i];\n\n\t\t\t\t/**\n\t\t\t\t * Just in case 🤷\n\t\t\t\t */\n\t\t\t\tif (!isAction(element)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst [action, fn] = element;\n\n\t\t\t\t/**\n\t\t\t\t * Imagine array of actions like\n\t\t\t\t *\n\t\t\t\t * [\n\t\t\t\t * ['dialog', ...props]\n\t\t\t\t * ['showBackground', ...props]\n\t\t\t\t * ['custom', function]\n\t\t\t\t * ]\n\t\t\t\t *\n\t\t\t\t * When player goes back array changes to\n\t\t\t\t *\n\t\t\t\t * [\n\t\t\t\t * ['dialog', ...props]\n\t\t\t\t * ]\n\t\t\t\t *\n\t\t\t\t * We catch these custom actions that are gone and\n\t\t\t\t * call their clear methods so there is no side effects\n\t\t\t\t * from future in the past\n\t\t\t\t */\n\t\t\t\tif (action === 'custom') {\n\t\t\t\t\tgetCustomActionHolder(context, fn).cleanup();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (context.meta.goingBack) {\n\t\t\t/**\n\t\t\t * Context is cleared at exit, so it is dirty only when goingBack\n\t\t\t */\n\t\t\tmatch('clear', [keep, characters, audio], {\n\t\t\t\tctx: context,\n\t\t\t\tdata: latest[1],\n\t\t\t});\n\t\t}\n\n\t\tcontext.loading(false);\n\n\t\tconst lastQueueItem = queue.at(-1);\n\t\tconst lastQueueItemRequiresUserAction = lastQueueItem && isBlockingAction(lastQueueItem);\n\n\t\tawait run((item) => {\n\t\t\tif (!latest) return;\n\n\t\t\t/**\n\t\t\t * Skip because last item will be ran again by `render(context)` call\n\t\t\t */\n\t\t\tif (lastQueueItem === item && lastQueueItemRequiresUserAction) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst [action, ...props] = item;\n\n\t\t\treturn match(action, props, {\n\t\t\t\tctx: context,\n\t\t\t\tdata: latest[1],\n\t\t\t});\n\t\t});\n\n\t\tif (!context.meta.goingBack) {\n\t\t\t/**\n\t\t\t * When not goingBack setting restoring to false is required to go forward\n\t\t\t * Because when restoring action do not call the resolve function which goes to next action but are controlled\n\t\t\t */\n\t\t\tcontext.meta.restoring = false;\n\t\t}\n\n\t\tawait render(context);\n\n\t\tcontext.meta.restoring = context.meta.goingBack = false;\n\t};\n\t// #endregion\n\n\tconst { refer, referGuarded } = createReferFunction({\n\t\tstory,\n\t\tonUnknownSceneHit,\n\t});\n\n\t// #region Exit Function\n\t/**\n\t * @param force Force exit\n\t */\n\tconst exit = (force = false, saving = true) => {\n\t\t/**\n\t\t * Exit only possible in main context\n\t\t */\n\t\tconst ctx = renderer.getContext(MAIN_CONTEXT_KEY);\n\n\t\tconst stack = useStack(ctx);\n\t\tconst current = stack.value;\n\n\t\tconst isSaved = () => {\n\t\t\tconst { saves } = storageData.get();\n\t\t\tconst [currentPath, currentData] = stack.value;\n\n\t\t\treturn saves.some(\n\t\t\t\t([path, data, [date, type]]) =>\n\t\t\t\t\ttype === 'manual' && times.has(date) && dequal(path, currentPath) && dequal(data, currentData),\n\t\t\t);\n\t\t};\n\n\t\tif (interacted > 1 && !force && askBeforeExit && !isSaved()) {\n\t\t\trenderer.ui.showExitPrompt();\n\t\t\treturn;\n\t\t}\n\n\t\t/**\n\t\t * Imagine list of actions like\n\t\t *\n\t\t * [\n\t\t * ['input', ...args]\n\t\t * ['dialog', ...args]\n\t\t * ]\n\t\t *\n\t\t * When you have done with input, you will go to the dialog\n\t\t * And at that moment you exit the game\n\t\t *\n\t\t * What happens? Input was \"enmemoried\", but dialog not. So when you will open saves, you'll see input action.\n\t\t * We cannot \"enmemory\" dialog when it's just started, because goingBack is going to last enmemoried item, which will be that dialog, so impossible to go back.\n\t\t *\n\t\t * What we do is enmemory on exit.\n\t\t */\n\t\tif (interacted > 0 && saving) {\n\t\t\tsave('auto');\n\t\t}\n\n\t\tstack.clear();\n\t\tctx.clear(EMPTY_SET, EMPTY_SET, { music: EMPTY_SET, sounds: EMPTY_SET }, noop);\n\t\trenderer.ui.showScreen('mainmenu');\n\t\tctx.audio.destroy();\n\n\t\tconst [time, type] = current[2];\n\n\t\t/**\n\t\t * This is auto save and belongs to the current session\n\t\t * Player did not interacted or did it once, so this is probably not-needed save\n\t\t */\n\t\tif (type === 'auto' && interacted <= 1 && times.has(time)) {\n\t\t\tstorageData.update((prev) => {\n\t\t\t\tprev.saves = prev.saves.filter((save) => save !== current);\n\n\t\t\t\treturn prev;\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Reset interactive value\n\t\t */\n\t\tinteractivity(false);\n\t\t/**\n\t\t * Reset session times\n\t\t */\n\t\ttimes.clear();\n\t};\n\t// #endregion\n\n\tconst back = async () => {\n\t\t/**\n\t\t * Back also happens in main context only\n\t\t */\n\t\tconst stack = useStack(MAIN_CONTEXT_KEY);\n\n\t\tconst valueBeforeBack = stack.value;\n\n\t\tstack.back();\n\n\t\t/**\n\t\t * There was only one item in the stack so there is no `stack.previous`, also `ctx.meta.goingBack` did not changed\n\t\t */\n\t\tif (dequal(valueBeforeBack, stack.value) && !stack.previous) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait restore(stack.value);\n\t};\n\n\tconst t = (key: BaseTranslationStrings, lang: string | $Language) => {\n\t\treturn translation[lang as $Language].internal[key];\n\t};\n\n\t// #region Preview Function\n\t/**\n\t * Execute save in context named `name`\n\t * @param save Save\n\t * @param name Context name\n\t */\n\tconst preview = async (save: Save, name: string): Promise<RendererInitPreviewReturn> => {\n\t\tif (isEmpty(story)) {\n\t\t\treturn Promise.resolve({\n\t\t\t\tassets: [],\n\t\t\t});\n\t\t}\n\n\t\tconst [path, data] = save;\n\n\t\tconst ctx = renderer.getContext(name);\n\n\t\tconst { found } = await refer(path);\n\n\t\tif (found) ctx.loading(true);\n\n\t\tconst { queue } = await getActionsFromPath({\n\t\t\tstory,\n\t\t\tpath,\n\t\t\tfilter: true,\n\t\t\treferGuarded,\n\t\t});\n\n\t\tctx.loading(false);\n\n\t\t/**\n\t\t * Enter restoring mode in action\n\t\t */\n\t\tctx.meta.restoring = true;\n\t\tctx.meta.preview = true;\n\n\t\tconst processor = createQueueProcessor(queue, {\n\t\t\tskip: EMPTY_SET,\n\t\t});\n\n\t\tuseStack(ctx).push(clone(save));\n\n\t\tconst assets: string[] = [];\n\n\t\tawait processor.run(([action, ...props]) => {\n\t\t\tif (isAudioAction(action)) return;\n\t\t\tif (action === 'vibrate') return;\n\t\t\tif (action === 'end') return;\n\n\t\t\thuntAssets({\n\t\t\t\taction,\n\t\t\t\tprops: props as any,\n\n\t\t\t\tcharacters,\n\n\t\t\t\tlang: getLanguageFromStore(storageData),\n\t\t\t\tvolume: getVolumeFromStore(storageData),\n\n\t\t\t\thandle: assets.push.bind(assets),\n\t\t\t});\n\n\t\t\treturn match(action, props, {\n\t\t\t\tctx,\n\t\t\t\tdata,\n\t\t\t});\n\t\t});\n\n\t\treturn {\n\t\t\tassets,\n\t\t};\n\t};\n\t// #endregion\n\n\tconst removeContext = (name: string) => {\n\t\tSTACK_MAP.delete(name);\n\t};\n\n\tconst getStateAtCtx = (context: string | Context) => {\n\t\treturn useStack(context).value[1];\n\t};\n\n\tconst getStateFunction = (context: string | Context) => {\n\t\tconst stack = useStack(context);\n\n\t\tconst state = ((value) => {\n\t\t\tconst _state = getStateAtCtx(context);\n\n\t\t\tif (!value) {\n\t\t\t\treturn _state;\n\t\t\t}\n\n\t\t\tconst prev = _state;\n\t\t\tconst val = isFunction(value) ? value(prev) : deepmerge(prev, value);\n\n\t\t\tstack.value[1] = val;\n\n\t\t\treturn undefined;\n\t\t}) as StateFunction<State>;\n\n\t\treturn state;\n\t};\n\n\tconst getLanguageDisplayName = (lang: Lang) => {\n\t\tconst language = translation[lang as $Language];\n\n\t\tif (DEV && !language) {\n\t\t\tthrow new Error(\n\t\t\t\t`Attempt to use unsupported language \"${language}\". Supported languages: ${languages.join(', ')}.`,\n\t\t\t);\n\t\t}\n\n\t\treturn capitalize(language.nameOverride || getIntlLanguageDisplayName(lang));\n\t};\n\n\tconst clearCustomAction = (ctx: Context, fn: CustomHandler) => {\n\t\tgetCustomActionHolder(ctx, fn).cleanup();\n\t};\n\n\tconst getResourseTypeWrapper = (url: string) => {\n\t\treturn getResourseType({\n\t\t\turl,\n\t\t\trequest,\n\t\t});\n\t};\n\n\tconst getCharacterColor = (c: keyof $Characters) => {\n\t\treturn c in characters ? characters[c].color : '#000000';\n\t};\n\n\tconst getCharacterAssets = (character: string, emotion: string) => {\n\t\treturn toArray(characters[character].emotions[emotion]).map(unwrapImageAsset);\n\t};\n\n\tconst getCharacterName = (character: keyof $Characters): string => {\n\t\tconst c = character;\n\t\tconst cs = characters;\n\t\tconst lang = getLanguageFromStore(storageData);\n\n\t\tif (c && c in cs) {\n\t\t\tconst block = cs[c].name;\n\n\t\t\tif (typeof block === 'string') {\n\t\t\t\treturn block;\n\t\t\t}\n\n\t\t\tif (lang in block) {\n\t\t\t\treturn block[lang];\n\t\t\t}\n\t\t}\n\n\t\treturn String(c);\n\t};\n\n\tconst setLanguage = (lang: string) => {\n\t\tstorageData.update((prev) => {\n\t\t\tif (languages.includes(lang as $Language)) {\n\t\t\t\tprev.meta[0] = lang as $Language;\n\t\t\t}\n\n\t\t\tif (lang === prev.meta[0]) {\n\t\t\t\tsetDocumentLanguage(lang);\n\t\t\t\tonLanguageChange?.(lang as $Language);\n\t\t\t}\n\n\t\t\treturn prev;\n\t\t});\n\t};\n\n\t// #region Renderer Creation\n\tconst renderer = createRenderer({\n\t\tmainContextKey: MAIN_CONTEXT_KEY,\n\n\t\tcharacters: getCharactersData(characters),\n\t\tcharacterAssetSizes,\n\t\tset,\n\t\trestore,\n\t\tsave,\n\t\tnewGame,\n\t\texit,\n\t\tback,\n\t\tt,\n\t\tpreview,\n\t\tremoveContext,\n\t\tgetStateFunction,\n\t\tclearCustomAction,\n\t\tlanguages,\n\t\tstorageData: storageData as unknown as Stored<StorageData<string, Data>>,\n\t\tcoreData,\n\n\t\tgetLanguageDisplayName,\n\t\tgetCharacterColor,\n\t\tgetCharacterAssets,\n\t\tgetDialogOverview: getDialogOverview.bind({\n\t\t\treferGuarded,\n\t\t\tstory,\n\t\t\tgetCharacterName,\n\t\t\tgetLanguage: () => getLanguageFromStore(storageData),\n\t\t\tgetStack: () => useStack(MAIN_CONTEXT_KEY),\n\t\t\ttemplateReplace: (...args) => templateReplace(...args),\n\t\t}),\n\n\t\tgetResourseType: getResourseTypeWrapper,\n\n\t\tsetLanguage,\n\t});\n\t// #endregion\n\n\tconst useStack = createUseStackFunction(renderer);\n\n\t/**\n\t * Initiate\n\t */\n\tuseStack(MAIN_CONTEXT_KEY).push(initial);\n\n\tconst UIInstance = renderer.ui.start();\n\n\tconst enmemory = (ctx: Context) => {\n\t\tif (ctx.meta.restoring) return;\n\n\t\tconst stack = useStack(ctx);\n\n\t\tconst current = clone(stack.value);\n\n\t\tcurrent[2][1] = 'auto';\n\n\t\tstack.push(current);\n\n\t\tsave('auto');\n\t};\n\n\tconst next = (ctx: Context) => {\n\t\tconst stack = useStack(ctx);\n\t\tconst path = stack.value[0];\n\n\t\tnextPath(path);\n\t};\n\n\tconst matchActionOptions: MatchActionHandlers = {\n\t\tgetContext: renderer.getContext,\n\t\tpush(ctx) {\n\t\t\tif (ctx.meta.restoring) return;\n\n\t\t\tnext(ctx);\n\t\t\trender(ctx);\n\t\t},\n\t\tforward(ctx) {\n\t\t\tif (!ctx.meta.preview) enmemory(ctx);\n\n\t\t\tmatchActionOptions.push(ctx);\n\n\t\t\tif (!ctx.meta.preview) interactivity(true);\n\t\t},\n\t\tasync onBeforeActionCall({ action, props, ctx }) {\n\t\t\tif (preloadAssets !== 'automatic') return;\n\t\t\tif (ctx.meta.preview || ctx.meta.restoring) return;\n\t\t\tif (!isBlockingAction([action, ...props] as unknown as Exclude<ValidAction, ValidAction[]>)) return;\n\n\t\t\ttry {\n\t\t\t\tconst collection = await collectActionsBeforeBlockingAction({\n\t\t\t\t\tpath: nextPath(clone(useStack(ctx).value[0])),\n\t\t\t\t\trefer: referGuarded,\n\t\t\t\t\tclone,\n\t\t\t\t});\n\n\t\t\t\tfor (const [action, ...props] of collection) {\n\t\t\t\t\thuntAssets({\n\t\t\t\t\t\taction,\n\t\t\t\t\t\tprops: props as any,\n\n\t\t\t\t\t\tcharacters,\n\n\t\t\t\t\t\tlang: getLanguageFromStore(storageData),\n\t\t\t\t\t\tvolume: getVolumeFromStore(storageData),\n\n\t\t\t\t\t\thandle: enqueueAssetForPreloading,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\thandleAssetsPreloading({\n\t\t\t\t\t...renderer.misc,\n\t\t\t\t\trequest,\n\t\t\t\t\tlimiter: limitAssetsDownload,\n\t\t\t\t});\n\t\t\t} catch (cause) {\n\t\t\t\tconsole.error(cause);\n\t\t\t}\n\t\t},\n\t};\n\n\t// #region Match Action\n\tconst { match, nativeActions } = matchAction(matchActionOptions, {\n\t\twait({ ctx, data, push }, [time]) {\n\t\t\tif (ctx.meta.restoring) return;\n\n\t\t\tsetTimeout(push, isFunction(time) ? time(data) : time);\n\t\t},\n\t\tshowBackground({ ctx, push }, [background]) {\n\t\t\tif (isString(background) || isAsset(background)) {\n\t\t\t\tctx.background({\n\t\t\t\t\tall: unwrapImageAsset(background),\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tctx.background(\n\t\t\t\t\tObject.fromEntries(Object.entries(background).map(([media, asset]) => [media, unwrapImageAsset(asset)])),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tpush();\n\t\t},\n\t\tplayMusic({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'music').play(true);\n\t\t\tpush();\n\t\t},\n\t\tpauseMusic({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'music').pause();\n\t\t\tpush();\n\t\t},\n\t\tstopMusic({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'music').stop();\n\t\t\tpush();\n\t\t},\n\t\tplaySound({ ctx, push }, [source, loop]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'sound').play(loop || false);\n\t\t\tpush();\n\t\t},\n\t\tpauseSound({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'sound').pause();\n\t\t\tpush();\n\t\t},\n\t\tstopSound({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'sound').stop();\n\t\t\tpush();\n\t\t},\n\t\tvoice({ ctx, push }, [source]) {\n\t\t\tconst lang = getLanguageFromStore(storageData);\n\t\t\tconst audioSource = isString(source) ? source : isAsset(source) ? source : source[lang];\n\n\t\t\t/**\n\t\t\t * We allow ignoring voice because it is okay to not have voiceover for certain languages\n\t\t\t */\n\t\t\tif (!audioSource) {\n\t\t\t\tpush();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tctx.audio.voice(unwrapAudioAsset(audioSource), paused);\n\t\t\tpush();\n\t\t},\n\t\tstopVoice({ ctx, push }) {\n\t\t\tctx.audio.voiceStop();\n\t\t\tpush();\n\t\t},\n\t\tshowCharacter({ ctx, push }, [character, emotion, className, style]) {\n\t\t\temotion ??= defaultEmotions[character];\n\n\t\t\tif (DEV && !emotion) {\n\t\t\t\tthrow new Error(`Attemp to show character \"${character}\" without emotion provided.`);\n\t\t\t}\n\n\t\t\tif (!emotion) return;\n\n\t\t\tif (DEV && !characters[character].emotions[emotion]) {\n\t\t\t\tthrow new Error(`Attempt to show character \"${character}\" with unknown emotion \"${emotion}\"`);\n\t\t\t}\n\n\t\t\tconst handle = ctx.character(character);\n\n\t\t\thandle.append(className, style, ctx.meta.restoring);\n\t\t\thandle.emotion(emotion, true);\n\n\t\t\tpush();\n\t\t},\n\t\thideCharacter({ ctx, push }, [character, className, style, duration]) {\n\t\t\tctx.character(character).remove(className, style, duration, ctx.meta.restoring).then(push);\n\t\t},\n\t\tdialog({ ctx, data, forward }, [character, content, emotion]) {\n\t\t\tconst name = getCharacterName(character);\n\t\t\tconst stack = useStack(ctx);\n\n\t\t\t/**\n\t\t\t * For each \"dialog\" we save copy of current game state\n\t\t\t * It's used for dialog overview\n\t\t\t */\n\t\t\tif (!ctx.meta.restoring && !ctx.meta.goingBack) {\n\t\t\t\tstack.value[3].push(clone(data));\n\t\t\t}\n\n\t\t\tctx.clearBlockingActions('dialog');\n\n\t\t\tctx.dialog(templateReplace(content, data), templateReplace(name, data), character, emotion, forward);\n\t\t},\n\t\tfunction({ ctx, push }, [fn]) {\n\t\t\tconst { restoring, goingBack, preview } = ctx.meta;\n\n\t\t\tconst result = fn({\n\t\t\t\tlang: getLanguageFromStore(storageData),\n\t\t\t\tgoingBack,\n\t\t\t\trestoring,\n\t\t\t\tpreview,\n\t\t\t\tstate: getStateFunction(ctx),\n\t\t\t});\n\n\t\t\tif (!ctx.meta.restoring) {\n\t\t\t\tresult ? result.then(push) : push();\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\t\tchoice({ ctx, data }, [question, ...choices]) {\n\t\t\tconst isWithoutQuestion = Array.isArray(question);\n\n\t\t\tif (isWithoutQuestion) {\n\t\t\t\t/**\n\t\t\t\t * Can be string or a choice\n\t\t\t\t */\n\t\t\t\tchoices.unshift(question as unknown as ActionChoiceChoice<string, State>);\n\n\t\t\t\t/**\n\t\t\t\t * Omitted then\n\t\t\t\t */\n\t\t\t\tquestion = '';\n\t\t\t}\n\n\t\t\tconst transformedChoices = choices.map(([content, _children, active, visible, onSelect, image]) => {\n\t\t\t\tconst active$ = store(false);\n\t\t\t\tconst visible$ = store(false);\n\n\t\t\t\tconst lang = getLanguageFromStore(storageData);\n\n\t\t\t\tconst getCheckValue = (fn: ChoiceCheckFunction<string, State> | undefined) => {\n\t\t\t\t\t// If there is no explicit \"no\" choice will be active or visible, etc...\n\t\t\t\t\tif (!fn) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Here we need to use \"fresh\" state instead of \"data\" parameter\n\t\t\t\t\treturn fn({\n\t\t\t\t\t\tlang,\n\t\t\t\t\t\tstate: getStateAtCtx(ctx),\n\t\t\t\t\t});\n\t\t\t\t};\n\n\t\t\t\tconst update = () => {\n\t\t\t\t\tactive$.set(getCheckValue(active));\n\t\t\t\t\tvisible$.set(getCheckValue(visible));\n\t\t\t\t};\n\n\t\t\t\tupdate();\n\n\t\t\t\tconst onSelectGuarded = onSelect || noop;\n\t\t\t\tconst onSelectWrapped = () => {\n\t\t\t\t\tonSelectGuarded({\n\t\t\t\t\t\trecompute: update,\n\t\t\t\t\t});\n\t\t\t\t};\n\n\t\t\t\tconst imageValue = image ? unwrapImageAsset(image) : '';\n\n\t\t\t\treturn [templateReplace(content, data), active$, visible$, onSelectWrapped, imageValue] as [\n\t\t\t\t\tstring,\n\t\t\t\t\tStored<boolean>,\n\t\t\t\t\tStored<boolean>,\n\t\t\t\t\t() => void,\n\t\t\t\t\tstring,\n\t\t\t\t];\n\t\t\t});\n\n\t\t\tif (DEV && transformedChoices.length === 0) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Running choice without variants to choose from, look at how to use Choice action properly [https://novely.pages.dev/guide/actions/choice#usage]`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tctx.clearBlockingActions('choice');\n\n\t\t\tctx.choices(templateReplace(question, data), transformedChoices, (selected) => {\n\t\t\t\tif (!ctx.meta.preview) {\n\t\t\t\t\tenmemory(ctx);\n\t\t\t\t}\n\n\t\t\t\tconst stack = useStack(ctx);\n\n\t\t\t\t/**\n\t\t\t\t * If there is a question, then `index` should be shifted by `1`\n\t\t\t\t */\n\t\t\t\tconst offset = isWithoutQuestion ? 0 : 1;\n\n\t\t\t\tif (DEV && !transformedChoices[selected]) {\n\t\t\t\t\tthrow new Error('Choice children is empty, either add content there or make item not selectable');\n\t\t\t\t}\n\n\t\t\t\tstack.value[0].push(['choice', selected + offset], [null, 0]);\n\t\t\t\trender(ctx);\n\t\t\t\tinteractivity(true);\n\t\t\t});\n\t\t},\n\t\tjump({ ctx, data }, [scene]) {\n\t\t\tconst stack = useStack(ctx);\n\n\t\t\t/**\n\t\t\t * `-1` index is used here because `clear` will run `next` that will increase index to `0`\n\t\t\t */\n\t\t\tstack.value[0] = [\n\t\t\t\t['jump', scene],\n\t\t\t\t[null, -1],\n\t\t\t];\n\n\t\t\tstack.value[3] = [];\n\n\t\t\tmatch('clear', [], {\n\t\t\t\tctx,\n\t\t\t\tdata,\n\t\t\t});\n\t\t},\n\t\tclear({ ctx, push }, [keep, characters, audio]) {\n\t\t\t/**\n\t\t\t * Remove vibration\n\t\t\t */\n\t\t\tctx.vibrate(0);\n\n\t\t\t/**\n\t\t\t * Call the actual `clear`\n\t\t\t */\n\t\t\tctx.clear(\n\t\t\t\tkeep || EMPTY_SET,\n\t\t\t\tcharacters || EMPTY_SET,\n\t\t\t\taudio || { music: EMPTY_SET, sounds: EMPTY_SET },\n\t\t\t\tpush,\n\t\t\t);\n\t\t},\n\t\tcondition({ ctx, data }, [condition, variants]) {\n\t\t\tif (DEV && Object.values(variants).length === 0) {\n\t\t\t\tthrow new Error(`Attempt to use Condition action with empty variants object`);\n\t\t\t}\n\n\t\t\tif (!ctx.meta.restoring) {\n\t\t\t\tconst val = String(condition(data));\n\n\t\t\t\tif (DEV && !variants[val]) {\n\t\t\t\t\tthrow new Error(`Attempt to go to unknown variant \"${val}\"`);\n\t\t\t\t}\n\n\t\t\t\tif (DEV && variants[val].length === 0) {\n\t\t\t\t\tthrow new Error(`Attempt to go to empty variant \"${val}\"`);\n\t\t\t\t}\n\n\t\t\t\tconst stack = useStack(ctx);\n\n\t\t\t\tstack.value[0].push(['condition', val], [null, 0]);\n\n\t\t\t\trender(ctx);\n\t\t\t}\n\t\t},\n\t\tend({ ctx }) {\n\t\t\tif (ctx.meta.preview) return;\n\n\t\t\texit(true, false);\n\t\t},\n\t\tinput({ ctx, data, forward }, [question, onInput, setup]) {\n\t\t\tctx.clearBlockingActions('input');\n\n\t\t\tctx.input(templateReplace(question, data), onInput, setup || noop, forward);\n\t\t},\n\t\tcustom({ ctx, push }, [fn]) {\n\t\t\tif (fn.requireUserAction) {\n\t\t\t\tctx.clearBlockingActions(undefined);\n\t\t\t}\n\n\t\t\tconst state = getStateFunction(ctx);\n\t\t\tconst lang = getLanguageFromStore(storageData);\n\n\t\t\tconst result = handleCustomAction(ctx, fn, {\n\t\t\t\t...ctx.custom(fn),\n\t\t\t\tstate,\n\t\t\t\tlang,\n\t\t\t\tgetStack: useStack,\n\t\t\t\tpaused,\n\t\t\t\ttemplateReplace,\n\t\t\t});\n\n\t\t\tconst next = () => {\n\t\t\t\tif (fn.requireUserAction && !ctx.meta.preview) {\n\t\t\t\t\tenmemory(ctx);\n\t\t\t\t\tinteractivity(true);\n\t\t\t\t}\n\n\t\t\t\tpush();\n\t\t\t};\n\n\t\t\tif (!ctx.meta.restoring || ctx.meta.goingBack) {\n\t\t\t\tif (isPromise(result)) {\n\t\t\t\t\tresult.then(next);\n\t\t\t\t} else {\n\t\t\t\t\tnext();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\t\tvibrate({ ctx, push }, pattern) {\n\t\t\tctx.vibrate(pattern);\n\t\t\tpush();\n\t\t},\n\t\tnext({ push }) {\n\t\t\tpush();\n\t\t},\n\t\tanimateCharacter({ ctx, push }, [character, className]) {\n\t\t\tconst classes = className.split(' ');\n\n\t\t\tif (DEV && classes.length === 0) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Attempt to use AnimateCharacter without classes. Classes should be provided [https://novely.pages.dev/guide/actions/animateCharacter.html]',\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (ctx.meta.preview) return;\n\n\t\t\tctx.character(character).animate(classes);\n\n\t\t\tpush();\n\t\t},\n\t\ttext({ ctx, data, forward }, text) {\n\t\t\tconst string = text.map((content) => templateReplace(content, data)).join(' ');\n\n\t\t\tif (DEV && string.length === 0) {\n\t\t\t\tthrow new Error(`Action Text was called with empty string or array`);\n\t\t\t}\n\n\t\t\tctx.clearBlockingActions('text');\n\n\t\t\tctx.text(string, forward);\n\t\t},\n\t\tasync exit({ ctx, data }) {\n\t\t\tif (ctx.meta.restoring) return;\n\n\t\t\tconst { exitImpossible } = await exitPath({\n\t\t\t\tpath: useStack(ctx).value[0],\n\t\t\t\trefer: referGuarded,\n\t\t\t\tonExitImpossible: () => {\n\t\t\t\t\tmatch('end', [], {\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\tdata,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (exitImpossible) {\n\t\t\t\tctx.clearBlockingActions(undefined);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\trender(ctx);\n\t\t},\n\t\tpreload({ ctx, push }, [source]) {\n\t\t\tif (DEV && preloadAssets !== 'lazy') {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`You do not need a preload action because \"preloadAssets\" strategy was set to \"${preloadAssets}\"`,\n\t\t\t\t);\n\n\t\t\t\tpush();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst src = unwrapAsset(source);\n\n\t\t\tif (!ctx.meta.goingBack && !ctx.meta.restoring && !PRELOADED_ASSETS.has(src)) {\n\t\t\t\tconst process = async () => {\n\t\t\t\t\tconst type = isAsset(source) ? source.type : await getResourseTypeWrapper(src);\n\n\t\t\t\t\tif (type === 'image') {\n\t\t\t\t\t\trenderer.misc.preloadAudioBlocking(src);\n\t\t\t\t\t} else if (type === 'audio') {\n\t\t\t\t\t\trenderer.misc.preloadImage(src);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (DEV) {\n\t\t\t\t\t\t\tconsole.error(`Preload error: Unknown type of the following resource: `, source);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Add to preloaded before it was loaded to prevent downloading multiple times\n\t\t\t\t\tPRELOADED_ASSETS.add(src);\n\t\t\t\t};\n\n\t\t\t\tprocess();\n\t\t\t}\n\n\t\t\tpush();\n\t\t},\n\t\tblock({ ctx }, [scene]) {\n\t\t\tif (DEV && !story[scene]) {\n\t\t\t\tthrow new Error(`Attempt to call Block action with unknown scene \"${scene}\"`);\n\t\t\t}\n\n\t\t\tif (DEV && story[scene].length === 0) {\n\t\t\t\tthrow new Error(`Attempt to call Block action with empty scene \"${scene}\"`);\n\t\t\t}\n\n\t\t\tif (!ctx.meta.restoring) {\n\t\t\t\tconst stack = useStack(ctx);\n\n\t\t\t\tstack.value[0].push(['block', scene], [null, 0]);\n\n\t\t\t\trender(ctx);\n\t\t\t}\n\t\t},\n\t});\n\t// #endregion\n\n\t// #region Action\n\tconst action = buildActionObject({\n\t\trendererActions: renderer.actions,\n\t\tnativeActions,\n\t\tcharacters,\n\t});\n\t// #endregion\n\n\t// #region Render Function\n\tconst render = async (ctx: Context) => {\n\t\tconst stack = useStack(ctx);\n\t\tconst [path, state] = stack.value;\n\n\t\tconst { found, value } = await refer(path);\n\n\t\tif (found) {\n\t\t\tctx.loading(true);\n\t\t}\n\n\t\tconst referred = await value;\n\n\t\tif (found) {\n\t\t\tctx.loading(false);\n\t\t}\n\n\t\tif (isAction(referred)) {\n\t\t\tconst [action, ...props] = referred;\n\n\t\t\tmatch(action, props, {\n\t\t\t\tctx,\n\t\t\t\tdata: state,\n\t\t\t});\n\t\t} else if (Object.values(story).some((branch) => branch === referred)) {\n\t\t\t/**\n\t\t\t * Developer might not write the end action on their own, so we will catch situation when there are no other options than end the game.\n\t\t\t *\n\t\t\t * There are three options right now.\n\t\t\t * - We've got to the action — gonna render it\n\t\t\t * - We've got `undefined`. This means we are tried to go forward, but story array ended already, so we are gonna run exit\n\t\t\t * - We've got branch of story object. This means we exitied from where it's possible to exit and now we can only end the game\n\t\t\t */\n\t\t\tmatch('end', [], {\n\t\t\t\tctx,\n\t\t\t\tdata: state,\n\t\t\t});\n\t\t} else {\n\t\t\tmatch('exit', [], {\n\t\t\t\tctx,\n\t\t\t\tdata: state,\n\t\t\t});\n\t\t}\n\t};\n\t// #endregion\n\n\tconst interactivity = (value = false) => {\n\t\tinteracted = value ? interacted + 1 : 0;\n\t};\n\n\t/**\n\t * Replaces content inside of {{braces}}.\n\t */\n\tconst templateReplace = (content: TextContent<$Language, Data>, values?: Data) => {\n\t\tconst {\n\t\t\tdata,\n\t\t\tmeta: [lang],\n\t\t} = storageData.get();\n\n\t\t// Object to take values from\n\t\tconst obj = values || data;\n\n\t\t// String\n\t\tconst str = flattenAllowedContent(!isFunction(content) && !isString(content) ? content[lang] : content, obj);\n\n\t\tconst t = translation[lang];\n\t\tconst pluralRules = (t.plural || t.actions) && new Intl.PluralRules(t.tag || lang);\n\n\t\treturn replaceTranslation(str, obj, t.plural, t.actions, pluralRules);\n\t};\n\n\tconst data = ((value) => {\n\t\tconst _data = storageData.get().data;\n\n\t\tif (!value) return _data;\n\n\t\tconst val = isFunction(value) ? value(_data) : deepmerge(_data, value as $Data);\n\n\t\tstorageData.update((prev) => {\n\t\t\tprev.data = val;\n\n\t\t\treturn prev;\n\t\t});\n\n\t\treturn undefined;\n\t}) as StateFunction<$Data>;\n\n\tconst getCurrentStorageData = () => {\n\t\treturn coreData.get().dataLoaded ? clone(storageData.get()) : null;\n\t};\n\n\tconst setStorageData = (data: StorageData<$Language, $Data>) => {\n\t\tif (destroyed) {\n\t\t\tif (DEV) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`function \\`setStorageData\\` was called after novely instance was destroyed. Data is not updater nor synced after destroy.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tstorageData.set(data);\n\t};\n\n\t// #region Function Return\n\treturn {\n\t\t/**\n\t\t * Function to set game script\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * engine.script({\n\t\t * start: [\n\t\t * action.function(() => {})\n\t\t * ]\n\t\t * })\n\t\t * ```\n\t\t */\n\t\tscript,\n\t\t/**\n\t\t * Get actions\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * engine.script({\n\t\t * start: [\n\t\t * action.function(() => {})\n\t\t * ]\n\t\t * })\n\t\t * ```\n\t\t */\n\t\taction: action as Actions,\n\t\t/**\n\t\t * State bound to `$MAIN` game context\n\t\t * @deprecated Use `state` function provided from action arguments\n\t\t */\n\t\tstate: getStateFunction(MAIN_CONTEXT_KEY),\n\t\t/**\n\t\t * Store data between games\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * engine.script({\n\t\t * start: [\n\t\t * action.function(() => {\n\t\t * // Paid content should be purchased only once\n\t\t * // So it will be available in any save\n\t\t * data({ paid_content_purchased: true })\n\t\t * })\n\t\t * ]\n\t\t * })\n\t\t * ```\n\t\t */\n\t\tdata,\n\t\t/**\n\t\t * Used in combination with type utilities\n\t\t * @deprecated Use `engine.types` instead\n\t\t * @example\n\t\t * ```ts\n\t\t * import type { ConditionParams, StateFunction } from '@novely/core';\n\t\t *\n\t\t * const conditionCheck = (state: StateFunction<ConditionParams<typeof engine.typeEssintials>>) => {\n\t\t * return state.age >= 18;\n\t\t * }\n\t\t * ```\n\t\t */\n\t\ttypeEssentials: {} as TypeEssentials<$Language, $State, $Data, $Characters>,\n\t\t/**\n\t\t * Used in combination with type utilities\n\t\t * @example\n\t\t * ```ts\n\t\t * import type { TypesFromEngine, ConditionParams, StateFunction } from '@novely/core';\n\t\t *\n\t\t * type Types = TypesFromEngine<typeof engine>;\n\t\t *\n\t\t * const conditionCheck = (state: StateFunction<ConditionParams<Types>>) => {\n\t\t * return state.age >= 18;\n\t\t * }\n\t\t * ```\n\t\t */\n\t\ttypes: null as EngineTypes<$Language, $State, $Data, $Characters> | null,\n\t\t/**\n\t\t * Replaces content inside {{braces}} using global data\n\t\t * @example\n\t\t * ```ts\n\t\t * data({ name: 'Alexei' })\n\t\t *\n\t\t * templateReplace('{{name}} is our hero')\n\t\t * templateReplace({\n\t\t * en: (data) => 'Hello, ' + data.name\n\t\t * })\n\t\t * ```\n\t\t */\n\t\ttemplateReplace(content: TextContent<$Language, $Data>) {\n\t\t\treturn templateReplace(content as TextContent<$Language, Data>);\n\t\t},\n\t\t/**\n\t\t * Same as `templateReplace` but uses state and requires explicitly providing it\n\t\t */\n\t\ttemplateReplaceState(content: TextContent<$Language, $State>, state: State) {\n\t\t\treturn templateReplace(content as TextContent<$Language, State>, state);\n\t\t},\n\t\t/**\n\t\t * Cancel data loading, hide UI, ignore page change events\n\t\t * Data updates still will work in case Novely already was loaded\n\t\t */\n\t\tdestroy() {\n\t\t\tif (destroyed) return;\n\n\t\t\tdataLoaded.cancel();\n\n\t\t\tUIInstance.unmount();\n\n\t\t\tremoveEventListener('beforeunload', throttledShortOnStorageDataChange);\n\n\t\t\tdestroyed = true;\n\t\t},\n\t\t/**\n\t\t * Funtion to get current storage data\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * const currentStorageData = engine.getCurrentStorageData();\n\t\t * ```\n\t\t */\n\t\tgetCurrentStorageData,\n\t\t/**\n\t\t * Function to set storage data. Using this function is not recommended.\n\t\t *\n\t\t * @deprecated\n\t\t * @example\n\t\t * ```ts\n\t\t * const currentStorageData = engine.getCurrentStorageData();\n\t\t *\n\t\t * if (currentStorageData) {\n\t\t * // update music volume\n\t\t * currentStorageData.meta[2] = 1;\n\t\t *\n\t\t * setStorageData(currentStorageData)\n\t\t * }\n\t\t * ```\n\t\t */\n\t\tsetStorageData,\n\t\t/**\n\t\t * Function to control paused state. Custom Actions are provided with `paused` store they can subscribe to.\n\t\t * This function will notify Custom Actions. Pause state can be used when showing ads.\n\t\t * @example\n\t\t * ```ts\n\t\t * sdk.on('pause' () => engine.setPaused(true));\n\t\t * sdk.on('resume', () => engine.setPaused(false));\n\t\t * ```\n\t\t */\n\t\tsetPaused: (paused: boolean) => {\n\t\t\tcoreData.update((prev) => {\n\t\t\t\tprev.paused = paused;\n\n\t\t\t\treturn prev;\n\t\t\t});\n\t\t},\n\t\t/**\n\t\t * Function to control focused state. It will affect `paused` store passed to Custom Actions.\n\t\t * This function can be used to pause game when it's not focused.\n\t\t * @example\n\t\t * ```ts\n\t\t * import { pauseOnBlur } from '@novely/core';\n\t\t *\n\t\t * // Will subscribe to blur/focus events and call `setFocused`\n\t\t * pauseOnBlur(engine);\n\t\t *\n\t\t * // OR\n\t\t *\n\t\t * sdk.on('focus' () => engine.setFocused(true));\n\t\t * sdk.on('blur', () => engine.setFocused(false));\n\t\t * ```\n\t\t */\n\t\tsetFocused: (focused: boolean) => {\n\t\t\tcoreData.update((prev) => {\n\t\t\t\tprev.focused = focused;\n\n\t\t\t\treturn prev;\n\t\t\t});\n\t\t},\n\t};\n\t// #endregion\n};\n\nexport { novely };\n","function set(obj, key, val) {\n\tif (typeof val.value === 'object') val.value = klona(val.value);\n\tif (!val.enumerable || val.get || val.set || !val.configurable || !val.writable || key === '__proto__') {\n\t\tObject.defineProperty(obj, key, val);\n\t} else obj[key] = val.value;\n}\n\nexport function klona(x) {\n\tif (typeof x !== 'object') return x;\n\n\tvar i=0, k, list, tmp, str=Object.prototype.toString.call(x);\n\n\tif (str === '[object Object]') {\n\t\ttmp = Object.create(x.__proto__ || null);\n\t} else if (str === '[object Array]') {\n\t\ttmp = Array(x.length);\n\t} else if (str === '[object Set]') {\n\t\ttmp = new Set;\n\t\tx.forEach(function (val) {\n\t\t\ttmp.add(klona(val));\n\t\t});\n\t} else if (str === '[object Map]') {\n\t\ttmp = new Map;\n\t\tx.forEach(function (val, key) {\n\t\t\ttmp.set(klona(key), klona(val));\n\t\t});\n\t} else if (str === '[object Date]') {\n\t\ttmp = new Date(+x);\n\t} else if (str === '[object RegExp]') {\n\t\ttmp = new RegExp(x.source, x.flags);\n\t} else if (str === '[object DataView]') {\n\t\ttmp = new x.constructor( klona(x.buffer) );\n\t} else if (str === '[object ArrayBuffer]') {\n\t\ttmp = x.slice(0);\n\t} else if (str.slice(-6) === 'Array]') {\n\t\t// ArrayBuffer.isView(x)\n\t\t// ~> `new` bcuz `Buffer.slice` => ref\n\t\ttmp = new x.constructor(x);\n\t}\n\n\tif (tmp) {\n\t\tfor (list=Object.getOwnPropertySymbols(x); i < list.length; i++) {\n\t\t\tset(tmp, list[i], Object.getOwnPropertyDescriptor(x, list[i]));\n\t\t}\n\n\t\tfor (i=0, list=Object.getOwnPropertyNames(x); i < list.length; i++) {\n\t\t\tif (Object.hasOwnProperty.call(tmp, k=list[i]) && tmp[k] === x[k]) continue;\n\t\t\tset(tmp, k, Object.getOwnPropertyDescriptor(x, k));\n\t\t}\n\t}\n\n\treturn tmp || x;\n}\n","import type { TypewriterSpeed } from './types';\n\nconst SKIPPED_DURING_RESTORE = new Set(['dialog', 'choice', 'input', 'vibrate', 'text'] as const);\n\nconst BLOCK_EXIT_STATEMENTS = new Set(['choice:exit', 'condition:exit', 'block:exit'] as const);\n\nconst BLOCK_STATEMENTS = new Set(['choice', 'condition', 'block'] as const);\n\nconst AUDIO_ACTIONS = new Set(['playMusic', 'stopMusic', 'playSound', 'stopSound', 'voice', 'stopVoice'] as const);\n\nconst EMPTY_SET = new Set<any>();\n\nconst DEFAULT_TYPEWRITER_SPEED: TypewriterSpeed = 'Medium';\n\nconst HOWLER_SUPPORTED_FILE_FORMATS = new Set([\n\t'mp3',\n\t'mpeg',\n\t'opus',\n\t'ogg',\n\t'oga',\n\t'wav',\n\t'aac',\n\t'caf',\n\t'm4a',\n\t'm4b',\n\t'mp4',\n\t'weba',\n\t'webm',\n\t'dolby',\n\t'flac',\n] as const);\n\nconst SUPPORTED_IMAGE_FILE_FORMATS = new Set([\n\t'apng',\n\t'avif',\n\t'gif',\n\t'jpg',\n\t'jpeg',\n\t'jfif',\n\t'pjpeg',\n\t'pjp',\n\t'png',\n\t'svg',\n\t'webp',\n\t'bmp',\n] as const);\n\n/**\n * @internal\n */\nconst MAIN_CONTEXT_KEY = '$MAIN';\n\nexport {\n\tSKIPPED_DURING_RESTORE,\n\tEMPTY_SET,\n\tDEFAULT_TYPEWRITER_SPEED,\n\tBLOCK_EXIT_STATEMENTS,\n\tBLOCK_STATEMENTS,\n\tMAIN_CONTEXT_KEY,\n\tAUDIO_ACTIONS,\n\tHOWLER_SUPPORTED_FILE_FORMATS,\n\tSUPPORTED_IMAGE_FILE_FORMATS,\n};\n","import type { CustomActionHolder } from './custom-action';\nimport type { StackHolder } from './types';\n\n/**\n * @internal\n */\nconst STACK_MAP = new Map<string, StackHolder>();\n\n/**\n * @internal\n */\nconst CUSTOM_ACTION_MAP = new Map<string, CustomActionHolder>();\n\nconst PRELOADED_ASSETS = new Set<string>();\nconst ASSETS_TO_PRELOAD = new Set<string>();\n\nexport { PRELOADED_ASSETS, ASSETS_TO_PRELOAD, STACK_MAP, CUSTOM_ACTION_MAP };\n","import type { ValidAction, CustomHandler } from '../action';\nimport type { NovelyAsset } from '../types';\nimport { AUDIO_ACTIONS, BLOCK_EXIT_STATEMENTS, BLOCK_STATEMENTS, SKIPPED_DURING_RESTORE } from '../constants';\n\nconst isNumber = (val: unknown): val is number => {\n\treturn typeof val === 'number';\n};\n\nconst isNull = (val: unknown): val is null => {\n\treturn val === null;\n};\n\nconst isString = (val: unknown): val is string => {\n\treturn typeof val === 'string';\n};\n\nconst isFunction = (val: unknown): val is (...parameters: any[]) => any => {\n\treturn typeof val === 'function';\n};\n\nconst isPromise = (val: unknown): val is Promise<any> => {\n\treturn Boolean(val) && (typeof val === 'object' || isFunction(val)) && isFunction((val as any).then);\n};\n\nconst isEmpty = (val: unknown): val is Record<PropertyKey, never> => {\n\treturn typeof val === 'object' && !isNull(val) && Object.keys(val).length === 0;\n};\n\n/**\n * Checks if a given string starts with 'http', '/', '.', or 'data'\n */\nconst isCSSImageURL = (url: string): boolean => {\n\tconst startsWith = String.prototype.startsWith.bind(url);\n\n\treturn startsWith('http') || startsWith('/') || startsWith('.') || startsWith('data');\n};\n\n/**\n * Determines if a given action requires user interaction based on its type and metadata.\n */\nconst isUserRequiredAction = ([action, ...meta]: ValidAction) => {\n\treturn Boolean(action === 'custom' && meta[0] && (meta[0] as unknown as CustomHandler).requireUserAction);\n};\n\nconst isBlockStatement = (statement: unknown): statement is 'choice' | 'condition' | 'block' => {\n\treturn BLOCK_STATEMENTS.has(statement as any);\n};\n\nconst isBlockExitStatement = (\n\tstatement: unknown,\n): statement is 'choice:exit' | 'condition:exit' | 'block:exit' => {\n\treturn BLOCK_EXIT_STATEMENTS.has(statement as any);\n};\n\nconst isSkippedDuringRestore = (item: unknown): item is 'vibrate' | 'dialog' | 'input' | 'choice' | 'text' => {\n\treturn SKIPPED_DURING_RESTORE.has(item as any);\n};\n\ntype AudioActionName = 'playMusic' | 'stopMusic' | 'playSound' | 'stopSound' | 'voice' | 'stopVoice';\n\nconst isAudioAction = (action: unknown): action is AudioActionName => {\n\treturn AUDIO_ACTIONS.has(action as any);\n};\n\nconst isAction = (element: unknown): element is Exclude<ValidAction, ValidAction[]> => {\n\treturn Array.isArray(element) && isString(element[0]);\n};\n\nconst isImageAsset = (asset: unknown): asset is string => {\n\treturn isString(asset) && isCSSImageURL(asset);\n};\n\n/**\n * Is custom and requires user action or skipped during restoring\n */\nconst isBlockingAction = (action: Exclude<ValidAction, ValidAction[]>) => {\n\treturn isUserRequiredAction(action) || (isSkippedDuringRestore(action[0]) && action[0] !== 'vibrate');\n};\n\nconst isAsset = (suspect: unknown): suspect is NovelyAsset => {\n\treturn suspect !== null && typeof suspect === 'object' && 'source' in suspect && 'type' in suspect;\n};\n\nexport {\n\tisNumber,\n\tisNull,\n\tisString,\n\tisFunction,\n\tisPromise,\n\tisEmpty,\n\tisCSSImageURL,\n\tisUserRequiredAction,\n\tisBlockStatement,\n\tisBlockExitStatement,\n\tisSkippedDuringRestore,\n\tisAudioAction,\n\tisAction,\n\tisImageAsset,\n\tisBlockingAction,\n\tisAsset,\n};\n\nexport type { AudioActionName };\n","import type { CustomHandler, DefaultActionProxy } from '../action';\nimport type { Thenable, State } from '../types';\nimport type { Context } from '../renderer';\n\ntype MatchActionParams = {\n\tdata: State;\n\tctx: Context;\n\n\tpush: () => void;\n\tforward: () => void;\n};\n\ntype MatchActionMap = {\n\t[Key in keyof DefaultActionProxy]: (\n\t\tparams: MatchActionParams,\n\t\tdata: Parameters<DefaultActionProxy[Key]>,\n\t) => void;\n};\n\ntype MatchActionMapComplete = Omit<MatchActionMap, 'custom'> & {\n\tcustom: (params: MatchActionParams, value: [handler: CustomHandler]) => Thenable<void>;\n};\n\ntype MatchActionParameters = {\n\t/**\n\t * Name of context or context\n\t */\n\tctx: string | Context;\n\t/**\n\t * Data from the save\n\t */\n\tdata: State;\n};\n\ntype OnBeforeActionCallPayload = {\n\taction: keyof MatchActionMapComplete;\n\tprops: Parameters<DefaultActionProxy[keyof MatchActionMapComplete]>;\n\tctx: Context;\n};\n\ntype MatchActionHandlers = {\n\tpush: (ctx: Context) => void;\n\tforward: (ctx: Context) => void;\n\n\tgetContext: (name: string) => Context;\n\n\tonBeforeActionCall: (payload: OnBeforeActionCallPayload) => void;\n};\n\nconst matchAction = (callbacks: MatchActionHandlers, values: MatchActionMapComplete) => {\n\tconst { getContext, onBeforeActionCall, push, forward } = callbacks;\n\n\tconst match = (action: keyof MatchActionMapComplete, props: any, { ctx, data }: MatchActionParameters) => {\n\t\tconst context = typeof ctx === 'string' ? getContext(ctx) : ctx;\n\n\t\tonBeforeActionCall({\n\t\t\taction,\n\t\t\tprops,\n\t\t\tctx: context,\n\t\t});\n\n\t\treturn values[action](\n\t\t\t{\n\t\t\t\tctx: context,\n\t\t\t\tdata,\n\n\t\t\t\tpush() {\n\t\t\t\t\tif (context.meta.preview) return;\n\n\t\t\t\t\tpush(context);\n\t\t\t\t},\n\t\t\t\tforward() {\n\t\t\t\t\tif (context.meta.preview) return;\n\n\t\t\t\t\tforward(context);\n\t\t\t\t},\n\t\t\t},\n\t\t\tprops,\n\t\t);\n\t};\n\n\treturn {\n\t\tmatch,\n\t\tnativeActions: Object.keys(values),\n\t};\n};\n\nexport { matchAction };\nexport type { MatchActionHandlers, MatchActionMapComplete };\n","import { memoize, once } from 'es-toolkit/function';\nimport { DEV } from 'esm-env';\nimport { supportsMap as audioSupport } from './audio-codecs';\nimport { HOWLER_SUPPORTED_FILE_FORMATS, SUPPORTED_IMAGE_FILE_FORMATS } from './constants';\nimport { supportsMap as imageSupport } from './image-formats';\nimport type { NovelyAsset } from './types';\nimport { getUrlFileExtension, isAsset } from './utilities';\n\nconst generateRandomId = () => Math.random().toString(36);\n\n/**\n * Function to get assets type. All assets must be of the same type. Only works with supported types.\n */\nconst getType = memoize(\n\t(extensions: string[]) => {\n\t\tif (extensions.every((extension) => HOWLER_SUPPORTED_FILE_FORMATS.has(extension as any))) {\n\t\t\treturn 'audio';\n\t\t}\n\n\t\tif (extensions.every((extension) => SUPPORTED_IMAGE_FILE_FORMATS.has(extension as any))) {\n\t\t\treturn 'image';\n\t\t}\n\n\t\tthrow extensions;\n\t},\n\t{\n\t\tgetCacheKey: (extensions) => extensions.join('~'),\n\t},\n);\n\nconst SUPPORT_MAPS = {\n\timage: imageSupport,\n\taudio: audioSupport,\n} as const;\n\n/**\n * This function uses array instead of spread because memoize only works with first argument\n */\nconst assetPrivate = memoize(\n\t(variants: string[]): NovelyAsset => {\n\t\tif (DEV && variants.length === 0) {\n\t\t\tthrow new Error(`Attempt to use \"asset\" function without arguments`);\n\t\t}\n\n\t\tconst map: Record<string, string> = {};\n\t\tconst extensions: string[] = [];\n\n\t\tfor (const v of variants) {\n\t\t\tconst e = getUrlFileExtension(v);\n\n\t\t\tmap[e] = v;\n\t\t\textensions.push(e);\n\t\t}\n\n\t\tconst type = getType(extensions);\n\n\t\tconst getSource = once(() => {\n\t\t\tconst support = SUPPORT_MAPS[type];\n\n\t\t\tfor (const extension of extensions) {\n\t\t\t\tif (extension in support) {\n\t\t\t\t\tif (support[extension as keyof typeof support]) {\n\t\t\t\t\t\treturn map[extension];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\treturn map[extension];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (DEV) {\n\t\t\t\tthrow new Error(`No matching asset was found for ${variants.map((v) => `\"${v}\"`).join(', ')}`);\n\t\t\t}\n\n\t\t\treturn '';\n\t\t});\n\n\t\treturn {\n\t\t\tget source() {\n\t\t\t\treturn getSource();\n\t\t\t},\n\t\t\tget type() {\n\t\t\t\treturn type;\n\t\t\t},\n\t\t\tid: generateRandomId(),\n\t\t};\n\t},\n\t{\n\t\tgetCacheKey: (variants) => variants.join('~'),\n\t},\n);\n\n/**\n * Memoizes and returns an asset selection object based on provided file variants.\n * The selected asset depends on the client's support for various formats.\n *\n * @param {...string} variants - A variable number of strings, each representing a potential asset file URL.\n * @returns {NovelyAsset} An object representing the selected asset with `source` and `type` properties.\n *\n * @throws {Error} If in DEV mode and no arguments are provided.\n * @example\n * ```\n * import { asset } from 'novely';\n *\n * // Passed first have higher priority\n * const classroom = asset(\n * 'classroom.avif',\n * 'classroom.webp',\n * 'classroom.jpeg'\n * );\n *\n * setTimeout(() => {\n * console.log(classroom.source);\n * }, 100);\n * ```\n */\nconst asset = (...variants: string[]) => {\n\treturn assetPrivate(variants);\n};\n\nasset.image = (source: string): NovelyAsset => {\n\tif (assetPrivate.cache.has(source)) {\n\t\treturn assetPrivate.cache.get(source)!;\n\t}\n\n\tconst asset = {\n\t\ttype: 'image',\n\t\tsource,\n\t\tid: generateRandomId(),\n\t} as NovelyAsset;\n\n\tassetPrivate.cache.set(source, asset);\n\n\treturn asset;\n};\n\nasset.audio = (source: string): NovelyAsset => {\n\tif (assetPrivate.cache.has(source)) {\n\t\treturn assetPrivate.cache.get(source)!;\n\t}\n\n\tconst asset = {\n\t\ttype: 'audio',\n\t\tsource,\n\t\tid: generateRandomId(),\n\t} as NovelyAsset;\n\n\tassetPrivate.cache.set(source, asset);\n\n\treturn asset;\n};\n\nconst unwrapAsset = (asset: string | NovelyAsset) => {\n\treturn isAsset(asset) ? asset.source : asset;\n};\n\nconst unwrapAudioAsset = (asset: string | NovelyAsset) => {\n\tif (DEV && isAsset(asset) && asset.type !== 'audio') {\n\t\tthrow new Error('Attempt to use non-audio asset in audio action', { cause: asset });\n\t}\n\n\treturn unwrapAsset(asset);\n};\n\nconst unwrapImageAsset = (asset: string | NovelyAsset) => {\n\tif (DEV && isAsset(asset) && asset.type !== 'image') {\n\t\tthrow new Error('Attempt to use non-image asset in action that requires image assets', { cause: asset });\n\t}\n\n\treturn unwrapAsset(asset);\n};\n\nexport { asset, unwrapAsset, unwrapAudioAsset, unwrapImageAsset };\n","/**\n * This code is adapted from the Howler.js source code.\n * Howler.js: https://github.com/goldfire/howler.js\n */\n\n/**\n * I guess some browsers will return \"no\". So it's better to be safe\n */\nconst cut = (str: CanPlayTypeResult | 'no') => str.replace(/^no$/, '');\n\nconst audio = new Audio();\n\nconst canPlay = (type: string) => !!cut(audio.canPlayType(type));\nconst canPlayMultiple = (...types: string[]) => types.some((type) => canPlay(type));\n\nconst supportsMap = {\n\tmp3: canPlayMultiple('audio/mpeg;', 'audio/mp3;'),\n\tmpeg: canPlay('audio/mpeg;'),\n\topus: canPlay('audio/ogg; codecs=\"opus\"'),\n\togg: canPlay('audio/ogg; codecs=\"vorbis\"'),\n\toga: canPlay('audio/ogg; codecs=\"vorbis\"'),\n\twav: canPlayMultiple('audio/wav; codecs=\"1\"', 'audio/wav;'),\n\taac: canPlay('audio/aac;'),\n\tcaf: canPlay('audio/x-caf;'),\n\tm4a: canPlayMultiple('audio/x-m4a;', 'audio/m4a;', 'audio/aac;'),\n\tm4b: canPlayMultiple('audio/x-m4b;', 'audio/m4b;', 'audio/aac;'),\n\tmp4: canPlayMultiple('audio/x-mp4;', 'audio/mp4;', 'audio/aac;'),\n\tweba: canPlay('audio/webm; codecs=\"vorbis\"'),\n\twebm: canPlay('audio/webm; codecs=\"vorbis\"'),\n\tdolby: canPlay('audio/mp4; codecs=\"ec-3\"'),\n\tflac: canPlayMultiple('audio/x-flac;', 'audio/flac;'),\n};\n\nexport { supportsMap };\n","const avif =\n\t'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAAB0AAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAIAAAACAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQ0MAAAAABNjb2xybmNseAACAAIAAYAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAACVtZGF0EgAKCBgANogQEAwgMg8f8D///8WfhwB8+ErK42A=';\nconst jxl =\n\t'data:image/jxl;base64,/woIAAAMABKIAgC4AF3lEgAAFSqjjBu8nOv58kOHxbSN6wxttW1hSaLIODZJJ3BIEkkaoCUzGM6qJAE=';\nconst webp =\n\t'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA';\n\nconst supportsFormat = (source: string) => {\n\tconst { promise, resolve } = Promise.withResolvers<boolean>();\n\n\tconst img = Object.assign(document.createElement('img'), {\n\t\tsrc: source,\n\t});\n\n\timg.onload = img.onerror = () => {\n\t\tresolve(img.height === 2);\n\t};\n\n\treturn promise;\n};\n\nconst supportsMap = {\n\tavif: false,\n\tjxl: false,\n\twebp: false,\n};\n\nconst formatsMap = {\n\tavif,\n\tjxl,\n\twebp,\n} as const;\n\nconst loadImageFormatsSupport = async () => {\n\tconst promises = [];\n\n\tfor (const [format, source] of Object.entries(formatsMap)) {\n\t\tconst promise = supportsFormat(source).then((supported) => {\n\t\t\tsupportsMap[format as keyof typeof supportsMap] = supported;\n\t\t});\n\n\t\tpromises.push(promise);\n\t}\n\n\tawait Promise.all(promises);\n};\n\nloadImageFormatsSupport();\n\nexport { supportsMap };\n","import type { Story, ValidAction, CustomHandler, GetActionParameters } from '../action';\nimport type { CloneFN, Path, PathItem, Thenable } from '../types';\nimport type { NovelyAsset } from '../types';\nimport {\n\tisNull,\n\tisNumber,\n\tisAction,\n\tisSkippedDuringRestore,\n\tisUserRequiredAction,\n\tisPromise,\n\tisBlockExitStatement,\n\tisBlockStatement,\n\tisBlockingAction,\n} from './assertions';\nimport { unwrapAsset } from '../asset';\nimport { DEV } from 'esm-env';\n\n// #region Is Exit Impossible\nconst isExitImpossible = (path: Path) => {\n\tconst blockStatements = path.filter(([item]) => isBlockStatement(item));\n\tconst blockExitStatements = path.filter(([item]) => isBlockExitStatement(item));\n\n\t/**\n\t * There were no blocks nor exits from blocks\n\t */\n\tif (blockStatements.length === 0 && blockExitStatements.length === 0) {\n\t\treturn true;\n\t}\n\n\t/**\n\t * There is block that can be exited\n\t */\n\tif (blockStatements.length > blockExitStatements.length) {\n\t\treturn false;\n\t}\n\n\treturn !blockExitStatements.every(([name], i) => name && name.startsWith(blockStatements[i][0]!));\n};\n// #endregion\n\n// #region Refer\ntype CreateReferFunctionParams = {\n\tstory: Story;\n\tonUnknownSceneHit: (scene: string) => Thenable<void>;\n};\n\nconst createReferFunction = ({ story, onUnknownSceneHit }: CreateReferFunctionParams) => {\n\tconst refer = async (path: Path) => {\n\t\t/**\n\t\t * Are we ready to return a value.\n\t\t * We need to know are there any \"unknown\" scenes or not\n\t\t */\n\t\tconst { promise: ready, resolve: setReady } = Promise.withResolvers<boolean>();\n\n\t\tlet current: any = story;\n\t\tlet precurrent: any = story;\n\n\t\tconst blocks: any[] = [];\n\n\t\tconst refer = async () => {\n\t\t\tfor (const [type, val] of path) {\n\t\t\t\tif (type === 'jump') {\n\t\t\t\t\tif (!current[val]) {\n\t\t\t\t\t\tsetReady(true);\n\t\t\t\t\t\tawait onUnknownSceneHit(val);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (DEV && !story[val]) {\n\t\t\t\t\t\tthrow new Error(`Attempt to jump to unknown scene \"${val}\"`);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (DEV && story[val].length === 0) {\n\t\t\t\t\t\tthrow new Error(`Attempt to jump to empty scene \"${val}\"`);\n\t\t\t\t\t}\n\n\t\t\t\t\tprecurrent = story;\n\t\t\t\t\tcurrent = current[val];\n\t\t\t\t} else if (type === null) {\n\t\t\t\t\tprecurrent = current;\n\t\t\t\t\tcurrent = current[val];\n\t\t\t\t} else if (type === 'choice') {\n\t\t\t\t\tblocks.push(precurrent);\n\t\t\t\t\tcurrent = current[(val as number) + 1][1];\n\t\t\t\t} else if (type === 'condition') {\n\t\t\t\t\tblocks.push(precurrent);\n\t\t\t\t\tcurrent = current[2][val];\n\t\t\t\t} else if (type === 'block') {\n\t\t\t\t\tblocks.push(precurrent);\n\t\t\t\t\tcurrent = story[val];\n\t\t\t\t} else if (type === 'block:exit' || type === 'choice:exit' || type === 'condition:exit') {\n\t\t\t\t\tcurrent = blocks.pop();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsetReady(false);\n\n\t\t\treturn current as Exclude<ValidAction, ValidAction[]>;\n\t\t};\n\n\t\tconst value = refer();\n\t\tconst found = await ready;\n\n\t\treturn {\n\t\t\tfound,\n\t\t\tvalue,\n\t\t};\n\t};\n\n\tconst referGuarded = async (path: Path) => {\n\t\treturn await (await refer(path)).value;\n\t};\n\n\treturn {\n\t\trefer,\n\t\treferGuarded,\n\t};\n};\n\ntype GuardedReferFunction = ReturnType<typeof createReferFunction>['referGuarded'];\n\n// #endregion\n\ntype ExitPathConfig = {\n\tpath: Path;\n\trefer: GuardedReferFunction;\n\n\tonExitImpossible?: () => void;\n};\n\n// #region Exit Path\nconst exitPath = async ({ path, refer, onExitImpossible }: ExitPathConfig) => {\n\tconst last = path.at(-1);\n\tconst ignore: ('choice:exit' | 'condition:exit' | 'block:exit')[] = [];\n\n\tlet wasExitImpossible = false;\n\n\t/**\n\t * - should be an array\n\t * - first element is action name\n\t */\n\tif (!isAction(await refer(path))) {\n\t\tif (last && isNull(last[0]) && isNumber(last[1])) {\n\t\t\tlast[1]--;\n\t\t} else {\n\t\t\tpath.pop();\n\t\t}\n\t}\n\n\tif (isExitImpossible(path)) {\n\t\tconst referred = await refer(path);\n\n\t\tif (isAction(referred) && isSkippedDuringRestore(referred[0])) {\n\t\t\tonExitImpossible?.();\n\t\t}\n\n\t\twasExitImpossible = true;\n\n\t\treturn {\n\t\t\texitImpossible: wasExitImpossible,\n\t\t};\n\t}\n\n\tfor (let i = path.length - 1; i > 0; i--) {\n\t\tconst [name] = path[i];\n\n\t\t/**\n\t\t * Remember already exited paths\n\t\t */\n\t\tif (isBlockExitStatement(name)) {\n\t\t\tignore.push(name);\n\t\t}\n\n\t\t/**\n\t\t * Ignore everything that we do not need there\n\t\t */\n\t\tif (!isBlockStatement(name)) continue;\n\n\t\t/**\n\t\t * When we found an already exited path we remove it from the list\n\t\t */\n\t\tif (ignore.at(-1)?.startsWith(name)) {\n\t\t\tignore.pop();\n\t\t\tcontinue;\n\t\t}\n\n\t\t/**\n\t\t * Exit from the path\n\t\t */\n\t\tpath.push([`${name}:exit`]);\n\n\t\tconst prev = findLastPathItemBeforeItemOfType(path.slice(0, i + 1), name);\n\n\t\t/**\n\t\t * When possible also go to the next action (or exit from one layer above)\n\t\t */\n\t\tif (prev) path.push([null, prev[1] + 1]);\n\n\t\t/**\n\t\t * If we added an `[null, int]` but it points not to action, then\n\t\t *\n\t\t * - remove that item\n\t\t * - close another block\n\t\t */\n\t\tif (!isAction(await refer(path))) {\n\t\t\tpath.pop();\n\t\t\tcontinue;\n\t\t}\n\n\t\tbreak;\n\t}\n\n\treturn {\n\t\texitImpossible: wasExitImpossible,\n\t};\n};\n// #endregion\n\n// #region Next Path\nconst nextPath = (path: Path) => {\n\t/**\n\t * Last path element\n\t */\n\tconst last = path.at(-1);\n\n\tif (last && (isNull(last[0]) || last[0] === 'jump') && isNumber(last[1])) {\n\t\tlast[1]++;\n\t} else {\n\t\tpath.push([null, 0]);\n\t}\n\n\treturn path;\n};\n// #endregion\n\n// #region Collect Actions Before Blocking Action\ntype CollectActionsBeforeBlockingActionOptions = {\n\tpath: Path;\n\trefer: GuardedReferFunction;\n\tclone: CloneFN;\n};\n\nconst collectActionsBeforeBlockingAction = async ({\n\tpath,\n\trefer,\n\tclone,\n}: CollectActionsBeforeBlockingActionOptions) => {\n\tconst collection: Exclude<ValidAction, ValidAction[]>[] = [];\n\n\tlet action = await refer(path);\n\n\twhile (true) {\n\t\tif (action == undefined) {\n\t\t\tconst { exitImpossible } = await exitPath({\n\t\t\t\tpath,\n\t\t\t\trefer,\n\t\t\t});\n\n\t\t\tif (exitImpossible) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!action) {\n\t\t\tbreak;\n\t\t}\n\n\t\tif (isBlockingAction(action)) {\n\t\t\tconst [name, ...props] = action;\n\n\t\t\tif (name === 'choice') {\n\t\t\t\tconst choiceProps = props as unknown as GetActionParameters<'Choice'>;\n\n\t\t\t\tfor (let i = 0; i < choiceProps.length; i++) {\n\t\t\t\t\tconst branchContent = choiceProps[i];\n\n\t\t\t\t\t/**\n\t\t\t\t\t * This is a title\n\t\t\t\t\t */\n\t\t\t\t\tif (!Array.isArray(branchContent)) continue;\n\n\t\t\t\t\tconst virtualPath = clone(path);\n\n\t\t\t\t\tvirtualPath.push(['choice', i], [null, 0]);\n\n\t\t\t\t\tconst innerActions = await collectActionsBeforeBlockingAction({\n\t\t\t\t\t\tpath: virtualPath,\n\t\t\t\t\t\trefer,\n\t\t\t\t\t\tclone,\n\t\t\t\t\t});\n\n\t\t\t\t\tcollection.push(...innerActions);\n\t\t\t\t}\n\t\t\t} else if (name === 'condition') {\n\t\t\t\tconst conditionProps = props as unknown as GetActionParameters<'Condition'>;\n\t\t\t\tconst conditions = Object.keys(conditionProps[1]);\n\n\t\t\t\tfor (const condition of conditions) {\n\t\t\t\t\tconst virtualPath = clone(path);\n\n\t\t\t\t\tvirtualPath.push(['condition', condition], [null, 0]);\n\n\t\t\t\t\tconst innerActions = await collectActionsBeforeBlockingAction({\n\t\t\t\t\t\tpath: virtualPath,\n\t\t\t\t\t\trefer,\n\t\t\t\t\t\tclone,\n\t\t\t\t\t});\n\n\t\t\t\t\tcollection.push(...innerActions);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\n\t\tcollection.push(action);\n\n\t\t/**\n\t\t * These special actions requires path change\n\t\t */\n\t\tif (action[0] === 'jump') {\n\t\t\tpath = [\n\t\t\t\t['jump', action[1]],\n\t\t\t\t[null, 0],\n\t\t\t];\n\t\t} else if (action[0] == 'block') {\n\t\t\tpath.push(['block', action[1]], [null, 0]);\n\t\t} else {\n\t\t\tnextPath(path);\n\t\t}\n\n\t\taction = await refer(path);\n\t}\n\n\treturn collection;\n};\n// #endregion\n\n// #region Find Last Path Item Before Item Of Type\nconst findLastPathItemBeforeItemOfType = (path: Path, name: PathItem[0]) => {\n\tconst item = path.findLast(([_name, _value], i, array) => {\n\t\tconst next = array[i + 1];\n\n\t\treturn isNull(_name) && isNumber(_value) && next != null && next[0] === name;\n\t});\n\n\treturn item as undefined | [null, number];\n};\n// #endregion\n\n// #region Get Opposite Action\nconst getOppositeAction = (action: 'showCharacter' | 'playSound' | 'playMusic' | 'voice' | any) => {\n\tconst MAP = {\n\t\tshowCharacter: 'hideCharacter',\n\t\tplaySound: 'stopSound',\n\t\tplayMusic: 'stopMusic',\n\t\tvoice: 'stopVoice',\n\t} as const;\n\n\treturn MAP[action as keyof typeof MAP];\n};\n// #endregion\n\n// #region Get Actions From Path\ntype GetActionsFromPathParams = {\n\t/**\n\t * A story object\n\t */\n\tstory: Story;\n\t/**\n\t * A path by that actions will be gathered\n\t */\n\tpath: Path;\n\t/**\n\t * true — actions that should be skipped would not be returned\n\t */\n\tfilter: boolean;\n\treferGuarded: GuardedReferFunction;\n};\n\nconst getActionsFromPath = async ({ story, path, filter, referGuarded }: GetActionsFromPathParams) => {\n\t/**\n\t * Current item in the story\n\t */\n\tlet current: any = story;\n\t/**\n\t * Previous `current` value\n\t */\n\tlet precurrent: any;\n\t/**\n\t * Should we ignore some actions\n\t */\n\tlet ignoreNestedBefore: null | PathItem[0] = null;\n\t/**\n\t * Current item of type `[null, int]`\n\t */\n\tlet index = 0;\n\t/**\n\t * Skipped action that should be preserved\n\t */\n\tlet skipPreserve: Exclude<ValidAction, ValidAction[]> | undefined = undefined;\n\t/**\n\t * Actions that are either considered user action or skipped during restore process\n\t */\n\tconst skip = new Set<Exclude<ValidAction, ValidAction[]>>();\n\n\t/**\n\t * Cound of items of type `[null, int]`\n\t */\n\tconst max = path.reduce((acc, [type, val]) => {\n\t\tif (isNull(type) && isNumber(val)) {\n\t\t\treturn acc + 1;\n\t\t}\n\n\t\treturn acc;\n\t}, 0);\n\n\tconst queue = [] as Exclude<ValidAction, ValidAction[]>[];\n\tconst blocks = [];\n\n\t// Will guard future usage\n\tawait referGuarded(path);\n\n\tfor (const [type, val] of path) {\n\t\tif (type === 'jump') {\n\t\t\tprecurrent = story;\n\t\t\tcurrent = current[val];\n\t\t} else if (type === null) {\n\t\t\tprecurrent = current;\n\n\t\t\tif (isNumber(val)) {\n\t\t\t\tindex++;\n\n\t\t\t\tlet startIndex = 0;\n\n\t\t\t\tif (ignoreNestedBefore) {\n\t\t\t\t\tconst prev = findLastPathItemBeforeItemOfType(path.slice(0, index), ignoreNestedBefore);\n\n\t\t\t\t\tif (prev) {\n\t\t\t\t\t\tstartIndex = prev[1];\n\t\t\t\t\t\tignoreNestedBefore = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * Запустим все экшены которые идут в `[null, int]` от `0` до `int`\n\t\t\t\t * Почему-то потребовалось изменить `<` на `<=`, чтобы последний action попадал сюда\n\t\t\t\t */\n\t\t\t\tfor (let i = startIndex; i <= val; i++) {\n\t\t\t\t\tconst item = current[i];\n\n\t\t\t\t\t/**\n\t\t\t\t\t * In case of broken save at least not throw\n\t\t\t\t\t * But is should not happen\n\t\t\t\t\t */\n\t\t\t\t\tif (!isAction(item)) continue;\n\n\t\t\t\t\tconst [action] = item;\n\n\t\t\t\t\tconst last = index === max && i === val;\n\t\t\t\t\tconst shouldSkip = isSkippedDuringRestore(action) || isUserRequiredAction(item);\n\n\t\t\t\t\tif (shouldSkip) {\n\t\t\t\t\t\tskip.add(item);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (shouldSkip && last) {\n\t\t\t\t\t\tskipPreserve = item;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (filter && shouldSkip && !last) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tqueue.push(item);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcurrent = current[val];\n\t\t} else if (type === 'choice') {\n\t\t\tblocks.push(precurrent);\n\t\t\tcurrent = current[val + 1][1];\n\t\t} else if (type === 'condition') {\n\t\t\tblocks.push(precurrent);\n\t\t\tcurrent = current[2][val];\n\t\t} else if (type === 'block') {\n\t\t\tblocks.push(precurrent);\n\t\t\tcurrent = story[val];\n\t\t} else if (type === 'block:exit' || type === 'choice:exit' || type === 'condition:exit') {\n\t\t\tcurrent = blocks.pop();\n\t\t\tignoreNestedBefore = type.slice(0, -5) as PathItem[0];\n\t\t}\n\t}\n\n\treturn {\n\t\tqueue,\n\t\tskip,\n\t\tskipPreserve,\n\t};\n};\n// #endregion\n\n// #region Queue Processor\ntype QueueProcessorOptions = {\n\tskip: Set<Exclude<ValidAction, ValidAction[]>>;\n\tskipPreserve?: Exclude<ValidAction, ValidAction[]> | undefined;\n};\n\nconst createQueueProcessor = (queue: Exclude<ValidAction, ValidAction[]>[], options: QueueProcessorOptions) => {\n\tconst processedQueue: Exclude<ValidAction, ValidAction[]>[] = [];\n\n\tconst keep = new Set();\n\tconst characters = new Set();\n\tconst audio = {\n\t\tmusic: new Set(),\n\t\tsounds: new Set(),\n\t};\n\n\t/**\n\t * Get the next actions array.\n\t */\n\tconst next = (i: number) => queue.slice(i + 1);\n\n\tfor (const [i, item] of queue.entries()) {\n\t\tconst [action, ...params] = item;\n\n\t\tif (options.skip.has(item) && item !== options.skipPreserve) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tkeep.add(action);\n\n\t\tif (action === 'function' || action === 'custom') {\n\t\t\tif (action === 'custom') {\n\t\t\t\tconst fn = params[0] as CustomHandler;\n\n\t\t\t\tif ('callOnlyLatest' in fn && fn.callOnlyLatest) {\n\t\t\t\t\tconst notLatest = next(i).some(([name, func]) => {\n\t\t\t\t\t\tif (name !== 'custom') return;\n\n\t\t\t\t\t\t// Checks for `undefined`. In case two id's are undefined it would not be true\n\t\t\t\t\t\tconst isIdenticalId = Boolean(func.id && fn.id && func.id === fn.id);\n\t\t\t\t\t\tconst isIdenticalByReference = func === fn;\n\t\t\t\t\t\tconst isIdenticalByCode = String(func) === String(fn);\n\n\t\t\t\t\t\treturn isIdenticalId || isIdenticalByReference || isIdenticalByCode;\n\t\t\t\t\t});\n\n\t\t\t\t\tif (notLatest) continue;\n\t\t\t\t} else if ('skipOnRestore' in fn && fn.skipOnRestore) {\n\t\t\t\t\tif (fn.skipOnRestore(next(i))) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tprocessedQueue.push(item);\n\t\t} else if (action === 'playSound') {\n\t\t\tconst closing = getOppositeAction(action);\n\n\t\t\tconst skip = next(i).some((item) => {\n\t\t\t\tif (isUserRequiredAction(item) || isSkippedDuringRestore(item[0])) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tconst [_action, target] = item;\n\n\t\t\t\tif (target !== params[0]) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn _action === closing || _action === action;\n\t\t\t});\n\n\t\t\tif (skip) continue;\n\n\t\t\taudio.sounds.add(unwrapAsset(params[0] as NovelyAsset));\n\t\t\tprocessedQueue.push(item);\n\t\t} else if (action === 'showCharacter' || action === 'playMusic' || action === 'voice') {\n\t\t\tconst closing = getOppositeAction(action);\n\n\t\t\tconst skip = next(i).some(([_action, target]) => {\n\t\t\t\tif (target !== params[0] && action !== 'voice') {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst musicWillBePaused = action === 'playMusic' && _action === 'pauseMusic';\n\n\t\t\t\t/**\n\t\t\t\t * It either will be closed OR same action will be ran again\n\t\t\t\t */\n\t\t\t\treturn musicWillBePaused || _action === closing || _action === action;\n\t\t\t});\n\n\t\t\tif (skip) continue;\n\n\t\t\t/**\n\t\t\t * Actually, we do not need check above to add there things to keep because if something was hidden already we could not keep it visible\n\t\t\t */\n\t\t\tif (action === 'showCharacter') {\n\t\t\t\tcharacters.add(params[0]);\n\t\t\t} else if (action === 'playMusic') {\n\t\t\t\taudio.music.add(unwrapAsset(params[0] as NovelyAsset));\n\t\t\t}\n\n\t\t\tprocessedQueue.push(item);\n\t\t} else if (action === 'showBackground' || action === 'preload') {\n\t\t\tconst skip = next(i).some(([_action]) => action === _action);\n\n\t\t\tif (skip) continue;\n\n\t\t\tprocessedQueue.push(item);\n\t\t} else if (action === 'animateCharacter') {\n\t\t\tconst skip = next(i).some(([_action, character], j, array) => {\n\t\t\t\t// Same character will be animated again.\n\t\t\t\tif (action === _action && character === params[0]) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tconst next = array.slice(j);\n\n\t\t\t\tconst characterWillAnimate = next.some(([__action, __character]) => action === __action);\n\t\t\t\tconst hasBlockingActions = next.some((item) => options.skip.has(item));\n\n\t\t\t\tconst differentCharacterWillAnimate =\n\t\t\t\t\t!hasBlockingActions &&\n\t\t\t\t\tnext.some(([__action, __character]) => __action === action && __character !== params[0]);\n\n\t\t\t\t// todo\n\t\t\t\treturn (characterWillAnimate && hasBlockingActions) || differentCharacterWillAnimate;\n\t\t\t});\n\n\t\t\tif (skip) continue;\n\n\t\t\tprocessedQueue.push(item);\n\t\t} else {\n\t\t\tprocessedQueue.push(item);\n\t\t}\n\t}\n\n\tconst run = async (match: (item: Exclude<ValidAction, ValidAction[]>) => Thenable<void>) => {\n\t\tfor (const item of processedQueue) {\n\t\t\tconst result = match(item);\n\n\t\t\tif (isPromise(result)) {\n\t\t\t\tawait result;\n\t\t\t}\n\t\t}\n\n\t\tprocessedQueue.length = 0;\n\t};\n\n\treturn {\n\t\trun,\n\t\tkeep: {\n\t\t\tkeep,\n\t\t\tcharacters,\n\t\t\taudio,\n\t\t},\n\t};\n};\n// #endregion\n\nexport {\n\tfindLastPathItemBeforeItemOfType,\n\tgetActionsFromPath,\n\tgetOppositeAction,\n\tcreateQueueProcessor,\n\tcreateReferFunction,\n\texitPath,\n\tcollectActionsBeforeBlockingAction,\n\tnextPath,\n\tisExitImpossible,\n};\n\nexport type { GuardedReferFunction };\n","type ControlledPromise<T> = Promise<\n\t| {\n\t\t\tvalue: T;\n\t\t\tcancelled: false;\n\t }\n\t| {\n\t\t\tvalue: null;\n\t\t\tcancelled: true;\n\t }\n>;\n\ntype ControlledPromiseObj<T> = {\n\tresolve: (value: T | PromiseLike<T>) => void;\n\treject: (reason?: any) => void;\n\n\tpromise: ControlledPromise<T>;\n\n\tcancel: () => void;\n};\n\nconst createControlledPromise = <T = void>() => {\n\tconst object = {\n\t\tresolve: null,\n\t\treject: null,\n\n\t\tpromise: null,\n\n\t\tcancel: null,\n\t} as unknown as ControlledPromiseObj<T>;\n\n\tconst init = () => {\n\t\tconst promise = new Promise((resolve, reject) => {\n\t\t\tobject.reject = reject;\n\t\t\tobject.resolve = (value) => {\n\t\t\t\tresolve({ cancelled: false, value });\n\t\t\t};\n\n\t\t\tobject.cancel = () => {\n\t\t\t\tresolve({ cancelled: true, value: null });\n\t\t\t\tinit();\n\t\t\t};\n\t\t});\n\n\t\tobject.promise = promise as ControlledPromise<T>;\n\t};\n\n\treturn init(), object;\n};\n\nexport { createControlledPromise };\nexport type { ControlledPromise, ControlledPromiseObj };\n","import { memoize } from 'es-toolkit/function';\nimport { HOWLER_SUPPORTED_FILE_FORMATS, SUPPORTED_IMAGE_FILE_FORMATS } from '../constants';\nimport { isCSSImageURL } from './assertions';\nimport { DEV } from 'esm-env';\n\nconst getUrlFileExtension = (address: string) => {\n\ttry {\n\t\tconst { pathname } = new URL(address, location.href);\n\n\t\t/**\n\t\t * By using pathname we remove search params from URL, but some things are still preserved\n\t\t *\n\t\t * Imagine pathname like `image.png!private:1230`\n\t\t * Yes, very unlikely to happen, but it is possible\n\t\t */\n\t\treturn pathname.split('.').at(-1)!.split('!')[0].split(':')[0];\n\t} catch (error) {\n\t\tif (DEV) {\n\t\t\tconsole.error(new Error(`Could not construct URL \"${address}\".`, { cause: error }));\n\t\t}\n\n\t\treturn '';\n\t}\n};\n\nconst fetchContentType = async (url: string, request: typeof fetch) => {\n\ttry {\n\t\tconst response = await request(url, {\n\t\t\tmethod: 'HEAD',\n\t\t});\n\n\t\treturn response.headers.get('Content-Type') || '';\n\t} catch (error) {\n\t\tif (DEV) {\n\t\t\tconsole.error(new Error(`Failed to fetch file at \"${url}\"`, { cause: error }));\n\t\t}\n\n\t\treturn '';\n\t}\n};\n\ntype GetResourceTypeParams = {\n\turl: string;\n\trequest: typeof fetch;\n};\n\nconst getResourseType = memoize(\n\tasync ({ url, request }: GetResourceTypeParams) => {\n\t\t/**\n\t\t * If url is not http we should not check\n\t\t *\n\t\t * startsWith('http') || startsWith('/') || startsWith('.') || startsWith('data')\n\t\t */\n\t\tif (!isCSSImageURL(url)) {\n\t\t\treturn 'other';\n\t\t}\n\n\t\tconst extension = getUrlFileExtension(url);\n\n\t\tif (HOWLER_SUPPORTED_FILE_FORMATS.has(extension as any)) {\n\t\t\treturn 'audio';\n\t\t}\n\n\t\tif (SUPPORTED_IMAGE_FILE_FORMATS.has(extension as any)) {\n\t\t\treturn 'image';\n\t\t}\n\n\t\t/**\n\t\t * If checks above didn't worked we will fetch content type\n\t\t * This might not work because of CORS\n\t\t */\n\t\tconst contentType = await fetchContentType(url, request);\n\n\t\tif (contentType.includes('audio')) {\n\t\t\treturn 'audio';\n\t\t}\n\n\t\tif (contentType.includes('image')) {\n\t\t\treturn 'image';\n\t\t}\n\n\t\treturn 'other';\n\t},\n\t{\n\t\tgetCacheKey: ({ url }) => url,\n\t},\n);\n\nexport { getUrlFileExtension, getResourseType, fetchContentType };\n\nexport type { GetResourceTypeParams };\n","import { memoize } from 'es-toolkit/function';\nimport type { Context, Renderer } from '../renderer';\nimport type { Save, StackHolder, UseStackFunctionReturnType } from '../types';\nimport { STACK_MAP } from '../shared';\n\nconst getStack = memoize(\n\t(_: Context) => {\n\t\treturn [] as unknown as StackHolder;\n\t},\n\t{\n\t\tcache: STACK_MAP,\n\t\tgetCacheKey: (ctx) => ctx.id,\n\t},\n);\n\nconst createUseStackFunction = (renderer: Renderer) => {\n\tconst useStack = (context: Context | string): UseStackFunctionReturnType => {\n\t\tconst ctx = typeof context === 'string' ? renderer.getContext(context) : context;\n\t\tconst stack = getStack(ctx);\n\n\t\treturn {\n\t\t\tget previous() {\n\t\t\t\treturn stack.previous;\n\t\t\t},\n\t\t\tget value() {\n\t\t\t\treturn stack.at(-1)!;\n\t\t\t},\n\t\t\tset value(value) {\n\t\t\t\tstack[stack.length - 1] = value;\n\t\t\t},\n\n\t\t\tback() {\n\t\t\t\tstack.previous = stack.length > 1 ? stack.pop() : this.value;\n\t\t\t\tctx.meta.goingBack = true;\n\t\t\t},\n\t\t\tpush(value: Save) {\n\t\t\t\tstack.push(value);\n\t\t\t},\n\t\t\tclear() {\n\t\t\t\tstack.previous = undefined;\n\n\t\t\t\tstack.length = 0;\n\t\t\t\tstack.length = 1;\n\t\t\t},\n\t\t};\n\t};\n\n\treturn useStack;\n};\n\nexport { getStack, createUseStackFunction };\n","import type { Story, ValidAction } from '../action';\n\nconst flatActions = (item: (ValidAction | ValidAction[])[]): ValidAction[] => {\n\treturn item.flatMap((data) => {\n\t\tconst type = data[0];\n\n\t\t/**\n\t\t * This is not just an action like `['name', ...arguments]`, but an array of actions\n\t\t */\n\t\tif (Array.isArray(type)) return flatActions(data as ValidAction[]);\n\n\t\treturn [data as ValidAction];\n\t});\n};\n\n/**\n * Transforms `(ValidAction | ValidAction[])[]` to `ValidAction[]`. Mutates provided `Story`\n */\nconst flatStory = (story: Story) => {\n\tfor (const key in story) {\n\t\tstory[key] = flatActions(story[key]);\n\t}\n\n\treturn story;\n};\n\nexport { flatActions, flatStory };\n","import { memoize } from 'es-toolkit/function';\nimport type { Lang } from '../types';\n\nconst getLanguage = (languages: string[]) => {\n\tlet { language } = navigator;\n\n\tif (languages.includes(language)) {\n\t\treturn language;\n\t} else if (languages.includes((language = language.slice(0, 2)))) {\n\t\treturn language;\n\t} else if ((language = languages.find((value) => navigator.languages.includes(value))!)) {\n\t\treturn language;\n\t}\n\n\t/**\n\t * We'v checked the `en-GB` format, `en` format, and maybe any second languages, but there were no matches\n\t */\n\treturn languages[0];\n};\n\nconst getIntlLanguageDisplayName = memoize((lang: Lang) => {\n\t/**\n\t * When using Intl fails we just return language key.\n\t */\n\ttry {\n\t\tconst intl = new Intl.DisplayNames([lang], {\n\t\t\ttype: 'language',\n\t\t});\n\n\t\treturn intl.of(lang) || lang;\n\t} catch {\n\t\treturn lang;\n\t}\n});\n\n/**\n * Capitalizes the string\n * @param str String without emojis or complex graphemes\n */\nconst capitalize = (str: string) => {\n\treturn str[0].toUpperCase() + str.slice(1);\n};\n\nexport { getLanguage, getIntlLanguageDisplayName, capitalize };\n","const noop = () => {};\n\n/**\n * A wrapper on `fn` to make it run only once!\n * @param fn Function that needed to run no more than one time\n */\nconst once = (fn: () => void) => {\n\tlet ran = false;\n\n\treturn () => {\n\t\tif (ran) return;\n\n\t\tran = true;\n\t\tfn();\n\t};\n};\n\nexport { noop, once };\n","import type { Stored } from '../store';\nimport type { Lang, StorageData } from '../types';\n\nconst getLanguageFromStore = <$Language extends Lang>(store: Stored<StorageData<$Language, any>>) => {\n\treturn store.get().meta[0];\n};\n\nconst getVolumeFromStore = <$Language extends Lang>(store: Stored<StorageData<$Language, any>>) => {\n\tconst { meta } = store.get();\n\n\treturn {\n\t\tmusic: meta[2],\n\t\tsound: meta[3],\n\t\tvoice: meta[4],\n\t};\n};\n\nexport { getLanguageFromStore, getVolumeFromStore };\n","const mapSet = <T, K>(set: Set<T>, fn: (value: T, index: number, array: T[]) => K): K[] => {\n\treturn [...set].map(fn);\n};\n\nconst toArray = <T>(target: T | T[]) => {\n\treturn Array.isArray(target) ? target : [target];\n};\n\nexport { mapSet, toArray };\n","import type { Character } from '../character';\nimport type { CharactersData, Lang } from '../types';\n\nconst getCharactersData = <Characters extends Record<string, Character<Lang>>>(characters: Characters) => {\n\tconst entries = Object.entries(characters);\n\tconst mapped = entries.map(([key, value]) => [key, { name: value.name, emotions: Object.keys(value.emotions) }]);\n\n\treturn Object.fromEntries(mapped) as CharactersData<Characters>;\n};\n\nexport { getCharactersData };\n","import { noop } from './utilities';\n\ntype Stored<T> = {\n\tsubscribe: (cb: (value: T) => void) => () => void;\n\tupdate: (fn: (prev: T) => T) => void;\n\tset: (val: T) => void;\n\tget: () => T;\n};\n\ntype Derived<T> = {\n\tsubscribe: (cb: (value: T) => void) => () => void;\n\tget: () => T;\n};\n\nconst store = <T>(current: T, subscribers = new Set<(value: T) => void>()): Stored<T> => {\n\tconst subscribe = (cb: (value: T) => void) => {\n\t\tsubscribers.add(cb), cb(current);\n\n\t\treturn () => {\n\t\t\tsubscribers.delete(cb);\n\t\t};\n\t};\n\n\tconst push = (value: T) => {\n\t\tfor (const cb of subscribers) cb(value);\n\t};\n\n\tconst update = (fn: (prev: T) => T) => {\n\t\tpush((current = fn(current)));\n\t};\n\n\tconst set = (val: T) => {\n\t\tupdate(() => val);\n\t};\n\n\tconst get = () => {\n\t\treturn current;\n\t};\n\n\treturn { subscribe, update, set, get } as const;\n};\n\nconst derive = <T, K>(input: Stored<T>, map: (value: T) => K): Derived<K> => {\n\treturn {\n\t\tget: () => map(input.get()),\n\t\tsubscribe: (subscriber) => {\n\t\t\treturn input.subscribe((value) => {\n\t\t\t\treturn subscriber(map(value));\n\t\t\t});\n\t\t},\n\t};\n};\n\nconst immutable = <T>(value: T): Derived<T> => {\n\treturn {\n\t\tget: () => value,\n\t\tsubscribe: (subscriber) => {\n\t\t\tsubscriber(value);\n\n\t\t\treturn noop;\n\t\t},\n\t};\n};\n\nexport { store, derive, immutable };\nexport type { Stored, Derived };\n","import type { CustomHandler, CustomHandlerFunctionGetFn, CustomHandlerGetResult, TextContent } from './action';\nimport type { Context, CustomActionHandle } from './renderer';\nimport type { Derived, Stored } from './store';\nimport { CUSTOM_ACTION_MAP } from './shared';\nimport type { CoreData, Data, Lang, Stack, State, StateFunction } from './types';\nimport { noop } from './utilities';\nimport { derive, immutable } from './store';\n\ntype CustomActionHolder = {\n\t/**\n\t * Node in which custom action is rendered\n\t */\n\tnode: null | HTMLDivElement;\n\t/**\n\t * Custom Handler function itself\n\t */\n\tfn: CustomHandler;\n\t/**\n\t * Local Data\n\t */\n\tlocalData: any;\n\t/**\n\t * Cleanup function. Provided by custom action.\n\t */\n\tcleanup: () => void;\n};\n\ntype HandleCustomActionOptions = CustomActionHandle & {\n\t/**\n\t * State Function\n\t */\n\tstate: StateFunction<State>;\n\t/**\n\t * Current Game Language\n\t */\n\tlang: Lang;\n\t/**\n\t * Function to get Stack\n\t */\n\tgetStack: (ctx: Context) => Stack;\n\t/**\n\t * Template Replace Function\n\t */\n\ttemplateReplace: (content: TextContent<Lang, Data>, values?: Data) => string;\n\t/**\n\t * Paused Store\n\t */\n\tpaused: Derived<boolean>;\n};\n\nconst createCustomActionNode = (id: string) => {\n\tconst div = document.createElement('div');\n\n\tdiv.setAttribute('data-id', id);\n\n\treturn div;\n};\n\nconst getCustomActionHolder = (ctx: Context, fn: CustomHandler) => {\n\tconst cached = CUSTOM_ACTION_MAP.get(ctx.id + fn.key);\n\n\tif (cached) {\n\t\treturn cached;\n\t}\n\n\tconst holder = {\n\t\tcleanup: noop,\n\t\tnode: null,\n\t\tfn: fn,\n\t\tlocalData: {},\n\t} satisfies CustomActionHolder;\n\n\tCUSTOM_ACTION_MAP.set(ctx.id + fn.key, holder);\n\n\treturn holder;\n};\n\nconst handleCustomAction = (\n\tctx: Context,\n\tfn: CustomHandler,\n\t{\n\t\tlang,\n\t\tstate,\n\t\tsetMountElement,\n\t\tsetClear,\n\t\tremove: renderersRemove,\n\t\tgetStack,\n\t\ttemplateReplace,\n\t\tpaused,\n\t}: HandleCustomActionOptions,\n) => {\n\tconst holder = getCustomActionHolder(ctx, fn);\n\n\tconst flags = {\n\t\t...ctx.meta,\n\t};\n\n\tconst getDomNodes = (insert = true): CustomHandlerGetResult<boolean> => {\n\t\tif (holder.node || !insert) {\n\t\t\treturn {\n\t\t\t\telement: holder.node,\n\t\t\t\troot: ctx.root,\n\t\t\t};\n\t\t}\n\n\t\tholder.node = insert ? createCustomActionNode(fn.key) : null;\n\n\t\tsetMountElement(holder.node);\n\n\t\treturn {\n\t\t\telement: holder.node,\n\t\t\troot: ctx.root,\n\t\t};\n\t};\n\n\tconst clear = (func: typeof noop) => {\n\t\t/**\n\t\t * We wrap original cleanup to achieve these goals:\n\t\t *\n\t\t * - when cleaned up function will not be called again\n\t\t * - when cleaned up renderer will get updated element\n\t\t */\n\t\tsetClear(\n\t\t\t(holder.cleanup = () => {\n\t\t\t\tfunc();\n\n\t\t\t\tholder.node = null;\n\t\t\t\tholder.cleanup = noop;\n\n\t\t\t\tsetMountElement(null);\n\t\t\t\tsetClear(noop);\n\t\t\t}),\n\t\t);\n\t};\n\n\tconst data = (updatedData?: any) => {\n\t\tif (updatedData) {\n\t\t\treturn (holder.localData = updatedData);\n\t\t}\n\n\t\treturn holder.localData;\n\t};\n\n\tconst remove = () => {\n\t\tholder.cleanup();\n\t\trenderersRemove();\n\t};\n\n\tconst stack = getStack(ctx);\n\n\tconst getPath = () => {\n\t\treturn stack.value[0];\n\t};\n\n\treturn fn({\n\t\tflags,\n\n\t\tlang,\n\n\t\tstate,\n\t\tdata,\n\n\t\ttemplateReplace,\n\n\t\tclear,\n\t\tremove,\n\n\t\trendererContext: ctx,\n\n\t\tgetDomNodes: getDomNodes as CustomHandlerFunctionGetFn,\n\n\t\tgetPath,\n\n\t\tcontextKey: ctx.id,\n\n\t\tpaused: flags.preview ? immutable(false) : paused,\n\t});\n};\n\nexport { getCustomActionHolder, handleCustomAction };\nexport type { CustomActionHolder, HandleCustomActionOptions };\n","import type { CustomHandler, DefaultActionProxy } from './action';\nimport type { Character } from './character';\nimport { ASSETS_TO_PRELOAD, PRELOADED_ASSETS } from './shared';\nimport type { Lang } from './types';\nimport { isAudioAction, isImageAsset, isString, isAsset, getResourseType, mapSet, toArray } from './utilities';\nimport { unwrapAudioAsset, unwrapImageAsset } from './asset';\n\nconst ACTION_NAME_TO_VOLUME_MAP = {\n\tplayMusic: 'music',\n\tplaySound: 'sound',\n\tvoice: 'voice',\n} as const;\n\n/**\n * Adds asset to `ASSETS_TO_PRELOAD` firstly checking if is was already preloaded\n */\nconst enqueueAssetForPreloading = (asset: string) => {\n\tif (!PRELOADED_ASSETS.has(asset)) {\n\t\tASSETS_TO_PRELOAD.add(asset);\n\t}\n};\n\ntype HandleAssetsPreloadingOptions = {\n\trequest: typeof fetch;\n\n\tlimiter: (fn: () => void | PromiseLike<void>) => Promise<void>;\n\n\tpreloadAudioBlocking: (source: string) => Promise<void>;\n\tpreloadImageBlocking: (source: string) => Promise<void>;\n};\n\n/**\n * Preloads assets\n */\nconst handleAssetsPreloading = async ({\n\trequest,\n\tlimiter,\n\tpreloadAudioBlocking,\n\tpreloadImageBlocking,\n}: HandleAssetsPreloadingOptions) => {\n\tconst list = mapSet(ASSETS_TO_PRELOAD, (asset) => {\n\t\treturn limiter(async () => {\n\t\t\tconst type = await getResourseType({\n\t\t\t\turl: asset,\n\t\t\t\trequest,\n\t\t\t});\n\n\t\t\tswitch (type) {\n\t\t\t\tcase 'audio': {\n\t\t\t\t\tawait preloadAudioBlocking(asset);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase 'image': {\n\t\t\t\t\tawait preloadImageBlocking(asset);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tASSETS_TO_PRELOAD.delete(asset);\n\t\t\tPRELOADED_ASSETS.add(asset);\n\t\t});\n\t});\n\n\t/**\n\t * `allSettled` is used because even if error happens game should run\n\t *\n\t * Ideally, there could be a notification for player, maybe developer could be also notified\n\t * But I don't think it's really needed\n\t */\n\tawait Promise.allSettled(list);\n\n\tASSETS_TO_PRELOAD.clear();\n};\n\ntype HuntAssetsOptions = {\n\t/**\n\t * Audio Volume\n\t */\n\tvolume: {\n\t\tmusic: number;\n\t\tsound: number;\n\t\tvoice: number;\n\t};\n\t/**\n\t * Current Language\n\t */\n\tlang: Lang;\n\t/**\n\t * Characters object from user config\n\t */\n\tcharacters: Record<string, Character>;\n\t/**\n\t * Action name\n\t */\n\taction: keyof DefaultActionProxy;\n\t/**\n\t * Action props\n\t */\n\tprops: Parameters<DefaultActionProxy[keyof DefaultActionProxy]>;\n\t/**\n\t * Function to handle found asset\n\t */\n\thandle: (asset: string) => void;\n};\n\nconst huntAssets = ({ volume, lang, characters, action, props, handle }: HuntAssetsOptions) => {\n\tif (action === 'showBackground') {\n\t\t/**\n\t\t * There are two types of showBackground currently\n\t\t *\n\t\t * Parameter is a `string`\n\t\t * Parameter is a `Record<'CSS Media', string>`\n\t\t */\n\t\tif (isString(props[0])) {\n\t\t\thandle(unwrapAudioAsset(props[0]));\n\t\t}\n\n\t\tif (props[0] && typeof props[0] === 'object') {\n\t\t\tfor (const value of Object.values(props[0])) {\n\t\t\t\tif (isImageAsset(value)) {\n\t\t\t\t\thandle(value);\n\t\t\t\t} else if (isAsset(value)) {\n\t\t\t\t\tconst unwrapped = unwrapImageAsset(value);\n\n\t\t\t\t\tif (isImageAsset(unwrapped)) {\n\t\t\t\t\t\thandle(unwrapped);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn;\n\t}\n\n\tconst getVolumeFor = (action: 'playMusic' | 'stopMusic' | 'playSound' | 'stopSound' | 'voice' | 'stopVoice') => {\n\t\tif (action in ACTION_NAME_TO_VOLUME_MAP) {\n\t\t\t// typescript don't be silly please\n\t\t\treturn volume[ACTION_NAME_TO_VOLUME_MAP[action as keyof typeof ACTION_NAME_TO_VOLUME_MAP]];\n\t\t}\n\n\t\treturn 0;\n\t};\n\n\t/**\n\t * Here \"stop\" action also matches condition, but because `ASSETS_TO_PRELOAD` is a Set, there is no problem\n\t */\n\tif (isAudioAction(action) && isString(props[0])) {\n\t\tif (getVolumeFor(action) > 0) {\n\t\t\thandle(unwrapAudioAsset(props[0]));\n\t\t}\n\n\t\treturn;\n\t}\n\n\tif (action === 'voice' && typeof props[0] === 'object') {\n\t\t/**\n\t\t * Early return in case of disabled voices\n\t\t */\n\t\tif (getVolumeFor('voice') == 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const [language, value] of Object.entries(props[0])) {\n\t\t\tif (language === lang) {\n\t\t\t\t/**\n\t\t\t\t * todo: decide how to make language comparison (maybe use some function)\n\t\t\t\t *\n\t\t\t\t * We can use en-US for both en-US and en-GB. Same thing applies to `dialog` and `text` action.\n\t\t\t\t * Maybe voice over language can be selected separately\n\t\t\t\t */\n\t\t\t\tvalue && handle(unwrapAudioAsset(value));\n\t\t\t}\n\t\t}\n\n\t\treturn;\n\t}\n\n\t/**\n\t * Load characters\n\t */\n\tif (action === 'showCharacter' && isString(props[0]) && isString(props[1])) {\n\t\tconst images = toArray(characters[props[0]].emotions[props[1]]);\n\n\t\tfor (const asset of images) {\n\t\t\thandle(unwrapImageAsset(asset));\n\t\t}\n\n\t\treturn;\n\t}\n\n\t/**\n\t * Custom action assets\n\t */\n\tif (action === 'custom' && (props[0] as CustomHandler).assets) {\n\t\tfor (const asset of (props[0] as CustomHandler).assets!) {\n\t\t\tisAsset(asset) ? handle(asset.source) : handle(asset);\n\t\t}\n\n\t\treturn;\n\t}\n\n\tif (action === 'choice') {\n\t\tfor (let i = 1; i < props.length; i++) {\n\t\t\tconst data = props[i];\n\n\t\t\tif (Array.isArray(data)) {\n\t\t\t\thandle(unwrapImageAsset(data[5] as string));\n\t\t\t}\n\t\t}\n\t}\n};\n\nexport { enqueueAssetForPreloading, handleAssetsPreloading, huntAssets };\n","import type { StorageData } from './types';\n\ntype LocalStorageStorageSettings = {\n\tkey: string;\n};\n\ntype NovelyStorage = {\n\tget: () => Promise<StorageData>;\n\tset: (data: StorageData) => Promise<void>;\n};\n\nconst localStorageStorage = (options: LocalStorageStorageSettings): NovelyStorage => {\n\treturn {\n\t\tasync get() {\n\t\t\tconst fallback = { saves: [], data: {}, meta: [] };\n\n\t\t\ttry {\n\t\t\t\tconst value = localStorage.getItem(options.key);\n\n\t\t\t\treturn value ? JSON.parse(value) : fallback;\n\t\t\t} catch {\n\t\t\t\treturn fallback;\n\t\t\t}\n\t\t},\n\t\tasync set(data) {\n\t\t\ttry {\n\t\t\t\tlocalStorage.setItem(options.key, JSON.stringify(data));\n\t\t\t} catch {}\n\t\t},\n\t};\n};\n\nexport type { NovelyStorage };\nexport { localStorageStorage };\n","import type { Data, State } from './types';\n\ntype PluralType = Intl.LDMLPluralRule;\ntype Pluralization = Partial<Record<PluralType, string>>;\ntype AllowedContent =\n\t| string\n\t| ((state: State | Data) => string | string[])\n\t| string[]\n\t| (string | ((state: State | Data) => string | string[]))[];\ntype TranslationActions = Partial<Record<string, (str: string) => string>>;\n\nconst RGX = /{{(.*?)}}/g;\n\nconst split = (input: string, delimeters: string[]) => {\n\tconst output: (string | undefined)[] = [];\n\n\tfor (const delimeter of delimeters) {\n\t\tif (!input) break;\n\n\t\tconst [start, end] = input.split(delimeter, 2);\n\n\t\toutput.push(start);\n\t\tinput = end;\n\t}\n\n\toutput.push(input);\n\n\treturn output;\n};\n\n/**\n * Turns any allowed content into string\n * @param c Content\n */\nconst flattenAllowedContent = (c: AllowedContent, state: State | Data): string => {\n\tif (Array.isArray(c)) {\n\t\treturn c.map((item) => flattenAllowedContent(item, state)).join('<br>');\n\t}\n\n\tif (typeof c === 'function') {\n\t\treturn flattenAllowedContent(c(state), state);\n\t}\n\n\treturn c;\n};\n\nconst replace = (\n\tinput: string,\n\tdata: Record<string, unknown>,\n\tpluralization?: Record<string, Pluralization>,\n\tactions?: TranslationActions,\n\tpr?: Intl.PluralRules,\n) => {\n\treturn input.replaceAll(RGX, (x: any, key: string, y: any) => {\n\t\tx = 0;\n\t\ty = data;\n\n\t\tconst [pathstr, plural, action] = split(key.trim(), ['@', '%']);\n\n\t\tif (!pathstr) {\n\t\t\treturn '';\n\t\t}\n\n\t\tconst path = pathstr.split('.');\n\n\t\twhile (y && x < path.length) y = y[path[x++]];\n\n\t\tif (plural && pluralization && y && pr) {\n\t\t\ty = pluralization[plural][pr.select(y)];\n\t\t}\n\n\t\tconst actionHandler = actions && action ? actions[action] : void 0;\n\n\t\tif (actionHandler) y = actionHandler(y);\n\n\t\treturn y == null ? '' : y;\n\t});\n};\n\nexport { flattenAllowedContent, replace };\nexport type { AllowedContent, PluralType, Pluralization, TranslationActions };\n","import { DEV } from 'esm-env';\nimport type { ActionChoiceChoiceObject, DefaultActionProxy, ValidAction, VirtualActions } from '../action';\nimport { flatActions } from './story';\nimport type { Data, Lang, State } from '../types';\nimport type { Character } from '../character';\n\ntype BuildActionObjectParams<$Lang extends Lang, $Data extends Data> = {\n\trendererActions: Record<string, (...args: any[]) => ValidAction>;\n\tnativeActions: string[];\n\n\tcharacters: Record<string, Character>;\n};\n\ntype VirtualActionsGlobal = VirtualActions<Record<string, Character>, Lang, State>;\ntype ActionsGlobal = DefaultActionProxy & VirtualActionsGlobal;\n\n/**\n * In this case actions that get overwritten with another action\n */\nconst VIRTUAL_ACTIONS: (keyof VirtualActionsGlobal)[] = ['say'];\n\nconst buildActionObject = <$Lang extends Lang, $Data extends Data>({\n\trendererActions,\n\tnativeActions,\n\tcharacters,\n}: BuildActionObjectParams<$Lang, $Data>) => {\n\tconst allActions = [...nativeActions, ...VIRTUAL_ACTIONS];\n\tconst object = { ...rendererActions };\n\n\tfor (let action of allActions) {\n\t\tobject[action] = (...props: Parameters<ActionsGlobal[keyof ActionsGlobal]>) => {\n\t\t\tif (action === 'say') {\n\t\t\t\taction = 'dialog';\n\n\t\t\t\tconst [character] = props as Parameters<VirtualActionsGlobal['say']>;\n\n\t\t\t\tif (DEV && !characters[character]) {\n\t\t\t\t\tthrow new Error(`Attempt to call Say action with unknown character \"${character}\"`);\n\t\t\t\t}\n\t\t\t} else if (action === 'choice') {\n\t\t\t\tif (props.slice(1).every((choice) => !Array.isArray(choice))) {\n\t\t\t\t\tfor (let i = 1; i < props.length; i++) {\n\t\t\t\t\t\tconst choice = props[i] as ActionChoiceChoiceObject<Lang, State>;\n\n\t\t\t\t\t\t(props as Parameters<DefaultActionProxy['choice']>)[i] = [\n\t\t\t\t\t\t\tchoice.title,\n\t\t\t\t\t\t\tflatActions(choice.children),\n\t\t\t\t\t\t\tchoice.active,\n\t\t\t\t\t\t\tchoice.visible,\n\t\t\t\t\t\t\tchoice.onSelect,\n\t\t\t\t\t\t\tchoice.image,\n\t\t\t\t\t\t];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor (let i = 1; i < props.length; i++) {\n\t\t\t\t\t\tconst choice = props[i];\n\n\t\t\t\t\t\tif (Array.isArray(choice)) {\n\t\t\t\t\t\t\tchoice[1] = flatActions(choice[1]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (action === 'condition') {\n\t\t\t\tconst actions = (props as Parameters<ActionsGlobal['condition']>)[1];\n\n\t\t\t\tfor (const key in actions) {\n\t\t\t\t\tactions[key] = flatActions(actions[key]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn [action, ...props] as ValidAction;\n\t\t};\n\t}\n\n\treturn object;\n};\n\nexport { buildActionObject };\n","import type { Story, TextContent } from '../action';\nimport { unwrapAudioAsset } from '../asset';\nimport type {\n\tData,\n\tDialogOverview,\n\tDialogOverviewEntry,\n\tLang,\n\tNovelyAsset,\n\tState,\n\tUseStackFunctionReturnType,\n} from '../types';\nimport { getActionsFromPath, type GuardedReferFunction } from './actions-processing';\nimport { isAsset, isSkippedDuringRestore, isString, isUserRequiredAction } from './assertions';\n\ntype GetDialogOverviewContext = {\n\tstory: Story;\n\treferGuarded: GuardedReferFunction;\n\n\tgetCharacterName: (character: string) => string;\n\tgetLanguage: () => string;\n\tgetStack: () => UseStackFunctionReturnType;\n\ttemplateReplace: (content: TextContent<Lang, Data>, values?: Data) => string;\n};\n\nconst getDialogOverview = async function (this: GetDialogOverviewContext) {\n\t/**\n\t * Dialog Overview is possible only in main context\n\t */\n\tconst { value: save } = this.getStack();\n\tconst stateSnapshots = save[3];\n\n\t/**\n\t * Easy mode\n\t */\n\tif (stateSnapshots.length == 0) {\n\t\treturn [];\n\t}\n\n\tconst { queue } = await getActionsFromPath({\n\t\tstory: this.story,\n\t\tpath: save[0],\n\t\tfilter: false,\n\t\treferGuarded: this.referGuarded,\n\t});\n\n\tconst lang = this.getLanguage();\n\n\ttype DialogItem = {\n\t\tname: undefined | string;\n\t\ttext: TextContent<string, State>;\n\t\tvoice: undefined | string | NovelyAsset | Record<string, string | NovelyAsset>;\n\t};\n\n\tconst dialogItems: DialogItem[] = [];\n\n\t/**\n\t * For every available state snapshot find dialog corresponding to it\n\t */\n\tfor (let p = 0, a = stateSnapshots.length, i = queue.length - 1; a > 0 && i > 0; i--) {\n\t\tconst action = queue[i];\n\n\t\tif (action[0] === 'dialog') {\n\t\t\tconst [_, name, text] = action;\n\n\t\t\tlet voice: undefined | string | NovelyAsset | Record<string, string | NovelyAsset> = undefined;\n\n\t\t\t/**\n\t\t\t * Search for the most recent `voice` action before current dialog\n\t\t\t */\n\t\t\tfor (let j = i - 1; j > p && j > 0; j--) {\n\t\t\t\tconst action = queue[j];\n\n\t\t\t\tif (isUserRequiredAction(action) || isSkippedDuringRestore(action[0])) break;\n\t\t\t\tif (action[0] === 'stopVoice') break;\n\n\t\t\t\tif (action[0] === 'voice') {\n\t\t\t\t\tvoice = action[1];\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdialogItems.push({\n\t\t\t\tname,\n\t\t\t\ttext,\n\t\t\t\tvoice,\n\t\t\t});\n\n\t\t\tp = i;\n\t\t\ta--;\n\t\t}\n\t}\n\n\tconst entries: DialogOverview = dialogItems.reverse().map(({ name, text, voice }, i) => {\n\t\tconst state = stateSnapshots[i];\n\t\tconst audioSource = isString(voice)\n\t\t\t? voice\n\t\t\t: isAsset(voice)\n\t\t\t\t? voice\n\t\t\t\t: voice == undefined\n\t\t\t\t\t? voice\n\t\t\t\t\t: voice[lang];\n\n\t\tname = name ? this.getCharacterName(name) : '';\n\n\t\treturn {\n\t\t\tname: this.templateReplace(name, state),\n\t\t\ttext: this.templateReplace(text, state),\n\t\t\tvoice: audioSource ? unwrapAudioAsset(audioSource) : '',\n\t\t} satisfies DialogOverviewEntry;\n\t});\n\n\treturn entries;\n};\n\nexport { getDialogOverview };\n","import type { Lang } from '../types';\n\nconst setDocumentLanguage = (language: Lang) => {\n\tdocument.documentElement.lang = language;\n};\n\nexport { setDocumentLanguage };\n","import type { ValidAction } from './action';\nimport type { Assign } from './types';\n\ntype Part = Record<string, (...args: any[]) => ValidAction>;\n\n/**\n * Extens core action with custom actions\n * @param base Actions object you will extend, `engine.action`\n * @param extension Actions object you will extend with\n * @example\n * ```ts\n * const action = extendAction(engine.action, {\n * particles: (options: Parameters<typeof particles>[0]) => {\n * return ['custom', particles(options)]\n * }\n * })\n * ```\n */\nconst extendAction = <Part0 extends Part, Part1 extends Part>(\n\tbase: Part0,\n\textension: Part1,\n): Readonly<Assign<Part0, Part1>> => {\n\treturn {\n\t\t...extension,\n\t\t...base,\n\t};\n};\n\nexport { extendAction };\n","const RU = {\n\tNewGame: 'Новая игра',\n\tHomeScreen: 'Главный экран',\n\tToTheGame: 'К игре',\n\tLanguage: 'Язык',\n\tNoSaves: 'Сохранений нет',\n\tLoadSave: 'Загрузить',\n\tSaves: 'Сохранения',\n\tSettings: 'Настройки',\n\tSumbit: 'Подтвердить',\n\tGoBack: 'Назад',\n\tDoSave: 'Сохранение',\n\tAuto: 'Авто',\n\tStop: 'Стоп',\n\tExit: 'Выход',\n\tAutomatic: 'Автоматическое',\n\tManual: 'Ручное',\n\tRemove: 'Удалить',\n\tLoadASaveFrom: 'Загрузить сохранение от',\n\tDeleteASaveFrom: 'Удалить сохранение от',\n\tTextSpeed: 'Скорость текста',\n\tTextSpeedSlow: 'Медленная',\n\tTextSpeedMedium: 'Средняя',\n\tTextSpeedFast: 'Быстрая',\n\tTextSpeedAuto: 'Автоматическая',\n\tCompleteText: 'Завершить текст',\n\tGoForward: 'Перейти вперёд',\n\tExitDialogWarning: 'Вы уверены, что хотите выйти? Прогресс будет сохранён.',\n\tExitDialogExit: 'Выйти',\n\tExitDialogBack: 'Вернуться в игру',\n\tOpenMenu: 'Открыть меню',\n\tCloseMenu: 'Закрыть меню',\n\tMusicVolume: 'Громкость музыки',\n\tSoundVolume: 'Громкость звуков',\n\tVoiceVolume: 'Громкость речи',\n\tClose: 'Закрыть',\n\tDialogOverview: 'Обзор диалога',\n};\n\ntype BaseTranslationStrings = keyof typeof RU;\n\nconst EN: Record<BaseTranslationStrings, string> = {\n\tNewGame: 'New Game',\n\tHomeScreen: 'Home Screen',\n\tToTheGame: 'To the Game',\n\tLanguage: 'Language',\n\tNoSaves: 'No saves',\n\tLoadSave: 'Load',\n\tSaves: 'Saves',\n\tSettings: 'Settings',\n\tSumbit: 'Submit',\n\tGoBack: 'Go back',\n\tDoSave: 'Save',\n\tAuto: 'Auto',\n\tStop: 'Stop',\n\tExit: 'Exit',\n\tAutomatic: 'Automatic',\n\tManual: 'Manual',\n\tRemove: 'Remove',\n\tLoadASaveFrom: 'Load a save from',\n\tDeleteASaveFrom: 'Delete a save from',\n\tTextSpeed: 'Text Speed',\n\tTextSpeedSlow: 'Slow',\n\tTextSpeedMedium: 'Medium',\n\tTextSpeedFast: 'Fast',\n\tTextSpeedAuto: 'Auto',\n\tCompleteText: 'Complete text',\n\tGoForward: 'Go forward',\n\tExitDialogWarning: 'Are you sure you want to exit? Progress will be saved.',\n\tExitDialogExit: 'Exit',\n\tExitDialogBack: 'Return to game',\n\tOpenMenu: 'Open menu',\n\tCloseMenu: 'Close menu',\n\tMusicVolume: 'Music volume',\n\tSoundVolume: 'Sound volume',\n\tVoiceVolume: 'Voice volume',\n\tClose: 'Close',\n\tDialogOverview: 'Dialog Overview',\n};\n\nexport { RU, EN };\nexport type { BaseTranslationStrings };\n","type EventHandler<T> = (this: Document, event: T) => void;\n\ntype BlurEventHandler = EventHandler<Event>;\ntype FocusEventHandler = EventHandler<FocusEvent>;\n\nconst BLUR_HANDLERS = new Set<BlurEventHandler>();\nconst FOCUS_HANDLERS = new Set<FocusEventHandler>();\n\ntype EventListeners = {\n\tfocus: FocusEventHandler;\n\tblur: BlurEventHandler;\n};\n\nconst registerEventListeners = (listeners: EventListeners) => {\n\tBLUR_HANDLERS.add(listeners.blur);\n\tFOCUS_HANDLERS.add(listeners.focus);\n\n\treturn () => {\n\t\tBLUR_HANDLERS.delete(listeners.blur);\n\t\tFOCUS_HANDLERS.delete(listeners.focus);\n\t};\n};\n\naddEventListener('focus', function (event) {\n\tfor (const handler of FOCUS_HANDLERS) {\n\t\ttry {\n\t\t\thandler.call(this.document, event);\n\t\t} catch {}\n\t}\n});\n\naddEventListener('blur', function (event) {\n\tfor (const handler of BLUR_HANDLERS) {\n\t\ttry {\n\t\t\thandler.call(this.document, event);\n\t\t} catch {}\n\t}\n});\n\nconst pauseOnBlur = (engine: { setFocused: (focused: boolean) => void }) => {\n\treturn {\n\t\tunsubscribe: registerEventListeners({\n\t\t\tfocus: () => {\n\t\t\t\tengine.setFocused(true);\n\t\t\t},\n\t\t\tblur: () => {\n\t\t\t\tengine.setFocused(false);\n\t\t\t},\n\t\t}),\n\t};\n};\n\nexport { pauseOnBlur };\n"],"mappings":"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","names":["memoize","DEV","asset","supportsMap","supportsMap","asset","DEV","refer","audio","item","next","memoize","DEV","memoize","memoize","memoize","memoize","store","set","set","getStack","asset","action","DEV","DEV","action","getLanguage","memoize","DEV","data","save","replace","set","characters","audio","action","type","props","asset","preview","next","t","paused"]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/.pnpm/dequal@2.0.3/node_modules/dequal/lite/index.mjs","../src/novely.ts","../../../node_modules/.pnpm/klona@2.0.6/node_modules/klona/full/index.mjs","../src/constants.ts","../src/shared.ts","../src/utilities/assertions.ts","../src/utilities/match-action.ts","../src/asset.ts","../src/audio-codecs.ts","../src/image-formats.ts","../src/utilities/actions-processing.ts","../src/utilities/controlled-promise.ts","../src/utilities/resources.ts","../src/utilities/stack.ts","../src/utilities/story.ts","../src/utilities/internationalization.ts","../src/utilities/functions.ts","../src/utilities/store.ts","../src/utilities/array.ts","../src/utilities/else.ts","../src/store.ts","../src/custom-action.ts","../src/preloading.ts","../src/storage.ts","../src/translation.ts","../src/utilities/actions.ts","../src/utilities/dialog-overview.ts","../src/utilities/document.ts","../src/extend-actions.ts","../src/translations.ts","../src/browser-events.ts"],"sourcesContent":["var has = Object.prototype.hasOwnProperty;\n\nexport function dequal(foo, bar) {\n\tvar ctor, len;\n\tif (foo === bar) return true;\n\n\tif (foo && bar && (ctor=foo.constructor) === bar.constructor) {\n\t\tif (ctor === Date) return foo.getTime() === bar.getTime();\n\t\tif (ctor === RegExp) return foo.toString() === bar.toString();\n\n\t\tif (ctor === Array) {\n\t\t\tif ((len=foo.length) === bar.length) {\n\t\t\t\twhile (len-- && dequal(foo[len], bar[len]));\n\t\t\t}\n\t\t\treturn len === -1;\n\t\t}\n\n\t\tif (!ctor || typeof foo === 'object') {\n\t\t\tlen = 0;\n\t\t\tfor (ctor in foo) {\n\t\t\t\tif (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false;\n\t\t\t\tif (!(ctor in bar) || !dequal(foo[ctor], bar[ctor])) return false;\n\t\t\t}\n\t\t\treturn Object.keys(bar).length === len;\n\t\t}\n\t}\n\n\treturn foo !== foo && bar !== bar;\n}\n","import { dequal } from 'dequal/lite';\nimport { memoize, throttle } from 'es-toolkit/function';\nimport { merge as deepmerge } from 'es-toolkit/object';\nimport { DEV } from 'esm-env';\nimport { klona } from 'klona/full';\nimport pLimit from 'p-limit';\nimport type {\n\tActionChoiceChoice,\n\tActionProxy,\n\tChoiceCheckFunction,\n\tCustomHandler,\n\tStory,\n\tTextContent,\n\tValidAction,\n\tVirtualActions,\n} from './action';\nimport type { Character } from './character';\nimport { DEFAULT_TYPEWRITER_SPEED, EMPTY_SET, MAIN_CONTEXT_KEY } from './constants';\nimport { getCustomActionHolder, handleCustomAction } from './custom-action';\nimport { enqueueAssetForPreloading, handleAssetsPreloading, huntAssets } from './preloading';\nimport type { Context, RendererInitPreviewReturn } from './renderer';\nimport { PRELOADED_ASSETS, STACK_MAP } from './shared';\nimport { storageAdapterLocal } from './storage';\nimport type { Stored } from './store';\nimport { derive, store } from './store';\nimport { flattenAllowedContent, replace as replaceTranslation } from './translation';\nimport type { BaseTranslationStrings } from './translations';\nimport type {\n\tCoreData,\n\tData,\n\tEngineTypes,\n\tLang,\n\tNovelyInit,\n\tSave,\n\tState,\n\tStateFunction,\n\tStorageData,\n\tTypeEssentials,\n} from './types';\nimport type { ControlledPromise } from './utilities';\nimport {\n\tisAction,\n\tisAudioAction,\n\tisBlockingAction,\n\tisEmpty,\n\tisFunction,\n\tisPromise,\n\tisString,\n\tisAsset,\n\tmatchAction,\n\tcreateQueueProcessor,\n\tgetActionsFromPath,\n\tcreateReferFunction,\n\texitPath,\n\tcollectActionsBeforeBlockingAction,\n\tnextPath,\n\tcreateControlledPromise,\n\tgetResourseType,\n\tcreateUseStackFunction,\n\tflatStory,\n\tcapitalize,\n\tgetLanguage as defaultGetLanguage,\n\tgetCharactersData,\n\tgetIntlLanguageDisplayName,\n\tgetLanguageFromStore,\n\tgetVolumeFromStore,\n\tnoop,\n\ttoArray,\n} from './utilities';\nimport type { MatchActionHandlers } from './utilities';\nimport { buildActionObject } from './utilities/actions';\nimport { unwrapAsset, unwrapAudioAsset, unwrapImageAsset } from './asset';\nimport { getDialogOverview } from './utilities/dialog-overview';\nimport { setDocumentLanguage } from './utilities/document';\n\nconst novely = <\n\t$Language extends string,\n\t$Characters extends Record<string, Character<$Language>>,\n\t$State extends State,\n\t$Data extends Data,\n\t$Actions extends Record<string, (...args: any[]) => ValidAction>,\n>({\n\tcharacters,\n\tcharacterAssetSizes = {},\n\tdefaultEmotions = {},\n\tstorage = storageAdapterLocal({ key: 'novely-game-storage' }),\n\tstorageDelay = Promise.resolve(),\n\trenderer: createRenderer,\n\tinitialScreen = 'mainmenu',\n\ttranslation,\n\tstate: defaultState = {} as $State,\n\tdata: defaultData = {} as $Data,\n\tautosaves = true,\n\tmigrations = [],\n\tthrottleTimeout = 850,\n\tgetLanguage = defaultGetLanguage,\n\toverrideLanguage = false,\n\taskBeforeExit = true,\n\tpreloadAssets = 'automatic',\n\tparallelAssetsDownloadLimit = 15,\n\tfetch: request = fetch,\n\tcloneFunction: clone = klona,\n\tsaveOnUnload = true,\n\tstartKey = 'start',\n\tdefaultTypewriterSpeed = DEFAULT_TYPEWRITER_SPEED,\n\tstoryOptions = { mode: 'static' },\n\tonLanguageChange,\n}: NovelyInit<$Language, $Characters, $State, $Data, $Actions>) => {\n\ttype $ActionProxy = ActionProxy<$Characters, $Language, $State>;\n\ttype $VirtualActions = VirtualActions<$Characters, $Language, $State>;\n\n\t// All action functions\n\ttype Actions = $Actions & $ActionProxy & $VirtualActions;\n\n\tconst languages = Object.keys(translation) as $Language[];\n\n\tconst limitScript = pLimit(1);\n\tconst limitAssetsDownload = pLimit(parallelAssetsDownloadLimit);\n\n\tconst story: Story = {};\n\n\tconst times = new Set<number>();\n\n\tconst dataLoaded = createControlledPromise();\n\n\tlet initialScreenWasShown = false;\n\tlet destroyed = false;\n\n\tif (storyOptions.mode === 'dynamic') {\n\t\tstoryOptions.preloadSaves ??= 4;\n\t}\n\n\tconst storyLoad = storyOptions.mode === 'static' ? noop : storyOptions.load;\n\tconst onUnknownSceneHit = memoize(async (scene: string) => {\n\t\tconst part = await storyLoad(scene);\n\n\t\tif (part) {\n\t\t\tawait script(part);\n\t\t}\n\t});\n\n\t/**\n\t * Saves timestamps created in this session\n\t */\n\tconst intime = (value: number) => {\n\t\treturn times.add(value), value;\n\t};\n\n\tconst scriptBase = async (part: Story) => {\n\t\t// In case script was called after destroy\n\t\tif (destroyed) return;\n\n\t\tObject.assign(story, flatStory(part));\n\n\t\t// This is the first `script` call, likely data did not loaded yet\n\t\tif (!initialScreenWasShown) {\n\t\t\trenderer.ui.showLoading();\n\t\t}\n\n\t\tawait dataLoaded.promise;\n\n\t\trenderer.ui.hideLoading();\n\n\t\tif (!initialScreenWasShown) {\n\t\t\tinitialScreenWasShown = true;\n\n\t\t\tif (initialScreen === 'game') {\n\t\t\t\trestore(undefined);\n\t\t\t} else {\n\t\t\t\trenderer.ui.showScreen(initialScreen);\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Setup your story here\n\t *\n\t * Call more than once to merge different story parts\n\t *\n\t * @example\n\t *\n\t * ```js\n\t * engine.script({\n\t * start: [action.jump('another-part')]\n\t * })\n\t *\n\t * engine.script({\n\t * 'another-part': []\n\t * })\n\t * ```\n\t */\n\tconst script = (part: Story) => {\n\t\treturn limitScript(() => scriptBase(part));\n\t};\n\n\tconst getDefaultSave = (state: $State) => {\n\t\treturn [\n\t\t\t[\n\t\t\t\t['jump', startKey],\n\t\t\t\t[null, 0],\n\t\t\t],\n\t\t\tstate,\n\t\t\t[intime(Date.now()), 'auto'],\n\t\t\t[],\n\t\t] as Save<$State>;\n\t};\n\n\t/**\n\t * Calls `getLanguage`, passes needed arguments\n\t * @returns language\n\t */\n\tconst getLanguageWithoutParameters = () => {\n\t\tconst language = getLanguage(languages, defaultGetLanguage);\n\n\t\t// This is valid language\n\t\tif (languages.includes(language as $Language)) {\n\t\t\tsetDocumentLanguage(language);\n\n\t\t\treturn language as $Language;\n\t\t}\n\n\t\tif (DEV) {\n\t\t\tthrow new Error(\n\t\t\t\t`Attempt to use unsupported language \"${language}\". Supported languages: ${languages.join(', ')}.`,\n\t\t\t);\n\t\t}\n\n\t\tthrow 0;\n\t};\n\n\t/**\n\t * 1) Novely rendered using the `initialData`, but you can't start new game or `load` an empty one - this is scary, imagine losing your progress\n\t * 2) Actual stored data is loaded, language and etc is changed\n\t */\n\tconst initialData: StorageData<$Language, $Data> = {\n\t\tsaves: [],\n\t\tdata: clone(defaultData),\n\t\tmeta: [getLanguageWithoutParameters(), DEFAULT_TYPEWRITER_SPEED, 1, 1, 1],\n\t};\n\n\tconst storageData = store(initialData);\n\tconst coreData = store<CoreData>({\n\t\tdataLoaded: false,\n\t\tpaused: false,\n\t\tfocused: document.visibilityState === 'visible',\n\t});\n\n\tconst paused = derive(coreData, (s) => s.paused || !s.focused);\n\n\tconst onDataLoadedPromise = async ({ cancelled }: Awaited<ControlledPromise<void>>) => {\n\t\t/**\n\t\t * Promise cancelled? Re-subscribe\n\t\t */\n\t\tif (cancelled) {\n\t\t\tdataLoaded.promise.then(onDataLoadedPromise);\n\t\t\treturn;\n\t\t}\n\n\t\tconst preload = () => {\n\t\t\tconst saves = [...storageData.get().saves].reverse();\n\t\t\tconst sliced = saves.slice(0, storyOptions.mode === 'dynamic' ? storyOptions.preloadSaves : 0);\n\n\t\t\tfor (const [path] of sliced) {\n\t\t\t\treferGuarded(path);\n\t\t\t}\n\t\t};\n\n\t\tpreload();\n\n\t\t/**\n\t\t * When promise is resolved data is marked loaded\n\t\t */\n\t\tcoreData.update((data) => {\n\t\t\tdata.dataLoaded = true;\n\n\t\t\treturn data;\n\t\t});\n\t};\n\n\tdataLoaded.promise.then(onDataLoadedPromise);\n\n\tconst onStorageDataChange = (value: StorageData) => {\n\t\tif (!coreData.get().dataLoaded) return;\n\n\t\tconst data = clone(value);\n\n\t\t/**\n\t\t * Empty out data snapshots\n\t\t */\n\t\tfor (const save of data.saves) {\n\t\t\tsave[3] = [];\n\t\t}\n\n\t\tstorage.set(data);\n\t};\n\n\t/**\n\t * Short one is used in conditions like `beforeunload` when waiting for too long is not a case\n\t * Another one relies on short one to prevent double saving\n\t */\n\tconst throttledShortOnStorageDataChange = throttle(() => onStorageDataChange(storageData.get()), 10);\n\tconst throttledOnStorageDataChange = throttle(throttledShortOnStorageDataChange, throttleTimeout);\n\n\tstorageData.subscribe(throttledOnStorageDataChange);\n\n\tif (saveOnUnload === true || (saveOnUnload === 'prod' && !DEV)) {\n\t\taddEventListener('beforeunload', throttledShortOnStorageDataChange);\n\t}\n\n\tconst getStoredData = async () => {\n\t\tlet stored = await storage.get();\n\n\t\tfor (const migration of migrations) {\n\t\t\tstored = migration(stored) as StorageData;\n\n\t\t\tif (DEV && !stored) {\n\t\t\t\tthrow new Error('Migrations should return a value.');\n\t\t\t}\n\t\t}\n\n\t\tif (overrideLanguage || !stored.meta[0]) {\n\t\t\tstored.meta[0] = getLanguageWithoutParameters();\n\t\t}\n\n\t\t/**\n\t\t * Default `localStorageStorage` returns empty array\n\t\t */\n\t\tstored.meta[1] ||= defaultTypewriterSpeed;\n\n\t\t/**\n\t\t * Sound Volumes\n\t\t */\n\t\tstored.meta[2] ??= 1;\n\t\tstored.meta[3] ??= 1;\n\t\tstored.meta[4] ??= 1;\n\n\t\t/**\n\t\t * When data is empty replace it with `defaultData`\n\t\t * It also might be empty (default to empty)\n\t\t */\n\t\tif (isEmpty(stored.data)) {\n\t\t\tstored.data = defaultData as Data;\n\t\t}\n\n\t\t/**\n\t\t * Now the next store updates will entail saving via storage.set\n\t\t */\n\t\tdataLoaded.resolve();\n\n\t\tstorageData.set(stored as StorageData<$Language, $Data>);\n\t};\n\n\t/**\n\t * By default this is resolved immediately, but also can be delayed.\n\t * I.e. storage has not loaded yet\n\t */\n\tstorageDelay.then(getStoredData);\n\n\tconst initial = getDefaultSave(clone(defaultState));\n\n\t// #region Save Function\n\tconst save = (type: Save[2][1]) => {\n\t\tif (!coreData.get().dataLoaded) return;\n\n\t\t/**\n\t\t * When autosaves diabled just return\n\t\t */\n\t\tif (!autosaves && type === 'auto') return;\n\n\t\t/**\n\t\t * Saves only possible in main context, so there is no reason for context to be used here\n\t\t */\n\t\tconst stack = useStack(MAIN_CONTEXT_KEY);\n\t\tconst current = clone(stack.value);\n\n\t\tstorageData.update((prev) => {\n\t\t\tconst replace = () => {\n\t\t\t\tprev.saves[prev.saves.length - 1] = current;\n\n\t\t\t\treturn prev;\n\t\t\t};\n\n\t\t\tconst add = () => {\n\t\t\t\tprev.saves.push(current);\n\n\t\t\t\treturn prev;\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * Get latest\n\t\t\t */\n\t\t\tconst last = prev.saves.at(-1);\n\n\t\t\t/**\n\t\t\t * We cannot compare anything here, thus just reutrn\n\t\t\t */\n\t\t\tif (!last) return add();\n\n\t\t\t/**\n\t\t\t * Update type and time information\n\t\t\t */\n\t\t\tcurrent[2][0] = intime(Date.now());\n\t\t\tcurrent[2][1] = type;\n\n\t\t\t/**\n\t\t\t * Empty out state snapshots\n\t\t\t */\n\t\t\tcurrent[3] = [];\n\n\t\t\tconst isIdentical = dequal(last[0], current[0]) && dequal(last[1], current[1]);\n\t\t\tconst isLastMadeInCurrentSession = times.has(last[2][0]);\n\n\t\t\t/**\n\t\t\t * Even if override is false, we will replace auto save with manual, because they are the same thing basically\n\t\t\t */\n\t\t\tif (isLastMadeInCurrentSession && last[2][1] === 'auto' && type === 'manual') {\n\t\t\t\treturn replace();\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Player has made a manual save, novely decided to make an auto save\n\t\t\t * But it is identical to previously created manual save so completely not wanted\n\t\t\t */\n\t\t\tif (last[2][1] === 'manual' && type === 'auto' && isIdentical) {\n\t\t\t\treturn prev;\n\t\t\t}\n\n\t\t\tif (isLastMadeInCurrentSession && last[2][1] === 'auto' && type === 'auto') {\n\t\t\t\treturn replace();\n\t\t\t}\n\n\t\t\treturn add();\n\t\t});\n\t};\n\t// #endregion\n\n\t// #region New Game\n\tconst newGame = () => {\n\t\tif (!coreData.get().dataLoaded) return;\n\n\t\tconst save = getDefaultSave(clone(defaultState));\n\n\t\t/**\n\t\t * Initial save is automatic, and should be ignored when autosaves is turned off\n\t\t */\n\t\tif (autosaves) {\n\t\t\tstorageData.update((prev) => {\n\t\t\t\treturn prev.saves.push(save), prev;\n\t\t\t});\n\t\t}\n\n\t\tconst context = renderer.getContext(MAIN_CONTEXT_KEY);\n\t\tconst stack = useStack(context);\n\n\t\tstack.value = save;\n\t\tcontext.meta.restoring = context.meta.goingBack = false;\n\n\t\trenderer.ui.showScreen('game');\n\n\t\trender(context);\n\t};\n\t// #endregion\n\n\t/**\n\t * Set's the save and restores onto it\n\t */\n\tconst set = (save: Save, ctx?: Context) => {\n\t\tconst stack = useStack(ctx || MAIN_CONTEXT_KEY);\n\n\t\tstack.value = save;\n\n\t\treturn restore(save);\n\t};\n\n\tlet interacted = 0;\n\n\t// #region Restore Function\n\t/**\n\t * Restore save or if none is passed then look for latest save, if there is no saves will create a new save\n\t */\n\tconst restore = async (save: Save | undefined) => {\n\t\tif (isEmpty(story)) {\n\t\t\tif (DEV) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Story is empty. You should call an `enine.script` function [https://novely.pages.dev/guide/story.html]',\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (!coreData.get().dataLoaded) return;\n\n\t\tlet latest = save || storageData.get().saves.at(-1);\n\n\t\t/**\n\t\t * When there is no save, make a new save\n\t\t */\n\t\tif (!latest) {\n\t\t\tlatest = clone(initial);\n\n\t\t\tstorageData.update((prev) => {\n\t\t\t\t/**\n\t\t\t\t * `latest` will be not undefined because this callback called immediately and variable is not changed\n\t\t\t\t */\n\t\t\t\tprev.saves.push(latest!);\n\n\t\t\t\treturn prev;\n\t\t\t});\n\t\t}\n\n\t\tconst context = renderer.getContext(MAIN_CONTEXT_KEY);\n\t\tconst stack = useStack(context);\n\n\t\tcontext.meta.restoring = true;\n\n\t\tconst previous = stack.previous;\n\n\t\tconst [path] = (stack.value = latest);\n\n\t\trenderer.ui.showScreen('game');\n\n\t\tconst { found } = await refer(path);\n\n\t\tif (found) context.loading(true);\n\n\t\tconst { queue, skip, skipPreserve } = await getActionsFromPath({\n\t\t\tstory,\n\t\t\tpath,\n\t\t\tfilter: false,\n\t\t\treferGuarded,\n\t\t});\n\n\t\tconst {\n\t\t\trun,\n\t\t\tkeep: { keep, characters, audio },\n\t\t} = createQueueProcessor(queue, {\n\t\t\tskip,\n\t\t\tskipPreserve,\n\t\t});\n\n\t\tif (previous) {\n\t\t\tconst { queue: prevQueue } = await getActionsFromPath({\n\t\t\t\tstory,\n\t\t\t\tpath: previous[0],\n\t\t\t\tfilter: false,\n\t\t\t\treferGuarded,\n\t\t\t});\n\n\t\t\tfor (let i = prevQueue.length - 1; i > queue.length - 1; i--) {\n\t\t\t\tconst element = prevQueue[i];\n\n\t\t\t\t/**\n\t\t\t\t * Just in case 🤷\n\t\t\t\t */\n\t\t\t\tif (!isAction(element)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst [action, fn] = element;\n\n\t\t\t\t/**\n\t\t\t\t * Imagine array of actions like\n\t\t\t\t *\n\t\t\t\t * [\n\t\t\t\t * ['dialog', ...props]\n\t\t\t\t * ['showBackground', ...props]\n\t\t\t\t * ['custom', function]\n\t\t\t\t * ]\n\t\t\t\t *\n\t\t\t\t * When player goes back array changes to\n\t\t\t\t *\n\t\t\t\t * [\n\t\t\t\t * ['dialog', ...props]\n\t\t\t\t * ]\n\t\t\t\t *\n\t\t\t\t * We catch these custom actions that are gone and\n\t\t\t\t * call their clear methods so there is no side effects\n\t\t\t\t * from future in the past\n\t\t\t\t */\n\t\t\t\tif (action === 'custom') {\n\t\t\t\t\tgetCustomActionHolder(context, fn).cleanup();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (context.meta.goingBack) {\n\t\t\t/**\n\t\t\t * Context is cleared at exit, so it is dirty only when goingBack\n\t\t\t */\n\t\t\tmatch('clear', [keep, characters, audio], {\n\t\t\t\tctx: context,\n\t\t\t\tdata: latest[1],\n\t\t\t});\n\t\t}\n\n\t\tcontext.loading(false);\n\n\t\tconst lastQueueItem = queue.at(-1);\n\t\tconst lastQueueItemRequiresUserAction = lastQueueItem && isBlockingAction(lastQueueItem);\n\n\t\tawait run((item) => {\n\t\t\tif (!latest) return;\n\n\t\t\t/**\n\t\t\t * Skip because last item will be ran again by `render(context)` call\n\t\t\t */\n\t\t\tif (lastQueueItem === item && lastQueueItemRequiresUserAction) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst [action, ...props] = item;\n\n\t\t\treturn match(action, props, {\n\t\t\t\tctx: context,\n\t\t\t\tdata: latest[1],\n\t\t\t});\n\t\t});\n\n\t\tif (!context.meta.goingBack) {\n\t\t\t/**\n\t\t\t * When not goingBack setting restoring to false is required to go forward\n\t\t\t * Because when restoring action do not call the resolve function which goes to next action but are controlled\n\t\t\t */\n\t\t\tcontext.meta.restoring = false;\n\t\t}\n\n\t\tawait render(context);\n\n\t\tcontext.meta.restoring = context.meta.goingBack = false;\n\t};\n\t// #endregion\n\n\tconst { refer, referGuarded } = createReferFunction({\n\t\tstory,\n\t\tonUnknownSceneHit,\n\t});\n\n\t// #region Exit Function\n\t/**\n\t * @param force Force exit\n\t */\n\tconst exit = (force = false, saving = true) => {\n\t\t/**\n\t\t * Exit only possible in main context\n\t\t */\n\t\tconst ctx = renderer.getContext(MAIN_CONTEXT_KEY);\n\n\t\tconst stack = useStack(ctx);\n\t\tconst current = stack.value;\n\n\t\tconst isSaved = () => {\n\t\t\tconst { saves } = storageData.get();\n\t\t\tconst [currentPath, currentData] = stack.value;\n\n\t\t\treturn saves.some(\n\t\t\t\t([path, data, [date, type]]) =>\n\t\t\t\t\ttype === 'manual' && times.has(date) && dequal(path, currentPath) && dequal(data, currentData),\n\t\t\t);\n\t\t};\n\n\t\tif (interacted > 1 && !force && askBeforeExit && !isSaved()) {\n\t\t\trenderer.ui.showExitPrompt();\n\t\t\treturn;\n\t\t}\n\n\t\t/**\n\t\t * Imagine list of actions like\n\t\t *\n\t\t * [\n\t\t * ['input', ...args]\n\t\t * ['dialog', ...args]\n\t\t * ]\n\t\t *\n\t\t * When you have done with input, you will go to the dialog\n\t\t * And at that moment you exit the game\n\t\t *\n\t\t * What happens? Input was \"enmemoried\", but dialog not. So when you will open saves, you'll see input action.\n\t\t * We cannot \"enmemory\" dialog when it's just started, because goingBack is going to last enmemoried item, which will be that dialog, so impossible to go back.\n\t\t *\n\t\t * What we do is enmemory on exit.\n\t\t */\n\t\tif (interacted > 0 && saving) {\n\t\t\tsave('auto');\n\t\t}\n\n\t\tstack.clear();\n\t\tctx.clear(EMPTY_SET, EMPTY_SET, { music: EMPTY_SET, sounds: EMPTY_SET }, noop);\n\t\trenderer.ui.showScreen('mainmenu');\n\t\tctx.audio.destroy();\n\n\t\tconst [time, type] = current[2];\n\n\t\t/**\n\t\t * This is auto save and belongs to the current session\n\t\t * Player did not interacted or did it once, so this is probably not-needed save\n\t\t */\n\t\tif (type === 'auto' && interacted <= 1 && times.has(time)) {\n\t\t\tstorageData.update((prev) => {\n\t\t\t\tprev.saves = prev.saves.filter((save) => save !== current);\n\n\t\t\t\treturn prev;\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Reset interactive value\n\t\t */\n\t\tinteractivity(false);\n\t\t/**\n\t\t * Reset session times\n\t\t */\n\t\ttimes.clear();\n\t};\n\t// #endregion\n\n\tconst back = async () => {\n\t\t/**\n\t\t * Back also happens in main context only\n\t\t */\n\t\tconst stack = useStack(MAIN_CONTEXT_KEY);\n\n\t\tconst valueBeforeBack = stack.value;\n\n\t\tstack.back();\n\n\t\t/**\n\t\t * There was only one item in the stack so there is no `stack.previous`, also `ctx.meta.goingBack` did not changed\n\t\t */\n\t\tif (dequal(valueBeforeBack, stack.value) && !stack.previous) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait restore(stack.value);\n\t};\n\n\tconst t = (key: BaseTranslationStrings, lang: string | $Language) => {\n\t\treturn translation[lang as $Language].internal[key];\n\t};\n\n\t// #region Preview Function\n\t/**\n\t * Execute save in context named `name`\n\t * @param save Save\n\t * @param name Context name\n\t */\n\tconst preview = async (save: Save, name: string): Promise<RendererInitPreviewReturn> => {\n\t\tif (isEmpty(story)) {\n\t\t\treturn Promise.resolve({\n\t\t\t\tassets: [],\n\t\t\t});\n\t\t}\n\n\t\tconst [path, data] = save;\n\n\t\tconst ctx = renderer.getContext(name);\n\n\t\tconst { found } = await refer(path);\n\n\t\tif (found) ctx.loading(true);\n\n\t\tconst { queue } = await getActionsFromPath({\n\t\t\tstory,\n\t\t\tpath,\n\t\t\tfilter: true,\n\t\t\treferGuarded,\n\t\t});\n\n\t\tctx.loading(false);\n\n\t\t/**\n\t\t * Enter restoring mode in action\n\t\t */\n\t\tctx.meta.restoring = true;\n\t\tctx.meta.preview = true;\n\n\t\tconst processor = createQueueProcessor(queue, {\n\t\t\tskip: EMPTY_SET,\n\t\t});\n\n\t\tuseStack(ctx).push(clone(save));\n\n\t\tconst assets: string[] = [];\n\n\t\tawait processor.run(([action, ...props]) => {\n\t\t\tif (isAudioAction(action)) return;\n\t\t\tif (action === 'vibrate') return;\n\t\t\tif (action === 'end') return;\n\n\t\t\thuntAssets({\n\t\t\t\taction,\n\t\t\t\tprops: props as any,\n\n\t\t\t\tcharacters,\n\n\t\t\t\tlang: getLanguageFromStore(storageData),\n\t\t\t\tvolume: getVolumeFromStore(storageData),\n\n\t\t\t\thandle: assets.push.bind(assets),\n\t\t\t});\n\n\t\t\treturn match(action, props, {\n\t\t\t\tctx,\n\t\t\t\tdata,\n\t\t\t});\n\t\t});\n\n\t\treturn {\n\t\t\tassets,\n\t\t};\n\t};\n\t// #endregion\n\n\tconst removeContext = (name: string) => {\n\t\tSTACK_MAP.delete(name);\n\t};\n\n\tconst getStateAtCtx = (context: string | Context) => {\n\t\treturn useStack(context).value[1];\n\t};\n\n\tconst getStateFunction = (context: string | Context) => {\n\t\tconst stack = useStack(context);\n\n\t\tconst state = ((value) => {\n\t\t\tconst _state = getStateAtCtx(context);\n\n\t\t\tif (!value) {\n\t\t\t\treturn _state;\n\t\t\t}\n\n\t\t\tconst prev = _state;\n\t\t\tconst val = isFunction(value) ? value(prev) : deepmerge(prev, value);\n\n\t\t\tstack.value[1] = val;\n\n\t\t\treturn undefined;\n\t\t}) as StateFunction<State>;\n\n\t\treturn state;\n\t};\n\n\tconst getLanguageDisplayName = (lang: Lang) => {\n\t\tconst language = translation[lang as $Language];\n\n\t\tif (DEV && !language) {\n\t\t\tthrow new Error(\n\t\t\t\t`Attempt to use unsupported language \"${language}\". Supported languages: ${languages.join(', ')}.`,\n\t\t\t);\n\t\t}\n\n\t\treturn capitalize(language.nameOverride || getIntlLanguageDisplayName(lang));\n\t};\n\n\tconst clearCustomAction = (ctx: Context, fn: CustomHandler) => {\n\t\tgetCustomActionHolder(ctx, fn).cleanup();\n\t};\n\n\tconst getResourseTypeWrapper = (url: string) => {\n\t\treturn getResourseType({\n\t\t\turl,\n\t\t\trequest,\n\t\t});\n\t};\n\n\tconst getCharacterColor = (c: keyof $Characters) => {\n\t\treturn c in characters ? characters[c].color : '#000000';\n\t};\n\n\tconst getCharacterAssets = (character: string, emotion: string) => {\n\t\treturn toArray(characters[character].emotions[emotion]).map(unwrapImageAsset);\n\t};\n\n\tconst getCharacterName = (character: keyof $Characters): string => {\n\t\tconst c = character;\n\t\tconst cs = characters;\n\t\tconst lang = getLanguageFromStore(storageData);\n\n\t\tif (c && c in cs) {\n\t\t\tconst block = cs[c].name;\n\n\t\t\tif (typeof block === 'string') {\n\t\t\t\treturn block;\n\t\t\t}\n\n\t\t\tif (lang in block) {\n\t\t\t\treturn block[lang];\n\t\t\t}\n\t\t}\n\n\t\treturn String(c);\n\t};\n\n\tconst setLanguage = (lang: string) => {\n\t\tstorageData.update((prev) => {\n\t\t\tif (languages.includes(lang as $Language)) {\n\t\t\t\tprev.meta[0] = lang as $Language;\n\t\t\t}\n\n\t\t\tif (lang === prev.meta[0]) {\n\t\t\t\tsetDocumentLanguage(lang);\n\t\t\t\tonLanguageChange?.(lang as $Language);\n\t\t\t}\n\n\t\t\treturn prev;\n\t\t});\n\t};\n\n\t// #region Renderer Creation\n\tconst renderer = createRenderer({\n\t\tmainContextKey: MAIN_CONTEXT_KEY,\n\n\t\tcharacters: getCharactersData(characters),\n\t\tcharacterAssetSizes,\n\t\tset,\n\t\trestore,\n\t\tsave,\n\t\tnewGame,\n\t\texit,\n\t\tback,\n\t\tt,\n\t\tpreview,\n\t\tremoveContext,\n\t\tgetStateFunction,\n\t\tclearCustomAction,\n\t\tlanguages,\n\t\tstorageData: storageData as unknown as Stored<StorageData<string, Data>>,\n\t\tcoreData,\n\n\t\tgetLanguageDisplayName,\n\t\tgetCharacterColor,\n\t\tgetCharacterAssets,\n\t\tgetDialogOverview: getDialogOverview.bind({\n\t\t\treferGuarded,\n\t\t\tstory,\n\t\t\tgetCharacterName,\n\t\t\tgetLanguage: () => getLanguageFromStore(storageData),\n\t\t\tgetStack: () => useStack(MAIN_CONTEXT_KEY),\n\t\t\ttemplateReplace: (...args) => templateReplace(...args),\n\t\t}),\n\n\t\tgetResourseType: getResourseTypeWrapper,\n\n\t\tsetLanguage,\n\t});\n\t// #endregion\n\n\tconst useStack = createUseStackFunction(renderer);\n\n\t/**\n\t * Initiate\n\t */\n\tuseStack(MAIN_CONTEXT_KEY).push(initial);\n\n\tconst UIInstance = renderer.ui.start();\n\n\tconst enmemory = (ctx: Context) => {\n\t\tif (ctx.meta.restoring) return;\n\n\t\tconst stack = useStack(ctx);\n\n\t\tconst current = clone(stack.value);\n\n\t\tcurrent[2][1] = 'auto';\n\n\t\tstack.push(current);\n\n\t\tsave('auto');\n\t};\n\n\tconst next = (ctx: Context) => {\n\t\tconst stack = useStack(ctx);\n\t\tconst path = stack.value[0];\n\n\t\tnextPath(path);\n\t};\n\n\tconst matchActionOptions: MatchActionHandlers = {\n\t\tgetContext: renderer.getContext,\n\t\tpush(ctx) {\n\t\t\tif (ctx.meta.restoring) return;\n\n\t\t\tnext(ctx);\n\t\t\trender(ctx);\n\t\t},\n\t\tforward(ctx) {\n\t\t\tif (!ctx.meta.preview) enmemory(ctx);\n\n\t\t\tmatchActionOptions.push(ctx);\n\n\t\t\tif (!ctx.meta.preview) interactivity(true);\n\t\t},\n\t\tasync onBeforeActionCall({ action, props, ctx }) {\n\t\t\tif (preloadAssets !== 'automatic') return;\n\t\t\tif (ctx.meta.preview || ctx.meta.restoring) return;\n\t\t\tif (!isBlockingAction([action, ...props] as unknown as Exclude<ValidAction, ValidAction[]>)) return;\n\n\t\t\ttry {\n\t\t\t\tconst collection = await collectActionsBeforeBlockingAction({\n\t\t\t\t\tpath: nextPath(clone(useStack(ctx).value[0])),\n\t\t\t\t\trefer: referGuarded,\n\t\t\t\t\tclone,\n\t\t\t\t});\n\n\t\t\t\tfor (const [action, ...props] of collection) {\n\t\t\t\t\thuntAssets({\n\t\t\t\t\t\taction,\n\t\t\t\t\t\tprops: props as any,\n\n\t\t\t\t\t\tcharacters,\n\n\t\t\t\t\t\tlang: getLanguageFromStore(storageData),\n\t\t\t\t\t\tvolume: getVolumeFromStore(storageData),\n\n\t\t\t\t\t\thandle: enqueueAssetForPreloading,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\thandleAssetsPreloading({\n\t\t\t\t\t...renderer.misc,\n\t\t\t\t\trequest,\n\t\t\t\t\tlimiter: limitAssetsDownload,\n\t\t\t\t});\n\t\t\t} catch (cause) {\n\t\t\t\tconsole.error(cause);\n\t\t\t}\n\t\t},\n\t};\n\n\t// #region Match Action\n\tconst { match, nativeActions } = matchAction(matchActionOptions, {\n\t\twait({ ctx, data, push }, [time]) {\n\t\t\tif (ctx.meta.restoring) return;\n\n\t\t\tsetTimeout(push, isFunction(time) ? time(data) : time);\n\t\t},\n\t\tshowBackground({ ctx, push }, [background]) {\n\t\t\tif (isString(background) || isAsset(background)) {\n\t\t\t\tctx.background({\n\t\t\t\t\tall: unwrapImageAsset(background),\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tctx.background(\n\t\t\t\t\tObject.fromEntries(Object.entries(background).map(([media, asset]) => [media, unwrapImageAsset(asset)])),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tpush();\n\t\t},\n\t\tplayMusic({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'music').play(true);\n\t\t\tpush();\n\t\t},\n\t\tpauseMusic({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'music').pause();\n\t\t\tpush();\n\t\t},\n\t\tstopMusic({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'music').stop();\n\t\t\tpush();\n\t\t},\n\t\tplaySound({ ctx, push }, [source, loop]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'sound').play(loop || false);\n\t\t\tpush();\n\t\t},\n\t\tpauseSound({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'sound').pause();\n\t\t\tpush();\n\t\t},\n\t\tstopSound({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'sound').stop();\n\t\t\tpush();\n\t\t},\n\t\tvoice({ ctx, push }, [source]) {\n\t\t\tconst lang = getLanguageFromStore(storageData);\n\t\t\tconst audioSource = isString(source) ? source : isAsset(source) ? source : source[lang];\n\n\t\t\t/**\n\t\t\t * We allow ignoring voice because it is okay to not have voiceover for certain languages\n\t\t\t */\n\t\t\tif (!audioSource) {\n\t\t\t\tpush();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tctx.audio.voice(unwrapAudioAsset(audioSource), paused);\n\t\t\tpush();\n\t\t},\n\t\tstopVoice({ ctx, push }) {\n\t\t\tctx.audio.voiceStop();\n\t\t\tpush();\n\t\t},\n\t\tshowCharacter({ ctx, push }, [character, emotion, className, style]) {\n\t\t\temotion ??= defaultEmotions[character];\n\n\t\t\tif (DEV && !emotion) {\n\t\t\t\tthrow new Error(`Attemp to show character \"${character}\" without emotion provided.`);\n\t\t\t}\n\n\t\t\tif (!emotion) return;\n\n\t\t\tif (DEV && !characters[character].emotions[emotion]) {\n\t\t\t\tthrow new Error(`Attempt to show character \"${character}\" with unknown emotion \"${emotion}\"`);\n\t\t\t}\n\n\t\t\tconst handle = ctx.character(character);\n\n\t\t\thandle.append(className, style, ctx.meta.restoring);\n\t\t\thandle.emotion(emotion, true);\n\n\t\t\tpush();\n\t\t},\n\t\thideCharacter({ ctx, push }, [character, className, style, duration]) {\n\t\t\tctx.character(character).remove(className, style, duration, ctx.meta.restoring).then(push);\n\t\t},\n\t\tdialog({ ctx, data, forward }, [character, content, emotion]) {\n\t\t\tconst name = getCharacterName(character);\n\t\t\tconst stack = useStack(ctx);\n\n\t\t\t/**\n\t\t\t * For each \"dialog\" we save copy of current game state\n\t\t\t * It's used for dialog overview\n\t\t\t */\n\t\t\tif (!ctx.meta.restoring && !ctx.meta.goingBack) {\n\t\t\t\tstack.value[3].push(clone(data));\n\t\t\t}\n\n\t\t\tctx.clearBlockingActions('dialog');\n\n\t\t\tctx.dialog(templateReplace(content, data), templateReplace(name, data), character, emotion, forward);\n\t\t},\n\t\tfunction({ ctx, push }, [fn]) {\n\t\t\tconst { restoring, goingBack, preview } = ctx.meta;\n\n\t\t\tconst result = fn({\n\t\t\t\tlang: getLanguageFromStore(storageData),\n\t\t\t\tgoingBack,\n\t\t\t\trestoring,\n\t\t\t\tpreview,\n\t\t\t\tstate: getStateFunction(ctx),\n\t\t\t});\n\n\t\t\tif (!ctx.meta.restoring) {\n\t\t\t\tresult ? result.then(push) : push();\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\t\tchoice({ ctx, data }, [question, ...choices]) {\n\t\t\tconst isWithoutQuestion = Array.isArray(question);\n\n\t\t\tif (isWithoutQuestion) {\n\t\t\t\t/**\n\t\t\t\t * Can be string or a choice\n\t\t\t\t */\n\t\t\t\tchoices.unshift(question as unknown as ActionChoiceChoice<string, State>);\n\n\t\t\t\t/**\n\t\t\t\t * Omitted then\n\t\t\t\t */\n\t\t\t\tquestion = '';\n\t\t\t}\n\n\t\t\tconst transformedChoices = choices.map(([content, _children, active, visible, onSelect, image]) => {\n\t\t\t\tconst active$ = store(false);\n\t\t\t\tconst visible$ = store(false);\n\n\t\t\t\tconst lang = getLanguageFromStore(storageData);\n\n\t\t\t\tconst getCheckValue = (fn: ChoiceCheckFunction<string, State> | undefined) => {\n\t\t\t\t\t// If there is no explicit \"no\" choice will be active or visible, etc...\n\t\t\t\t\tif (!fn) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Here we need to use \"fresh\" state instead of \"data\" parameter\n\t\t\t\t\treturn fn({\n\t\t\t\t\t\tlang,\n\t\t\t\t\t\tstate: getStateAtCtx(ctx),\n\t\t\t\t\t});\n\t\t\t\t};\n\n\t\t\t\tconst update = () => {\n\t\t\t\t\tactive$.set(getCheckValue(active));\n\t\t\t\t\tvisible$.set(getCheckValue(visible));\n\t\t\t\t};\n\n\t\t\t\tupdate();\n\n\t\t\t\tconst onSelectGuarded = onSelect || noop;\n\t\t\t\tconst onSelectWrapped = () => {\n\t\t\t\t\tonSelectGuarded({\n\t\t\t\t\t\trecompute: update,\n\t\t\t\t\t});\n\t\t\t\t};\n\n\t\t\t\tconst imageValue = image ? unwrapImageAsset(image) : '';\n\n\t\t\t\treturn [templateReplace(content, data), active$, visible$, onSelectWrapped, imageValue] as [\n\t\t\t\t\tstring,\n\t\t\t\t\tStored<boolean>,\n\t\t\t\t\tStored<boolean>,\n\t\t\t\t\t() => void,\n\t\t\t\t\tstring,\n\t\t\t\t];\n\t\t\t});\n\n\t\t\tif (DEV && transformedChoices.length === 0) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Running choice without variants to choose from, look at how to use Choice action properly [https://novely.pages.dev/guide/actions/choice#usage]`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tctx.clearBlockingActions('choice');\n\n\t\t\tctx.choices(templateReplace(question, data), transformedChoices, (selected) => {\n\t\t\t\tif (!ctx.meta.preview) {\n\t\t\t\t\tenmemory(ctx);\n\t\t\t\t}\n\n\t\t\t\tconst stack = useStack(ctx);\n\n\t\t\t\t/**\n\t\t\t\t * If there is a question, then `index` should be shifted by `1`\n\t\t\t\t */\n\t\t\t\tconst offset = isWithoutQuestion ? 0 : 1;\n\n\t\t\t\tif (DEV && !transformedChoices[selected]) {\n\t\t\t\t\tthrow new Error('Choice children is empty, either add content there or make item not selectable');\n\t\t\t\t}\n\n\t\t\t\tstack.value[0].push(['choice', selected + offset], [null, 0]);\n\t\t\t\trender(ctx);\n\t\t\t\tinteractivity(true);\n\t\t\t});\n\t\t},\n\t\tjump({ ctx, data }, [scene]) {\n\t\t\tconst stack = useStack(ctx);\n\n\t\t\t/**\n\t\t\t * `-1` index is used here because `clear` will run `next` that will increase index to `0`\n\t\t\t */\n\t\t\tstack.value[0] = [\n\t\t\t\t['jump', scene],\n\t\t\t\t[null, -1],\n\t\t\t];\n\n\t\t\tstack.value[3] = [];\n\n\t\t\tmatch('clear', [], {\n\t\t\t\tctx,\n\t\t\t\tdata,\n\t\t\t});\n\t\t},\n\t\tclear({ ctx, push }, [keep, characters, audio]) {\n\t\t\t/**\n\t\t\t * Remove vibration\n\t\t\t */\n\t\t\tctx.vibrate(0);\n\n\t\t\t/**\n\t\t\t * Call the actual `clear`\n\t\t\t */\n\t\t\tctx.clear(\n\t\t\t\tkeep || EMPTY_SET,\n\t\t\t\tcharacters || EMPTY_SET,\n\t\t\t\taudio || { music: EMPTY_SET, sounds: EMPTY_SET },\n\t\t\t\tpush,\n\t\t\t);\n\t\t},\n\t\tcondition({ ctx, data }, [condition, variants]) {\n\t\t\tif (DEV && Object.values(variants).length === 0) {\n\t\t\t\tthrow new Error(`Attempt to use Condition action with empty variants object`);\n\t\t\t}\n\n\t\t\tif (!ctx.meta.restoring) {\n\t\t\t\tconst val = String(condition(data));\n\n\t\t\t\tif (DEV && !variants[val]) {\n\t\t\t\t\tthrow new Error(`Attempt to go to unknown variant \"${val}\"`);\n\t\t\t\t}\n\n\t\t\t\tif (DEV && variants[val].length === 0) {\n\t\t\t\t\tthrow new Error(`Attempt to go to empty variant \"${val}\"`);\n\t\t\t\t}\n\n\t\t\t\tconst stack = useStack(ctx);\n\n\t\t\t\tstack.value[0].push(['condition', val], [null, 0]);\n\n\t\t\t\trender(ctx);\n\t\t\t}\n\t\t},\n\t\tend({ ctx }) {\n\t\t\tif (ctx.meta.preview) return;\n\n\t\t\texit(true, false);\n\t\t},\n\t\tinput({ ctx, data, forward }, [question, onInput, setup]) {\n\t\t\tctx.clearBlockingActions('input');\n\n\t\t\tctx.input(templateReplace(question, data), onInput, setup || noop, forward);\n\t\t},\n\t\tcustom({ ctx, push }, [fn]) {\n\t\t\tif (fn.requireUserAction) {\n\t\t\t\tctx.clearBlockingActions(undefined);\n\t\t\t}\n\n\t\t\tconst state = getStateFunction(ctx);\n\t\t\tconst lang = getLanguageFromStore(storageData);\n\n\t\t\tconst result = handleCustomAction(ctx, fn, {\n\t\t\t\t...ctx.custom(fn),\n\t\t\t\tstate,\n\t\t\t\tlang,\n\t\t\t\tgetStack: useStack,\n\t\t\t\tpaused,\n\t\t\t\ttemplateReplace,\n\t\t\t});\n\n\t\t\tconst next = () => {\n\t\t\t\tif (fn.requireUserAction && !ctx.meta.preview) {\n\t\t\t\t\tenmemory(ctx);\n\t\t\t\t\tinteractivity(true);\n\t\t\t\t}\n\n\t\t\t\tpush();\n\t\t\t};\n\n\t\t\tif (!ctx.meta.restoring || ctx.meta.goingBack) {\n\t\t\t\tif (isPromise(result)) {\n\t\t\t\t\tresult.then(next);\n\t\t\t\t} else {\n\t\t\t\t\tnext();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\t\tvibrate({ ctx, push }, pattern) {\n\t\t\tctx.vibrate(pattern);\n\t\t\tpush();\n\t\t},\n\t\tnext({ push }) {\n\t\t\tpush();\n\t\t},\n\t\tanimateCharacter({ ctx, push }, [character, className]) {\n\t\t\tconst classes = className.split(' ');\n\n\t\t\tif (DEV && classes.length === 0) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Attempt to use AnimateCharacter without classes. Classes should be provided [https://novely.pages.dev/guide/actions/animateCharacter.html]',\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (ctx.meta.preview) return;\n\n\t\t\tctx.character(character).animate(classes);\n\n\t\t\tpush();\n\t\t},\n\t\ttext({ ctx, data, forward }, text) {\n\t\t\tconst string = text.map((content) => templateReplace(content, data)).join(' ');\n\n\t\t\tif (DEV && string.length === 0) {\n\t\t\t\tthrow new Error(`Action Text was called with empty string or array`);\n\t\t\t}\n\n\t\t\tctx.clearBlockingActions('text');\n\n\t\t\tctx.text(string, forward);\n\t\t},\n\t\tasync exit({ ctx, data }) {\n\t\t\tif (ctx.meta.restoring) return;\n\n\t\t\tconst { exitImpossible } = await exitPath({\n\t\t\t\tpath: useStack(ctx).value[0],\n\t\t\t\trefer: referGuarded,\n\t\t\t\tonExitImpossible: () => {\n\t\t\t\t\tmatch('end', [], {\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\tdata,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (exitImpossible) {\n\t\t\t\tctx.clearBlockingActions(undefined);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\trender(ctx);\n\t\t},\n\t\tpreload({ ctx, push }, [source]) {\n\t\t\tif (DEV && preloadAssets !== 'lazy') {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`You do not need a preload action because \"preloadAssets\" strategy was set to \"${preloadAssets}\"`,\n\t\t\t\t);\n\n\t\t\t\tpush();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst src = unwrapAsset(source);\n\n\t\t\tif (!ctx.meta.goingBack && !ctx.meta.restoring && !PRELOADED_ASSETS.has(src)) {\n\t\t\t\tconst process = async () => {\n\t\t\t\t\tconst type = isAsset(source) ? source.type : await getResourseTypeWrapper(src);\n\n\t\t\t\t\tif (type === 'image') {\n\t\t\t\t\t\trenderer.misc.preloadAudioBlocking(src);\n\t\t\t\t\t} else if (type === 'audio') {\n\t\t\t\t\t\trenderer.misc.preloadImage(src);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (DEV) {\n\t\t\t\t\t\t\tconsole.error(`Preload error: Unknown type of the following resource: `, source);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Add to preloaded before it was loaded to prevent downloading multiple times\n\t\t\t\t\tPRELOADED_ASSETS.add(src);\n\t\t\t\t};\n\n\t\t\t\tprocess();\n\t\t\t}\n\n\t\t\tpush();\n\t\t},\n\t\tblock({ ctx }, [scene]) {\n\t\t\tif (DEV && !story[scene]) {\n\t\t\t\tthrow new Error(`Attempt to call Block action with unknown scene \"${scene}\"`);\n\t\t\t}\n\n\t\t\tif (DEV && story[scene].length === 0) {\n\t\t\t\tthrow new Error(`Attempt to call Block action with empty scene \"${scene}\"`);\n\t\t\t}\n\n\t\t\tif (!ctx.meta.restoring) {\n\t\t\t\tconst stack = useStack(ctx);\n\n\t\t\t\tstack.value[0].push(['block', scene], [null, 0]);\n\n\t\t\t\trender(ctx);\n\t\t\t}\n\t\t},\n\t});\n\t// #endregion\n\n\t// #region Action\n\tconst action = buildActionObject({\n\t\trendererActions: renderer.actions,\n\t\tnativeActions,\n\t\tcharacters,\n\t});\n\t// #endregion\n\n\t// #region Render Function\n\tconst render = async (ctx: Context) => {\n\t\tconst stack = useStack(ctx);\n\t\tconst [path, state] = stack.value;\n\n\t\tconst { found, value } = await refer(path);\n\n\t\tif (found) {\n\t\t\tctx.loading(true);\n\t\t}\n\n\t\tconst referred = await value;\n\n\t\tif (found) {\n\t\t\tctx.loading(false);\n\t\t}\n\n\t\tif (isAction(referred)) {\n\t\t\tconst [action, ...props] = referred;\n\n\t\t\tmatch(action, props, {\n\t\t\t\tctx,\n\t\t\t\tdata: state,\n\t\t\t});\n\t\t} else if (Object.values(story).some((branch) => branch === referred)) {\n\t\t\t/**\n\t\t\t * Developer might not write the end action on their own, so we will catch situation when there are no other options than end the game.\n\t\t\t *\n\t\t\t * There are three options right now.\n\t\t\t * - We've got to the action — gonna render it\n\t\t\t * - We've got `undefined`. This means we are tried to go forward, but story array ended already, so we are gonna run exit\n\t\t\t * - We've got branch of story object. This means we exitied from where it's possible to exit and now we can only end the game\n\t\t\t */\n\t\t\tmatch('end', [], {\n\t\t\t\tctx,\n\t\t\t\tdata: state,\n\t\t\t});\n\t\t} else {\n\t\t\tmatch('exit', [], {\n\t\t\t\tctx,\n\t\t\t\tdata: state,\n\t\t\t});\n\t\t}\n\t};\n\t// #endregion\n\n\tconst interactivity = (value = false) => {\n\t\tinteracted = value ? interacted + 1 : 0;\n\t};\n\n\t/**\n\t * Replaces content inside of {{braces}}.\n\t */\n\tconst templateReplace = (content: TextContent<$Language, Data>, values?: Data) => {\n\t\tconst {\n\t\t\tdata,\n\t\t\tmeta: [lang],\n\t\t} = storageData.get();\n\n\t\t// Object to take values from\n\t\tconst obj = values || data;\n\n\t\t// String\n\t\tconst str = flattenAllowedContent(!isFunction(content) && !isString(content) ? content[lang] : content, obj);\n\n\t\tconst t = translation[lang];\n\t\tconst pluralRules = (t.plural || t.actions) && new Intl.PluralRules(t.tag || lang);\n\n\t\treturn replaceTranslation(str, obj, t.plural, t.actions, pluralRules);\n\t};\n\n\tconst data = ((value) => {\n\t\tconst _data = storageData.get().data;\n\n\t\tif (!value) return _data;\n\n\t\tconst val = isFunction(value) ? value(_data) : deepmerge(_data, value as $Data);\n\n\t\tstorageData.update((prev) => {\n\t\t\tprev.data = val;\n\n\t\t\treturn prev;\n\t\t});\n\n\t\treturn undefined;\n\t}) as StateFunction<$Data>;\n\n\tconst getCurrentStorageData = () => {\n\t\treturn coreData.get().dataLoaded ? clone(storageData.get()) : null;\n\t};\n\n\tconst setStorageData = (data: StorageData<$Language, $Data>) => {\n\t\tif (destroyed) {\n\t\t\tif (DEV) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`function \\`setStorageData\\` was called after novely instance was destroyed. Data is not updater nor synced after destroy.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tstorageData.set(data);\n\t};\n\n\t// #region Function Return\n\treturn {\n\t\t/**\n\t\t * Function to set game script\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * engine.script({\n\t\t * start: [\n\t\t * action.function(() => {})\n\t\t * ]\n\t\t * })\n\t\t * ```\n\t\t */\n\t\tscript,\n\t\t/**\n\t\t * Get actions\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * engine.script({\n\t\t * start: [\n\t\t * action.function(() => {})\n\t\t * ]\n\t\t * })\n\t\t * ```\n\t\t */\n\t\taction: action as Actions,\n\t\t/**\n\t\t * State bound to `$MAIN` game context\n\t\t * @deprecated Use `state` function provided from action arguments\n\t\t */\n\t\tstate: getStateFunction(MAIN_CONTEXT_KEY),\n\t\t/**\n\t\t * Store data between games\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * engine.script({\n\t\t * start: [\n\t\t * action.function(() => {\n\t\t * // Paid content should be purchased only once\n\t\t * // So it will be available in any save\n\t\t * data({ paid_content_purchased: true })\n\t\t * })\n\t\t * ]\n\t\t * })\n\t\t * ```\n\t\t */\n\t\tdata,\n\t\t/**\n\t\t * Used in combination with type utilities\n\t\t * @deprecated Use `engine.types` instead\n\t\t * @example\n\t\t * ```ts\n\t\t * import type { ConditionParams, StateFunction } from '@novely/core';\n\t\t *\n\t\t * const conditionCheck = (state: StateFunction<ConditionParams<typeof engine.typeEssintials>>) => {\n\t\t * return state.age >= 18;\n\t\t * }\n\t\t * ```\n\t\t */\n\t\ttypeEssentials: {} as TypeEssentials<$Language, $State, $Data, $Characters>,\n\t\t/**\n\t\t * Used in combination with type utilities\n\t\t * @example\n\t\t * ```ts\n\t\t * import type { TypesFromEngine, ConditionParams, StateFunction } from '@novely/core';\n\t\t *\n\t\t * type Types = TypesFromEngine<typeof engine>;\n\t\t *\n\t\t * const conditionCheck = (state: StateFunction<ConditionParams<Types>>) => {\n\t\t * return state.age >= 18;\n\t\t * }\n\t\t * ```\n\t\t */\n\t\ttypes: null as EngineTypes<$Language, $State, $Data, $Characters> | null,\n\t\t/**\n\t\t * Replaces content inside {{braces}} using global data\n\t\t * @example\n\t\t * ```ts\n\t\t * data({ name: 'Alexei' })\n\t\t *\n\t\t * templateReplace('{{name}} is our hero')\n\t\t * templateReplace({\n\t\t * en: (data) => 'Hello, ' + data.name\n\t\t * })\n\t\t * ```\n\t\t */\n\t\ttemplateReplace(content: TextContent<$Language, $Data>) {\n\t\t\treturn templateReplace(content as TextContent<$Language, Data>);\n\t\t},\n\t\t/**\n\t\t * Same as `templateReplace` but uses state and requires explicitly providing it\n\t\t */\n\t\ttemplateReplaceState(content: TextContent<$Language, $State>, state: State) {\n\t\t\treturn templateReplace(content as TextContent<$Language, State>, state);\n\t\t},\n\t\t/**\n\t\t * Cancel data loading, hide UI, ignore page change events\n\t\t * Data updates still will work in case Novely already was loaded\n\t\t */\n\t\tdestroy() {\n\t\t\tif (destroyed) return;\n\n\t\t\tdataLoaded.cancel();\n\n\t\t\tUIInstance.unmount();\n\n\t\t\tremoveEventListener('beforeunload', throttledShortOnStorageDataChange);\n\n\t\t\tdestroyed = true;\n\t\t},\n\t\t/**\n\t\t * Funtion to get current storage data\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * const currentStorageData = engine.getCurrentStorageData();\n\t\t * ```\n\t\t */\n\t\tgetCurrentStorageData,\n\t\t/**\n\t\t * Function to set storage data. Using this function is not recommended.\n\t\t *\n\t\t * @deprecated\n\t\t * @example\n\t\t * ```ts\n\t\t * const currentStorageData = engine.getCurrentStorageData();\n\t\t *\n\t\t * if (currentStorageData) {\n\t\t * // update music volume\n\t\t * currentStorageData.meta[2] = 1;\n\t\t *\n\t\t * setStorageData(currentStorageData)\n\t\t * }\n\t\t * ```\n\t\t */\n\t\tsetStorageData,\n\t\t/**\n\t\t * Function to control paused state. Custom Actions are provided with `paused` store they can subscribe to.\n\t\t * This function will notify Custom Actions. Pause state can be used when showing ads.\n\t\t * @example\n\t\t * ```ts\n\t\t * sdk.on('pause' () => engine.setPaused(true));\n\t\t * sdk.on('resume', () => engine.setPaused(false));\n\t\t * ```\n\t\t */\n\t\tsetPaused: (paused: boolean) => {\n\t\t\tcoreData.update((prev) => {\n\t\t\t\tprev.paused = paused;\n\n\t\t\t\treturn prev;\n\t\t\t});\n\t\t},\n\t\t/**\n\t\t * Function to control focused state. It will affect `paused` store passed to Custom Actions.\n\t\t * This function can be used to pause game when it's not focused.\n\t\t * @example\n\t\t * ```ts\n\t\t * import { pauseOnBlur } from '@novely/core';\n\t\t *\n\t\t * // Will subscribe to blur/focus events and call `setFocused`\n\t\t * pauseOnBlur(engine);\n\t\t *\n\t\t * // OR\n\t\t *\n\t\t * sdk.on('focus' () => engine.setFocused(true));\n\t\t * sdk.on('blur', () => engine.setFocused(false));\n\t\t * ```\n\t\t */\n\t\tsetFocused: (focused: boolean) => {\n\t\t\tcoreData.update((prev) => {\n\t\t\t\tprev.focused = focused;\n\n\t\t\t\treturn prev;\n\t\t\t});\n\t\t},\n\t};\n\t// #endregion\n};\n\nexport { novely };\n","function set(obj, key, val) {\n\tif (typeof val.value === 'object') val.value = klona(val.value);\n\tif (!val.enumerable || val.get || val.set || !val.configurable || !val.writable || key === '__proto__') {\n\t\tObject.defineProperty(obj, key, val);\n\t} else obj[key] = val.value;\n}\n\nexport function klona(x) {\n\tif (typeof x !== 'object') return x;\n\n\tvar i=0, k, list, tmp, str=Object.prototype.toString.call(x);\n\n\tif (str === '[object Object]') {\n\t\ttmp = Object.create(x.__proto__ || null);\n\t} else if (str === '[object Array]') {\n\t\ttmp = Array(x.length);\n\t} else if (str === '[object Set]') {\n\t\ttmp = new Set;\n\t\tx.forEach(function (val) {\n\t\t\ttmp.add(klona(val));\n\t\t});\n\t} else if (str === '[object Map]') {\n\t\ttmp = new Map;\n\t\tx.forEach(function (val, key) {\n\t\t\ttmp.set(klona(key), klona(val));\n\t\t});\n\t} else if (str === '[object Date]') {\n\t\ttmp = new Date(+x);\n\t} else if (str === '[object RegExp]') {\n\t\ttmp = new RegExp(x.source, x.flags);\n\t} else if (str === '[object DataView]') {\n\t\ttmp = new x.constructor( klona(x.buffer) );\n\t} else if (str === '[object ArrayBuffer]') {\n\t\ttmp = x.slice(0);\n\t} else if (str.slice(-6) === 'Array]') {\n\t\t// ArrayBuffer.isView(x)\n\t\t// ~> `new` bcuz `Buffer.slice` => ref\n\t\ttmp = new x.constructor(x);\n\t}\n\n\tif (tmp) {\n\t\tfor (list=Object.getOwnPropertySymbols(x); i < list.length; i++) {\n\t\t\tset(tmp, list[i], Object.getOwnPropertyDescriptor(x, list[i]));\n\t\t}\n\n\t\tfor (i=0, list=Object.getOwnPropertyNames(x); i < list.length; i++) {\n\t\t\tif (Object.hasOwnProperty.call(tmp, k=list[i]) && tmp[k] === x[k]) continue;\n\t\t\tset(tmp, k, Object.getOwnPropertyDescriptor(x, k));\n\t\t}\n\t}\n\n\treturn tmp || x;\n}\n","import type { TypewriterSpeed } from './types';\n\nconst SKIPPED_DURING_RESTORE = new Set(['dialog', 'choice', 'input', 'vibrate', 'text'] as const);\n\nconst BLOCK_EXIT_STATEMENTS = new Set(['choice:exit', 'condition:exit', 'block:exit'] as const);\n\nconst BLOCK_STATEMENTS = new Set(['choice', 'condition', 'block'] as const);\n\nconst AUDIO_ACTIONS = new Set(['playMusic', 'stopMusic', 'playSound', 'stopSound', 'voice', 'stopVoice'] as const);\n\nconst EMPTY_SET = new Set<any>();\n\nconst DEFAULT_TYPEWRITER_SPEED: TypewriterSpeed = 'Medium';\n\nconst HOWLER_SUPPORTED_FILE_FORMATS = new Set([\n\t'mp3',\n\t'mpeg',\n\t'opus',\n\t'ogg',\n\t'oga',\n\t'wav',\n\t'aac',\n\t'caf',\n\t'm4a',\n\t'm4b',\n\t'mp4',\n\t'weba',\n\t'webm',\n\t'dolby',\n\t'flac',\n] as const);\n\nconst SUPPORTED_IMAGE_FILE_FORMATS = new Set([\n\t'apng',\n\t'avif',\n\t'gif',\n\t'jpg',\n\t'jpeg',\n\t'jfif',\n\t'pjpeg',\n\t'pjp',\n\t'png',\n\t'svg',\n\t'webp',\n\t'bmp',\n] as const);\n\n/**\n * @internal\n */\nconst MAIN_CONTEXT_KEY = '$MAIN';\n\nexport {\n\tSKIPPED_DURING_RESTORE,\n\tEMPTY_SET,\n\tDEFAULT_TYPEWRITER_SPEED,\n\tBLOCK_EXIT_STATEMENTS,\n\tBLOCK_STATEMENTS,\n\tMAIN_CONTEXT_KEY,\n\tAUDIO_ACTIONS,\n\tHOWLER_SUPPORTED_FILE_FORMATS,\n\tSUPPORTED_IMAGE_FILE_FORMATS,\n};\n","import type { CustomActionHolder } from './custom-action';\nimport type { StackHolder } from './types';\n\n/**\n * @internal\n */\nconst STACK_MAP = new Map<string, StackHolder>();\n\n/**\n * @internal\n */\nconst CUSTOM_ACTION_MAP = new Map<string, CustomActionHolder>();\n\nconst PRELOADED_ASSETS = new Set<string>();\nconst ASSETS_TO_PRELOAD = new Set<string>();\n\nexport { PRELOADED_ASSETS, ASSETS_TO_PRELOAD, STACK_MAP, CUSTOM_ACTION_MAP };\n","import type { ValidAction, CustomHandler } from '../action';\nimport type { NovelyAsset } from '../types';\nimport { AUDIO_ACTIONS, BLOCK_EXIT_STATEMENTS, BLOCK_STATEMENTS, SKIPPED_DURING_RESTORE } from '../constants';\n\nconst isNumber = (val: unknown): val is number => {\n\treturn typeof val === 'number';\n};\n\nconst isNull = (val: unknown): val is null => {\n\treturn val === null;\n};\n\nconst isString = (val: unknown): val is string => {\n\treturn typeof val === 'string';\n};\n\nconst isFunction = (val: unknown): val is (...parameters: any[]) => any => {\n\treturn typeof val === 'function';\n};\n\nconst isPromise = (val: unknown): val is Promise<any> => {\n\treturn Boolean(val) && (typeof val === 'object' || isFunction(val)) && isFunction((val as any).then);\n};\n\nconst isEmpty = (val: unknown): val is Record<PropertyKey, never> => {\n\treturn typeof val === 'object' && !isNull(val) && Object.keys(val).length === 0;\n};\n\n/**\n * Checks if a given string starts with 'http', '/', '.', or 'data'\n */\nconst isCSSImageURL = (url: string): boolean => {\n\tconst startsWith = String.prototype.startsWith.bind(url);\n\n\treturn startsWith('http') || startsWith('/') || startsWith('.') || startsWith('data');\n};\n\n/**\n * Determines if a given action requires user interaction based on its type and metadata.\n */\nconst isUserRequiredAction = ([action, ...meta]: ValidAction) => {\n\treturn Boolean(action === 'custom' && meta[0] && (meta[0] as unknown as CustomHandler).requireUserAction);\n};\n\nconst isBlockStatement = (statement: unknown): statement is 'choice' | 'condition' | 'block' => {\n\treturn BLOCK_STATEMENTS.has(statement as any);\n};\n\nconst isBlockExitStatement = (\n\tstatement: unknown,\n): statement is 'choice:exit' | 'condition:exit' | 'block:exit' => {\n\treturn BLOCK_EXIT_STATEMENTS.has(statement as any);\n};\n\nconst isSkippedDuringRestore = (item: unknown): item is 'vibrate' | 'dialog' | 'input' | 'choice' | 'text' => {\n\treturn SKIPPED_DURING_RESTORE.has(item as any);\n};\n\ntype AudioActionName = 'playMusic' | 'stopMusic' | 'playSound' | 'stopSound' | 'voice' | 'stopVoice';\n\nconst isAudioAction = (action: unknown): action is AudioActionName => {\n\treturn AUDIO_ACTIONS.has(action as any);\n};\n\nconst isAction = (element: unknown): element is Exclude<ValidAction, ValidAction[]> => {\n\treturn Array.isArray(element) && isString(element[0]);\n};\n\nconst isImageAsset = (asset: unknown): asset is string => {\n\treturn isString(asset) && isCSSImageURL(asset);\n};\n\n/**\n * Is custom and requires user action or skipped during restoring\n */\nconst isBlockingAction = (action: Exclude<ValidAction, ValidAction[]>) => {\n\treturn isUserRequiredAction(action) || (isSkippedDuringRestore(action[0]) && action[0] !== 'vibrate');\n};\n\nconst isAsset = (suspect: unknown): suspect is NovelyAsset => {\n\treturn suspect !== null && typeof suspect === 'object' && 'source' in suspect && 'type' in suspect;\n};\n\nexport {\n\tisNumber,\n\tisNull,\n\tisString,\n\tisFunction,\n\tisPromise,\n\tisEmpty,\n\tisCSSImageURL,\n\tisUserRequiredAction,\n\tisBlockStatement,\n\tisBlockExitStatement,\n\tisSkippedDuringRestore,\n\tisAudioAction,\n\tisAction,\n\tisImageAsset,\n\tisBlockingAction,\n\tisAsset,\n};\n\nexport type { AudioActionName };\n","import type { CustomHandler, DefaultActionProxy } from '../action';\nimport type { Thenable, State } from '../types';\nimport type { Context } from '../renderer';\n\ntype MatchActionParams = {\n\tdata: State;\n\tctx: Context;\n\n\tpush: () => void;\n\tforward: () => void;\n};\n\ntype MatchActionMap = {\n\t[Key in keyof DefaultActionProxy]: (\n\t\tparams: MatchActionParams,\n\t\tdata: Parameters<DefaultActionProxy[Key]>,\n\t) => void;\n};\n\ntype MatchActionMapComplete = Omit<MatchActionMap, 'custom'> & {\n\tcustom: (params: MatchActionParams, value: [handler: CustomHandler]) => Thenable<void>;\n};\n\ntype MatchActionParameters = {\n\t/**\n\t * Name of context or context\n\t */\n\tctx: string | Context;\n\t/**\n\t * Data from the save\n\t */\n\tdata: State;\n};\n\ntype OnBeforeActionCallPayload = {\n\taction: keyof MatchActionMapComplete;\n\tprops: Parameters<DefaultActionProxy[keyof MatchActionMapComplete]>;\n\tctx: Context;\n};\n\ntype MatchActionHandlers = {\n\tpush: (ctx: Context) => void;\n\tforward: (ctx: Context) => void;\n\n\tgetContext: (name: string) => Context;\n\n\tonBeforeActionCall: (payload: OnBeforeActionCallPayload) => void;\n};\n\nconst matchAction = (callbacks: MatchActionHandlers, values: MatchActionMapComplete) => {\n\tconst { getContext, onBeforeActionCall, push, forward } = callbacks;\n\n\tconst match = (action: keyof MatchActionMapComplete, props: any, { ctx, data }: MatchActionParameters) => {\n\t\tconst context = typeof ctx === 'string' ? getContext(ctx) : ctx;\n\n\t\tonBeforeActionCall({\n\t\t\taction,\n\t\t\tprops,\n\t\t\tctx: context,\n\t\t});\n\n\t\treturn values[action](\n\t\t\t{\n\t\t\t\tctx: context,\n\t\t\t\tdata,\n\n\t\t\t\tpush() {\n\t\t\t\t\tif (context.meta.preview) return;\n\n\t\t\t\t\tpush(context);\n\t\t\t\t},\n\t\t\t\tforward() {\n\t\t\t\t\tif (context.meta.preview) return;\n\n\t\t\t\t\tforward(context);\n\t\t\t\t},\n\t\t\t},\n\t\t\tprops,\n\t\t);\n\t};\n\n\treturn {\n\t\tmatch,\n\t\tnativeActions: Object.keys(values),\n\t};\n};\n\nexport { matchAction };\nexport type { MatchActionHandlers, MatchActionMapComplete };\n","import { memoize, once } from 'es-toolkit/function';\nimport { DEV } from 'esm-env';\nimport { supportsMap as audioSupport } from './audio-codecs';\nimport { HOWLER_SUPPORTED_FILE_FORMATS, SUPPORTED_IMAGE_FILE_FORMATS } from './constants';\nimport { supportsMap as imageSupport } from './image-formats';\nimport type { NovelyAsset } from './types';\nimport { getUrlFileExtension, isAsset } from './utilities';\n\nconst generateRandomId = () => Math.random().toString(36);\n\n/**\n * Function to get assets type. All assets must be of the same type. Only works with supported types.\n */\nconst getType = memoize(\n\t(extensions: string[]) => {\n\t\tif (extensions.every((extension) => HOWLER_SUPPORTED_FILE_FORMATS.has(extension as any))) {\n\t\t\treturn 'audio';\n\t\t}\n\n\t\tif (extensions.every((extension) => SUPPORTED_IMAGE_FILE_FORMATS.has(extension as any))) {\n\t\t\treturn 'image';\n\t\t}\n\n\t\tif (DEV) {\n\t\t\tthrow new Error(`Unsupported file extensions: ${JSON.stringify(extensions)}`);\n\t\t}\n\n\t\tthrow extensions;\n\t},\n\t{\n\t\tgetCacheKey: (extensions) => extensions.join('~'),\n\t},\n);\n\nconst SUPPORT_MAPS = {\n\timage: imageSupport,\n\taudio: audioSupport,\n} as const;\n\n/**\n * This function uses array instead of spread because memoize only works with first argument\n */\nconst assetPrivate = memoize(\n\t(variants: string[]): NovelyAsset => {\n\t\tif (DEV && variants.length === 0) {\n\t\t\tthrow new Error(`Attempt to use \"asset\" function without arguments`);\n\t\t}\n\n\t\tconst map: Record<string, string> = {};\n\t\tconst extensions: string[] = [];\n\n\t\tfor (const v of variants) {\n\t\t\tconst e = getUrlFileExtension(v);\n\n\t\t\tmap[e] = v;\n\t\t\textensions.push(e);\n\t\t}\n\n\t\tconst type = getType(extensions);\n\n\t\tconst getSource = once(() => {\n\t\t\tconst support = SUPPORT_MAPS[type];\n\n\t\t\tfor (const extension of extensions) {\n\t\t\t\tif (extension in support) {\n\t\t\t\t\tif (support[extension as keyof typeof support]) {\n\t\t\t\t\t\treturn map[extension];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\treturn map[extension];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (DEV) {\n\t\t\t\tthrow new Error(`No matching asset was found for ${variants.map((v) => `\"${v}\"`).join(', ')}`);\n\t\t\t}\n\n\t\t\treturn '';\n\t\t});\n\n\t\treturn {\n\t\t\tget source() {\n\t\t\t\treturn getSource();\n\t\t\t},\n\t\t\tget type() {\n\t\t\t\treturn type;\n\t\t\t},\n\t\t\tid: generateRandomId(),\n\t\t};\n\t},\n\t{\n\t\tgetCacheKey: (variants) => variants.join('~'),\n\t},\n);\n\n/**\n * Memoizes and returns an asset selection object based on provided file variants.\n * The selected asset depends on the client's support for various formats.\n *\n * @param {...string} variants - A variable number of strings, each representing a potential asset file URL.\n * @returns {NovelyAsset} An object representing the selected asset with `source` and `type` properties.\n *\n * @throws {Error} If in DEV mode and no arguments are provided.\n * @example\n * ```\n * import { asset } from 'novely';\n *\n * // Passed first have higher priority\n * const classroom = asset(\n * 'classroom.avif',\n * 'classroom.webp',\n * 'classroom.jpeg'\n * );\n *\n * setTimeout(() => {\n * console.log(classroom.source);\n * }, 100);\n * ```\n */\nconst asset = (...variants: string[]) => {\n\treturn assetPrivate(variants);\n};\n\nasset.image = (source: string): NovelyAsset => {\n\tif (assetPrivate.cache.has(source)) {\n\t\treturn assetPrivate.cache.get(source)!;\n\t}\n\n\tconst asset = {\n\t\ttype: 'image',\n\t\tsource,\n\t\tid: generateRandomId(),\n\t} as NovelyAsset;\n\n\tassetPrivate.cache.set(source, asset);\n\n\treturn asset;\n};\n\nasset.audio = (source: string): NovelyAsset => {\n\tif (assetPrivate.cache.has(source)) {\n\t\treturn assetPrivate.cache.get(source)!;\n\t}\n\n\tconst asset = {\n\t\ttype: 'audio',\n\t\tsource,\n\t\tid: generateRandomId(),\n\t} as NovelyAsset;\n\n\tassetPrivate.cache.set(source, asset);\n\n\treturn asset;\n};\n\nconst unwrapAsset = (asset: string | NovelyAsset) => {\n\treturn isAsset(asset) ? asset.source : asset;\n};\n\nconst unwrapAudioAsset = (asset: string | NovelyAsset) => {\n\tif (DEV && isAsset(asset) && asset.type !== 'audio') {\n\t\tthrow new Error('Attempt to use non-audio asset in audio action', { cause: asset });\n\t}\n\n\treturn unwrapAsset(asset);\n};\n\nconst unwrapImageAsset = (asset: string | NovelyAsset) => {\n\tif (DEV && isAsset(asset) && asset.type !== 'image') {\n\t\tthrow new Error('Attempt to use non-image asset in action that requires image assets', { cause: asset });\n\t}\n\n\treturn unwrapAsset(asset);\n};\n\nexport { asset, unwrapAsset, unwrapAudioAsset, unwrapImageAsset };\n","/**\n * This code is adapted from the Howler.js source code.\n * Howler.js: https://github.com/goldfire/howler.js\n */\n\n/**\n * I guess some browsers will return \"no\". So it's better to be safe\n */\nconst cut = (str: CanPlayTypeResult | 'no') => str.replace(/^no$/, '');\n\nconst audio = new Audio();\n\nconst canPlay = (type: string) => !!cut(audio.canPlayType(type));\nconst canPlayMultiple = (...types: string[]) => types.some((type) => canPlay(type));\n\nconst supportsMap = {\n\tmp3: canPlayMultiple('audio/mpeg;', 'audio/mp3;'),\n\tmpeg: canPlay('audio/mpeg;'),\n\topus: canPlay('audio/ogg; codecs=\"opus\"'),\n\togg: canPlay('audio/ogg; codecs=\"vorbis\"'),\n\toga: canPlay('audio/ogg; codecs=\"vorbis\"'),\n\twav: canPlayMultiple('audio/wav; codecs=\"1\"', 'audio/wav;'),\n\taac: canPlay('audio/aac;'),\n\tcaf: canPlay('audio/x-caf;'),\n\tm4a: canPlayMultiple('audio/x-m4a;', 'audio/m4a;', 'audio/aac;'),\n\tm4b: canPlayMultiple('audio/x-m4b;', 'audio/m4b;', 'audio/aac;'),\n\tmp4: canPlayMultiple('audio/x-mp4;', 'audio/mp4;', 'audio/aac;'),\n\tweba: canPlay('audio/webm; codecs=\"vorbis\"'),\n\twebm: canPlay('audio/webm; codecs=\"vorbis\"'),\n\tdolby: canPlay('audio/mp4; codecs=\"ec-3\"'),\n\tflac: canPlayMultiple('audio/x-flac;', 'audio/flac;'),\n};\n\nexport { supportsMap };\n","const avif =\n\t'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAAB0AAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAIAAAACAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQ0MAAAAABNjb2xybmNseAACAAIAAYAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAACVtZGF0EgAKCBgANogQEAwgMg8f8D///8WfhwB8+ErK42A=';\nconst jxl =\n\t'data:image/jxl;base64,/woIAAAMABKIAgC4AF3lEgAAFSqjjBu8nOv58kOHxbSN6wxttW1hSaLIODZJJ3BIEkkaoCUzGM6qJAE=';\nconst webp =\n\t'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA';\n\nconst supportsFormat = (source: string) => {\n\tconst { promise, resolve } = Promise.withResolvers<boolean>();\n\n\tconst img = Object.assign(document.createElement('img'), {\n\t\tsrc: source,\n\t});\n\n\timg.onload = img.onerror = () => {\n\t\tresolve(img.height === 2);\n\t};\n\n\treturn promise;\n};\n\nconst supportsMap = {\n\tavif: false,\n\tjxl: false,\n\twebp: false,\n};\n\nconst formatsMap = {\n\tavif,\n\tjxl,\n\twebp,\n} as const;\n\nconst loadImageFormatsSupport = async () => {\n\tconst promises = [];\n\n\tfor (const [format, source] of Object.entries(formatsMap)) {\n\t\tconst promise = supportsFormat(source).then((supported) => {\n\t\t\tsupportsMap[format as keyof typeof supportsMap] = supported;\n\t\t});\n\n\t\tpromises.push(promise);\n\t}\n\n\tawait Promise.all(promises);\n};\n\nloadImageFormatsSupport();\n\nexport { supportsMap };\n","import type { Story, ValidAction, CustomHandler, GetActionParameters } from '../action';\nimport type { CloneFN, Path, PathItem, Thenable } from '../types';\nimport type { NovelyAsset } from '../types';\nimport {\n\tisNull,\n\tisNumber,\n\tisAction,\n\tisSkippedDuringRestore,\n\tisUserRequiredAction,\n\tisPromise,\n\tisBlockExitStatement,\n\tisBlockStatement,\n\tisBlockingAction,\n} from './assertions';\nimport { unwrapAsset } from '../asset';\nimport { DEV } from 'esm-env';\n\n// #region Is Exit Impossible\nconst isExitImpossible = (path: Path) => {\n\tconst blockStatements = path.filter(([item]) => isBlockStatement(item));\n\tconst blockExitStatements = path.filter(([item]) => isBlockExitStatement(item));\n\n\t/**\n\t * There were no blocks nor exits from blocks\n\t */\n\tif (blockStatements.length === 0 && blockExitStatements.length === 0) {\n\t\treturn true;\n\t}\n\n\t/**\n\t * There is block that can be exited\n\t */\n\tif (blockStatements.length > blockExitStatements.length) {\n\t\treturn false;\n\t}\n\n\treturn !blockExitStatements.every(([name], i) => name && name.startsWith(blockStatements[i][0]!));\n};\n// #endregion\n\n// #region Refer\ntype CreateReferFunctionParams = {\n\tstory: Story;\n\tonUnknownSceneHit: (scene: string) => Thenable<void>;\n};\n\nconst createReferFunction = ({ story, onUnknownSceneHit }: CreateReferFunctionParams) => {\n\tconst refer = async (path: Path) => {\n\t\t/**\n\t\t * Are we ready to return a value.\n\t\t * We need to know are there any \"unknown\" scenes or not\n\t\t */\n\t\tconst { promise: ready, resolve: setReady } = Promise.withResolvers<boolean>();\n\n\t\tlet current: any = story;\n\t\tlet precurrent: any = story;\n\n\t\tconst blocks: any[] = [];\n\n\t\tconst refer = async () => {\n\t\t\tfor (const [type, val] of path) {\n\t\t\t\tif (type === 'jump') {\n\t\t\t\t\tif (!current[val]) {\n\t\t\t\t\t\tsetReady(true);\n\t\t\t\t\t\tawait onUnknownSceneHit(val);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (DEV && !story[val]) {\n\t\t\t\t\t\tthrow new Error(`Attempt to jump to unknown scene \"${val}\"`);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (DEV && story[val].length === 0) {\n\t\t\t\t\t\tthrow new Error(`Attempt to jump to empty scene \"${val}\"`);\n\t\t\t\t\t}\n\n\t\t\t\t\tprecurrent = story;\n\t\t\t\t\tcurrent = current[val];\n\t\t\t\t} else if (type === null) {\n\t\t\t\t\tprecurrent = current;\n\t\t\t\t\tcurrent = current[val];\n\t\t\t\t} else if (type === 'choice') {\n\t\t\t\t\tblocks.push(precurrent);\n\t\t\t\t\tcurrent = current[(val as number) + 1][1];\n\t\t\t\t} else if (type === 'condition') {\n\t\t\t\t\tblocks.push(precurrent);\n\t\t\t\t\tcurrent = current[2][val];\n\t\t\t\t} else if (type === 'block') {\n\t\t\t\t\tblocks.push(precurrent);\n\t\t\t\t\tcurrent = story[val];\n\t\t\t\t} else if (type === 'block:exit' || type === 'choice:exit' || type === 'condition:exit') {\n\t\t\t\t\tcurrent = blocks.pop();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsetReady(false);\n\n\t\t\treturn current as Exclude<ValidAction, ValidAction[]>;\n\t\t};\n\n\t\tconst value = refer();\n\t\tconst found = await ready;\n\n\t\treturn {\n\t\t\tfound,\n\t\t\tvalue,\n\t\t};\n\t};\n\n\tconst referGuarded = async (path: Path) => {\n\t\treturn await (await refer(path)).value;\n\t};\n\n\treturn {\n\t\trefer,\n\t\treferGuarded,\n\t};\n};\n\ntype GuardedReferFunction = ReturnType<typeof createReferFunction>['referGuarded'];\n\n// #endregion\n\ntype ExitPathConfig = {\n\tpath: Path;\n\trefer: GuardedReferFunction;\n\n\tonExitImpossible?: () => void;\n};\n\n// #region Exit Path\nconst exitPath = async ({ path, refer, onExitImpossible }: ExitPathConfig) => {\n\tconst last = path.at(-1);\n\tconst ignore: ('choice:exit' | 'condition:exit' | 'block:exit')[] = [];\n\n\tlet wasExitImpossible = false;\n\n\t/**\n\t * - should be an array\n\t * - first element is action name\n\t */\n\tif (!isAction(await refer(path))) {\n\t\tif (last && isNull(last[0]) && isNumber(last[1])) {\n\t\t\tlast[1]--;\n\t\t} else {\n\t\t\tpath.pop();\n\t\t}\n\t}\n\n\tif (isExitImpossible(path)) {\n\t\tconst referred = await refer(path);\n\n\t\tif (isAction(referred) && isSkippedDuringRestore(referred[0])) {\n\t\t\tonExitImpossible?.();\n\t\t}\n\n\t\twasExitImpossible = true;\n\n\t\treturn {\n\t\t\texitImpossible: wasExitImpossible,\n\t\t};\n\t}\n\n\tfor (let i = path.length - 1; i > 0; i--) {\n\t\tconst [name] = path[i];\n\n\t\t/**\n\t\t * Remember already exited paths\n\t\t */\n\t\tif (isBlockExitStatement(name)) {\n\t\t\tignore.push(name);\n\t\t}\n\n\t\t/**\n\t\t * Ignore everything that we do not need there\n\t\t */\n\t\tif (!isBlockStatement(name)) continue;\n\n\t\t/**\n\t\t * When we found an already exited path we remove it from the list\n\t\t */\n\t\tif (ignore.at(-1)?.startsWith(name)) {\n\t\t\tignore.pop();\n\t\t\tcontinue;\n\t\t}\n\n\t\t/**\n\t\t * Exit from the path\n\t\t */\n\t\tpath.push([`${name}:exit`]);\n\n\t\tconst prev = findLastPathItemBeforeItemOfType(path.slice(0, i + 1), name);\n\n\t\t/**\n\t\t * When possible also go to the next action (or exit from one layer above)\n\t\t */\n\t\tif (prev) path.push([null, prev[1] + 1]);\n\n\t\t/**\n\t\t * If we added an `[null, int]` but it points not to action, then\n\t\t *\n\t\t * - remove that item\n\t\t * - close another block\n\t\t */\n\t\tif (!isAction(await refer(path))) {\n\t\t\tpath.pop();\n\t\t\tcontinue;\n\t\t}\n\n\t\tbreak;\n\t}\n\n\treturn {\n\t\texitImpossible: wasExitImpossible,\n\t};\n};\n// #endregion\n\n// #region Next Path\nconst nextPath = (path: Path) => {\n\t/**\n\t * Last path element\n\t */\n\tconst last = path.at(-1);\n\n\tif (last && (isNull(last[0]) || last[0] === 'jump') && isNumber(last[1])) {\n\t\tlast[1]++;\n\t} else {\n\t\tpath.push([null, 0]);\n\t}\n\n\treturn path;\n};\n// #endregion\n\n// #region Collect Actions Before Blocking Action\ntype CollectActionsBeforeBlockingActionOptions = {\n\tpath: Path;\n\trefer: GuardedReferFunction;\n\tclone: CloneFN;\n};\n\nconst collectActionsBeforeBlockingAction = async ({\n\tpath,\n\trefer,\n\tclone,\n}: CollectActionsBeforeBlockingActionOptions) => {\n\tconst collection: Exclude<ValidAction, ValidAction[]>[] = [];\n\n\tlet action = await refer(path);\n\n\twhile (true) {\n\t\tif (action == undefined) {\n\t\t\tconst { exitImpossible } = await exitPath({\n\t\t\t\tpath,\n\t\t\t\trefer,\n\t\t\t});\n\n\t\t\tif (exitImpossible) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!action) {\n\t\t\tbreak;\n\t\t}\n\n\t\tif (isBlockingAction(action)) {\n\t\t\tconst [name, ...props] = action;\n\n\t\t\tif (name === 'choice') {\n\t\t\t\tconst choiceProps = props as unknown as GetActionParameters<'Choice'>;\n\n\t\t\t\tfor (let i = 0; i < choiceProps.length; i++) {\n\t\t\t\t\tconst branchContent = choiceProps[i];\n\n\t\t\t\t\t/**\n\t\t\t\t\t * This is a title\n\t\t\t\t\t */\n\t\t\t\t\tif (!Array.isArray(branchContent)) continue;\n\n\t\t\t\t\tconst virtualPath = clone(path);\n\n\t\t\t\t\tvirtualPath.push(['choice', i], [null, 0]);\n\n\t\t\t\t\tconst innerActions = await collectActionsBeforeBlockingAction({\n\t\t\t\t\t\tpath: virtualPath,\n\t\t\t\t\t\trefer,\n\t\t\t\t\t\tclone,\n\t\t\t\t\t});\n\n\t\t\t\t\tcollection.push(...innerActions);\n\t\t\t\t}\n\t\t\t} else if (name === 'condition') {\n\t\t\t\tconst conditionProps = props as unknown as GetActionParameters<'Condition'>;\n\t\t\t\tconst conditions = Object.keys(conditionProps[1]);\n\n\t\t\t\tfor (const condition of conditions) {\n\t\t\t\t\tconst virtualPath = clone(path);\n\n\t\t\t\t\tvirtualPath.push(['condition', condition], [null, 0]);\n\n\t\t\t\t\tconst innerActions = await collectActionsBeforeBlockingAction({\n\t\t\t\t\t\tpath: virtualPath,\n\t\t\t\t\t\trefer,\n\t\t\t\t\t\tclone,\n\t\t\t\t\t});\n\n\t\t\t\t\tcollection.push(...innerActions);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\n\t\tcollection.push(action);\n\n\t\t/**\n\t\t * These special actions requires path change\n\t\t */\n\t\tif (action[0] === 'jump') {\n\t\t\tpath = [\n\t\t\t\t['jump', action[1]],\n\t\t\t\t[null, 0],\n\t\t\t];\n\t\t} else if (action[0] == 'block') {\n\t\t\tpath.push(['block', action[1]], [null, 0]);\n\t\t} else {\n\t\t\tnextPath(path);\n\t\t}\n\n\t\taction = await refer(path);\n\t}\n\n\treturn collection;\n};\n// #endregion\n\n// #region Find Last Path Item Before Item Of Type\nconst findLastPathItemBeforeItemOfType = (path: Path, name: PathItem[0]) => {\n\tconst item = path.findLast(([_name, _value], i, array) => {\n\t\tconst next = array[i + 1];\n\n\t\treturn isNull(_name) && isNumber(_value) && next != null && next[0] === name;\n\t});\n\n\treturn item as undefined | [null, number];\n};\n// #endregion\n\n// #region Get Opposite Action\nconst getOppositeAction = (action: 'showCharacter' | 'playSound' | 'playMusic' | 'voice' | any) => {\n\tconst MAP = {\n\t\tshowCharacter: 'hideCharacter',\n\t\tplaySound: 'stopSound',\n\t\tplayMusic: 'stopMusic',\n\t\tvoice: 'stopVoice',\n\t} as const;\n\n\treturn MAP[action as keyof typeof MAP];\n};\n// #endregion\n\n// #region Get Actions From Path\ntype GetActionsFromPathParams = {\n\t/**\n\t * A story object\n\t */\n\tstory: Story;\n\t/**\n\t * A path by that actions will be gathered\n\t */\n\tpath: Path;\n\t/**\n\t * true — actions that should be skipped would not be returned\n\t */\n\tfilter: boolean;\n\treferGuarded: GuardedReferFunction;\n};\n\nconst getActionsFromPath = async ({ story, path, filter, referGuarded }: GetActionsFromPathParams) => {\n\t/**\n\t * Current item in the story\n\t */\n\tlet current: any = story;\n\t/**\n\t * Previous `current` value\n\t */\n\tlet precurrent: any;\n\t/**\n\t * Should we ignore some actions\n\t */\n\tlet ignoreNestedBefore: null | PathItem[0] = null;\n\t/**\n\t * Current item of type `[null, int]`\n\t */\n\tlet index = 0;\n\t/**\n\t * Skipped action that should be preserved\n\t */\n\tlet skipPreserve: Exclude<ValidAction, ValidAction[]> | undefined = undefined;\n\t/**\n\t * Actions that are either considered user action or skipped during restore process\n\t */\n\tconst skip = new Set<Exclude<ValidAction, ValidAction[]>>();\n\n\t/**\n\t * Cound of items of type `[null, int]`\n\t */\n\tconst max = path.reduce((acc, [type, val]) => {\n\t\tif (isNull(type) && isNumber(val)) {\n\t\t\treturn acc + 1;\n\t\t}\n\n\t\treturn acc;\n\t}, 0);\n\n\tconst queue = [] as Exclude<ValidAction, ValidAction[]>[];\n\tconst blocks = [];\n\n\t// Will guard future usage\n\tawait referGuarded(path);\n\n\tfor (const [type, val] of path) {\n\t\tif (type === 'jump') {\n\t\t\tprecurrent = story;\n\t\t\tcurrent = current[val];\n\t\t} else if (type === null) {\n\t\t\tprecurrent = current;\n\n\t\t\tif (isNumber(val)) {\n\t\t\t\tindex++;\n\n\t\t\t\tlet startIndex = 0;\n\n\t\t\t\tif (ignoreNestedBefore) {\n\t\t\t\t\tconst prev = findLastPathItemBeforeItemOfType(path.slice(0, index), ignoreNestedBefore);\n\n\t\t\t\t\tif (prev) {\n\t\t\t\t\t\tstartIndex = prev[1];\n\t\t\t\t\t\tignoreNestedBefore = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * Запустим все экшены которые идут в `[null, int]` от `0` до `int`\n\t\t\t\t * Почему-то потребовалось изменить `<` на `<=`, чтобы последний action попадал сюда\n\t\t\t\t */\n\t\t\t\tfor (let i = startIndex; i <= val; i++) {\n\t\t\t\t\tconst item = current[i];\n\n\t\t\t\t\t/**\n\t\t\t\t\t * In case of broken save at least not throw\n\t\t\t\t\t * But is should not happen\n\t\t\t\t\t */\n\t\t\t\t\tif (!isAction(item)) continue;\n\n\t\t\t\t\tconst [action] = item;\n\n\t\t\t\t\tconst last = index === max && i === val;\n\t\t\t\t\tconst shouldSkip = isSkippedDuringRestore(action) || isUserRequiredAction(item);\n\n\t\t\t\t\tif (shouldSkip) {\n\t\t\t\t\t\tskip.add(item);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (shouldSkip && last) {\n\t\t\t\t\t\tskipPreserve = item;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (filter && shouldSkip && !last) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tqueue.push(item);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcurrent = current[val];\n\t\t} else if (type === 'choice') {\n\t\t\tblocks.push(precurrent);\n\t\t\tcurrent = current[val + 1][1];\n\t\t} else if (type === 'condition') {\n\t\t\tblocks.push(precurrent);\n\t\t\tcurrent = current[2][val];\n\t\t} else if (type === 'block') {\n\t\t\tblocks.push(precurrent);\n\t\t\tcurrent = story[val];\n\t\t} else if (type === 'block:exit' || type === 'choice:exit' || type === 'condition:exit') {\n\t\t\tcurrent = blocks.pop();\n\t\t\tignoreNestedBefore = type.slice(0, -5) as PathItem[0];\n\t\t}\n\t}\n\n\treturn {\n\t\tqueue,\n\t\tskip,\n\t\tskipPreserve,\n\t};\n};\n// #endregion\n\n// #region Queue Processor\ntype QueueProcessorOptions = {\n\tskip: Set<Exclude<ValidAction, ValidAction[]>>;\n\tskipPreserve?: Exclude<ValidAction, ValidAction[]> | undefined;\n};\n\nconst createQueueProcessor = (queue: Exclude<ValidAction, ValidAction[]>[], options: QueueProcessorOptions) => {\n\tconst processedQueue: Exclude<ValidAction, ValidAction[]>[] = [];\n\n\tconst keep = new Set();\n\tconst characters = new Set();\n\tconst audio = {\n\t\tmusic: new Set(),\n\t\tsounds: new Set(),\n\t};\n\n\t/**\n\t * Get the next actions array.\n\t */\n\tconst next = (i: number) => queue.slice(i + 1);\n\n\tfor (const [i, item] of queue.entries()) {\n\t\tconst [action, ...params] = item;\n\n\t\tif (options.skip.has(item) && item !== options.skipPreserve) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tkeep.add(action);\n\n\t\tif (action === 'function' || action === 'custom') {\n\t\t\tif (action === 'custom') {\n\t\t\t\tconst fn = params[0] as CustomHandler;\n\n\t\t\t\tif ('callOnlyLatest' in fn && fn.callOnlyLatest) {\n\t\t\t\t\tconst notLatest = next(i).some(([name, func]) => {\n\t\t\t\t\t\tif (name !== 'custom') return;\n\n\t\t\t\t\t\t// Checks for `undefined`. In case two id's are undefined it would not be true\n\t\t\t\t\t\tconst isIdenticalId = Boolean(func.id && fn.id && func.id === fn.id);\n\t\t\t\t\t\tconst isIdenticalByReference = func === fn;\n\t\t\t\t\t\tconst isIdenticalByCode = String(func) === String(fn);\n\n\t\t\t\t\t\treturn isIdenticalId || isIdenticalByReference || isIdenticalByCode;\n\t\t\t\t\t});\n\n\t\t\t\t\tif (notLatest) continue;\n\t\t\t\t} else if ('skipOnRestore' in fn && fn.skipOnRestore) {\n\t\t\t\t\tif (fn.skipOnRestore(next(i))) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tprocessedQueue.push(item);\n\t\t} else if (action === 'playSound') {\n\t\t\tconst closing = getOppositeAction(action);\n\n\t\t\tconst skip = next(i).some((item) => {\n\t\t\t\tif (isUserRequiredAction(item) || isSkippedDuringRestore(item[0])) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tconst [_action, target] = item;\n\n\t\t\t\tif (target !== params[0]) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn _action === closing || _action === action;\n\t\t\t});\n\n\t\t\tif (skip) continue;\n\n\t\t\taudio.sounds.add(unwrapAsset(params[0] as NovelyAsset));\n\t\t\tprocessedQueue.push(item);\n\t\t} else if (action === 'showCharacter' || action === 'playMusic' || action === 'voice') {\n\t\t\tconst closing = getOppositeAction(action);\n\n\t\t\tconst skip = next(i).some(([_action, target]) => {\n\t\t\t\tif (target !== params[0] && action !== 'voice') {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst musicWillBePaused = action === 'playMusic' && _action === 'pauseMusic';\n\n\t\t\t\t/**\n\t\t\t\t * It either will be closed OR same action will be ran again\n\t\t\t\t */\n\t\t\t\treturn musicWillBePaused || _action === closing || _action === action;\n\t\t\t});\n\n\t\t\tif (skip) continue;\n\n\t\t\t/**\n\t\t\t * Actually, we do not need check above to add there things to keep because if something was hidden already we could not keep it visible\n\t\t\t */\n\t\t\tif (action === 'showCharacter') {\n\t\t\t\tcharacters.add(params[0]);\n\t\t\t} else if (action === 'playMusic') {\n\t\t\t\taudio.music.add(unwrapAsset(params[0] as NovelyAsset));\n\t\t\t}\n\n\t\t\tprocessedQueue.push(item);\n\t\t} else if (action === 'showBackground' || action === 'preload') {\n\t\t\tconst skip = next(i).some(([_action]) => action === _action);\n\n\t\t\tif (skip) continue;\n\n\t\t\tprocessedQueue.push(item);\n\t\t} else if (action === 'animateCharacter') {\n\t\t\tconst skip = next(i).some(([_action, character], j, array) => {\n\t\t\t\t// Same character will be animated again.\n\t\t\t\tif (action === _action && character === params[0]) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tconst next = array.slice(j);\n\n\t\t\t\tconst characterWillAnimate = next.some(([__action, __character]) => action === __action);\n\t\t\t\tconst hasBlockingActions = next.some((item) => options.skip.has(item));\n\n\t\t\t\tconst differentCharacterWillAnimate =\n\t\t\t\t\t!hasBlockingActions &&\n\t\t\t\t\tnext.some(([__action, __character]) => __action === action && __character !== params[0]);\n\n\t\t\t\t// todo\n\t\t\t\treturn (characterWillAnimate && hasBlockingActions) || differentCharacterWillAnimate;\n\t\t\t});\n\n\t\t\tif (skip) continue;\n\n\t\t\tprocessedQueue.push(item);\n\t\t} else {\n\t\t\tprocessedQueue.push(item);\n\t\t}\n\t}\n\n\tconst run = async (match: (item: Exclude<ValidAction, ValidAction[]>) => Thenable<void>) => {\n\t\tfor (const item of processedQueue) {\n\t\t\tconst result = match(item);\n\n\t\t\tif (isPromise(result)) {\n\t\t\t\tawait result;\n\t\t\t}\n\t\t}\n\n\t\tprocessedQueue.length = 0;\n\t};\n\n\treturn {\n\t\trun,\n\t\tkeep: {\n\t\t\tkeep,\n\t\t\tcharacters,\n\t\t\taudio,\n\t\t},\n\t};\n};\n// #endregion\n\nexport {\n\tfindLastPathItemBeforeItemOfType,\n\tgetActionsFromPath,\n\tgetOppositeAction,\n\tcreateQueueProcessor,\n\tcreateReferFunction,\n\texitPath,\n\tcollectActionsBeforeBlockingAction,\n\tnextPath,\n\tisExitImpossible,\n};\n\nexport type { GuardedReferFunction };\n","type ControlledPromise<T> = Promise<\n\t| {\n\t\t\tvalue: T;\n\t\t\tcancelled: false;\n\t }\n\t| {\n\t\t\tvalue: null;\n\t\t\tcancelled: true;\n\t }\n>;\n\ntype ControlledPromiseObj<T> = {\n\tresolve: (value: T | PromiseLike<T>) => void;\n\treject: (reason?: any) => void;\n\n\tpromise: ControlledPromise<T>;\n\n\tcancel: () => void;\n};\n\nconst createControlledPromise = <T = void>() => {\n\tconst object = {\n\t\tresolve: null,\n\t\treject: null,\n\n\t\tpromise: null,\n\n\t\tcancel: null,\n\t} as unknown as ControlledPromiseObj<T>;\n\n\tconst init = () => {\n\t\tconst promise = new Promise((resolve, reject) => {\n\t\t\tobject.reject = reject;\n\t\t\tobject.resolve = (value) => {\n\t\t\t\tresolve({ cancelled: false, value });\n\t\t\t};\n\n\t\t\tobject.cancel = () => {\n\t\t\t\tresolve({ cancelled: true, value: null });\n\t\t\t\tinit();\n\t\t\t};\n\t\t});\n\n\t\tobject.promise = promise as ControlledPromise<T>;\n\t};\n\n\treturn init(), object;\n};\n\nexport { createControlledPromise };\nexport type { ControlledPromise, ControlledPromiseObj };\n","import { memoize } from 'es-toolkit/function';\nimport { HOWLER_SUPPORTED_FILE_FORMATS, SUPPORTED_IMAGE_FILE_FORMATS } from '../constants';\nimport { isCSSImageURL } from './assertions';\nimport { DEV } from 'esm-env';\n\nconst getUrlFileExtension = (address: string) => {\n\ttry {\n\t\tconst { pathname } = new URL(address, location.href);\n\n\t\t/**\n\t\t * By using pathname we remove search params from URL, but some things are still preserved\n\t\t *\n\t\t * Imagine pathname like `image.png!private:1230`\n\t\t */\n\t\treturn pathname.split('.').at(-1)!.split('!')[0].split(':')[0];\n\t} catch (error) {\n\t\tif (DEV) {\n\t\t\tconsole.error(new Error(`Could not construct URL \"${address}\".`, { cause: error }));\n\t\t}\n\n\t\treturn '';\n\t}\n};\n\nconst fetchContentType = async (url: string, request: typeof fetch) => {\n\ttry {\n\t\tconst response = await request(url, {\n\t\t\tmethod: 'HEAD',\n\t\t});\n\n\t\treturn response.headers.get('Content-Type') || '';\n\t} catch (error) {\n\t\tif (DEV) {\n\t\t\tconsole.error(new Error(`Failed to fetch file at \"${url}\"`, { cause: error }));\n\t\t}\n\n\t\treturn '';\n\t}\n};\n\ntype GetResourceTypeParams = {\n\turl: string;\n\trequest: typeof fetch;\n};\n\nconst getResourseType = memoize(\n\tasync ({ url, request }: GetResourceTypeParams) => {\n\t\t/**\n\t\t * If url is not http we should not check\n\t\t *\n\t\t * startsWith('http') || startsWith('/') || startsWith('.') || startsWith('data')\n\t\t */\n\t\tif (!isCSSImageURL(url)) {\n\t\t\treturn 'other';\n\t\t}\n\n\t\tconst extension = getUrlFileExtension(url);\n\n\t\tif (HOWLER_SUPPORTED_FILE_FORMATS.has(extension as any)) {\n\t\t\treturn 'audio';\n\t\t}\n\n\t\tif (SUPPORTED_IMAGE_FILE_FORMATS.has(extension as any)) {\n\t\t\treturn 'image';\n\t\t}\n\n\t\t/**\n\t\t * If checks above didn't worked we will fetch content type\n\t\t * This might not work because of CORS\n\t\t */\n\t\tconst contentType = await fetchContentType(url, request);\n\n\t\tif (contentType.includes('audio')) {\n\t\t\treturn 'audio';\n\t\t}\n\n\t\tif (contentType.includes('image')) {\n\t\t\treturn 'image';\n\t\t}\n\n\t\treturn 'other';\n\t},\n\t{\n\t\tgetCacheKey: ({ url }) => url,\n\t},\n);\n\nexport { getUrlFileExtension, getResourseType, fetchContentType };\n\nexport type { GetResourceTypeParams };\n","import { memoize } from 'es-toolkit/function';\nimport type { Context, Renderer } from '../renderer';\nimport type { Save, StackHolder, UseStackFunctionReturnType } from '../types';\nimport { STACK_MAP } from '../shared';\n\nconst getStack = memoize(\n\t(_: Context) => {\n\t\treturn [] as unknown as StackHolder;\n\t},\n\t{\n\t\tcache: STACK_MAP,\n\t\tgetCacheKey: (ctx) => ctx.id,\n\t},\n);\n\nconst createUseStackFunction = (renderer: Renderer) => {\n\tconst useStack = (context: Context | string): UseStackFunctionReturnType => {\n\t\tconst ctx = typeof context === 'string' ? renderer.getContext(context) : context;\n\t\tconst stack = getStack(ctx);\n\n\t\treturn {\n\t\t\tget previous() {\n\t\t\t\treturn stack.previous;\n\t\t\t},\n\t\t\tget value() {\n\t\t\t\treturn stack.at(-1)!;\n\t\t\t},\n\t\t\tset value(value) {\n\t\t\t\tstack[stack.length - 1] = value;\n\t\t\t},\n\n\t\t\tback() {\n\t\t\t\tstack.previous = stack.length > 1 ? stack.pop() : this.value;\n\t\t\t\tctx.meta.goingBack = true;\n\t\t\t},\n\t\t\tpush(value: Save) {\n\t\t\t\tstack.push(value);\n\t\t\t},\n\t\t\tclear() {\n\t\t\t\tstack.previous = undefined;\n\n\t\t\t\tstack.length = 0;\n\t\t\t\tstack.length = 1;\n\t\t\t},\n\t\t};\n\t};\n\n\treturn useStack;\n};\n\nexport { getStack, createUseStackFunction };\n","import type { Story, ValidAction } from '../action';\n\nconst flatActions = (item: (ValidAction | ValidAction[])[]): ValidAction[] => {\n\treturn item.flatMap((data) => {\n\t\tconst type = data[0];\n\n\t\t/**\n\t\t * This is not just an action like `['name', ...arguments]`, but an array of actions\n\t\t */\n\t\tif (Array.isArray(type)) return flatActions(data as ValidAction[]);\n\n\t\treturn [data as ValidAction];\n\t});\n};\n\n/**\n * Transforms `(ValidAction | ValidAction[])[]` to `ValidAction[]`. Mutates provided `Story`\n */\nconst flatStory = (story: Story) => {\n\tfor (const key in story) {\n\t\tstory[key] = flatActions(story[key]);\n\t}\n\n\treturn story;\n};\n\nexport { flatActions, flatStory };\n","import { memoize } from 'es-toolkit/function';\nimport type { Lang } from '../types';\n\nconst getLanguage = (languages: string[]) => {\n\tlet { language } = navigator;\n\n\tif (languages.includes(language)) {\n\t\treturn language;\n\t} else if (languages.includes((language = language.slice(0, 2)))) {\n\t\treturn language;\n\t} else if ((language = languages.find((value) => navigator.languages.includes(value))!)) {\n\t\treturn language;\n\t}\n\n\t/**\n\t * We'v checked the `en-GB` format, `en` format, and maybe any second languages, but there were no matches\n\t */\n\treturn languages[0];\n};\n\nconst getIntlLanguageDisplayName = memoize((lang: Lang) => {\n\t/**\n\t * When using Intl fails we just return language key.\n\t */\n\ttry {\n\t\tconst intl = new Intl.DisplayNames([lang], {\n\t\t\ttype: 'language',\n\t\t});\n\n\t\treturn intl.of(lang) || lang;\n\t} catch {\n\t\treturn lang;\n\t}\n});\n\n/**\n * Capitalizes the string\n * @param str String without emojis or complex graphemes\n */\nconst capitalize = (str: string) => {\n\treturn str[0].toUpperCase() + str.slice(1);\n};\n\nexport { getLanguage, getIntlLanguageDisplayName, capitalize };\n","const noop = () => {};\n\n/**\n * A wrapper on `fn` to make it run only once!\n * @param fn Function that needed to run no more than one time\n */\nconst once = (fn: () => void) => {\n\tlet ran = false;\n\n\treturn () => {\n\t\tif (ran) return;\n\n\t\tran = true;\n\t\tfn();\n\t};\n};\n\nexport { noop, once };\n","import type { Stored } from '../store';\nimport type { Lang, StorageData } from '../types';\n\nconst getLanguageFromStore = <$Language extends Lang>(store: Stored<StorageData<$Language, any>>) => {\n\treturn store.get().meta[0];\n};\n\nconst getVolumeFromStore = <$Language extends Lang>(store: Stored<StorageData<$Language, any>>) => {\n\tconst { meta } = store.get();\n\n\treturn {\n\t\tmusic: meta[2],\n\t\tsound: meta[3],\n\t\tvoice: meta[4],\n\t};\n};\n\nexport { getLanguageFromStore, getVolumeFromStore };\n","const mapSet = <T, K>(set: Set<T>, fn: (value: T, index: number, array: T[]) => K): K[] => {\n\treturn [...set].map(fn);\n};\n\nconst toArray = <T>(target: T | T[]) => {\n\treturn Array.isArray(target) ? target : [target];\n};\n\nexport { mapSet, toArray };\n","import type { Character } from '../character';\nimport type { CharactersData, Lang } from '../types';\n\nconst getCharactersData = <Characters extends Record<string, Character<Lang>>>(characters: Characters) => {\n\tconst entries = Object.entries(characters);\n\tconst mapped = entries.map(([key, value]) => [key, { name: value.name, emotions: Object.keys(value.emotions) }]);\n\n\treturn Object.fromEntries(mapped) as CharactersData<Characters>;\n};\n\nexport { getCharactersData };\n","import { noop } from './utilities';\n\ntype Stored<T> = {\n\tsubscribe: (cb: (value: T) => void) => () => void;\n\tupdate: (fn: (prev: T) => T) => void;\n\tset: (val: T) => void;\n\tget: () => T;\n};\n\ntype Derived<T> = {\n\tsubscribe: (cb: (value: T) => void) => () => void;\n\tget: () => T;\n};\n\nconst store = <T>(current: T, subscribers = new Set<(value: T) => void>()): Stored<T> => {\n\tconst subscribe = (cb: (value: T) => void) => {\n\t\tsubscribers.add(cb), cb(current);\n\n\t\treturn () => {\n\t\t\tsubscribers.delete(cb);\n\t\t};\n\t};\n\n\tconst push = (value: T) => {\n\t\tfor (const cb of subscribers) cb(value);\n\t};\n\n\tconst update = (fn: (prev: T) => T) => {\n\t\tpush((current = fn(current)));\n\t};\n\n\tconst set = (val: T) => {\n\t\tupdate(() => val);\n\t};\n\n\tconst get = () => {\n\t\treturn current;\n\t};\n\n\treturn { subscribe, update, set, get } as const;\n};\n\nconst derive = <T, K>(input: Stored<T>, map: (value: T) => K): Derived<K> => {\n\treturn {\n\t\tget: () => map(input.get()),\n\t\tsubscribe: (subscriber) => {\n\t\t\treturn input.subscribe((value) => {\n\t\t\t\treturn subscriber(map(value));\n\t\t\t});\n\t\t},\n\t};\n};\n\nconst immutable = <T>(value: T): Derived<T> => {\n\treturn {\n\t\tget: () => value,\n\t\tsubscribe: (subscriber) => {\n\t\t\tsubscriber(value);\n\n\t\t\treturn noop;\n\t\t},\n\t};\n};\n\nexport { store, derive, immutable };\nexport type { Stored, Derived };\n","import type { CustomHandler, CustomHandlerFunctionGetFn, CustomHandlerGetResult, TextContent } from './action';\nimport type { Context, CustomActionHandle } from './renderer';\nimport type { Derived, Stored } from './store';\nimport { CUSTOM_ACTION_MAP } from './shared';\nimport type { CoreData, Data, Lang, Stack, State, StateFunction } from './types';\nimport { noop } from './utilities';\nimport { derive, immutable } from './store';\n\ntype CustomActionHolder = {\n\t/**\n\t * Node in which custom action is rendered\n\t */\n\tnode: null | HTMLDivElement;\n\t/**\n\t * Custom Handler function itself\n\t */\n\tfn: CustomHandler;\n\t/**\n\t * Local Data\n\t */\n\tlocalData: any;\n\t/**\n\t * Cleanup function. Provided by custom action.\n\t */\n\tcleanup: () => void;\n};\n\ntype HandleCustomActionOptions = CustomActionHandle & {\n\t/**\n\t * State Function\n\t */\n\tstate: StateFunction<State>;\n\t/**\n\t * Current Game Language\n\t */\n\tlang: Lang;\n\t/**\n\t * Function to get Stack\n\t */\n\tgetStack: (ctx: Context) => Stack;\n\t/**\n\t * Template Replace Function\n\t */\n\ttemplateReplace: (content: TextContent<Lang, Data>, values?: Data) => string;\n\t/**\n\t * Paused Store\n\t */\n\tpaused: Derived<boolean>;\n};\n\nconst createCustomActionNode = (id: string) => {\n\tconst div = document.createElement('div');\n\n\tdiv.setAttribute('data-id', id);\n\n\treturn div;\n};\n\nconst getCustomActionHolder = (ctx: Context, fn: CustomHandler) => {\n\tconst cached = CUSTOM_ACTION_MAP.get(ctx.id + fn.key);\n\n\tif (cached) {\n\t\treturn cached;\n\t}\n\n\tconst holder = {\n\t\tcleanup: noop,\n\t\tnode: null,\n\t\tfn: fn,\n\t\tlocalData: {},\n\t} satisfies CustomActionHolder;\n\n\tCUSTOM_ACTION_MAP.set(ctx.id + fn.key, holder);\n\n\treturn holder;\n};\n\nconst handleCustomAction = (\n\tctx: Context,\n\tfn: CustomHandler,\n\t{\n\t\tlang,\n\t\tstate,\n\t\tsetMountElement,\n\t\tsetClear,\n\t\tremove: renderersRemove,\n\t\tgetStack,\n\t\ttemplateReplace,\n\t\tpaused,\n\t}: HandleCustomActionOptions,\n) => {\n\tconst holder = getCustomActionHolder(ctx, fn);\n\n\tconst flags = {\n\t\t...ctx.meta,\n\t};\n\n\tconst getDomNodes = (insert = true): CustomHandlerGetResult<boolean> => {\n\t\tif (holder.node || !insert) {\n\t\t\treturn {\n\t\t\t\telement: holder.node,\n\t\t\t\troot: ctx.root,\n\t\t\t};\n\t\t}\n\n\t\tholder.node = insert ? createCustomActionNode(fn.key) : null;\n\n\t\tsetMountElement(holder.node);\n\n\t\treturn {\n\t\t\telement: holder.node,\n\t\t\troot: ctx.root,\n\t\t};\n\t};\n\n\tconst clear = (func: typeof noop) => {\n\t\t/**\n\t\t * We wrap original cleanup to achieve these goals:\n\t\t *\n\t\t * - when cleaned up function will not be called again\n\t\t * - when cleaned up renderer will get updated element\n\t\t */\n\t\tsetClear(\n\t\t\t(holder.cleanup = () => {\n\t\t\t\tfunc();\n\n\t\t\t\tholder.node = null;\n\t\t\t\tholder.cleanup = noop;\n\n\t\t\t\tsetMountElement(null);\n\t\t\t\tsetClear(noop);\n\t\t\t}),\n\t\t);\n\t};\n\n\tconst data = (updatedData?: any) => {\n\t\tif (updatedData) {\n\t\t\treturn (holder.localData = updatedData);\n\t\t}\n\n\t\treturn holder.localData;\n\t};\n\n\tconst remove = () => {\n\t\tholder.cleanup();\n\t\trenderersRemove();\n\t};\n\n\tconst stack = getStack(ctx);\n\n\tconst getPath = () => {\n\t\treturn stack.value[0];\n\t};\n\n\tconst getSave = () => {\n\t\treturn stack.value;\n\t};\n\n\treturn fn({\n\t\tflags,\n\n\t\tlang,\n\n\t\tstate,\n\t\tdata,\n\n\t\ttemplateReplace,\n\n\t\tclear,\n\t\tremove,\n\n\t\trendererContext: ctx,\n\n\t\tgetDomNodes: getDomNodes as CustomHandlerFunctionGetFn,\n\n\t\tgetSave,\n\t\tgetPath,\n\n\t\tcontextKey: ctx.id,\n\n\t\tpaused: flags.preview ? immutable(false) : paused,\n\t});\n};\n\nexport { getCustomActionHolder, handleCustomAction };\nexport type { CustomActionHolder, HandleCustomActionOptions };\n","import type { CustomHandler, DefaultActionProxy } from './action';\nimport type { Character } from './character';\nimport { ASSETS_TO_PRELOAD, PRELOADED_ASSETS } from './shared';\nimport type { Lang } from './types';\nimport { isAudioAction, isImageAsset, isString, isAsset, getResourseType, mapSet, toArray } from './utilities';\nimport { unwrapAudioAsset, unwrapImageAsset } from './asset';\n\nconst ACTION_NAME_TO_VOLUME_MAP = {\n\tplayMusic: 'music',\n\tplaySound: 'sound',\n\tvoice: 'voice',\n} as const;\n\n/**\n * Adds asset to `ASSETS_TO_PRELOAD` firstly checking if is was already preloaded\n */\nconst enqueueAssetForPreloading = (asset: string) => {\n\tif (!PRELOADED_ASSETS.has(asset)) {\n\t\tASSETS_TO_PRELOAD.add(asset);\n\t}\n};\n\ntype HandleAssetsPreloadingOptions = {\n\trequest: typeof fetch;\n\n\tlimiter: (fn: () => void | PromiseLike<void>) => Promise<void>;\n\n\tpreloadAudioBlocking: (source: string) => Promise<void>;\n\tpreloadImageBlocking: (source: string) => Promise<void>;\n};\n\n/**\n * Preloads assets\n */\nconst handleAssetsPreloading = async ({\n\trequest,\n\tlimiter,\n\tpreloadAudioBlocking,\n\tpreloadImageBlocking,\n}: HandleAssetsPreloadingOptions) => {\n\tconst list = mapSet(ASSETS_TO_PRELOAD, (asset) => {\n\t\treturn limiter(async () => {\n\t\t\tconst type = await getResourseType({\n\t\t\t\turl: asset,\n\t\t\t\trequest,\n\t\t\t});\n\n\t\t\tswitch (type) {\n\t\t\t\tcase 'audio': {\n\t\t\t\t\tawait preloadAudioBlocking(asset);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase 'image': {\n\t\t\t\t\tawait preloadImageBlocking(asset);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tASSETS_TO_PRELOAD.delete(asset);\n\t\t\tPRELOADED_ASSETS.add(asset);\n\t\t});\n\t});\n\n\t/**\n\t * `allSettled` is used because even if error happens game should run\n\t *\n\t * Ideally, there could be a notification for player, maybe developer could be also notified\n\t * But I don't think it's really needed\n\t */\n\tawait Promise.allSettled(list);\n\n\tASSETS_TO_PRELOAD.clear();\n};\n\ntype HuntAssetsOptions = {\n\t/**\n\t * Audio Volume\n\t */\n\tvolume: {\n\t\tmusic: number;\n\t\tsound: number;\n\t\tvoice: number;\n\t};\n\t/**\n\t * Current Language\n\t */\n\tlang: Lang;\n\t/**\n\t * Characters object from user config\n\t */\n\tcharacters: Record<string, Character>;\n\t/**\n\t * Action name\n\t */\n\taction: keyof DefaultActionProxy;\n\t/**\n\t * Action props\n\t */\n\tprops: Parameters<DefaultActionProxy[keyof DefaultActionProxy]>;\n\t/**\n\t * Function to handle found asset\n\t */\n\thandle: (asset: string) => void;\n};\n\nconst huntAssets = ({ volume, lang, characters, action, props, handle }: HuntAssetsOptions) => {\n\tif (action === 'showBackground') {\n\t\t/**\n\t\t * There are two types of showBackground currently\n\t\t *\n\t\t * Parameter is a `string`\n\t\t * Parameter is a `Record<'CSS Media', string>`\n\t\t */\n\t\tif (isString(props[0])) {\n\t\t\thandle(unwrapAudioAsset(props[0]));\n\t\t}\n\n\t\tif (props[0] && typeof props[0] === 'object') {\n\t\t\tfor (const value of Object.values(props[0])) {\n\t\t\t\tif (isImageAsset(value)) {\n\t\t\t\t\thandle(value);\n\t\t\t\t} else if (isAsset(value)) {\n\t\t\t\t\tconst unwrapped = unwrapImageAsset(value);\n\n\t\t\t\t\tif (isImageAsset(unwrapped)) {\n\t\t\t\t\t\thandle(unwrapped);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn;\n\t}\n\n\tconst getVolumeFor = (action: 'playMusic' | 'stopMusic' | 'playSound' | 'stopSound' | 'voice' | 'stopVoice') => {\n\t\tif (action in ACTION_NAME_TO_VOLUME_MAP) {\n\t\t\t// typescript don't be silly please\n\t\t\treturn volume[ACTION_NAME_TO_VOLUME_MAP[action as keyof typeof ACTION_NAME_TO_VOLUME_MAP]];\n\t\t}\n\n\t\treturn 0;\n\t};\n\n\t/**\n\t * Here \"stop\" action also matches condition, but because `ASSETS_TO_PRELOAD` is a Set, there is no problem\n\t */\n\tif (isAudioAction(action) && isString(props[0])) {\n\t\tif (getVolumeFor(action) > 0) {\n\t\t\thandle(unwrapAudioAsset(props[0]));\n\t\t}\n\n\t\treturn;\n\t}\n\n\tif (action === 'voice' && typeof props[0] === 'object') {\n\t\t/**\n\t\t * Early return in case of disabled voices\n\t\t */\n\t\tif (getVolumeFor('voice') == 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const [language, value] of Object.entries(props[0])) {\n\t\t\tif (language === lang) {\n\t\t\t\t/**\n\t\t\t\t * todo: decide how to make language comparison (maybe use some function)\n\t\t\t\t *\n\t\t\t\t * We can use en-US for both en-US and en-GB. Same thing applies to `dialog` and `text` action.\n\t\t\t\t * Maybe voice over language can be selected separately\n\t\t\t\t */\n\t\t\t\tvalue && handle(unwrapAudioAsset(value));\n\t\t\t}\n\t\t}\n\n\t\treturn;\n\t}\n\n\t/**\n\t * Load characters\n\t */\n\tif (action === 'showCharacter' && isString(props[0]) && isString(props[1])) {\n\t\tconst images = toArray(characters[props[0]].emotions[props[1]]);\n\n\t\tfor (const asset of images) {\n\t\t\thandle(unwrapImageAsset(asset));\n\t\t}\n\n\t\treturn;\n\t}\n\n\t/**\n\t * Custom action assets\n\t */\n\tif (action === 'custom' && (props[0] as CustomHandler).assets) {\n\t\tfor (const asset of (props[0] as CustomHandler).assets!) {\n\t\t\tisAsset(asset) ? handle(asset.source) : handle(asset);\n\t\t}\n\n\t\treturn;\n\t}\n\n\tif (action === 'choice') {\n\t\tfor (let i = 1; i < props.length; i++) {\n\t\t\tconst data = props[i];\n\n\t\t\tif (Array.isArray(data)) {\n\t\t\t\thandle(unwrapImageAsset(data[5] as string));\n\t\t\t}\n\t\t}\n\t}\n};\n\nexport { enqueueAssetForPreloading, handleAssetsPreloading, huntAssets };\n","import type { StorageData } from './types';\n\ntype StorageAdapter = {\n\tget: () => Promise<StorageData>;\n\tset: (data: StorageData) => Promise<void>;\n};\n\ntype StorageAdapterLocalOptions = {\n\tkey: string;\n};\n\n/**\n * Stores data in localStorage\n */\nconst storageAdapterLocal = ({ key }: StorageAdapterLocalOptions): StorageAdapter => {\n\treturn {\n\t\tasync get() {\n\t\t\tconst fallback = { saves: [], data: {}, meta: [] };\n\n\t\t\ttry {\n\t\t\t\tconst value = localStorage.getItem(key);\n\n\t\t\t\treturn value ? JSON.parse(value) : fallback;\n\t\t\t} catch {\n\t\t\t\treturn fallback;\n\t\t\t}\n\t\t},\n\t\tasync set(data) {\n\t\t\ttry {\n\t\t\t\tlocalStorage.setItem(key, JSON.stringify(data));\n\t\t\t} catch {}\n\t\t},\n\t};\n};\n\nexport type { StorageAdapter };\nexport { storageAdapterLocal };\n","import type { Data, State } from './types';\n\ntype PluralType = Intl.LDMLPluralRule;\ntype Pluralization = Partial<Record<PluralType, string>>;\ntype AllowedContent =\n\t| string\n\t| ((state: State | Data) => string | string[])\n\t| string[]\n\t| (string | ((state: State | Data) => string | string[]))[];\ntype TranslationActions = Partial<Record<string, (str: string) => string>>;\n\nconst RGX = /{{(.*?)}}/g;\n\nconst split = (input: string, delimeters: string[]) => {\n\tconst output: (string | undefined)[] = [];\n\n\tfor (const delimeter of delimeters) {\n\t\tif (!input) break;\n\n\t\tconst [start, end] = input.split(delimeter, 2);\n\n\t\toutput.push(start);\n\t\tinput = end;\n\t}\n\n\toutput.push(input);\n\n\treturn output;\n};\n\n/**\n * Turns any allowed content into string\n * @param c Content\n */\nconst flattenAllowedContent = (c: AllowedContent, state: State | Data): string => {\n\tif (Array.isArray(c)) {\n\t\treturn c.map((item) => flattenAllowedContent(item, state)).join('<br>');\n\t}\n\n\tif (typeof c === 'function') {\n\t\treturn flattenAllowedContent(c(state), state);\n\t}\n\n\treturn c;\n};\n\nconst replace = (\n\tinput: string,\n\tdata: Record<string, unknown>,\n\tpluralization?: Record<string, Pluralization>,\n\tactions?: TranslationActions,\n\tpr?: Intl.PluralRules,\n) => {\n\treturn input.replaceAll(RGX, (x: any, key: string, y: any) => {\n\t\tx = 0;\n\t\ty = data;\n\n\t\tconst [pathstr, plural, action] = split(key.trim(), ['@', '%']);\n\n\t\tif (!pathstr) {\n\t\t\treturn '';\n\t\t}\n\n\t\tconst path = pathstr.split('.');\n\n\t\twhile (y && x < path.length) y = y[path[x++]];\n\n\t\tif (plural && pluralization && y && pr) {\n\t\t\ty = pluralization[plural][pr.select(y)];\n\t\t}\n\n\t\tconst actionHandler = actions && action ? actions[action] : void 0;\n\n\t\tif (actionHandler) y = actionHandler(y);\n\n\t\treturn y == null ? '' : y;\n\t});\n};\n\nexport { flattenAllowedContent, replace };\nexport type { AllowedContent, PluralType, Pluralization, TranslationActions };\n","import { DEV } from 'esm-env';\nimport type { ActionChoiceChoiceObject, DefaultActionProxy, ValidAction, VirtualActions } from '../action';\nimport { flatActions } from './story';\nimport type { Data, Lang, State } from '../types';\nimport type { Character } from '../character';\n\ntype BuildActionObjectParams<$Lang extends Lang, $Data extends Data> = {\n\trendererActions: Record<string, (...args: any[]) => ValidAction>;\n\tnativeActions: string[];\n\n\tcharacters: Record<string, Character>;\n};\n\ntype VirtualActionsGlobal = VirtualActions<Record<string, Character>, Lang, State>;\ntype ActionsGlobal = DefaultActionProxy & VirtualActionsGlobal;\n\n/**\n * In this case actions that get overwritten with another action\n */\nconst VIRTUAL_ACTIONS: (keyof VirtualActionsGlobal)[] = ['say'];\n\nconst buildActionObject = <$Lang extends Lang, $Data extends Data>({\n\trendererActions,\n\tnativeActions,\n\tcharacters,\n}: BuildActionObjectParams<$Lang, $Data>) => {\n\tconst allActions = [...nativeActions, ...VIRTUAL_ACTIONS];\n\tconst object = { ...rendererActions };\n\n\tfor (let action of allActions) {\n\t\tobject[action] = (...props: Parameters<ActionsGlobal[keyof ActionsGlobal]>) => {\n\t\t\tif (action === 'say') {\n\t\t\t\taction = 'dialog';\n\n\t\t\t\tconst [character] = props as Parameters<VirtualActionsGlobal['say']>;\n\n\t\t\t\tif (DEV && !characters[character]) {\n\t\t\t\t\tthrow new Error(`Attempt to call Say action with unknown character \"${character}\"`);\n\t\t\t\t}\n\t\t\t} else if (action === 'choice') {\n\t\t\t\tif (props.slice(1).every((choice) => !Array.isArray(choice))) {\n\t\t\t\t\tfor (let i = 1; i < props.length; i++) {\n\t\t\t\t\t\tconst choice = props[i] as ActionChoiceChoiceObject<Lang, State>;\n\n\t\t\t\t\t\t(props as Parameters<DefaultActionProxy['choice']>)[i] = [\n\t\t\t\t\t\t\tchoice.title,\n\t\t\t\t\t\t\tflatActions(choice.children),\n\t\t\t\t\t\t\tchoice.active,\n\t\t\t\t\t\t\tchoice.visible,\n\t\t\t\t\t\t\tchoice.onSelect,\n\t\t\t\t\t\t\tchoice.image,\n\t\t\t\t\t\t];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor (let i = 1; i < props.length; i++) {\n\t\t\t\t\t\tconst choice = props[i];\n\n\t\t\t\t\t\tif (Array.isArray(choice)) {\n\t\t\t\t\t\t\tchoice[1] = flatActions(choice[1]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (action === 'condition') {\n\t\t\t\tconst actions = (props as Parameters<ActionsGlobal['condition']>)[1];\n\n\t\t\t\tfor (const key in actions) {\n\t\t\t\t\tactions[key] = flatActions(actions[key]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn [action, ...props] as ValidAction;\n\t\t};\n\t}\n\n\treturn object;\n};\n\nexport { buildActionObject };\n","import type { Story, TextContent } from '../action';\nimport { unwrapAudioAsset } from '../asset';\nimport type {\n\tData,\n\tDialogOverview,\n\tDialogOverviewEntry,\n\tLang,\n\tNovelyAsset,\n\tState,\n\tUseStackFunctionReturnType,\n} from '../types';\nimport { getActionsFromPath, type GuardedReferFunction } from './actions-processing';\nimport { isAsset, isSkippedDuringRestore, isString, isUserRequiredAction } from './assertions';\n\ntype GetDialogOverviewContext = {\n\tstory: Story;\n\treferGuarded: GuardedReferFunction;\n\n\tgetCharacterName: (character: string) => string;\n\tgetLanguage: () => string;\n\tgetStack: () => UseStackFunctionReturnType;\n\ttemplateReplace: (content: TextContent<Lang, Data>, values?: Data) => string;\n};\n\nconst getDialogOverview = async function (this: GetDialogOverviewContext) {\n\t/**\n\t * Dialog Overview is possible only in main context\n\t */\n\tconst { value: save } = this.getStack();\n\tconst stateSnapshots = save[3];\n\n\t/**\n\t * Easy mode\n\t */\n\tif (stateSnapshots.length == 0) {\n\t\treturn [];\n\t}\n\n\tconst { queue } = await getActionsFromPath({\n\t\tstory: this.story,\n\t\tpath: save[0],\n\t\tfilter: false,\n\t\treferGuarded: this.referGuarded,\n\t});\n\n\tconst lang = this.getLanguage();\n\n\ttype DialogItem = {\n\t\tname: undefined | string;\n\t\ttext: TextContent<string, State>;\n\t\tvoice: undefined | string | NovelyAsset | Record<string, string | NovelyAsset>;\n\t};\n\n\tconst dialogItems: DialogItem[] = [];\n\n\t/**\n\t * For every available state snapshot find dialog corresponding to it\n\t */\n\tfor (let p = 0, a = stateSnapshots.length, i = queue.length - 1; a > 0 && i > 0; i--) {\n\t\tconst action = queue[i];\n\n\t\tif (action[0] === 'dialog') {\n\t\t\tconst [_, name, text] = action;\n\n\t\t\tlet voice: undefined | string | NovelyAsset | Record<string, string | NovelyAsset> = undefined;\n\n\t\t\t/**\n\t\t\t * Search for the most recent `voice` action before current dialog\n\t\t\t */\n\t\t\tfor (let j = i - 1; j > p && j > 0; j--) {\n\t\t\t\tconst action = queue[j];\n\n\t\t\t\tif (isUserRequiredAction(action) || isSkippedDuringRestore(action[0])) break;\n\t\t\t\tif (action[0] === 'stopVoice') break;\n\n\t\t\t\tif (action[0] === 'voice') {\n\t\t\t\t\tvoice = action[1];\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdialogItems.push({\n\t\t\t\tname,\n\t\t\t\ttext,\n\t\t\t\tvoice,\n\t\t\t});\n\n\t\t\tp = i;\n\t\t\ta--;\n\t\t}\n\t}\n\n\tconst entries: DialogOverview = dialogItems.reverse().map(({ name, text, voice }, i) => {\n\t\tconst state = stateSnapshots[i];\n\t\tconst audioSource = isString(voice)\n\t\t\t? voice\n\t\t\t: isAsset(voice)\n\t\t\t\t? voice\n\t\t\t\t: voice == undefined\n\t\t\t\t\t? voice\n\t\t\t\t\t: voice[lang];\n\n\t\tname = name ? this.getCharacterName(name) : '';\n\n\t\treturn {\n\t\t\tname: this.templateReplace(name, state),\n\t\t\ttext: this.templateReplace(text, state),\n\t\t\tvoice: audioSource ? unwrapAudioAsset(audioSource) : '',\n\t\t} satisfies DialogOverviewEntry;\n\t});\n\n\treturn entries;\n};\n\nexport { getDialogOverview };\n","import type { Lang } from '../types';\n\nconst setDocumentLanguage = (language: Lang) => {\n\tdocument.documentElement.lang = language;\n};\n\nexport { setDocumentLanguage };\n","import type { ValidAction } from './action';\nimport type { Assign } from './types';\n\ntype Part = Record<string, (...args: any[]) => ValidAction>;\n\n/**\n * Extens core action with custom actions\n * @param base Actions object you will extend, `engine.action`\n * @param extension Actions object you will extend with\n * @example\n * ```ts\n * const action = extendAction(engine.action, {\n * particles: (options: Parameters<typeof particles>[0]) => {\n * return ['custom', particles(options)]\n * }\n * })\n * ```\n */\nconst extendAction = <Part0 extends Part, Part1 extends Part>(\n\tbase: Part0,\n\textension: Part1,\n): Readonly<Assign<Part0, Part1>> => {\n\treturn {\n\t\t...extension,\n\t\t...base,\n\t};\n};\n\nexport { extendAction };\n","const RU = {\n\tNewGame: 'Новая игра',\n\tHomeScreen: 'Главный экран',\n\tToTheGame: 'К игре',\n\tLanguage: 'Язык',\n\tNoSaves: 'Сохранений нет',\n\tLoadSave: 'Загрузить',\n\tSaves: 'Сохранения',\n\tSettings: 'Настройки',\n\tSumbit: 'Подтвердить',\n\tGoBack: 'Назад',\n\tDoSave: 'Сохранение',\n\tAuto: 'Авто',\n\tStop: 'Стоп',\n\tExit: 'Выход',\n\tAutomatic: 'Автоматическое',\n\tManual: 'Ручное',\n\tRemove: 'Удалить',\n\tLoadASaveFrom: 'Загрузить сохранение от',\n\tDeleteASaveFrom: 'Удалить сохранение от',\n\tTextSpeed: 'Скорость текста',\n\tTextSpeedSlow: 'Медленная',\n\tTextSpeedMedium: 'Средняя',\n\tTextSpeedFast: 'Быстрая',\n\tTextSpeedAuto: 'Автоматическая',\n\tCompleteText: 'Завершить текст',\n\tGoForward: 'Перейти вперёд',\n\tExitDialogWarning: 'Вы уверены, что хотите выйти? Прогресс будет сохранён.',\n\tExitDialogExit: 'Выйти',\n\tExitDialogBack: 'Вернуться в игру',\n\tOpenMenu: 'Открыть меню',\n\tCloseMenu: 'Закрыть меню',\n\tMusicVolume: 'Громкость музыки',\n\tSoundVolume: 'Громкость звуков',\n\tVoiceVolume: 'Громкость речи',\n\tClose: 'Закрыть',\n\tDialogOverview: 'Обзор диалога',\n};\n\ntype BaseTranslationStrings = keyof typeof RU;\n\nconst EN: Record<BaseTranslationStrings, string> = {\n\tNewGame: 'New Game',\n\tHomeScreen: 'Home Screen',\n\tToTheGame: 'To the Game',\n\tLanguage: 'Language',\n\tNoSaves: 'No saves',\n\tLoadSave: 'Load',\n\tSaves: 'Saves',\n\tSettings: 'Settings',\n\tSumbit: 'Submit',\n\tGoBack: 'Go back',\n\tDoSave: 'Save',\n\tAuto: 'Auto',\n\tStop: 'Stop',\n\tExit: 'Exit',\n\tAutomatic: 'Automatic',\n\tManual: 'Manual',\n\tRemove: 'Remove',\n\tLoadASaveFrom: 'Load a save from',\n\tDeleteASaveFrom: 'Delete a save from',\n\tTextSpeed: 'Text Speed',\n\tTextSpeedSlow: 'Slow',\n\tTextSpeedMedium: 'Medium',\n\tTextSpeedFast: 'Fast',\n\tTextSpeedAuto: 'Auto',\n\tCompleteText: 'Complete text',\n\tGoForward: 'Go forward',\n\tExitDialogWarning: 'Are you sure you want to exit? Progress will be saved.',\n\tExitDialogExit: 'Exit',\n\tExitDialogBack: 'Return to game',\n\tOpenMenu: 'Open menu',\n\tCloseMenu: 'Close menu',\n\tMusicVolume: 'Music volume',\n\tSoundVolume: 'Sound volume',\n\tVoiceVolume: 'Voice volume',\n\tClose: 'Close',\n\tDialogOverview: 'Dialog Overview',\n};\n\nexport { RU, EN };\nexport type { BaseTranslationStrings };\n","type EventHandler<T> = (this: Document, event: T) => void;\n\ntype BlurEventHandler = EventHandler<Event>;\ntype FocusEventHandler = EventHandler<FocusEvent>;\n\nconst BLUR_HANDLERS = new Set<BlurEventHandler>();\nconst FOCUS_HANDLERS = new Set<FocusEventHandler>();\n\ntype EventListeners = {\n\tfocus: FocusEventHandler;\n\tblur: BlurEventHandler;\n};\n\nconst registerEventListeners = (listeners: EventListeners) => {\n\tBLUR_HANDLERS.add(listeners.blur);\n\tFOCUS_HANDLERS.add(listeners.focus);\n\n\treturn () => {\n\t\tBLUR_HANDLERS.delete(listeners.blur);\n\t\tFOCUS_HANDLERS.delete(listeners.focus);\n\t};\n};\n\naddEventListener('focus', function (event) {\n\tfor (const handler of FOCUS_HANDLERS) {\n\t\ttry {\n\t\t\thandler.call(this.document, event);\n\t\t} catch {}\n\t}\n});\n\naddEventListener('blur', function (event) {\n\tfor (const handler of BLUR_HANDLERS) {\n\t\ttry {\n\t\t\thandler.call(this.document, event);\n\t\t} catch {}\n\t}\n});\n\nconst pauseOnBlur = (engine: { setFocused: (focused: boolean) => void }) => {\n\treturn {\n\t\tunsubscribe: registerEventListeners({\n\t\t\tfocus: () => {\n\t\t\t\tengine.setFocused(true);\n\t\t\t},\n\t\t\tblur: () => {\n\t\t\t\tengine.setFocused(false);\n\t\t\t},\n\t\t}),\n\t};\n};\n\nexport { pauseOnBlur };\n"],"mappings":"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","names":["memoize","DEV","asset","supportsMap","supportsMap","asset","DEV","refer","audio","item","next","memoize","DEV","memoize","memoize","memoize","memoize","store","set","set","getStack","asset","action","DEV","DEV","action","getLanguage","memoize","DEV","data","save","replace","set","characters","audio","action","type","props","asset","preview","next","t","paused"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@novely/core",
|
|
3
3
|
"description": "Novely - powerful visual novel engine for creating interactive stories and games with branching narratives and rich multimedia content",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.52.0-next",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"publishConfig": {
|