@novely/core 0.47.1 → 0.47.2
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.global.js +19 -7
- package/dist/index.global.js.map +1 -1
- package/dist/index.js +19 -7
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/novely.ts","../../../node_modules/.pnpm/klona@2.0.6/node_modules/klona/full/index.mjs","../src/constants.ts","../src/utilities/assertions.ts","../src/utilities/match-action.ts","../src/utilities/ungrupped.ts","../src/utilities/actions-processing.ts","../src/utilities/controlled-promise.ts","../src/utilities/resources.ts","../src/utilities/stack.ts","../src/shared.ts","../src/utilities/story.ts","../src/browser.ts","../src/custom-action.ts","../src/preloading.ts","../src/storage.ts","../src/store.ts","../src/translation.ts","../src/extend-actions.ts","../src/translations.ts","../src/asset.ts","../src/audio-codecs.ts","../src/image-formats.ts"],"sourcesContent":["import { dequal } from 'dequal/lite';\nimport { 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 { setupBrowserVisibilityChangeListeners } from './browser';\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 { ASSETS_TO_PRELOAD, PRELOADED_ASSETS, STACK_MAP } from './shared';\nimport { localStorageStorage } from './storage';\nimport type { Stored } from './store';\nimport { store } from './store';\nimport { flattenAllowedContent, replace as replaceTranslation } from './translation';\nimport type { BaseTranslationStrings } from './translations';\nimport type {\n\tCoreData,\n\tData,\n\tDialogOverview,\n\tDialogOverviewEntry,\n\tLang,\n\tNovelyAsset,\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\tflatActions,\n\tflatStory,\n\tcapitalize,\n\tgetLanguage as defaultGetLanguage,\n\tgetCharactersData,\n\tgetIntlLanguageDisplayName,\n\tgetLanguageFromStore,\n\tgetVolumeFromStore,\n\thandleAudioAsset,\n\thandleImageAsset,\n\tnoop,\n\ttoArray,\n\tisUserRequiredAction,\n\tisSkippedDuringRestore,\n} from './utilities';\nimport type { MatchActionHandlers } from './utilities';\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 = 'lazy',\n\tparallelAssetsDownloadLimit = 15,\n\tfetch: request = fetch,\n\tcloneFunction: clone = klona,\n\tsaveOnUnload = true,\n\tstartKey = 'start',\n}: NovelyInit<$Language, $Characters, $State, $Data, $Actions>) => {\n\t/**\n\t * All action functions\n\t */\n\ttype Actions = $Actions &\n\t\tActionProxy<$Characters, $Language, $State> &\n\t\tVirtualActions<$Characters, $Language, $State>;\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\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/**\n\t\t * In case script was called after destroy\n\t\t */\n\t\tif (destroyed) return;\n\n\t\tObject.assign(story, flatStory(part));\n\n\t\tlet loadingIsShown = false;\n\n\t\t/**\n\t\t * This is the first `script` call, likely data did not loaded yet\n\t\t */\n\t\tif (!initialScreenWasShown) {\n\t\t\trenderer.ui.showLoading();\n\t\t\tloadingIsShown = true;\n\t\t}\n\n\t\tif (preloadAssets === 'blocking' && ASSETS_TO_PRELOAD.size > 0) {\n\t\t\t/**\n\t\t\t * Likely updating this will not break anything, but just to be sure nothing breaks\n\t\t\t * We want to avoid flashes, and who knows how some renderer will use it\n\t\t\t */\n\t\t\tif (!loadingIsShown) {\n\t\t\t\trenderer.ui.showLoading();\n\t\t\t}\n\n\t\t\tawait handleAssetsPreloading({\n\t\t\t\t...renderer.misc,\n\t\t\t\tlimiter: limitAssetsDownload,\n\t\t\t\trequest,\n\t\t\t});\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\t// #region Action Proxy\n\tconst action = new Proxy({} as Actions, {\n\t\tget(_: unknown, action: string) {\n\t\t\tif (action in renderer.actions) {\n\t\t\t\treturn renderer.actions[action];\n\t\t\t}\n\n\t\t\treturn (...props: Parameters<Actions[keyof Actions]>) => {\n\t\t\t\tif (action === 'say') {\n\t\t\t\t\taction = 'dialog';\n\n\t\t\t\t\tconst [character] = props;\n\n\t\t\t\t\tif (DEV && !characters[character]) {\n\t\t\t\t\t\tthrow new Error(`Attempt to call Say action with unknown character \"${character}\"`);\n\t\t\t\t\t}\n\t\t\t\t} else if (action === 'choice') {\n\t\t\t\t\tconst actions = props.slice(1);\n\n\t\t\t\t\tif (actions.every((choice) => !Array.isArray(choice))) {\n\t\t\t\t\t\tfor (let i = 1; i < props.length; i++) {\n\t\t\t\t\t\t\tconst choice = props[i];\n\n\t\t\t\t\t\t\tprops[i] = [\n\t\t\t\t\t\t\t\tchoice.title,\n\t\t\t\t\t\t\t\tflatActions(choice.children),\n\t\t\t\t\t\t\t\tchoice.active,\n\t\t\t\t\t\t\t\tchoice.visible,\n\t\t\t\t\t\t\t\tchoice.onSelect,\n\t\t\t\t\t\t\t\tchoice.image,\n\t\t\t\t\t\t\t];\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor (let i = 1; i < props.length; i++) {\n\t\t\t\t\t\t\tconst choice = props[i];\n\n\t\t\t\t\t\t\tif (Array.isArray(choice)) {\n\t\t\t\t\t\t\t\tchoice[1] = flatActions(choice[1]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (action === 'condition') {\n\t\t\t\t\tconst actions = props[1];\n\n\t\t\t\t\tfor (const key in actions) {\n\t\t\t\t\t\tactions[key] = flatActions(actions[key]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (preloadAssets === 'blocking') {\n\t\t\t\t\thuntAssets({\n\t\t\t\t\t\taction: action as any,\n\t\t\t\t\t\tprops: props as any,\n\n\t\t\t\t\t\tmode: preloadAssets,\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\treturn [action, ...props] as ValidAction;\n\t\t\t};\n\t\t},\n\t});\n\t// #endregion\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/**\n\t\t * This is valid language\n\t\t */\n\t\tif (languages.includes(language as $Language)) {\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});\n\n\tconst onDataLoadedPromise = ({ 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\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\tconst throttledOnStorageDataChange = throttle(onStorageDataChange, throttleTimeout);\n\tconst throttledEmergencyOnStorageDataChange = throttle(() => {\n\t\tif (saveOnUnload === true || (saveOnUnload === 'prod' && !DEV)) {\n\t\t\tonStorageDataChange(storageData.get());\n\t\t}\n\t}, 10);\n\n\tstorageData.subscribe(throttledOnStorageDataChange);\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] ||= DEFAULT_TYPEWRITER_SPEED;\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\tconst unsubscribeFromBrowserVisibilityChange = setupBrowserVisibilityChangeListeners({\n\t\tonChange: throttledEmergencyOnStorageDataChange,\n\t});\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\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\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 { queue, skip, skipPreserve } = getActionsFromPath(story, path, false);\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 } = getActionsFromPath(story, previous[0], false);\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\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\trender(context);\n\n\t\tcontext.meta.restoring = context.meta.goingBack = false;\n\t};\n\t// #endregion\n\n\tconst refer = createReferFunction(story);\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 { queue } = getActionsFromPath(story, path, true);\n\t\tconst ctx = renderer.getContext(name);\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\tmode: preloadAssets,\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 getResourseTypeForRenderer = (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(handleImageAsset);\n\t};\n\n\tconst getCharacterName = (character: keyof $Characters): string => {\n\t\tconst c = character;\n\t\tconst cs = characters;\n\t\tconst [lang] = storageData.get().meta;\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 as $Language];\n\t\t\t}\n\t\t}\n\n\t\treturn String(c) || '';\n\t};\n\n\tconst getDialogOverview = () => {\n\t\t/**\n\t\t * Dialog Overview is possible only in main context\n\t\t */\n\t\tconst { value: save } = useStack(MAIN_CONTEXT_KEY);\n\t\tconst stateSnapshots = save[3];\n\n\t\t/**\n\t\t * Easy mode\n\t\t */\n\t\tif (stateSnapshots.length == 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst { queue } = getActionsFromPath(story, save[0], false);\n\n\t\tconst [lang] = storageData.get().meta;\n\n\t\ttype DialogItem = {\n\t\t\tname: undefined | string;\n\t\t\ttext: TextContent<string, State>;\n\t\t\tvoice: undefined | string | NovelyAsset | Record<string, string | NovelyAsset>;\n\t\t};\n\n\t\tconst dialogItems: DialogItem[] = [];\n\n\t\t/**\n\t\t * For every available state snapshot find dialog corresponding to it\n\t\t */\n\t\tfor (let p = 0, a = stateSnapshots.length, i = queue.length - 1; a > 0; i--) {\n\t\t\tconst action = queue[i];\n\n\t\t\tif (action[0] === 'dialog') {\n\t\t\t\tconst [_, name, text] = action;\n\n\t\t\t\tlet voice: undefined | string | NovelyAsset | Record<string, string | NovelyAsset> = undefined;\n\n\t\t\t\t/**\n\t\t\t\t * Search for the most recent `voice` action before current dialog\n\t\t\t\t */\n\t\t\t\tfor (let j = i - 1; j > p; j--) {\n\t\t\t\t\tconst action = queue[j];\n\n\t\t\t\t\tif (isUserRequiredAction(action) || isSkippedDuringRestore(action[0])) break;\n\t\t\t\t\tif (action[0] === 'stopVoice') break;\n\n\t\t\t\t\tif (action[0] === 'voice') {\n\t\t\t\t\t\tvoice = action[1];\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tdialogItems.push({\n\t\t\t\t\tname,\n\t\t\t\t\ttext,\n\t\t\t\t\tvoice,\n\t\t\t\t});\n\n\t\t\t\tp = i;\n\t\t\t\ta--;\n\t\t\t}\n\t\t}\n\n\t\tconst entries: DialogOverview = dialogItems.reverse().map(({ name, text, voice }, i) => {\n\t\t\tconst state = stateSnapshots[i];\n\t\t\tconst audioSource = isString(voice)\n\t\t\t\t? voice\n\t\t\t\t: isAsset(voice)\n\t\t\t\t\t? voice\n\t\t\t\t\t: voice == undefined\n\t\t\t\t\t\t? voice\n\t\t\t\t\t\t: voice[lang];\n\n\t\t\tname = name ? getCharacterName(name as keyof $Characters) : '';\n\n\t\t\treturn {\n\t\t\t\tname: templateReplace(name, state),\n\t\t\t\ttext: templateReplace(text, state),\n\t\t\t\tvoice: audioSource ? handleAudioAsset(audioSource) : '',\n\t\t\t} satisfies DialogOverviewEntry;\n\t\t});\n\n\t\treturn entries;\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,\n\n\t\tgetResourseType: getResourseTypeForRenderer,\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\tonBeforeActionCall({ 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 = collectActionsBeforeBlockingAction({\n\t\t\t\t\tpath: nextPath(clone(useStack(ctx).value[0])),\n\t\t\t\t\trefer,\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\tmode: preloadAssets,\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 = 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: handleImageAsset(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, handleImageAsset(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(handleAudioAsset(source), 'music').play(true);\n\t\t\tpush();\n\t\t},\n\t\tpauseMusic({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(handleAudioAsset(source), 'music').pause();\n\t\t\tpush();\n\t\t},\n\t\tstopMusic({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(handleAudioAsset(source), 'music').stop();\n\t\t\tpush();\n\t\t},\n\t\tplaySound({ ctx, push }, [source, loop]) {\n\t\t\tctx.audio.music(handleAudioAsset(source), 'sound').play(loop || false);\n\t\t\tpush();\n\t\t},\n\t\tpauseSound({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(handleAudioAsset(source), 'sound').pause();\n\t\t\tpush();\n\t\t},\n\t\tstopSound({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(handleAudioAsset(source), 'sound').stop();\n\t\t\tpush();\n\t\t},\n\t\tvoice({ ctx, push }, [source]) {\n\t\t\tconst [lang] = storageData.get().meta;\n\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(handleAudioAsset(audioSource));\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 ? handleImageAsset(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\tif (DEV && !story[scene]) {\n\t\t\t\tthrow new Error(`Attempt to jump to 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 jump to empty scene \"${scene}\"`);\n\t\t\t}\n\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\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\texit({ ctx, data }) {\n\t\t\tif (ctx.meta.restoring) return;\n\n\t\t\tconst { exitImpossible } = exitPath({\n\t\t\t\tpath: useStack(ctx).value[0],\n\t\t\t\trefer: refer,\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 becase \"preloadAssets\" strategy was set to \"${preloadAssets}\"`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (!ctx.meta.goingBack && !ctx.meta.restoring && !PRELOADED_ASSETS.has(source)) {\n\t\t\t\t/**\n\t\t\t\t * Add to preloaded before it was loaded to prevent save image downloading multiple times\n\t\t\t\t */\n\t\t\t\tPRELOADED_ASSETS.add(renderer.misc.preloadImage(source));\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 Render Function\n\tconst render = (ctx: Context) => {\n\t\tconst stack = useStack(ctx);\n\t\tconst [path, state] = stack.value;\n\n\t\tconst referred = refer(path);\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 * Basically 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 typeEssentials: TypeEssentials<$Language, $State, $Data, $Characters> = {\n\t\tl: null,\n\t\ts: null,\n\t\td: null,\n\t\tc: null,\n\t};\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 * @deprecated Will be removed BUT replaced with state passed into actions as a parameter\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 *\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,\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\tdataLoaded.cancel();\n\n\t\t\tUIInstance.unmount();\n\n\t\t\tunsubscribeFromBrowserVisibilityChange();\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};\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 { 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 = <M extends MatchActionMapComplete>(callbacks: MatchActionHandlers, values: M) => {\n\tconst { getContext, onBeforeActionCall, push, forward } = callbacks;\n\n\treturn (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\nexport { matchAction };\nexport type { MatchActionHandlers, MatchActionMapComplete };\n","import { memoize } from 'es-toolkit/function';\nimport { DEV } from 'esm-env';\nimport type { Character } from '../character';\nimport type { Stored } from '../store';\nimport type { CharactersData, Lang, NovelyAsset, StorageData } from '../types';\nimport { isAsset } from './assertions';\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 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\nconst mapSet = <T, K>(set: Set<T>, fn: (value: T, index: number, array: T[]) => K): K[] => {\n\treturn [...set].map(fn);\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\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\nconst unwrapAsset = (asset: string | NovelyAsset) => {\n\treturn isAsset(asset) ? asset.source : asset;\n};\n\nconst handleAudioAsset = (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 handleImageAsset = (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\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\nconst toArray = <T>(target: T | T[]) => {\n\treturn Array.isArray(target) ? target : [target];\n};\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 {\n\tgetLanguage,\n\tnoop,\n\tonce,\n\tmapSet,\n\tcapitalize,\n\tgetIntlLanguageDisplayName,\n\thandleAudioAsset,\n\thandleImageAsset,\n\tgetCharactersData,\n\ttoArray,\n\tgetLanguageFromStore,\n\tgetVolumeFromStore,\n\tunwrapAsset,\n};\n","import type { Story, ValidAction, CustomHandler, GetActionParameters } from '../action';\nimport type { CloneFN, Path, PathItem, Thenable } from '../types';\nimport type { NovelyAsset } from '../types';\nimport { unwrapAsset } from './ungrupped';\nimport {\n\tisNull,\n\tisNumber,\n\tisFunction,\n\tisAction,\n\tisSkippedDuringRestore,\n\tisUserRequiredAction,\n\tisPromise,\n\tisBlockExitStatement,\n\tisBlockStatement,\n\tisBlockingAction,\n} from './assertions';\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\nconst createReferFunction = (story: Story) => {\n\tconst refer = (path: Path) => {\n\t\tlet current: any = story;\n\t\tlet precurrent: any = story;\n\n\t\tconst blocks: any[] = [];\n\n\t\tfor (const [type, val] of path) {\n\t\t\tif (type === 'jump') {\n\t\t\t\tprecurrent = story;\n\t\t\t\tcurrent = current[val];\n\t\t\t} else if (type === null) {\n\t\t\t\tprecurrent = current;\n\t\t\t\tcurrent = current[val];\n\t\t\t} else if (type === 'choice') {\n\t\t\t\tblocks.push(precurrent);\n\t\t\t\tcurrent = current[(val as number) + 1][1];\n\t\t\t} else if (type === 'condition') {\n\t\t\t\tblocks.push(precurrent);\n\t\t\t\tcurrent = current[2][val];\n\t\t\t} else if (type === 'block') {\n\t\t\t\tblocks.push(precurrent);\n\t\t\t\tcurrent = story[val];\n\t\t\t} else if (type === 'block:exit' || type === 'choice:exit' || type === 'condition:exit') {\n\t\t\t\tcurrent = blocks.pop();\n\t\t\t}\n\t\t}\n\n\t\treturn current as Exclude<ValidAction, ValidAction[]>;\n\t};\n\n\treturn refer;\n};\n\ntype ReferFunction = ReturnType<typeof createReferFunction>;\n// #endregion\n\ntype ExitPathConfig = {\n\tpath: Path;\n\trefer: ReferFunction;\n\n\tonExitImpossible?: () => void;\n};\n\n// #region Exit Path\nconst exitPath = ({ 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(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 = 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(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: ReferFunction;\n\tclone: CloneFN;\n};\n\nconst collectActionsBeforeBlockingAction = ({ path, refer, clone }: CollectActionsBeforeBlockingActionOptions) => {\n\tconst collection: Exclude<ValidAction, ValidAction[]>[] = [];\n\n\tlet action = refer(path);\n\n\twhile (true) {\n\t\tif (action == undefined) {\n\t\t\tconst { exitImpossible } = 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 = 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 = 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 = 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\n/**\n * @param story A story object\n * @param path A path by that actions will be gathered\n * @param filter true — actions that should be skipped would not be returned\n */\nconst getActionsFromPath = (story: Story, path: Path, filter: boolean) => {\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\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\tsound: 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\t/**\n\t\t\t\t\t * We'll calculate it is `latest` or not\n\t\t\t\t\t */\n\t\t\t\t\tconst notLatest = next(i).some(([, func]) => {\n\t\t\t\t\t\tif (!isFunction(func)) return false;\n\n\t\t\t\t\t\tconst c0 = func as CustomHandler;\n\t\t\t\t\t\tconst c1 = fn;\n\n\t\t\t\t\t\t// Also check for `undefined` so if two id's were undefined it would not be true\n\t\t\t\t\t\tconst isIdenticalID = Boolean(c0.id && c1.id && c0.id === c1.id);\n\t\t\t\t\t\tconst isIdenticalByReference = c0 === c1;\n\n\t\t\t\t\t\treturn isIdenticalID || isIdenticalByReference || String(c0) === String(c1);\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 (\n\t\t\taction === 'showCharacter' ||\n\t\t\taction === 'playSound' ||\n\t\t\taction === 'playMusic' ||\n\t\t\taction === 'voice'\n\t\t) {\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 musicGonnaBePaused = action === 'playMusic' && _action === 'pauseMusic';\n\t\t\t\tconst soundGonnaBePaused = action === 'playSound' && _action === 'pauseSound';\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 musicGonnaBePaused || soundGonnaBePaused || _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} else if (action === 'playSound') {\n\t\t\t\taudio.sound.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/**\n\t\t\t\t * Same character will be animated again. Ignore.\n\t\t\t\t */\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\t/**\n\t\t\t\t * This is not a best check.\n\t\t\t\t *\n\t\t\t\t * @todo: make two animations for two different characters animate when not separeted by \"blocking actions\"\n\t\t\t\t */\n\t\t\t\treturn characterWillAnimate && hasBlockingActions;\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 await (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","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 { 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 { 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 { noop } from './utilities';\n\ntype SetupBrowserVisibilityChangeListenersOptions = {\n\tonChange: () => void;\n};\n\n/**\n * Browser-only function.\n *\n * Tries to save data when page is switched OR is going to be unloaded\n */\nconst setupBrowserVisibilityChangeListeners = ({ onChange }: SetupBrowserVisibilityChangeListenersOptions) => {\n\tif (typeof document === 'undefined') return noop;\n\n\tconst onVisibilityChange = () => {\n\t\tif (document.visibilityState === 'hidden') {\n\t\t\tonChange();\n\t\t}\n\t};\n\n\taddEventListener('visibilitychange', onVisibilityChange);\n\taddEventListener('beforeunload', onChange);\n\n\treturn () => {\n\t\tremoveEventListener('visibilitychange', onVisibilityChange);\n\t\tremoveEventListener('beforeunload', onChange);\n\t};\n};\n\nexport { setupBrowserVisibilityChangeListeners };\nexport type { SetupBrowserVisibilityChangeListenersOptions };\n","import type { CustomHandler, CustomHandlerFunctionGetFn, CustomHandlerGetResult, TextContent } from './action';\nimport type { Context, CustomActionHandle } from './renderer';\nimport { CUSTOM_ACTION_MAP } from './shared';\nimport type { Data, Lang, Stack, State, StateFunction } from './types';\nimport { noop } from './utilities';\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};\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}: 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\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 { AssetsPreloading, Lang } from './types';\nimport {\n\tisAudioAction,\n\tisImageAsset,\n\tisString,\n\tisAsset,\n\tgetResourseType,\n\thandleAudioAsset,\n\thandleImageAsset,\n\tmapSet,\n\ttoArray,\n} from './utilities';\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 * Assets Preloading Mode\n\t */\n\tmode: AssetsPreloading;\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, mode, 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(handleAudioAsset(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 = handleImageAsset(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(handleAudioAsset(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\t/**\n\t\t\t * In case of blocking mode we are going to preload every language possible\n\t\t\t * This is not optimal, but preferred language is unknown (language saved in cloud may be different from language choosen from function to get language)\n\t\t\t */\n\t\t\tif (mode === 'blocking') {\n\t\t\t\t/**\n\t\t\t\t * This check is not necessary, but just in case undefined\n\t\t\t\t */\n\t\t\t\tvalue && handle(handleAudioAsset(value));\n\t\t\t} else if (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. But should we? Should it be explicit?\n\t\t\t\t */\n\t\t\t\tvalue && handle(handleAudioAsset(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(handleImageAsset(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(handleImageAsset(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","type 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\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\nexport { store };\nexport type { Stored };\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 type { ValidAction } from './action';\nimport type { Assign } from './types';\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 = <\n\tPart0 extends Record<string, (...args: any[]) => ValidAction>,\n\tPart1 extends Record<string, (...args: any[]) => ValidAction>,\n>(\n\tbase: Part0,\n\textension: Part1,\n): Readonly<Assign<Part0, Part1>> => {\n\treturn new Proxy({} as Readonly<Assign<Part0, Part1>>, {\n\t\tget(_, key, receiver) {\n\t\t\treturn Reflect.get(key in extension ? extension : base, key, receiver);\n\t\t},\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\n/**\n * Translated automatically\n */\nconst KK: Record<BaseTranslationStrings, string> = {\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\n/**\n * Translated automatically\n */\nconst JP: Record<BaseTranslationStrings, string> = {\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\nexport { RU, EN, KK, JP };\nexport type { BaseTranslationStrings };\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 } 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\nexport { asset };\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"],"mappings":"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","names":["DEV","asset","set","asset","store","audio","next","item","memoize","DEV","memoize","memoize","memoize","getStack","asset","action","set","getLanguage","action","DEV","data","save","replace","set","characters","audio","type","props","asset","preview","next","t","memoize","DEV","supportsMap","memoize","supportsMap","DEV","asset"]}
|
|
1
|
+
{"version":3,"sources":["../src/novely.ts","../../../node_modules/.pnpm/klona@2.0.6/node_modules/klona/full/index.mjs","../src/constants.ts","../src/utilities/assertions.ts","../src/utilities/match-action.ts","../src/utilities/ungrupped.ts","../src/utilities/actions-processing.ts","../src/utilities/controlled-promise.ts","../src/utilities/resources.ts","../src/utilities/stack.ts","../src/shared.ts","../src/utilities/story.ts","../src/browser.ts","../src/custom-action.ts","../src/preloading.ts","../src/storage.ts","../src/store.ts","../src/translation.ts","../src/extend-actions.ts","../src/translations.ts","../src/asset.ts","../src/audio-codecs.ts","../src/image-formats.ts"],"sourcesContent":["import { dequal } from 'dequal/lite';\nimport { 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 { setupBrowserVisibilityChangeListeners } from './browser';\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 { ASSETS_TO_PRELOAD, PRELOADED_ASSETS, STACK_MAP } from './shared';\nimport { localStorageStorage } from './storage';\nimport type { Stored } from './store';\nimport { store } from './store';\nimport { flattenAllowedContent, replace as replaceTranslation } from './translation';\nimport type { BaseTranslationStrings } from './translations';\nimport type {\n\tCoreData,\n\tData,\n\tDialogOverview,\n\tDialogOverviewEntry,\n\tLang,\n\tNovelyAsset,\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\tflatActions,\n\tflatStory,\n\tcapitalize,\n\tgetLanguage as defaultGetLanguage,\n\tgetCharactersData,\n\tgetIntlLanguageDisplayName,\n\tgetLanguageFromStore,\n\tgetVolumeFromStore,\n\thandleAudioAsset,\n\thandleImageAsset,\n\tnoop,\n\ttoArray,\n\tisUserRequiredAction,\n\tisSkippedDuringRestore,\n} from './utilities';\nimport type { MatchActionHandlers } from './utilities';\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 = 'lazy',\n\tparallelAssetsDownloadLimit = 15,\n\tfetch: request = fetch,\n\tcloneFunction: clone = klona,\n\tsaveOnUnload = true,\n\tstartKey = 'start',\n}: NovelyInit<$Language, $Characters, $State, $Data, $Actions>) => {\n\t/**\n\t * All action functions\n\t */\n\ttype Actions = $Actions &\n\t\tActionProxy<$Characters, $Language, $State> &\n\t\tVirtualActions<$Characters, $Language, $State>;\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\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/**\n\t\t * In case script was called after destroy\n\t\t */\n\t\tif (destroyed) return;\n\n\t\tObject.assign(story, flatStory(part));\n\n\t\tlet loadingIsShown = false;\n\n\t\t/**\n\t\t * This is the first `script` call, likely data did not loaded yet\n\t\t */\n\t\tif (!initialScreenWasShown) {\n\t\t\trenderer.ui.showLoading();\n\t\t\tloadingIsShown = true;\n\t\t}\n\n\t\tif (preloadAssets === 'blocking' && ASSETS_TO_PRELOAD.size > 0) {\n\t\t\t/**\n\t\t\t * Likely updating this will not break anything, but just to be sure nothing breaks\n\t\t\t * We want to avoid flashes, and who knows how some renderer will use it\n\t\t\t */\n\t\t\tif (!loadingIsShown) {\n\t\t\t\trenderer.ui.showLoading();\n\t\t\t}\n\n\t\t\tawait handleAssetsPreloading({\n\t\t\t\t...renderer.misc,\n\t\t\t\tlimiter: limitAssetsDownload,\n\t\t\t\trequest,\n\t\t\t});\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\t// #region Action Proxy\n\tconst action = new Proxy({} as Actions, {\n\t\tget(_: unknown, action: string) {\n\t\t\tif (action in renderer.actions) {\n\t\t\t\treturn renderer.actions[action];\n\t\t\t}\n\n\t\t\treturn (...props: Parameters<Actions[keyof Actions]>) => {\n\t\t\t\tif (action === 'say') {\n\t\t\t\t\taction = 'dialog';\n\n\t\t\t\t\tconst [character] = props;\n\n\t\t\t\t\tif (DEV && !characters[character]) {\n\t\t\t\t\t\tthrow new Error(`Attempt to call Say action with unknown character \"${character}\"`);\n\t\t\t\t\t}\n\t\t\t\t} else if (action === 'choice') {\n\t\t\t\t\tconst actions = props.slice(1);\n\n\t\t\t\t\tif (actions.every((choice) => !Array.isArray(choice))) {\n\t\t\t\t\t\tfor (let i = 1; i < props.length; i++) {\n\t\t\t\t\t\t\tconst choice = props[i];\n\n\t\t\t\t\t\t\tprops[i] = [\n\t\t\t\t\t\t\t\tchoice.title,\n\t\t\t\t\t\t\t\tflatActions(choice.children),\n\t\t\t\t\t\t\t\tchoice.active,\n\t\t\t\t\t\t\t\tchoice.visible,\n\t\t\t\t\t\t\t\tchoice.onSelect,\n\t\t\t\t\t\t\t\tchoice.image,\n\t\t\t\t\t\t\t];\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor (let i = 1; i < props.length; i++) {\n\t\t\t\t\t\t\tconst choice = props[i];\n\n\t\t\t\t\t\t\tif (Array.isArray(choice)) {\n\t\t\t\t\t\t\t\tchoice[1] = flatActions(choice[1]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (action === 'condition') {\n\t\t\t\t\tconst actions = props[1];\n\n\t\t\t\t\tfor (const key in actions) {\n\t\t\t\t\t\tactions[key] = flatActions(actions[key]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (preloadAssets === 'blocking') {\n\t\t\t\t\thuntAssets({\n\t\t\t\t\t\taction: action as any,\n\t\t\t\t\t\tprops: props as any,\n\n\t\t\t\t\t\tmode: preloadAssets,\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\treturn [action, ...props] as ValidAction;\n\t\t\t};\n\t\t},\n\t});\n\t// #endregion\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/**\n\t\t * This is valid language\n\t\t */\n\t\tif (languages.includes(language as $Language)) {\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});\n\n\tconst onDataLoadedPromise = ({ 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\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\tconst throttledOnStorageDataChange = throttle(onStorageDataChange, throttleTimeout);\n\tconst throttledEmergencyOnStorageDataChange = throttle(() => {\n\t\tif (saveOnUnload === true || (saveOnUnload === 'prod' && !DEV)) {\n\t\t\tonStorageDataChange(storageData.get());\n\t\t}\n\t}, 10);\n\n\tstorageData.subscribe(throttledOnStorageDataChange);\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] ||= DEFAULT_TYPEWRITER_SPEED;\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\tconst unsubscribeFromBrowserVisibilityChange = setupBrowserVisibilityChangeListeners({\n\t\tonChange: throttledEmergencyOnStorageDataChange,\n\t});\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\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\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 { queue, skip, skipPreserve } = getActionsFromPath(story, path, false);\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 } = getActionsFromPath(story, previous[0], false);\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\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\trender(context);\n\n\t\tcontext.meta.restoring = context.meta.goingBack = false;\n\t};\n\t// #endregion\n\n\tconst refer = createReferFunction(story);\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 { queue } = getActionsFromPath(story, path, true);\n\t\tconst ctx = renderer.getContext(name);\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\tmode: preloadAssets,\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 getResourseTypeForRenderer = (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(handleImageAsset);\n\t};\n\n\tconst getCharacterName = (character: keyof $Characters): string => {\n\t\tconst c = character;\n\t\tconst cs = characters;\n\t\tconst [lang] = storageData.get().meta;\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 as $Language];\n\t\t\t}\n\t\t}\n\n\t\treturn String(c) || '';\n\t};\n\n\tconst getDialogOverview = () => {\n\t\t/**\n\t\t * Dialog Overview is possible only in main context\n\t\t */\n\t\tconst { value: save } = useStack(MAIN_CONTEXT_KEY);\n\t\tconst stateSnapshots = save[3];\n\n\t\t/**\n\t\t * Easy mode\n\t\t */\n\t\tif (stateSnapshots.length == 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst { queue } = getActionsFromPath(story, save[0], false);\n\n\t\tconst [lang] = storageData.get().meta;\n\n\t\ttype DialogItem = {\n\t\t\tname: undefined | string;\n\t\t\ttext: TextContent<string, State>;\n\t\t\tvoice: undefined | string | NovelyAsset | Record<string, string | NovelyAsset>;\n\t\t};\n\n\t\tconst dialogItems: DialogItem[] = [];\n\n\t\t/**\n\t\t * For every available state snapshot find dialog corresponding to it\n\t\t */\n\t\tfor (let p = 0, a = stateSnapshots.length, i = queue.length - 1; a > 0; i--) {\n\t\t\tconst action = queue[i];\n\n\t\t\tif (action[0] === 'dialog') {\n\t\t\t\tconst [_, name, text] = action;\n\n\t\t\t\tlet voice: undefined | string | NovelyAsset | Record<string, string | NovelyAsset> = undefined;\n\n\t\t\t\t/**\n\t\t\t\t * Search for the most recent `voice` action before current dialog\n\t\t\t\t */\n\t\t\t\tfor (let j = i - 1; j > p; j--) {\n\t\t\t\t\tconst action = queue[j];\n\n\t\t\t\t\tif (isUserRequiredAction(action) || isSkippedDuringRestore(action[0])) break;\n\t\t\t\t\tif (action[0] === 'stopVoice') break;\n\n\t\t\t\t\tif (action[0] === 'voice') {\n\t\t\t\t\t\tvoice = action[1];\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tdialogItems.push({\n\t\t\t\t\tname,\n\t\t\t\t\ttext,\n\t\t\t\t\tvoice,\n\t\t\t\t});\n\n\t\t\t\tp = i;\n\t\t\t\ta--;\n\t\t\t}\n\t\t}\n\n\t\tconst entries: DialogOverview = dialogItems.reverse().map(({ name, text, voice }, i) => {\n\t\t\tconst state = stateSnapshots[i];\n\t\t\tconst audioSource = isString(voice)\n\t\t\t\t? voice\n\t\t\t\t: isAsset(voice)\n\t\t\t\t\t? voice\n\t\t\t\t\t: voice == undefined\n\t\t\t\t\t\t? voice\n\t\t\t\t\t\t: voice[lang];\n\n\t\t\tname = name ? getCharacterName(name as keyof $Characters) : '';\n\n\t\t\treturn {\n\t\t\t\tname: templateReplace(name, state),\n\t\t\t\ttext: templateReplace(text, state),\n\t\t\t\tvoice: audioSource ? handleAudioAsset(audioSource) : '',\n\t\t\t} satisfies DialogOverviewEntry;\n\t\t});\n\n\t\treturn entries;\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,\n\n\t\tgetResourseType: getResourseTypeForRenderer,\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\tonBeforeActionCall({ 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 = collectActionsBeforeBlockingAction({\n\t\t\t\t\tpath: nextPath(clone(useStack(ctx).value[0])),\n\t\t\t\t\trefer,\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\tmode: preloadAssets,\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 = 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: handleImageAsset(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, handleImageAsset(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(handleAudioAsset(source), 'music').play(true);\n\t\t\tpush();\n\t\t},\n\t\tpauseMusic({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(handleAudioAsset(source), 'music').pause();\n\t\t\tpush();\n\t\t},\n\t\tstopMusic({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(handleAudioAsset(source), 'music').stop();\n\t\t\tpush();\n\t\t},\n\t\tplaySound({ ctx, push }, [source, loop]) {\n\t\t\tctx.audio.music(handleAudioAsset(source), 'sound').play(loop || false);\n\t\t\tpush();\n\t\t},\n\t\tpauseSound({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(handleAudioAsset(source), 'sound').pause();\n\t\t\tpush();\n\t\t},\n\t\tstopSound({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(handleAudioAsset(source), 'sound').stop();\n\t\t\tpush();\n\t\t},\n\t\tvoice({ ctx, push }, [source]) {\n\t\t\tconst [lang] = storageData.get().meta;\n\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(handleAudioAsset(audioSource));\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 ? handleImageAsset(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\tif (DEV && !story[scene]) {\n\t\t\t\tthrow new Error(`Attempt to jump to 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 jump to empty scene \"${scene}\"`);\n\t\t\t}\n\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\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\texit({ ctx, data }) {\n\t\t\tif (ctx.meta.restoring) return;\n\n\t\t\tconst { exitImpossible } = exitPath({\n\t\t\t\tpath: useStack(ctx).value[0],\n\t\t\t\trefer: refer,\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 becase \"preloadAssets\" strategy was set to \"${preloadAssets}\"`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (!ctx.meta.goingBack && !ctx.meta.restoring && !PRELOADED_ASSETS.has(source)) {\n\t\t\t\t/**\n\t\t\t\t * Add to preloaded before it was loaded to prevent save image downloading multiple times\n\t\t\t\t */\n\t\t\t\tPRELOADED_ASSETS.add(renderer.misc.preloadImage(source));\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 Render Function\n\tconst render = (ctx: Context) => {\n\t\tconst stack = useStack(ctx);\n\t\tconst [path, state] = stack.value;\n\n\t\tconst referred = refer(path);\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 * Basically 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 typeEssentials: TypeEssentials<$Language, $State, $Data, $Characters> = {\n\t\tl: null,\n\t\ts: null,\n\t\td: null,\n\t\tc: null,\n\t};\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 * @deprecated Will be removed BUT replaced with state passed into actions as a parameter\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 *\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,\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\tdataLoaded.cancel();\n\n\t\t\tUIInstance.unmount();\n\n\t\t\tunsubscribeFromBrowserVisibilityChange();\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};\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 { 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 = <M extends MatchActionMapComplete>(callbacks: MatchActionHandlers, values: M) => {\n\tconst { getContext, onBeforeActionCall, push, forward } = callbacks;\n\n\treturn (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\nexport { matchAction };\nexport type { MatchActionHandlers, MatchActionMapComplete };\n","import { memoize } from 'es-toolkit/function';\nimport { DEV } from 'esm-env';\nimport type { Character } from '../character';\nimport type { Stored } from '../store';\nimport type { CharactersData, Lang, NovelyAsset, StorageData } from '../types';\nimport { isAsset } from './assertions';\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 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\nconst mapSet = <T, K>(set: Set<T>, fn: (value: T, index: number, array: T[]) => K): K[] => {\n\treturn [...set].map(fn);\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\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\nconst unwrapAsset = (asset: string | NovelyAsset) => {\n\treturn isAsset(asset) ? asset.source : asset;\n};\n\nconst handleAudioAsset = (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 handleImageAsset = (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\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\nconst toArray = <T>(target: T | T[]) => {\n\treturn Array.isArray(target) ? target : [target];\n};\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 {\n\tgetLanguage,\n\tnoop,\n\tonce,\n\tmapSet,\n\tcapitalize,\n\tgetIntlLanguageDisplayName,\n\thandleAudioAsset,\n\thandleImageAsset,\n\tgetCharactersData,\n\ttoArray,\n\tgetLanguageFromStore,\n\tgetVolumeFromStore,\n\tunwrapAsset,\n};\n","import type { Story, ValidAction, CustomHandler, GetActionParameters } from '../action';\nimport type { CloneFN, Path, PathItem, Thenable } from '../types';\nimport type { NovelyAsset } from '../types';\nimport { unwrapAsset } from './ungrupped';\nimport {\n\tisNull,\n\tisNumber,\n\tisFunction,\n\tisAction,\n\tisSkippedDuringRestore,\n\tisUserRequiredAction,\n\tisPromise,\n\tisBlockExitStatement,\n\tisBlockStatement,\n\tisBlockingAction,\n} from './assertions';\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\nconst createReferFunction = (story: Story) => {\n\tconst refer = (path: Path) => {\n\t\tlet current: any = story;\n\t\tlet precurrent: any = story;\n\n\t\tconst blocks: any[] = [];\n\n\t\tfor (const [type, val] of path) {\n\t\t\tif (type === 'jump') {\n\t\t\t\tprecurrent = story;\n\t\t\t\tcurrent = current[val];\n\t\t\t} else if (type === null) {\n\t\t\t\tprecurrent = current;\n\t\t\t\tcurrent = current[val];\n\t\t\t} else if (type === 'choice') {\n\t\t\t\tblocks.push(precurrent);\n\t\t\t\tcurrent = current[(val as number) + 1][1];\n\t\t\t} else if (type === 'condition') {\n\t\t\t\tblocks.push(precurrent);\n\t\t\t\tcurrent = current[2][val];\n\t\t\t} else if (type === 'block') {\n\t\t\t\tblocks.push(precurrent);\n\t\t\t\tcurrent = story[val];\n\t\t\t} else if (type === 'block:exit' || type === 'choice:exit' || type === 'condition:exit') {\n\t\t\t\tcurrent = blocks.pop();\n\t\t\t}\n\t\t}\n\n\t\treturn current as Exclude<ValidAction, ValidAction[]>;\n\t};\n\n\treturn refer;\n};\n\ntype ReferFunction = ReturnType<typeof createReferFunction>;\n// #endregion\n\ntype ExitPathConfig = {\n\tpath: Path;\n\trefer: ReferFunction;\n\n\tonExitImpossible?: () => void;\n};\n\n// #region Exit Path\nconst exitPath = ({ 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(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 = 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(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: ReferFunction;\n\tclone: CloneFN;\n};\n\nconst collectActionsBeforeBlockingAction = ({ path, refer, clone }: CollectActionsBeforeBlockingActionOptions) => {\n\tconst collection: Exclude<ValidAction, ValidAction[]>[] = [];\n\n\tlet action = refer(path);\n\n\twhile (true) {\n\t\tif (action == undefined) {\n\t\t\tconst { exitImpossible } = 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 = 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 = 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 = 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\n/**\n * @param story A story object\n * @param path A path by that actions will be gathered\n * @param filter true — actions that should be skipped would not be returned\n */\nconst getActionsFromPath = (story: Story, path: Path, filter: boolean) => {\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\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\t/**\n\t\t\t\t\t * We'll calculate it is `latest` or not\n\t\t\t\t\t */\n\t\t\t\t\tconst notLatest = next(i).some(([, func]) => {\n\t\t\t\t\t\tif (!isFunction(func)) return false;\n\n\t\t\t\t\t\tconst c0 = func as CustomHandler;\n\t\t\t\t\t\tconst c1 = fn;\n\n\t\t\t\t\t\t// Also check for `undefined` so if two id's were undefined it would not be true\n\t\t\t\t\t\tconst isIdenticalID = Boolean(c0.id && c1.id && c0.id === c1.id);\n\t\t\t\t\t\tconst isIdenticalByReference = c0 === c1;\n\n\t\t\t\t\t\treturn isIdenticalID || isIdenticalByReference || String(c0) === String(c1);\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/**\n\t\t\t\t * Same character will be animated again. Ignore.\n\t\t\t\t */\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\t/**\n\t\t\t\t * This is not a best check.\n\t\t\t\t *\n\t\t\t\t * @todo: make two animations for two different characters animate when not separeted by \"blocking actions\"\n\t\t\t\t */\n\t\t\t\treturn characterWillAnimate && hasBlockingActions;\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 await (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","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 { 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 { 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 { noop } from './utilities';\n\ntype SetupBrowserVisibilityChangeListenersOptions = {\n\tonChange: () => void;\n};\n\n/**\n * Browser-only function.\n *\n * Tries to save data when page is switched OR is going to be unloaded\n */\nconst setupBrowserVisibilityChangeListeners = ({ onChange }: SetupBrowserVisibilityChangeListenersOptions) => {\n\tif (typeof document === 'undefined') return noop;\n\n\tconst onVisibilityChange = () => {\n\t\tif (document.visibilityState === 'hidden') {\n\t\t\tonChange();\n\t\t}\n\t};\n\n\taddEventListener('visibilitychange', onVisibilityChange);\n\taddEventListener('beforeunload', onChange);\n\n\treturn () => {\n\t\tremoveEventListener('visibilitychange', onVisibilityChange);\n\t\tremoveEventListener('beforeunload', onChange);\n\t};\n};\n\nexport { setupBrowserVisibilityChangeListeners };\nexport type { SetupBrowserVisibilityChangeListenersOptions };\n","import type { CustomHandler, CustomHandlerFunctionGetFn, CustomHandlerGetResult, TextContent } from './action';\nimport type { Context, CustomActionHandle } from './renderer';\nimport { CUSTOM_ACTION_MAP } from './shared';\nimport type { Data, Lang, Stack, State, StateFunction } from './types';\nimport { noop } from './utilities';\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};\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}: 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\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 { AssetsPreloading, Lang } from './types';\nimport {\n\tisAudioAction,\n\tisImageAsset,\n\tisString,\n\tisAsset,\n\tgetResourseType,\n\thandleAudioAsset,\n\thandleImageAsset,\n\tmapSet,\n\ttoArray,\n} from './utilities';\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 * Assets Preloading Mode\n\t */\n\tmode: AssetsPreloading;\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, mode, 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(handleAudioAsset(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 = handleImageAsset(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(handleAudioAsset(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\t/**\n\t\t\t * In case of blocking mode we are going to preload every language possible\n\t\t\t * This is not optimal, but preferred language is unknown (language saved in cloud may be different from language choosen from function to get language)\n\t\t\t */\n\t\t\tif (mode === 'blocking') {\n\t\t\t\t/**\n\t\t\t\t * This check is not necessary, but just in case undefined\n\t\t\t\t */\n\t\t\t\tvalue && handle(handleAudioAsset(value));\n\t\t\t} else if (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. But should we? Should it be explicit?\n\t\t\t\t */\n\t\t\t\tvalue && handle(handleAudioAsset(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(handleImageAsset(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(handleImageAsset(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","type 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\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\nexport { store };\nexport type { Stored };\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 type { ValidAction } from './action';\nimport type { Assign } from './types';\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 = <\n\tPart0 extends Record<string, (...args: any[]) => ValidAction>,\n\tPart1 extends Record<string, (...args: any[]) => ValidAction>,\n>(\n\tbase: Part0,\n\textension: Part1,\n): Readonly<Assign<Part0, Part1>> => {\n\treturn new Proxy({} as Readonly<Assign<Part0, Part1>>, {\n\t\tget(_, key, receiver) {\n\t\t\treturn Reflect.get(key in extension ? extension : base, key, receiver);\n\t\t},\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\n/**\n * Translated automatically\n */\nconst KK: Record<BaseTranslationStrings, string> = {\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\n/**\n * Translated automatically\n */\nconst JP: Record<BaseTranslationStrings, string> = {\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\nexport { RU, EN, KK, JP };\nexport type { BaseTranslationStrings };\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 } 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\nexport { asset };\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"],"mappings":"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","names":["DEV","asset","set","asset","store","audio","item","next","memoize","DEV","memoize","memoize","memoize","getStack","asset","action","set","getLanguage","action","DEV","data","save","replace","set","characters","audio","type","props","asset","preview","next","t","memoize","DEV","supportsMap","memoize","supportsMap","DEV","asset"]}
|