@novely/core 0.52.0 → 0.53.0-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -639,6 +639,37 @@ type Character<$Lang extends Lang = string> = {
639
639
  emotions: Emotions;
640
640
  };
641
641
 
642
+ type TickHandler = (ticker: Ticker) => void;
643
+ declare class Ticker {
644
+ listeners: Set<TickHandler>;
645
+ running: boolean;
646
+ private _factory;
647
+ constructor(factory: TickerFactory);
648
+ get deltaTime(): number;
649
+ get lastTime(): number;
650
+ add(cb: (ticker: Ticker) => void): () => void;
651
+ remove(cb: (ticker: Ticker) => void): void;
652
+ start: () => void;
653
+ stop: () => void;
654
+ detach: () => void;
655
+ }
656
+ declare class TickerFactory {
657
+ private _children;
658
+ private _raf;
659
+ private _running;
660
+ private _unsubscribe;
661
+ deltaTime: number;
662
+ lastTime: number;
663
+ constructor(paused: Derived<boolean>);
664
+ start(): void;
665
+ stop(): void;
666
+ fork(): Ticker;
667
+ check(positive: boolean): void;
668
+ destroy(): void;
669
+ detach(ticker: Ticker): void;
670
+ private update;
671
+ }
672
+
642
673
  type ValidAction = ['choice', string | undefined, ...[string, unknown[], (() => boolean)?, (() => boolean)?, string?][]] | ['clear', Set<keyof DefaultActionProxy>?, Set<string>?, {
643
674
  music: Set<string>;
644
675
  sounds: Set<string>;
@@ -784,6 +815,28 @@ type CustomHandlerFunctionParameters<L extends string, S extends State> = {
784
815
  * }
785
816
  */
786
817
  paused: Derived<boolean>;
818
+ /**
819
+ * Ticker
820
+ *
821
+ * @example
822
+ * ```ts
823
+ * const handler: CustomHandler = async ({ clear, ticker }) => {
824
+ * const unsubscribe = ticker.add((ticker) => {
825
+ * console.log(ticker.deltaTime);
826
+ * })
827
+ *
828
+ * ticker.start();
829
+ *
830
+ * clear(unsubscribe);
831
+ * }
832
+ * ```
833
+ */
834
+ ticker: Ticker;
835
+ /**
836
+ * Fetching function.
837
+ * @default fetch
838
+ */
839
+ request: typeof fetch;
787
840
  };
788
841
  type CustomHandlerFunction<L extends string, S extends State> = (parameters: CustomHandlerFunctionParameters<L, S>) => Thenable<void>;
789
842
  type CustomHandlerCalling = {
@@ -1178,4 +1231,4 @@ declare const pauseOnBlur: (engine: {
1178
1231
  unsubscribe: () => void;
1179
1232
  };
1180
1233
 
1181
- export { type ActionChoiceChoice, type ActionChoiceChoiceObject, type ActionInputOnInputMeta, type ActionInputSetup, type ActionInputSetupCleanup, type ActionProxy, type AllowedContent, type AudioHandle, type BackgroundImage, type BaseTranslationStrings, type Character, type CharacterAssetSizes, type CharacterHandle, type CharactersData, type ChoiceCheckFunction, type ChoiceCheckFunctionProps, type ChoiceOnSelectFunction, type ChoiceOnSelectFunctionProps, type ChoiceParams, type ConditionCheckFunction, type ConditionParams, type Context, type CoreData, type CustomActionHandle, type CustomHandler, type CustomHandlerFunction, type CustomHandlerFunctionGetFn, type CustomHandlerFunctionParameters, type CustomHandlerGetResult, type CustomHandlerGetResultDataFunction, type CustomHandlerInfo, type Data, type DeepPartial, type DefaultActionProxy, type Derived, EN, type Emotions, type EngineTypes, type FunctionParams, type FunctionableValue, type GetActionParameters, type InputHandler, type Lang, type NovelyAsset, type NovelyInit, type NovelyScreen, type Path, type PathItem, type PluralType, type Pluralization, RU, type Renderer, type RendererInit, type RendererInitPreviewReturn, type Save, type Stack, type StackHolder, type State, type StateFunction, type StorageAdapter, type StorageData, type StorageMeta, type Stored, type Story, type TextContent, type Thenable, type TranslationActions, type TypesFromEngine, type TypewriterSpeed, type ValidAction, asset, extendAction, novely, pauseOnBlur, storageAdapterLocal };
1234
+ export { type ActionChoiceChoice, type ActionChoiceChoiceObject, type ActionInputOnInputMeta, type ActionInputSetup, type ActionInputSetupCleanup, type ActionProxy, type AllowedContent, type AudioHandle, type BackgroundImage, type BaseTranslationStrings, type Character, type CharacterAssetSizes, type CharacterHandle, type CharactersData, type ChoiceCheckFunction, type ChoiceCheckFunctionProps, type ChoiceOnSelectFunction, type ChoiceOnSelectFunctionProps, type ChoiceParams, type ConditionCheckFunction, type ConditionParams, type Context, type CoreData, type CustomActionHandle, type CustomHandler, type CustomHandlerFunction, type CustomHandlerFunctionGetFn, type CustomHandlerFunctionParameters, type CustomHandlerGetResult, type CustomHandlerGetResultDataFunction, type CustomHandlerInfo, type Data, type DeepPartial, type DefaultActionProxy, type Derived, EN, type Emotions, type EngineTypes, type FunctionParams, type FunctionableValue, type GetActionParameters, type InputHandler, type Lang, type NovelyAsset, type NovelyInit, type NovelyScreen, type Path, type PathItem, type PluralType, type Pluralization, RU, type Renderer, type RendererInit, type RendererInitPreviewReturn, type Save, type Stack, type StackHolder, type State, type StateFunction, type StorageAdapter, type StorageData, type StorageMeta, type Stored, type Story, type TextContent, type Thenable, Ticker, type TranslationActions, type TypesFromEngine, type TypewriterSpeed, type ValidAction, asset, extendAction, novely, pauseOnBlur, storageAdapterLocal };
package/dist/index.js CHANGED
@@ -1042,7 +1042,9 @@ var handleCustomAction = (ctx, fn, {
1042
1042
  remove: renderersRemove,
1043
1043
  getStack: getStack2,
1044
1044
  templateReplace,
1045
- paused
1045
+ paused,
1046
+ ticker,
1047
+ request
1046
1048
  }) => {
1047
1049
  const holder = getCustomActionHolder(ctx, fn);
1048
1050
  const cleanupHolder = getCustomActionCleanupHolder(ctx);
@@ -1054,7 +1056,7 @@ var handleCustomAction = (ctx, fn, {
1054
1056
  };
1055
1057
  const cleanupSource = {
1056
1058
  fn,
1057
- list: [],
1059
+ list: [ticker.detach],
1058
1060
  node: cleanupNode
1059
1061
  };
1060
1062
  cleanupHolder.push(cleanupSource);
@@ -1105,7 +1107,9 @@ var handleCustomAction = (ctx, fn, {
1105
1107
  getDomNodes,
1106
1108
  getSave,
1107
1109
  contextKey: ctx.id,
1108
- paused: ctx.meta.preview ? immutable(false) : paused
1110
+ paused: ctx.meta.preview ? immutable(false) : paused,
1111
+ ticker,
1112
+ request
1109
1113
  });
1110
1114
  };
1111
1115
 
@@ -1383,6 +1387,117 @@ var setDocumentLanguage = (language) => {
1383
1387
  document.documentElement.lang = language;
1384
1388
  };
1385
1389
 
1390
+ // src/ticker.ts
1391
+ var Ticker = class {
1392
+ listeners = /* @__PURE__ */ new Set();
1393
+ running = false;
1394
+ _factory;
1395
+ constructor(factory) {
1396
+ this._factory = factory;
1397
+ }
1398
+ get deltaTime() {
1399
+ return this._factory.deltaTime;
1400
+ }
1401
+ get lastTime() {
1402
+ return this._factory.lastTime;
1403
+ }
1404
+ add(cb) {
1405
+ this.listeners.add(cb);
1406
+ if (this.listeners.size === 1) {
1407
+ this._factory.check(true);
1408
+ }
1409
+ return () => {
1410
+ this.remove(cb);
1411
+ };
1412
+ }
1413
+ remove(cb) {
1414
+ this.listeners.delete(cb);
1415
+ if (this.listeners.size === 0) {
1416
+ this._factory.check(false);
1417
+ }
1418
+ }
1419
+ start = () => {
1420
+ this.running = true;
1421
+ if (this.listeners.size > 0) {
1422
+ this._factory.check(true);
1423
+ }
1424
+ };
1425
+ stop = () => {
1426
+ this.running = false;
1427
+ };
1428
+ detach = () => {
1429
+ this.listeners.clear();
1430
+ this.stop();
1431
+ this._factory.detach(this);
1432
+ };
1433
+ };
1434
+ var TickerFactory = class {
1435
+ _children = /* @__PURE__ */ new Set();
1436
+ _raf = -1;
1437
+ _running = false;
1438
+ _unsubscribe;
1439
+ deltaTime = 0;
1440
+ lastTime = performance.now();
1441
+ constructor(paused) {
1442
+ this._unsubscribe = paused.subscribe((paused2) => {
1443
+ if (paused2) {
1444
+ this.stop();
1445
+ } else if (Array.from(this._children).some((ticker) => ticker.running && ticker.listeners.size > 0)) {
1446
+ this.start();
1447
+ }
1448
+ });
1449
+ }
1450
+ start() {
1451
+ if (this._running) {
1452
+ return;
1453
+ }
1454
+ cancelAnimationFrame(this._raf);
1455
+ this.lastTime = performance.now();
1456
+ this._running = true;
1457
+ this._raf = requestAnimationFrame(this.update);
1458
+ }
1459
+ stop() {
1460
+ cancelAnimationFrame(this._raf);
1461
+ this._running = false;
1462
+ this._raf = -1;
1463
+ }
1464
+ fork() {
1465
+ const ticker = new Ticker(this);
1466
+ this._children.add(ticker);
1467
+ return ticker;
1468
+ }
1469
+ check(positive) {
1470
+ if (positive) {
1471
+ this.start();
1472
+ } else if (Array.from(this._children).every((ticker) => !ticker.running || ticker.listeners.size === 0)) {
1473
+ this.stop();
1474
+ }
1475
+ }
1476
+ destroy() {
1477
+ this._unsubscribe();
1478
+ this._children.forEach((child) => child.detach());
1479
+ }
1480
+ detach(ticker) {
1481
+ this._children.delete(ticker);
1482
+ this.check(false);
1483
+ }
1484
+ update = (currentTime) => {
1485
+ this.deltaTime = currentTime - this.lastTime;
1486
+ this._children.forEach((ticker) => {
1487
+ if (ticker.running) {
1488
+ ticker.listeners.forEach((tick) => {
1489
+ tick(ticker);
1490
+ });
1491
+ }
1492
+ });
1493
+ if (!this._running) {
1494
+ return;
1495
+ }
1496
+ this.lastTime = currentTime;
1497
+ this._raf = requestAnimationFrame(this.update);
1498
+ };
1499
+ };
1500
+
1386
1501
  // src/novely.ts
1387
1502
  var novely = ({
1388
1503
  characters,
@@ -1962,6 +2077,7 @@ var novely = ({
1962
2077
  }
1963
2078
  }
1964
2079
  };
2080
+ const ticker = new TickerFactory(paused);
1965
2081
  const { match, nativeActions } = matchAction(matchActionOptions, {
1966
2082
  wait({ ctx, data: data2, push }, [time]) {
1967
2083
  if (ctx.meta.restoring) return;
@@ -2168,7 +2284,9 @@ var novely = ({
2168
2284
  lang,
2169
2285
  getStack: useStack,
2170
2286
  paused,
2171
- templateReplace
2287
+ ticker: ticker.fork(),
2288
+ templateReplace,
2289
+ request
2172
2290
  });
2173
2291
  const next2 = () => {
2174
2292
  if (fn.requireUserAction && !ctx.meta.preview) {
@@ -2436,6 +2554,7 @@ var novely = ({
2436
2554
  if (destroyed) return;
2437
2555
  dataLoaded.cancel();
2438
2556
  UIInstance.unmount();
2557
+ ticker.destroy();
2439
2558
  removeEventListener("beforeunload", throttledShortOnStorageDataChange);
2440
2559
  destroyed = true;
2441
2560
  },
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../node_modules/.pnpm/dequal@2.0.3/node_modules/dequal/lite/index.mjs","../src/novely.ts","../../../node_modules/.pnpm/klona@2.0.6/node_modules/klona/full/index.mjs","../src/constants.ts","../src/shared.ts","../src/utilities/assertions.ts","../src/utilities/match-action.ts","../src/asset.ts","../src/audio-codecs.ts","../src/image-formats.ts","../src/utilities/actions-processing.ts","../src/utilities/controlled-promise.ts","../src/utilities/resources.ts","../src/utilities/stack.ts","../src/utilities/story.ts","../src/utilities/internationalization.ts","../src/utilities/noop.ts","../src/utilities/store.ts","../src/utilities/array.ts","../src/utilities/else.ts","../src/store.ts","../src/custom-action.ts","../src/preloading.ts","../src/storage.ts","../src/translation.ts","../src/utilities/actions.ts","../src/utilities/dialog-overview.ts","../src/utilities/document.ts","../src/extend-actions.ts","../src/translations.ts","../src/browser-events.ts"],"sourcesContent":["var has = Object.prototype.hasOwnProperty;\n\nexport function dequal(foo, bar) {\n\tvar ctor, len;\n\tif (foo === bar) return true;\n\n\tif (foo && bar && (ctor=foo.constructor) === bar.constructor) {\n\t\tif (ctor === Date) return foo.getTime() === bar.getTime();\n\t\tif (ctor === RegExp) return foo.toString() === bar.toString();\n\n\t\tif (ctor === Array) {\n\t\t\tif ((len=foo.length) === bar.length) {\n\t\t\t\twhile (len-- && dequal(foo[len], bar[len]));\n\t\t\t}\n\t\t\treturn len === -1;\n\t\t}\n\n\t\tif (!ctor || typeof foo === 'object') {\n\t\t\tlen = 0;\n\t\t\tfor (ctor in foo) {\n\t\t\t\tif (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false;\n\t\t\t\tif (!(ctor in bar) || !dequal(foo[ctor], bar[ctor])) return false;\n\t\t\t}\n\t\t\treturn Object.keys(bar).length === len;\n\t\t}\n\t}\n\n\treturn foo !== foo && bar !== bar;\n}\n","import { dequal } from 'dequal/lite';\nimport { memoize, throttle } from 'es-toolkit/function';\nimport { merge as deepmerge } from 'es-toolkit/object';\nimport { DEV } from 'esm-env';\nimport { klona } from 'klona/full';\nimport pLimit from 'p-limit';\nimport type {\n\tActionChoiceChoice,\n\tActionProxy,\n\tChoiceCheckFunction,\n\tCustomHandler,\n\tStory,\n\tTextContent,\n\tValidAction,\n\tVirtualActions,\n} from './action';\nimport type { Character } from './character';\nimport type { CleanupFn } from './custom-action';\nimport { DEFAULT_TYPEWRITER_SPEED, EMPTY_SET, MAIN_CONTEXT_KEY } from './constants';\nimport { cleanCleanupSource, getCustomActionCleanupHolder, handleCustomAction } from './custom-action';\nimport { enqueueAssetForPreloading, handleAssetsPreloading, huntAssets } from './preloading';\nimport type { Context, RendererInitPreviewReturn } from './renderer';\nimport { PRELOADED_ASSETS, STACK_MAP } from './shared';\nimport { storageAdapterLocal } from './storage';\nimport type { Stored } from './store';\nimport { derive, store } from './store';\nimport { flattenAllowedContent, replace as replaceTranslation } from './translation';\nimport type { BaseTranslationStrings } from './translations';\nimport type {\n\tCoreData,\n\tData,\n\tEngineTypes,\n\tLang,\n\tNovelyInit,\n\tSave,\n\tState,\n\tStateFunction,\n\tStorageData,\n} from './types';\nimport type { ControlledPromise } from './utilities';\nimport {\n\tisAction,\n\tisAudioAction,\n\tisBlockingAction,\n\tisEmpty,\n\tisFunction,\n\tisPromise,\n\tisString,\n\tisAsset,\n\tmatchAction,\n\tcreateQueueProcessor,\n\tgetActionsFromPath,\n\tcreateReferFunction,\n\texitPath,\n\tcollectActionsBeforeBlockingAction,\n\tnextPath,\n\tcreateControlledPromise,\n\tgetResourseType,\n\tcreateUseStackFunction,\n\tflatStory,\n\tcapitalize,\n\tgetLanguage as defaultGetLanguage,\n\tgetCharactersData,\n\tgetIntlLanguageDisplayName,\n\tgetLanguageFromStore,\n\tgetVolumeFromStore,\n\tnoop,\n\ttoArray,\n} from './utilities';\nimport type { MatchActionHandlers } from './utilities';\nimport { buildActionObject } from './utilities/actions';\nimport { unwrapAsset, unwrapAudioAsset, unwrapImageAsset } from './asset';\nimport { getDialogOverview } from './utilities/dialog-overview';\nimport { setDocumentLanguage } from './utilities/document';\n\nconst novely = <\n\t$Language extends string,\n\t$Characters extends Record<string, Character<$Language>>,\n\t$State extends State,\n\t$Data extends Data,\n\t$Actions extends Record<string, (...args: any[]) => ValidAction>,\n>({\n\tcharacters,\n\tcharacterAssetSizes = {},\n\tdefaultEmotions = {},\n\tstorage = storageAdapterLocal({ key: 'novely-game-storage' }),\n\tstorageDelay = Promise.resolve(),\n\trenderer: createRenderer,\n\tinitialScreen = 'mainmenu',\n\ttranslation,\n\tstate: defaultState = {} as $State,\n\tdata: defaultData = {} as $Data,\n\tautosaves = true,\n\tmigrations = [],\n\tthrottleTimeout = 850,\n\tgetLanguage = defaultGetLanguage,\n\toverrideLanguage = false,\n\taskBeforeExit = true,\n\tpreloadAssets = 'automatic',\n\tparallelAssetsDownloadLimit = 15,\n\tfetch: request = fetch,\n\tcloneFunction: clone = klona,\n\tsaveOnUnload = true,\n\tstartKey = 'start',\n\tdefaultTypewriterSpeed = DEFAULT_TYPEWRITER_SPEED,\n\tstoryOptions = { mode: 'static' },\n\tonLanguageChange,\n}: NovelyInit<$Language, $Characters, $State, $Data, $Actions>) => {\n\ttype $ActionProxy = ActionProxy<$Characters, $Language, $State>;\n\ttype $VirtualActions = VirtualActions<$Characters, $Language, $State>;\n\n\t// All action functions\n\ttype Actions = $Actions & $ActionProxy & $VirtualActions;\n\n\tconst languages = Object.keys(translation) as $Language[];\n\n\tconst limitScript = pLimit(1);\n\tconst limitAssetsDownload = pLimit(parallelAssetsDownloadLimit);\n\n\tconst story: Story = {};\n\n\tconst times = new Set<number>();\n\n\tconst dataLoaded = createControlledPromise();\n\n\tlet initialScreenWasShown = false;\n\tlet destroyed = false;\n\n\tif (storyOptions.mode === 'dynamic') {\n\t\tstoryOptions.preloadSaves ??= 4;\n\t}\n\n\tconst storyLoad = storyOptions.mode === 'static' ? noop : storyOptions.load;\n\tconst onUnknownSceneHit = memoize(async (scene: string) => {\n\t\tconst part = await storyLoad(scene);\n\n\t\tif (part) {\n\t\t\tawait script(part);\n\t\t}\n\t});\n\n\t/**\n\t * Saves timestamps created in this session\n\t */\n\tconst intime = (value: number) => {\n\t\treturn times.add(value), value;\n\t};\n\n\tconst scriptBase = async (part: Story) => {\n\t\t// In case script was called after destroy\n\t\tif (destroyed) return;\n\n\t\tObject.assign(story, flatStory(part));\n\n\t\t// This is the first `script` call, likely data did not loaded yet\n\t\tif (!initialScreenWasShown) {\n\t\t\trenderer.ui.showLoading();\n\t\t}\n\n\t\tawait dataLoaded.promise;\n\n\t\trenderer.ui.hideLoading();\n\n\t\tif (!initialScreenWasShown) {\n\t\t\tinitialScreenWasShown = true;\n\n\t\t\tif (initialScreen === 'game') {\n\t\t\t\trestore(undefined);\n\t\t\t} else {\n\t\t\t\trenderer.ui.showScreen(initialScreen);\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Setup your story here\n\t *\n\t * Call more than once to merge different story parts\n\t *\n\t * @example\n\t *\n\t * ```js\n\t * engine.script({\n\t * start: [action.jump('another-part')]\n\t * })\n\t *\n\t * engine.script({\n\t * 'another-part': []\n\t * })\n\t * ```\n\t */\n\tconst script = (part: Story) => {\n\t\treturn limitScript(() => scriptBase(part));\n\t};\n\n\tconst getDefaultSave = (state: $State) => {\n\t\treturn [\n\t\t\t[\n\t\t\t\t['jump', startKey],\n\t\t\t\t[null, 0],\n\t\t\t],\n\t\t\tstate,\n\t\t\t[intime(Date.now()), 'auto'],\n\t\t\t[],\n\t\t] as Save<$State>;\n\t};\n\n\t/**\n\t * Calls `getLanguage`, passes needed arguments\n\t * @returns language\n\t */\n\tconst getLanguageWithoutParameters = () => {\n\t\tconst language = getLanguage(languages, defaultGetLanguage);\n\n\t\t// This is valid language\n\t\tif (languages.includes(language as $Language)) {\n\t\t\tsetDocumentLanguage(language);\n\n\t\t\treturn language as $Language;\n\t\t}\n\n\t\tif (DEV) {\n\t\t\tthrow new Error(\n\t\t\t\t`Attempt to use unsupported language \"${language}\". Supported languages: ${languages.join(', ')}.`,\n\t\t\t);\n\t\t}\n\n\t\tthrow 0;\n\t};\n\n\t/**\n\t * 1) Novely rendered using the `initialData`, but you can't start new game or `load` an empty one - this is scary, imagine losing your progress\n\t * 2) Actual stored data is loaded, language and etc is changed\n\t */\n\tconst initialData: StorageData<$Language, $Data> = {\n\t\tsaves: [],\n\t\tdata: clone(defaultData),\n\t\tmeta: [getLanguageWithoutParameters(), DEFAULT_TYPEWRITER_SPEED, 1, 1, 1],\n\t};\n\n\tconst storageData = store(initialData);\n\tconst coreData = store<CoreData>({\n\t\tdataLoaded: false,\n\t\tpaused: false,\n\t\tfocused: document.visibilityState === 'visible',\n\t});\n\n\tconst paused = derive(coreData, (s) => s.paused || !s.focused);\n\n\tconst onDataLoadedPromise = async ({ cancelled }: Awaited<ControlledPromise<void>>) => {\n\t\t/**\n\t\t * Promise cancelled? Re-subscribe\n\t\t */\n\t\tif (cancelled) {\n\t\t\tdataLoaded.promise.then(onDataLoadedPromise);\n\t\t\treturn;\n\t\t}\n\n\t\tconst preload = () => {\n\t\t\tconst saves = [...storageData.get().saves].reverse();\n\t\t\tconst sliced = saves.slice(0, storyOptions.mode === 'dynamic' ? storyOptions.preloadSaves : 0);\n\n\t\t\tfor (const [path] of sliced) {\n\t\t\t\treferGuarded(path);\n\t\t\t}\n\t\t};\n\n\t\tpreload();\n\n\t\t/**\n\t\t * When promise is resolved data is marked loaded\n\t\t */\n\t\tcoreData.update((data) => {\n\t\t\tdata.dataLoaded = true;\n\n\t\t\treturn data;\n\t\t});\n\t};\n\n\tdataLoaded.promise.then(onDataLoadedPromise);\n\n\tconst onStorageDataChange = (value: StorageData) => {\n\t\tif (!coreData.get().dataLoaded) return;\n\n\t\tconst data = clone(value);\n\n\t\t/**\n\t\t * Empty out data snapshots\n\t\t */\n\t\tfor (const save of data.saves) {\n\t\t\tsave[3] = [];\n\t\t}\n\n\t\tstorage.set(data);\n\t};\n\n\t/**\n\t * Short one is used in conditions like `beforeunload` when waiting for too long is not a case\n\t * Another one relies on short one to prevent double saving\n\t */\n\tconst throttledShortOnStorageDataChange = throttle(() => onStorageDataChange(storageData.get()), 10);\n\tconst throttledOnStorageDataChange = throttle(throttledShortOnStorageDataChange, throttleTimeout);\n\n\tstorageData.subscribe(throttledOnStorageDataChange);\n\n\tif (saveOnUnload === true || (saveOnUnload === 'prod' && !DEV)) {\n\t\taddEventListener('beforeunload', throttledShortOnStorageDataChange);\n\t}\n\n\tconst getStoredData = async () => {\n\t\tlet stored = await storage.get();\n\n\t\tfor (const migration of migrations) {\n\t\t\tstored = migration(stored) as StorageData;\n\n\t\t\tif (DEV && !stored) {\n\t\t\t\tthrow new Error('Migrations should return a value.');\n\t\t\t}\n\t\t}\n\n\t\tif (overrideLanguage || !stored.meta[0]) {\n\t\t\tstored.meta[0] = getLanguageWithoutParameters();\n\t\t}\n\n\t\t/**\n\t\t * Default `localStorageStorage` returns empty array\n\t\t */\n\t\tstored.meta[1] ||= defaultTypewriterSpeed;\n\n\t\t/**\n\t\t * Sound Volumes\n\t\t */\n\t\tstored.meta[2] ??= 1;\n\t\tstored.meta[3] ??= 1;\n\t\tstored.meta[4] ??= 1;\n\n\t\t/**\n\t\t * When data is empty replace it with `defaultData`\n\t\t * It also might be empty (default to empty)\n\t\t */\n\t\tif (isEmpty(stored.data)) {\n\t\t\tstored.data = defaultData as Data;\n\t\t}\n\n\t\t/**\n\t\t * Now the next store updates will entail saving via storage.set\n\t\t */\n\t\tdataLoaded.resolve();\n\n\t\tstorageData.set(stored as StorageData<$Language, $Data>);\n\t};\n\n\t/**\n\t * By default this is resolved immediately, but also can be delayed.\n\t * I.e. storage has not loaded yet\n\t */\n\tstorageDelay.then(getStoredData);\n\n\tconst initial = getDefaultSave(clone(defaultState));\n\n\t// #region Save Function\n\tconst save = (type: Save[2][1]) => {\n\t\tif (!coreData.get().dataLoaded) return;\n\n\t\t/**\n\t\t * When autosaves diabled just return\n\t\t */\n\t\tif (!autosaves && type === 'auto') return;\n\n\t\t/**\n\t\t * Saves only possible in main context, so there is no reason for context to be used here\n\t\t */\n\t\tconst stack = useStack(MAIN_CONTEXT_KEY);\n\t\tconst current = clone(stack.value);\n\n\t\tstorageData.update((prev) => {\n\t\t\tconst replace = () => {\n\t\t\t\tprev.saves[prev.saves.length - 1] = current;\n\n\t\t\t\treturn prev;\n\t\t\t};\n\n\t\t\tconst add = () => {\n\t\t\t\tprev.saves.push(current);\n\n\t\t\t\treturn prev;\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * Get latest\n\t\t\t */\n\t\t\tconst last = prev.saves.at(-1);\n\n\t\t\t/**\n\t\t\t * We cannot compare anything here, thus just reutrn\n\t\t\t */\n\t\t\tif (!last) return add();\n\n\t\t\t/**\n\t\t\t * Update type and time information\n\t\t\t */\n\t\t\tcurrent[2][0] = intime(Date.now());\n\t\t\tcurrent[2][1] = type;\n\n\t\t\t/**\n\t\t\t * Empty out state snapshots\n\t\t\t */\n\t\t\tcurrent[3] = [];\n\n\t\t\tconst isIdentical = dequal(last[0], current[0]) && dequal(last[1], current[1]);\n\t\t\tconst isLastMadeInCurrentSession = times.has(last[2][0]);\n\n\t\t\t/**\n\t\t\t * Even if override is false, we will replace auto save with manual, because they are the same thing basically\n\t\t\t */\n\t\t\tif (isLastMadeInCurrentSession && last[2][1] === 'auto' && type === 'manual') {\n\t\t\t\treturn replace();\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Player has made a manual save, novely decided to make an auto save\n\t\t\t * But it is identical to previously created manual save so completely not wanted\n\t\t\t */\n\t\t\tif (last[2][1] === 'manual' && type === 'auto' && isIdentical) {\n\t\t\t\treturn prev;\n\t\t\t}\n\n\t\t\tif (isLastMadeInCurrentSession && last[2][1] === 'auto' && type === 'auto') {\n\t\t\t\treturn replace();\n\t\t\t}\n\n\t\t\treturn add();\n\t\t});\n\t};\n\t// #endregion\n\n\t// #region New Game\n\tconst newGame = () => {\n\t\tif (!coreData.get().dataLoaded) return;\n\n\t\tconst save = getDefaultSave(clone(defaultState));\n\n\t\t/**\n\t\t * Initial save is automatic, and should be ignored when autosaves is turned off\n\t\t */\n\t\tif (autosaves) {\n\t\t\tstorageData.update((prev) => {\n\t\t\t\treturn prev.saves.push(save), prev;\n\t\t\t});\n\t\t}\n\n\t\tconst context = renderer.getContext(MAIN_CONTEXT_KEY);\n\t\tconst stack = useStack(context);\n\n\t\tstack.value = save;\n\t\tcontext.meta.restoring = context.meta.goingBack = false;\n\n\t\trenderer.ui.showScreen('game');\n\n\t\trender(context);\n\t};\n\t// #endregion\n\n\t/**\n\t * Set's the save and restores onto it\n\t */\n\tconst set = (save: Save, ctx?: Context) => {\n\t\tconst stack = useStack(ctx || MAIN_CONTEXT_KEY);\n\n\t\tstack.value = save;\n\n\t\treturn restore(save);\n\t};\n\n\tlet interacted = 0;\n\n\t// #region Restore Function\n\t/**\n\t * Restore save or if none is passed then look for latest save, if there is no saves will create a new save\n\t */\n\tconst restore = async (save: Save | undefined) => {\n\t\tif (isEmpty(story)) {\n\t\t\tif (DEV) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Story is empty. You should call an `enine.script` function [https://novely.pages.dev/guide/story.html]',\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (!coreData.get().dataLoaded) return;\n\n\t\tlet latest = save || storageData.get().saves.at(-1);\n\n\t\t/**\n\t\t * When there is no save, make a new save\n\t\t */\n\t\tif (!latest) {\n\t\t\tlatest = clone(initial);\n\n\t\t\tstorageData.update((prev) => {\n\t\t\t\tprev.saves.push(latest!);\n\n\t\t\t\treturn prev;\n\t\t\t});\n\t\t}\n\n\t\tconst context = renderer.getContext(MAIN_CONTEXT_KEY);\n\t\tconst stack = useStack(context);\n\n\t\tcontext.meta.restoring = true;\n\n\t\tconst previous = stack.previous;\n\n\t\tconst [path] = (stack.value = latest);\n\n\t\trenderer.ui.showScreen('game');\n\n\t\tconst { found } = await refer(path);\n\n\t\tif (found) context.loading(true);\n\n\t\tconst { queue, skip, skipPreserve } = await getActionsFromPath({\n\t\t\tstory,\n\t\t\tpath,\n\t\t\tfilter: false,\n\t\t\treferGuarded,\n\t\t});\n\n\t\tconst cleanupHolder = getCustomActionCleanupHolder(context);\n\n\t\tif (previous) {\n\t\t\tconst { queue: prevQueue } = await getActionsFromPath({\n\t\t\t\tstory,\n\t\t\t\tpath: previous[0],\n\t\t\t\tfilter: false,\n\t\t\t\treferGuarded,\n\t\t\t});\n\n\t\t\tconst futures: CustomHandler[] = [];\n\n\t\t\tconst isFromDifferentBranches = previous[0][0][1] !== path[0][1];\n\t\t\tconst end = isFromDifferentBranches ? 0 : queue.length - 1;\n\n\t\t\tfor (let i = prevQueue.length - 1; i >= end; i--) {\n\t\t\t\tconst [action, fn] = prevQueue[i];\n\n\t\t\t\tif (action === 'custom') {\n\t\t\t\t\tfutures.push(fn);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfutures.reverse();\n\n\t\t\tconst nodeCleanup = new Set<CleanupFn>();\n\n\t\t\tfor (const future of futures) {\n\t\t\t\tinner: for (let i = cleanupHolder.length - 1; i >= 0; i--) {\n\t\t\t\t\tconst item = cleanupHolder[i];\n\n\t\t\t\t\tif (future === item.fn) {\n\t\t\t\t\t\tcleanCleanupSource(item);\n\t\t\t\t\t\tnodeCleanup.add(item.node);\n\n\t\t\t\t\t\tcleanupHolder.splice(i, 1);\n\n\t\t\t\t\t\tbreak inner;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tnodeCleanup.forEach((f) => f());\n\t\t}\n\n\t\tconst {\n\t\t\trun,\n\t\t\tkeep: { keep, characters, audio },\n\t\t} = createQueueProcessor(queue, {\n\t\t\tskip,\n\t\t\tskipPreserve,\n\t\t});\n\n\t\tif (context.meta.goingBack) {\n\t\t\t/**\n\t\t\t * Context is cleared at exit, so it is dirty only when goingBack\n\t\t\t */\n\t\t\tmatch('clear', [keep, characters, audio], {\n\t\t\t\tctx: context,\n\t\t\t\tdata: latest[1],\n\t\t\t});\n\t\t}\n\n\t\tcontext.loading(false);\n\n\t\tconst lastQueueItem = queue.at(-1);\n\t\tconst lastQueueItemRequiresUserAction = lastQueueItem && isBlockingAction(lastQueueItem);\n\n\t\tawait run((item) => {\n\t\t\tif (!latest) return;\n\n\t\t\t/**\n\t\t\t * Skip because last item will be ran again by `render(context)` call\n\t\t\t */\n\t\t\tif (lastQueueItem === item && lastQueueItemRequiresUserAction) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst [action, ...props] = item;\n\n\t\t\tif (action === 'custom') {\n\t\t\t\t/**\n\t\t\t\t * We check if there's an existing cleanup function for this action.\n\t\t\t\t * If found, it means the previous run hasn't been cleaned up yet.\n\t\t\t\t * In that case, we avoid re-running.\n\t\t\t\t */\n\t\t\t\tif (cleanupHolder.some((holder) => holder.fn === props[0])) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn match(action, props, {\n\t\t\t\tctx: context,\n\t\t\t\tdata: latest[1],\n\t\t\t});\n\t\t});\n\n\t\tif (!context.meta.goingBack) {\n\t\t\t/**\n\t\t\t * When not goingBack setting restoring to false is required to go forward\n\t\t\t * Because when restoring action do not call the resolve function which goes to next action but are controlled\n\t\t\t */\n\t\t\tcontext.meta.restoring = false;\n\t\t}\n\n\t\tawait render(context);\n\n\t\tcontext.meta.restoring = context.meta.goingBack = false;\n\t};\n\t// #endregion\n\n\tconst { refer, referGuarded } = createReferFunction({\n\t\tstory,\n\t\tonUnknownSceneHit,\n\t});\n\n\t// #region Exit Function\n\t/**\n\t * @param force Force exit\n\t */\n\tconst exit = (force = false, saving = true) => {\n\t\t/**\n\t\t * Exit only possible in main context\n\t\t */\n\t\tconst ctx = renderer.getContext(MAIN_CONTEXT_KEY);\n\n\t\tconst stack = useStack(ctx);\n\t\tconst current = stack.value;\n\n\t\tconst isSaved = () => {\n\t\t\tconst { saves } = storageData.get();\n\t\t\tconst [currentPath, currentData] = stack.value;\n\n\t\t\treturn saves.some(\n\t\t\t\t([path, data, [date, type]]) =>\n\t\t\t\t\ttype === 'manual' && times.has(date) && dequal(path, currentPath) && dequal(data, currentData),\n\t\t\t);\n\t\t};\n\n\t\tif (interacted > 1 && !force && askBeforeExit && !isSaved()) {\n\t\t\trenderer.ui.showExitPrompt();\n\t\t\treturn;\n\t\t}\n\n\t\t/**\n\t\t * Imagine list of actions like\n\t\t *\n\t\t * [\n\t\t * ['input', ...args]\n\t\t * ['dialog', ...args]\n\t\t * ]\n\t\t *\n\t\t * When you have done with input, you will go to the dialog\n\t\t * And at that moment you exit the game\n\t\t *\n\t\t * What happens? Input was \"enmemoried\", but dialog not. So when you will open saves, you'll see input action.\n\t\t * We cannot \"enmemory\" dialog when it's just started, because goingBack is going to last enmemoried item, which will be that dialog, so impossible to go back.\n\t\t *\n\t\t * What we do is enmemory on exit.\n\t\t */\n\t\tif (interacted > 0 && saving) {\n\t\t\tsave('auto');\n\t\t}\n\n\t\tstack.clear();\n\t\tclearCustomActionsAtContext(ctx);\n\t\tctx.clear(EMPTY_SET, EMPTY_SET, { music: EMPTY_SET, sounds: EMPTY_SET }, noop);\n\t\trenderer.ui.showScreen('mainmenu');\n\t\tctx.audio.destroy();\n\n\t\tconst [time, type] = current[2];\n\n\t\t/**\n\t\t * This is auto save and belongs to the current session\n\t\t * Player did not interacted or did it once, so this is probably not-needed save\n\t\t */\n\t\tif (type === 'auto' && interacted <= 1 && times.has(time)) {\n\t\t\tstorageData.update((prev) => {\n\t\t\t\tprev.saves = prev.saves.filter((save) => save !== current);\n\n\t\t\t\treturn prev;\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Reset interactive value\n\t\t */\n\t\tinteractivity(false);\n\t\t/**\n\t\t * Reset session times\n\t\t */\n\t\ttimes.clear();\n\t};\n\t// #endregion\n\n\tconst back = async () => {\n\t\t/**\n\t\t * Back also happens in main context only\n\t\t */\n\t\tconst stack = useStack(MAIN_CONTEXT_KEY);\n\n\t\tconst valueBeforeBack = stack.value;\n\n\t\tstack.back();\n\n\t\t/**\n\t\t * There was only one item in the stack so there is no `stack.previous`, also `ctx.meta.goingBack` did not changed\n\t\t */\n\t\tif (dequal(valueBeforeBack, stack.value) && !stack.previous) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait restore(stack.value);\n\t};\n\n\tconst t = (key: BaseTranslationStrings, lang: string | $Language) => {\n\t\treturn translation[lang as $Language].internal[key];\n\t};\n\n\t// #region Preview Function\n\t/**\n\t * Execute save in context named `name`\n\t * @param save Save\n\t * @param name Context name\n\t */\n\tconst preview = async (save: Save, name: string): Promise<RendererInitPreviewReturn> => {\n\t\tif (isEmpty(story)) {\n\t\t\treturn Promise.resolve({\n\t\t\t\tassets: [],\n\t\t\t});\n\t\t}\n\n\t\tconst [path, data] = save;\n\n\t\tconst ctx = renderer.getContext(name);\n\n\t\tconst { found } = await refer(path);\n\n\t\tif (found) ctx.loading(true);\n\n\t\tconst { queue } = await getActionsFromPath({\n\t\t\tstory,\n\t\t\tpath,\n\t\t\tfilter: true,\n\t\t\treferGuarded,\n\t\t});\n\n\t\tctx.loading(false);\n\n\t\t// Enter restoring mode in action\n\t\tctx.meta.restoring = true;\n\t\tctx.meta.preview = true;\n\n\t\tconst processor = createQueueProcessor(queue, {\n\t\t\tskip: EMPTY_SET,\n\t\t});\n\n\t\tuseStack(ctx).push(clone(save));\n\n\t\tconst assets: string[] = [];\n\n\t\tawait processor.run(([action, ...props]) => {\n\t\t\tif (isAudioAction(action)) return;\n\t\t\tif (action === 'vibrate') return;\n\t\t\tif (action === 'end') return;\n\n\t\t\thuntAssets({\n\t\t\t\taction,\n\t\t\t\tprops: props as any,\n\n\t\t\t\tcharacters,\n\n\t\t\t\tlang: getLanguageFromStore(storageData),\n\t\t\t\tvolume: getVolumeFromStore(storageData),\n\n\t\t\t\thandle: assets.push.bind(assets),\n\t\t\t});\n\n\t\t\treturn match(action, props, {\n\t\t\t\tctx,\n\t\t\t\tdata,\n\t\t\t});\n\t\t});\n\n\t\treturn {\n\t\t\tassets,\n\t\t};\n\t};\n\t// #endregion\n\n\tconst removeContext = (name: string) => {\n\t\tSTACK_MAP.delete(name);\n\t};\n\n\tconst getStateAtCtx = (context: string | Context) => {\n\t\treturn useStack(context).value[1];\n\t};\n\n\tconst getStateFunction = (context: string | Context) => {\n\t\tconst stack = useStack(context);\n\n\t\tconst state = ((value) => {\n\t\t\tconst _state = getStateAtCtx(context);\n\n\t\t\tif (!value) {\n\t\t\t\treturn _state;\n\t\t\t}\n\n\t\t\tconst prev = _state;\n\t\t\tconst val = isFunction(value) ? value(prev) : deepmerge(prev, value);\n\n\t\t\tstack.value[1] = val;\n\n\t\t\treturn undefined;\n\t\t}) as StateFunction<State>;\n\n\t\treturn state;\n\t};\n\n\tconst getLanguageDisplayName = (lang: Lang) => {\n\t\tconst language = translation[lang as $Language];\n\n\t\tif (DEV && !language) {\n\t\t\tthrow new Error(\n\t\t\t\t`Attempt to use unsupported language \"${language}\". Supported languages: ${languages.join(', ')}.`,\n\t\t\t);\n\t\t}\n\n\t\treturn capitalize(language.nameOverride || getIntlLanguageDisplayName(lang));\n\t};\n\n\tconst clearCustomActionsAtContext = (ctx: Context) => {\n\t\tconst cleanupHolder = getCustomActionCleanupHolder(ctx);\n\t\tconst nodeCleanup = new Set<CleanupFn>();\n\n\t\tfor (const item of cleanupHolder) {\n\t\t\tcleanCleanupSource(item);\n\t\t\tnodeCleanup.add(item.node);\n\t\t}\n\n\t\tcleanupHolder.length = 0;\n\t\tnodeCleanup.forEach((fn) => fn());\n\t};\n\n\tconst getResourseTypeWrapper = (url: string) => {\n\t\treturn getResourseType({\n\t\t\turl,\n\t\t\trequest,\n\t\t});\n\t};\n\n\tconst getCharacterColor = (c: keyof $Characters) => {\n\t\treturn c in characters ? characters[c].color : '#000000';\n\t};\n\n\tconst getCharacterAssets = (character: string, emotion: string) => {\n\t\treturn toArray(characters[character].emotions[emotion]).map(unwrapImageAsset);\n\t};\n\n\tconst getCharacterName = (character: keyof $Characters): string => {\n\t\tconst c = character;\n\t\tconst cs = characters;\n\t\tconst lang = getLanguageFromStore(storageData);\n\n\t\tif (c && c in cs) {\n\t\t\tconst block = cs[c].name;\n\n\t\t\tif (typeof block === 'string') {\n\t\t\t\treturn block;\n\t\t\t}\n\n\t\t\tif (lang in block) {\n\t\t\t\treturn block[lang];\n\t\t\t}\n\t\t}\n\n\t\treturn String(c);\n\t};\n\n\tconst setLanguage = (lang: string) => {\n\t\tstorageData.update((prev) => {\n\t\t\tif (languages.includes(lang as $Language)) {\n\t\t\t\tprev.meta[0] = lang as $Language;\n\t\t\t}\n\n\t\t\tif (lang === prev.meta[0]) {\n\t\t\t\tsetDocumentLanguage(lang);\n\t\t\t\tonLanguageChange?.(lang as $Language);\n\t\t\t}\n\n\t\t\treturn prev;\n\t\t});\n\t};\n\n\t// #region Renderer Creation\n\tconst renderer = createRenderer({\n\t\tmainContextKey: MAIN_CONTEXT_KEY,\n\n\t\tcharacters: getCharactersData(characters),\n\t\tcharacterAssetSizes,\n\t\tset,\n\t\trestore,\n\t\tsave,\n\t\tnewGame,\n\t\texit,\n\t\tback,\n\t\tt,\n\t\tpreview,\n\t\tremoveContext,\n\t\tgetStateFunction,\n\t\tclearCustomActionsAtContext,\n\t\tlanguages,\n\t\tstorageData: storageData as unknown as Stored<StorageData<string, Data>>,\n\t\tcoreData,\n\n\t\tgetLanguageDisplayName,\n\t\tgetCharacterColor,\n\t\tgetCharacterAssets,\n\t\tgetDialogOverview: getDialogOverview.bind({\n\t\t\treferGuarded,\n\t\t\tstory,\n\t\t\tgetCharacterName,\n\t\t\tgetLanguage: () => getLanguageFromStore(storageData),\n\t\t\tgetStack: () => useStack(MAIN_CONTEXT_KEY),\n\t\t\ttemplateReplace: (...args) => templateReplace(...args),\n\t\t}),\n\n\t\tgetResourseType: getResourseTypeWrapper,\n\n\t\tsetLanguage,\n\t});\n\t// #endregion\n\n\tconst useStack = createUseStackFunction(renderer);\n\n\t/**\n\t * Initiate\n\t */\n\tuseStack(MAIN_CONTEXT_KEY).push(initial);\n\n\tconst UIInstance = renderer.ui.start();\n\n\tconst enmemory = (ctx: Context) => {\n\t\tif (ctx.meta.restoring) return;\n\n\t\tconst stack = useStack(ctx);\n\n\t\tconst current = clone(stack.value);\n\n\t\tcurrent[2][1] = 'auto';\n\n\t\tstack.push(current);\n\n\t\tsave('auto');\n\t};\n\n\tconst next = (ctx: Context) => {\n\t\tconst stack = useStack(ctx);\n\t\tconst path = stack.value[0];\n\n\t\tnextPath(path);\n\t};\n\n\tconst matchActionOptions: MatchActionHandlers = {\n\t\tgetContext: renderer.getContext,\n\t\tpush(ctx) {\n\t\t\tif (ctx.meta.restoring) return;\n\n\t\t\tnext(ctx);\n\t\t\trender(ctx);\n\t\t},\n\t\tforward(ctx) {\n\t\t\tif (!ctx.meta.preview) enmemory(ctx);\n\n\t\t\tmatchActionOptions.push(ctx);\n\n\t\t\tif (!ctx.meta.preview) interactivity(true);\n\t\t},\n\t\tasync onBeforeActionCall({ action, props, ctx }) {\n\t\t\tif (preloadAssets !== 'automatic') return;\n\t\t\tif (ctx.meta.preview || ctx.meta.restoring) return;\n\t\t\tif (!isBlockingAction([action, ...props] as unknown as Exclude<ValidAction, ValidAction[]>)) return;\n\n\t\t\ttry {\n\t\t\t\tconst collection = await collectActionsBeforeBlockingAction({\n\t\t\t\t\tpath: nextPath(clone(useStack(ctx).value[0])),\n\t\t\t\t\trefer: referGuarded,\n\t\t\t\t\tclone,\n\t\t\t\t});\n\n\t\t\t\tfor (const [action, ...props] of collection) {\n\t\t\t\t\thuntAssets({\n\t\t\t\t\t\taction,\n\t\t\t\t\t\tprops: props as any,\n\n\t\t\t\t\t\tcharacters,\n\n\t\t\t\t\t\tlang: getLanguageFromStore(storageData),\n\t\t\t\t\t\tvolume: getVolumeFromStore(storageData),\n\n\t\t\t\t\t\thandle: enqueueAssetForPreloading,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\thandleAssetsPreloading({\n\t\t\t\t\t...renderer.misc,\n\t\t\t\t\trequest,\n\t\t\t\t\tlimiter: limitAssetsDownload,\n\t\t\t\t});\n\t\t\t} catch (cause) {\n\t\t\t\tconsole.error(cause);\n\t\t\t}\n\t\t},\n\t};\n\n\t// #region Match Action\n\tconst { match, nativeActions } = matchAction(matchActionOptions, {\n\t\twait({ ctx, data, push }, [time]) {\n\t\t\tif (ctx.meta.restoring) return;\n\n\t\t\tsetTimeout(push, isFunction(time) ? time(data) : time);\n\t\t},\n\t\tshowBackground({ ctx, push }, [background]) {\n\t\t\tif (isString(background) || isAsset(background)) {\n\t\t\t\tctx.background({\n\t\t\t\t\tall: unwrapImageAsset(background),\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tctx.background(\n\t\t\t\t\tObject.fromEntries(Object.entries(background).map(([media, asset]) => [media, unwrapImageAsset(asset)])),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tpush();\n\t\t},\n\t\tplayMusic({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'music').play(true);\n\t\t\tpush();\n\t\t},\n\t\tpauseMusic({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'music').pause();\n\t\t\tpush();\n\t\t},\n\t\tstopMusic({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'music').stop();\n\t\t\tpush();\n\t\t},\n\t\tplaySound({ ctx, push }, [source, loop]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'sound').play(loop || false);\n\t\t\tpush();\n\t\t},\n\t\tpauseSound({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'sound').pause();\n\t\t\tpush();\n\t\t},\n\t\tstopSound({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'sound').stop();\n\t\t\tpush();\n\t\t},\n\t\tvoice({ ctx, push }, [source]) {\n\t\t\tconst lang = getLanguageFromStore(storageData);\n\t\t\tconst audioSource = isString(source) ? source : isAsset(source) ? source : source[lang];\n\n\t\t\t/**\n\t\t\t * We allow ignoring voice because it is okay to not have voiceover for certain languages\n\t\t\t */\n\t\t\tif (!audioSource) {\n\t\t\t\tpush();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tctx.audio.voice(unwrapAudioAsset(audioSource), paused);\n\t\t\tpush();\n\t\t},\n\t\tstopVoice({ ctx, push }) {\n\t\t\tctx.audio.voiceStop();\n\t\t\tpush();\n\t\t},\n\t\tshowCharacter({ ctx, push }, [character, emotion, className, style]) {\n\t\t\temotion ??= defaultEmotions[character];\n\n\t\t\tif (DEV && !emotion) {\n\t\t\t\tthrow new Error(`Attemp to show character \"${character}\" without emotion provided.`);\n\t\t\t}\n\n\t\t\tif (!emotion) return;\n\n\t\t\tif (DEV && !characters[character].emotions[emotion]) {\n\t\t\t\tthrow new Error(`Attempt to show character \"${character}\" with unknown emotion \"${emotion}\"`);\n\t\t\t}\n\n\t\t\tconst handle = ctx.character(character);\n\n\t\t\thandle.append(className, style, ctx.meta.restoring);\n\t\t\thandle.emotion(emotion, true);\n\n\t\t\tpush();\n\t\t},\n\t\thideCharacter({ ctx, push }, [character, className, style, duration]) {\n\t\t\tctx.character(character).remove(className, style, duration, ctx.meta.restoring).then(push);\n\t\t},\n\t\tdialog({ ctx, data, forward }, [character, content, emotion]) {\n\t\t\tconst name = getCharacterName(character);\n\t\t\tconst stack = useStack(ctx);\n\n\t\t\t/**\n\t\t\t * For each \"dialog\" we save copy of current game state\n\t\t\t * It's used for dialog overview\n\t\t\t */\n\t\t\tif (!ctx.meta.restoring && !ctx.meta.goingBack) {\n\t\t\t\tstack.value[3].push(clone(data));\n\t\t\t}\n\n\t\t\tctx.clearBlockingActions('dialog');\n\n\t\t\tctx.dialog(templateReplace(content, data), templateReplace(name, data), character, emotion, forward);\n\t\t},\n\t\tfunction({ ctx, push }, [fn]) {\n\t\t\tconst { restoring, goingBack, preview } = ctx.meta;\n\n\t\t\tconst result = fn({\n\t\t\t\tlang: getLanguageFromStore(storageData),\n\t\t\t\tgoingBack,\n\t\t\t\trestoring,\n\t\t\t\tpreview,\n\t\t\t\tstate: getStateFunction(ctx),\n\t\t\t});\n\n\t\t\tif (!ctx.meta.restoring) {\n\t\t\t\tresult ? result.then(push) : push();\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\t\tchoice({ ctx, data }, [question, ...choices]) {\n\t\t\tconst isWithoutQuestion = Array.isArray(question);\n\n\t\t\tif (isWithoutQuestion) {\n\t\t\t\t/**\n\t\t\t\t * Can be string or a choice\n\t\t\t\t */\n\t\t\t\tchoices.unshift(question as unknown as ActionChoiceChoice<string, State>);\n\n\t\t\t\t/**\n\t\t\t\t * Omitted then\n\t\t\t\t */\n\t\t\t\tquestion = '';\n\t\t\t}\n\n\t\t\tconst transformedChoices = choices.map(([content, _children, active, visible, onSelect, image]) => {\n\t\t\t\tconst active$ = store(false);\n\t\t\t\tconst visible$ = store(false);\n\n\t\t\t\tconst lang = getLanguageFromStore(storageData);\n\n\t\t\t\tconst getCheckValue = (fn: ChoiceCheckFunction<string, State> | undefined) => {\n\t\t\t\t\t// If there is no explicit \"no\" choice will be active or visible, etc...\n\t\t\t\t\tif (!fn) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Here we need to use \"fresh\" state instead of \"data\" parameter\n\t\t\t\t\treturn fn({\n\t\t\t\t\t\tlang,\n\t\t\t\t\t\tstate: getStateAtCtx(ctx),\n\t\t\t\t\t});\n\t\t\t\t};\n\n\t\t\t\tconst update = () => {\n\t\t\t\t\tactive$.set(getCheckValue(active));\n\t\t\t\t\tvisible$.set(getCheckValue(visible));\n\t\t\t\t};\n\n\t\t\t\tupdate();\n\n\t\t\t\tconst onSelectGuarded = onSelect || noop;\n\t\t\t\tconst onSelectWrapped = () => {\n\t\t\t\t\tonSelectGuarded({\n\t\t\t\t\t\trecompute: update,\n\t\t\t\t\t});\n\t\t\t\t};\n\n\t\t\t\tconst imageValue = image ? unwrapImageAsset(image) : '';\n\n\t\t\t\treturn [templateReplace(content, data), active$, visible$, onSelectWrapped, imageValue] as [\n\t\t\t\t\tstring,\n\t\t\t\t\tStored<boolean>,\n\t\t\t\t\tStored<boolean>,\n\t\t\t\t\t() => void,\n\t\t\t\t\tstring,\n\t\t\t\t];\n\t\t\t});\n\n\t\t\tif (DEV && transformedChoices.length === 0) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Running choice without variants to choose from, look at how to use Choice action properly [https://novely.pages.dev/guide/actions/choice#usage]`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tctx.clearBlockingActions('choice');\n\n\t\t\tctx.choices(templateReplace(question, data), transformedChoices, (selected) => {\n\t\t\t\tif (!ctx.meta.preview) {\n\t\t\t\t\tenmemory(ctx);\n\t\t\t\t}\n\n\t\t\t\tconst stack = useStack(ctx);\n\n\t\t\t\t/**\n\t\t\t\t * If there is a question, then `index` should be shifted by `1`\n\t\t\t\t */\n\t\t\t\tconst offset = isWithoutQuestion ? 0 : 1;\n\n\t\t\t\tif (DEV && !transformedChoices[selected]) {\n\t\t\t\t\tthrow new Error('Choice children is empty, either add content there or make item not selectable');\n\t\t\t\t}\n\n\t\t\t\tstack.value[0].push(['choice', selected + offset], [null, 0]);\n\t\t\t\trender(ctx);\n\t\t\t\tinteractivity(true);\n\t\t\t});\n\t\t},\n\t\tjump({ ctx, data }, [scene]) {\n\t\t\tconst stack = useStack(ctx);\n\n\t\t\t/**\n\t\t\t * `-1` index is used here because `clear` will run `next` that will increase index to `0`\n\t\t\t */\n\t\t\tstack.value[0] = [\n\t\t\t\t['jump', scene],\n\t\t\t\t[null, -1],\n\t\t\t];\n\n\t\t\tstack.value[3] = [];\n\n\t\t\tmatch('clear', [], {\n\t\t\t\tctx,\n\t\t\t\tdata,\n\t\t\t});\n\t\t},\n\t\tclear({ ctx, push }, [keep, characters, audio]) {\n\t\t\t/**\n\t\t\t * Remove vibration\n\t\t\t */\n\t\t\tctx.vibrate(0);\n\n\t\t\t/**\n\t\t\t * Call the actual `clear`\n\t\t\t */\n\t\t\tctx.clear(\n\t\t\t\tkeep || EMPTY_SET,\n\t\t\t\tcharacters || EMPTY_SET,\n\t\t\t\taudio || { music: EMPTY_SET, sounds: EMPTY_SET },\n\t\t\t\tpush,\n\t\t\t);\n\t\t},\n\t\tcondition({ ctx, data }, [condition, variants]) {\n\t\t\tif (DEV && Object.values(variants).length === 0) {\n\t\t\t\tthrow new Error(`Attempt to use Condition action with empty variants object`);\n\t\t\t}\n\n\t\t\tif (!ctx.meta.restoring) {\n\t\t\t\tconst val = String(condition(data));\n\n\t\t\t\tif (DEV && !variants[val]) {\n\t\t\t\t\tthrow new Error(`Attempt to go to unknown variant \"${val}\"`);\n\t\t\t\t}\n\n\t\t\t\tif (DEV && variants[val].length === 0) {\n\t\t\t\t\tthrow new Error(`Attempt to go to empty variant \"${val}\"`);\n\t\t\t\t}\n\n\t\t\t\tconst stack = useStack(ctx);\n\n\t\t\t\tstack.value[0].push(['condition', val], [null, 0]);\n\n\t\t\t\trender(ctx);\n\t\t\t}\n\t\t},\n\t\tend({ ctx }) {\n\t\t\tif (ctx.meta.preview) return;\n\n\t\t\texit(true, false);\n\t\t},\n\t\tinput({ ctx, data, forward }, [question, onInput, setup]) {\n\t\t\tctx.clearBlockingActions('input');\n\n\t\t\tctx.input(templateReplace(question, data), onInput, setup || noop, forward);\n\t\t},\n\t\tcustom({ ctx, push }, [fn]) {\n\t\t\tif (fn.requireUserAction) {\n\t\t\t\tctx.clearBlockingActions(undefined);\n\t\t\t}\n\n\t\t\tconst state = getStateFunction(ctx);\n\t\t\tconst lang = getLanguageFromStore(storageData);\n\n\t\t\tconst result = handleCustomAction(ctx, fn, {\n\t\t\t\t...ctx.custom(fn),\n\t\t\t\tstate,\n\t\t\t\tlang,\n\t\t\t\tgetStack: useStack,\n\t\t\t\tpaused,\n\t\t\t\ttemplateReplace,\n\t\t\t});\n\n\t\t\tconst next = () => {\n\t\t\t\tif (fn.requireUserAction && !ctx.meta.preview) {\n\t\t\t\t\tenmemory(ctx);\n\t\t\t\t\tinteractivity(true);\n\t\t\t\t}\n\n\t\t\t\tpush();\n\t\t\t};\n\n\t\t\tif (!ctx.meta.restoring || ctx.meta.goingBack) {\n\t\t\t\tif (isPromise(result)) {\n\t\t\t\t\tresult.then(next);\n\t\t\t\t} else {\n\t\t\t\t\tnext();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\t\tvibrate({ ctx, push }, pattern) {\n\t\t\tctx.vibrate(pattern);\n\t\t\tpush();\n\t\t},\n\t\tnext({ push }) {\n\t\t\tpush();\n\t\t},\n\t\tanimateCharacter({ ctx, push }, [character, className]) {\n\t\t\tconst classes = className.split(' ');\n\n\t\t\tif (DEV && classes.length === 0) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Attempt to use AnimateCharacter without classes. Classes should be provided [https://novely.pages.dev/guide/actions/animateCharacter.html]',\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (ctx.meta.preview) return;\n\n\t\t\tctx.character(character).animate(classes);\n\n\t\t\tpush();\n\t\t},\n\t\ttext({ ctx, data, forward }, text) {\n\t\t\tconst string = text.map((content) => templateReplace(content, data)).join(' ');\n\n\t\t\tif (DEV && string.length === 0) {\n\t\t\t\tthrow new Error(`Action Text was called with empty string or array`);\n\t\t\t}\n\n\t\t\tctx.clearBlockingActions('text');\n\n\t\t\tctx.text(string, forward);\n\t\t},\n\t\tasync exit({ ctx, data }) {\n\t\t\tif (ctx.meta.restoring) return;\n\n\t\t\tconst { exitImpossible } = await exitPath({\n\t\t\t\tpath: useStack(ctx).value[0],\n\t\t\t\trefer: referGuarded,\n\t\t\t\tonExitImpossible: () => {\n\t\t\t\t\tmatch('end', [], {\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\tdata,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (exitImpossible) {\n\t\t\t\tctx.clearBlockingActions(undefined);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\trender(ctx);\n\t\t},\n\t\tpreload({ ctx, push }, [source]) {\n\t\t\tif (DEV && preloadAssets !== 'lazy') {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`You do not need a preload action because \"preloadAssets\" strategy was set to \"${preloadAssets}\"`,\n\t\t\t\t);\n\n\t\t\t\tpush();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst src = unwrapAsset(source);\n\n\t\t\tif (!ctx.meta.goingBack && !ctx.meta.restoring && !PRELOADED_ASSETS.has(src)) {\n\t\t\t\tconst process = async () => {\n\t\t\t\t\tconst type = isAsset(source) ? source.type : await getResourseTypeWrapper(src);\n\n\t\t\t\t\tif (type === 'image') {\n\t\t\t\t\t\trenderer.misc.preloadAudioBlocking(src);\n\t\t\t\t\t} else if (type === 'audio') {\n\t\t\t\t\t\trenderer.misc.preloadImage(src);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (DEV) {\n\t\t\t\t\t\t\tconsole.error(`Preload error: Unknown type of the following resource: `, source);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Add to preloaded before it was loaded to prevent downloading multiple times\n\t\t\t\t\tPRELOADED_ASSETS.add(src);\n\t\t\t\t};\n\n\t\t\t\tprocess();\n\t\t\t}\n\n\t\t\tpush();\n\t\t},\n\t\tblock({ ctx }, [scene]) {\n\t\t\tif (DEV && !story[scene]) {\n\t\t\t\tthrow new Error(`Attempt to call Block action with unknown scene \"${scene}\"`);\n\t\t\t}\n\n\t\t\tif (DEV && story[scene].length === 0) {\n\t\t\t\tthrow new Error(`Attempt to call Block action with empty scene \"${scene}\"`);\n\t\t\t}\n\n\t\t\tif (!ctx.meta.restoring) {\n\t\t\t\tconst stack = useStack(ctx);\n\n\t\t\t\tstack.value[0].push(['block', scene], [null, 0]);\n\n\t\t\t\trender(ctx);\n\t\t\t}\n\t\t},\n\t});\n\t// #endregion\n\n\t// #region Action\n\tconst action = buildActionObject({\n\t\trendererActions: renderer.actions,\n\t\tnativeActions,\n\t\tcharacters,\n\t});\n\t// #endregion\n\n\t// #region Render Function\n\tconst render = async (ctx: Context) => {\n\t\tconst stack = useStack(ctx);\n\t\tconst [path, state] = stack.value;\n\n\t\tconst { found, value } = await refer(path);\n\n\t\tif (found) {\n\t\t\tctx.loading(true);\n\t\t}\n\n\t\tconst referred = await value;\n\n\t\tif (found) {\n\t\t\tctx.loading(false);\n\t\t}\n\n\t\tif (isAction(referred)) {\n\t\t\tconst [action, ...props] = referred;\n\n\t\t\tmatch(action, props, {\n\t\t\t\tctx,\n\t\t\t\tdata: state,\n\t\t\t});\n\t\t} else if (Object.values(story).some((branch) => branch === referred)) {\n\t\t\t/**\n\t\t\t * Developer might not write the end action on their own, so we will catch situation when there are no other options than end the game.\n\t\t\t *\n\t\t\t * There are three options right now.\n\t\t\t * - We've got to the action — gonna render it\n\t\t\t * - We've got `undefined`. This means we are tried to go forward, but story array ended already, so we are gonna run exit\n\t\t\t * - We've got branch of story object. This means we exitied from where it's possible to exit and now we can only end the game\n\t\t\t */\n\t\t\tmatch('end', [], {\n\t\t\t\tctx,\n\t\t\t\tdata: state,\n\t\t\t});\n\t\t} else {\n\t\t\tmatch('exit', [], {\n\t\t\t\tctx,\n\t\t\t\tdata: state,\n\t\t\t});\n\t\t}\n\t};\n\t// #endregion\n\n\tconst interactivity = (value = false) => {\n\t\tinteracted = value ? interacted + 1 : 0;\n\t};\n\n\t/**\n\t * Replaces content inside of {{braces}}.\n\t */\n\tconst templateReplace = (content: TextContent<$Language, Data>, values?: Data) => {\n\t\tconst {\n\t\t\tdata,\n\t\t\tmeta: [lang],\n\t\t} = storageData.get();\n\n\t\t// Object to take values from\n\t\tconst obj = values || data;\n\n\t\t// String\n\t\tconst str = flattenAllowedContent(!isFunction(content) && !isString(content) ? content[lang] : content, obj);\n\n\t\tconst t = translation[lang];\n\t\tconst pluralRules = (t.plural || t.actions) && new Intl.PluralRules(t.tag || lang);\n\n\t\treturn replaceTranslation(str, obj, t.plural, t.actions, pluralRules);\n\t};\n\n\tconst data = ((value) => {\n\t\tconst _data = storageData.get().data;\n\n\t\tif (!value) return _data;\n\n\t\tconst val = isFunction(value) ? value(_data) : deepmerge(_data, value as $Data);\n\n\t\tstorageData.update((prev) => {\n\t\t\tprev.data = val;\n\n\t\t\treturn prev;\n\t\t});\n\n\t\treturn undefined;\n\t}) as StateFunction<$Data>;\n\n\tconst getCurrentStorageData = () => {\n\t\treturn coreData.get().dataLoaded ? clone(storageData.get()) : null;\n\t};\n\n\tconst setStorageData = (data: StorageData<$Language, $Data>) => {\n\t\tif (destroyed) {\n\t\t\tif (DEV) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`function \\`setStorageData\\` was called after novely instance was destroyed. Data is not updater nor synced after destroy.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tstorageData.set(data);\n\t};\n\n\t// #region Function Return\n\treturn {\n\t\t/**\n\t\t * Function to set game script\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * engine.script({\n\t\t * start: [\n\t\t * action.function(() => {})\n\t\t * ]\n\t\t * })\n\t\t * ```\n\t\t */\n\t\tscript,\n\t\t/**\n\t\t * Get actions\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * engine.script({\n\t\t * start: [\n\t\t * action.function(() => {})\n\t\t * ]\n\t\t * })\n\t\t * ```\n\t\t */\n\t\taction: action as Actions,\n\t\t/**\n\t\t * State bound to `$MAIN` game context\n\t\t * @deprecated Use `state` function provided from action arguments\n\t\t */\n\t\tstate: getStateFunction(MAIN_CONTEXT_KEY),\n\t\t/**\n\t\t * Store data between games\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * engine.script({\n\t\t * start: [\n\t\t * action.function(() => {\n\t\t * // Paid content should be purchased only once\n\t\t * // So it will be available in any save\n\t\t * data({ paid_content_purchased: true })\n\t\t * })\n\t\t * ]\n\t\t * })\n\t\t * ```\n\t\t */\n\t\tdata,\n\t\t/**\n\t\t * Used in combination with type utilities\n\t\t * @example\n\t\t * ```ts\n\t\t * import type { TypesFromEngine, ConditionParams, StateFunction } from '@novely/core';\n\t\t *\n\t\t * type Types = TypesFromEngine<typeof engine>;\n\t\t *\n\t\t * const conditionCheck = (state: StateFunction<ConditionParams<Types>>) => {\n\t\t * return state.age >= 18;\n\t\t * }\n\t\t * ```\n\t\t */\n\t\ttypes: null as EngineTypes<$Language, $State, $Data, $Characters> | null,\n\t\t/**\n\t\t * Replaces content inside {{braces}} using global data\n\t\t * @example\n\t\t * ```ts\n\t\t * data({ name: 'Alexei' })\n\t\t *\n\t\t * templateReplace('{{name}} is our hero')\n\t\t * templateReplace({\n\t\t * en: (data) => 'Hello, ' + data.name\n\t\t * })\n\t\t * ```\n\t\t */\n\t\ttemplateReplace(content: TextContent<$Language, $Data>) {\n\t\t\treturn templateReplace(content as TextContent<$Language, Data>);\n\t\t},\n\t\t/**\n\t\t * Same as `templateReplace` but uses state and requires explicitly providing it\n\t\t */\n\t\ttemplateReplaceState(content: TextContent<$Language, $State>, state: State) {\n\t\t\treturn templateReplace(content as TextContent<$Language, State>, state);\n\t\t},\n\t\t/**\n\t\t * Cancel data loading, hide UI, ignore page change events\n\t\t * Data updates still will work in case Novely already was loaded\n\t\t */\n\t\tdestroy() {\n\t\t\tif (destroyed) return;\n\n\t\t\tdataLoaded.cancel();\n\n\t\t\tUIInstance.unmount();\n\n\t\t\tremoveEventListener('beforeunload', throttledShortOnStorageDataChange);\n\n\t\t\tdestroyed = true;\n\t\t},\n\t\t/**\n\t\t * Funtion to get current storage data\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * const currentStorageData = engine.getCurrentStorageData();\n\t\t * ```\n\t\t */\n\t\tgetCurrentStorageData,\n\t\t/**\n\t\t * Function to set storage data. Using this function is not recommended.\n\t\t *\n\t\t * @deprecated\n\t\t * @example\n\t\t * ```ts\n\t\t * const currentStorageData = engine.getCurrentStorageData();\n\t\t *\n\t\t * if (currentStorageData) {\n\t\t * // update music volume\n\t\t * currentStorageData.meta[2] = 1;\n\t\t *\n\t\t * setStorageData(currentStorageData)\n\t\t * }\n\t\t * ```\n\t\t */\n\t\tsetStorageData,\n\t\t/**\n\t\t * Function to control paused state. Custom Actions are provided with `paused` store they can subscribe to.\n\t\t * This function will notify Custom Actions. Pause state can be used when showing ads.\n\t\t * @example\n\t\t * ```ts\n\t\t * sdk.on('pause' () => engine.setPaused(true));\n\t\t * sdk.on('resume', () => engine.setPaused(false));\n\t\t * ```\n\t\t */\n\t\tsetPaused: (paused: boolean) => {\n\t\t\tcoreData.update((prev) => {\n\t\t\t\tprev.paused = paused;\n\n\t\t\t\treturn prev;\n\t\t\t});\n\t\t},\n\t\t/**\n\t\t * Function to control focused state. It will affect `paused` store passed to Custom Actions.\n\t\t * This function can be used to pause game when it's not focused.\n\t\t * @example\n\t\t * ```ts\n\t\t * import { pauseOnBlur } from '@novely/core';\n\t\t *\n\t\t * // Will subscribe to blur/focus events and call `setFocused`\n\t\t * pauseOnBlur(engine);\n\t\t *\n\t\t * // OR\n\t\t *\n\t\t * sdk.on('focus' () => engine.setFocused(true));\n\t\t * sdk.on('blur', () => engine.setFocused(false));\n\t\t * ```\n\t\t */\n\t\tsetFocused: (focused: boolean) => {\n\t\t\tcoreData.update((prev) => {\n\t\t\t\tprev.focused = focused;\n\n\t\t\t\treturn prev;\n\t\t\t});\n\t\t},\n\t};\n\t// #endregion\n};\n\nexport { novely };\n","function set(obj, key, val) {\n\tif (typeof val.value === 'object') val.value = klona(val.value);\n\tif (!val.enumerable || val.get || val.set || !val.configurable || !val.writable || key === '__proto__') {\n\t\tObject.defineProperty(obj, key, val);\n\t} else obj[key] = val.value;\n}\n\nexport function klona(x) {\n\tif (typeof x !== 'object') return x;\n\n\tvar i=0, k, list, tmp, str=Object.prototype.toString.call(x);\n\n\tif (str === '[object Object]') {\n\t\ttmp = Object.create(x.__proto__ || null);\n\t} else if (str === '[object Array]') {\n\t\ttmp = Array(x.length);\n\t} else if (str === '[object Set]') {\n\t\ttmp = new Set;\n\t\tx.forEach(function (val) {\n\t\t\ttmp.add(klona(val));\n\t\t});\n\t} else if (str === '[object Map]') {\n\t\ttmp = new Map;\n\t\tx.forEach(function (val, key) {\n\t\t\ttmp.set(klona(key), klona(val));\n\t\t});\n\t} else if (str === '[object Date]') {\n\t\ttmp = new Date(+x);\n\t} else if (str === '[object RegExp]') {\n\t\ttmp = new RegExp(x.source, x.flags);\n\t} else if (str === '[object DataView]') {\n\t\ttmp = new x.constructor( klona(x.buffer) );\n\t} else if (str === '[object ArrayBuffer]') {\n\t\ttmp = x.slice(0);\n\t} else if (str.slice(-6) === 'Array]') {\n\t\t// ArrayBuffer.isView(x)\n\t\t// ~> `new` bcuz `Buffer.slice` => ref\n\t\ttmp = new x.constructor(x);\n\t}\n\n\tif (tmp) {\n\t\tfor (list=Object.getOwnPropertySymbols(x); i < list.length; i++) {\n\t\t\tset(tmp, list[i], Object.getOwnPropertyDescriptor(x, list[i]));\n\t\t}\n\n\t\tfor (i=0, list=Object.getOwnPropertyNames(x); i < list.length; i++) {\n\t\t\tif (Object.hasOwnProperty.call(tmp, k=list[i]) && tmp[k] === x[k]) continue;\n\t\t\tset(tmp, k, Object.getOwnPropertyDescriptor(x, k));\n\t\t}\n\t}\n\n\treturn tmp || x;\n}\n","import type { TypewriterSpeed } from './types';\n\nconst SKIPPED_DURING_RESTORE = new Set(['dialog', 'choice', 'input', 'vibrate', 'text'] as const);\n\nconst BLOCK_EXIT_STATEMENTS = new Set(['choice:exit', 'condition:exit', 'block:exit'] as const);\n\nconst BLOCK_STATEMENTS = new Set(['choice', 'condition', 'block'] as const);\n\nconst AUDIO_ACTIONS = new Set(['playMusic', 'stopMusic', 'playSound', 'stopSound', 'voice', 'stopVoice'] as const);\n\nconst EMPTY_SET = new Set<any>();\n\nconst DEFAULT_TYPEWRITER_SPEED: TypewriterSpeed = 'Medium';\n\nconst HOWLER_SUPPORTED_FILE_FORMATS = new Set([\n\t'mp3',\n\t'mpeg',\n\t'opus',\n\t'ogg',\n\t'oga',\n\t'wav',\n\t'aac',\n\t'caf',\n\t'm4a',\n\t'm4b',\n\t'mp4',\n\t'weba',\n\t'webm',\n\t'dolby',\n\t'flac',\n] as const);\n\nconst SUPPORTED_IMAGE_FILE_FORMATS = new Set([\n\t'apng',\n\t'avif',\n\t'gif',\n\t'jpg',\n\t'jpeg',\n\t'jfif',\n\t'pjpeg',\n\t'pjp',\n\t'png',\n\t'svg',\n\t'webp',\n\t'bmp',\n] as const);\n\n/**\n * @internal\n */\nconst MAIN_CONTEXT_KEY = '$MAIN';\n\nexport {\n\tSKIPPED_DURING_RESTORE,\n\tEMPTY_SET,\n\tDEFAULT_TYPEWRITER_SPEED,\n\tBLOCK_EXIT_STATEMENTS,\n\tBLOCK_STATEMENTS,\n\tMAIN_CONTEXT_KEY,\n\tAUDIO_ACTIONS,\n\tHOWLER_SUPPORTED_FILE_FORMATS,\n\tSUPPORTED_IMAGE_FILE_FORMATS,\n};\n","import type { CustomActionHolder, CustomActionCleanupHolder } 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\n/**\n * @internal\n */\nconst CUSTOM_ACTION_CLEANUP_MAP = new Map<string, CustomActionCleanupHolder>();\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, CUSTOM_ACTION_CLEANUP_MAP };\n","import type { ValidAction, CustomHandler } from '../action';\nimport type { NovelyAsset } from '../types';\nimport { AUDIO_ACTIONS, BLOCK_EXIT_STATEMENTS, BLOCK_STATEMENTS, SKIPPED_DURING_RESTORE } from '../constants';\n\nconst isNumber = (val: unknown): val is number => {\n\treturn typeof val === 'number';\n};\n\nconst isNull = (val: unknown): val is null => {\n\treturn val === null;\n};\n\nconst isString = (val: unknown): val is string => {\n\treturn typeof val === 'string';\n};\n\nconst isFunction = (val: unknown): val is (...parameters: any[]) => any => {\n\treturn typeof val === 'function';\n};\n\nconst isPromise = (val: unknown): val is Promise<any> => {\n\treturn Boolean(val) && (typeof val === 'object' || isFunction(val)) && isFunction((val as any).then);\n};\n\nconst isEmpty = (val: unknown): val is Record<PropertyKey, never> => {\n\treturn typeof val === 'object' && !isNull(val) && Object.keys(val).length === 0;\n};\n\n/**\n * Checks if a given string starts with 'http', '/', '.', or 'data'\n */\nconst isCSSImageURL = (url: string): boolean => {\n\tconst startsWith = String.prototype.startsWith.bind(url);\n\n\treturn startsWith('http') || startsWith('/') || startsWith('.') || startsWith('data');\n};\n\n/**\n * Determines if a given action requires user interaction based on its type and metadata.\n */\nconst isUserRequiredAction = ([action, ...meta]: ValidAction) => {\n\treturn Boolean(action === 'custom' && meta[0] && (meta[0] as unknown as CustomHandler).requireUserAction);\n};\n\nconst isBlockStatement = (statement: unknown): statement is 'choice' | 'condition' | 'block' => {\n\treturn BLOCK_STATEMENTS.has(statement as any);\n};\n\nconst isBlockExitStatement = (\n\tstatement: unknown,\n): statement is 'choice:exit' | 'condition:exit' | 'block:exit' => {\n\treturn BLOCK_EXIT_STATEMENTS.has(statement as any);\n};\n\nconst isSkippedDuringRestore = (item: unknown): item is 'vibrate' | 'dialog' | 'input' | 'choice' | 'text' => {\n\treturn SKIPPED_DURING_RESTORE.has(item as any);\n};\n\ntype AudioActionName = 'playMusic' | 'stopMusic' | 'playSound' | 'stopSound' | 'voice' | 'stopVoice';\n\nconst isAudioAction = (action: unknown): action is AudioActionName => {\n\treturn AUDIO_ACTIONS.has(action as any);\n};\n\nconst isAction = (element: unknown): element is Exclude<ValidAction, ValidAction[]> => {\n\treturn Array.isArray(element) && isString(element[0]);\n};\n\nconst isImageAsset = (asset: unknown): asset is string => {\n\treturn isString(asset) && isCSSImageURL(asset);\n};\n\n/**\n * Is custom and requires user action or skipped during restoring\n */\nconst isBlockingAction = (action: Exclude<ValidAction, ValidAction[]>) => {\n\treturn isUserRequiredAction(action) || (isSkippedDuringRestore(action[0]) && action[0] !== 'vibrate');\n};\n\nconst isAsset = (suspect: unknown): suspect is NovelyAsset => {\n\treturn suspect !== null && typeof suspect === 'object' && 'source' in suspect && 'type' in suspect;\n};\n\nexport {\n\tisNumber,\n\tisNull,\n\tisString,\n\tisFunction,\n\tisPromise,\n\tisEmpty,\n\tisCSSImageURL,\n\tisUserRequiredAction,\n\tisBlockStatement,\n\tisBlockExitStatement,\n\tisSkippedDuringRestore,\n\tisAudioAction,\n\tisAction,\n\tisImageAsset,\n\tisBlockingAction,\n\tisAsset,\n};\n\nexport type { AudioActionName };\n","import type { CustomHandler, DefaultActionProxy } from '../action';\nimport type { Thenable, State } from '../types';\nimport type { Context } from '../renderer';\n\ntype MatchActionParams = {\n\tdata: State;\n\tctx: Context;\n\n\tpush: () => void;\n\tforward: () => void;\n};\n\ntype MatchActionMap = {\n\t[Key in keyof DefaultActionProxy]: (\n\t\tparams: MatchActionParams,\n\t\tdata: Parameters<DefaultActionProxy[Key]>,\n\t) => void;\n};\n\ntype MatchActionMapComplete = Omit<MatchActionMap, 'custom'> & {\n\tcustom: (params: MatchActionParams, value: [handler: CustomHandler]) => Thenable<void>;\n};\n\ntype MatchActionParameters = {\n\t/**\n\t * Name of context or context\n\t */\n\tctx: string | Context;\n\t/**\n\t * Data from the save\n\t */\n\tdata: State;\n};\n\ntype OnBeforeActionCallPayload = {\n\taction: keyof MatchActionMapComplete;\n\tprops: Parameters<DefaultActionProxy[keyof MatchActionMapComplete]>;\n\tctx: Context;\n};\n\ntype MatchActionHandlers = {\n\tpush: (ctx: Context) => void;\n\tforward: (ctx: Context) => void;\n\n\tgetContext: (name: string) => Context;\n\n\tonBeforeActionCall: (payload: OnBeforeActionCallPayload) => void;\n};\n\nconst matchAction = (callbacks: MatchActionHandlers, values: MatchActionMapComplete) => {\n\tconst { getContext, onBeforeActionCall, push, forward } = callbacks;\n\n\tconst match = (action: keyof MatchActionMapComplete, props: any, { ctx, data }: MatchActionParameters) => {\n\t\tconst context = typeof ctx === 'string' ? getContext(ctx) : ctx;\n\n\t\tonBeforeActionCall({\n\t\t\taction,\n\t\t\tprops,\n\t\t\tctx: context,\n\t\t});\n\n\t\treturn values[action](\n\t\t\t{\n\t\t\t\tctx: context,\n\t\t\t\tdata,\n\n\t\t\t\tpush() {\n\t\t\t\t\tif (context.meta.preview) return;\n\n\t\t\t\t\tpush(context);\n\t\t\t\t},\n\t\t\t\tforward() {\n\t\t\t\t\tif (context.meta.preview) return;\n\n\t\t\t\t\tforward(context);\n\t\t\t\t},\n\t\t\t},\n\t\t\tprops,\n\t\t);\n\t};\n\n\treturn {\n\t\tmatch,\n\t\tnativeActions: Object.keys(values),\n\t};\n};\n\nexport { matchAction };\nexport type { MatchActionHandlers, MatchActionMapComplete };\n","import { memoize, once } from 'es-toolkit/function';\nimport { DEV } from 'esm-env';\nimport { supportsMap as audioSupport } from './audio-codecs';\nimport { HOWLER_SUPPORTED_FILE_FORMATS, SUPPORTED_IMAGE_FILE_FORMATS } from './constants';\nimport { supportsMap as imageSupport } from './image-formats';\nimport type { NovelyAsset } from './types';\nimport { getUrlFileExtension, isAsset } from './utilities';\n\nconst generateRandomId = () => Math.random().toString(36);\n\n/**\n * Function to get assets type. All assets must be of the same type. Only works with supported types.\n */\nconst getType = memoize(\n\t(extensions: string[]) => {\n\t\tif (extensions.every((extension) => HOWLER_SUPPORTED_FILE_FORMATS.has(extension as any))) {\n\t\t\treturn 'audio';\n\t\t}\n\n\t\tif (extensions.every((extension) => SUPPORTED_IMAGE_FILE_FORMATS.has(extension as any))) {\n\t\t\treturn 'image';\n\t\t}\n\n\t\tif (DEV) {\n\t\t\tthrow new Error(`Unsupported file extensions: ${JSON.stringify(extensions)}`);\n\t\t}\n\n\t\tthrow extensions;\n\t},\n\t{\n\t\tgetCacheKey: (extensions) => extensions.join('~'),\n\t},\n);\n\nconst SUPPORT_MAPS = {\n\timage: imageSupport,\n\taudio: audioSupport,\n} as const;\n\n/**\n * This function uses array instead of spread because memoize only works with first argument\n */\nconst assetPrivate = memoize(\n\t(variants: string[]): NovelyAsset => {\n\t\tif (DEV && variants.length === 0) {\n\t\t\tthrow new Error(`Attempt to use \"asset\" function without arguments`);\n\t\t}\n\n\t\tconst map: Record<string, string> = {};\n\t\tconst extensions: string[] = [];\n\n\t\tfor (const v of variants) {\n\t\t\tconst e = getUrlFileExtension(v);\n\n\t\t\tmap[e] = v;\n\t\t\textensions.push(e);\n\t\t}\n\n\t\tconst type = getType(extensions);\n\n\t\tconst getSource = once(() => {\n\t\t\tconst support = SUPPORT_MAPS[type];\n\n\t\t\tfor (const extension of extensions) {\n\t\t\t\tif (extension in support) {\n\t\t\t\t\tif (support[extension as keyof typeof support]) {\n\t\t\t\t\t\treturn map[extension];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\treturn map[extension];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (DEV) {\n\t\t\t\tthrow new Error(`No matching asset was found for ${variants.map((v) => `\"${v}\"`).join(', ')}`);\n\t\t\t}\n\n\t\t\treturn '';\n\t\t});\n\n\t\treturn {\n\t\t\tget source() {\n\t\t\t\treturn getSource();\n\t\t\t},\n\t\t\tget type() {\n\t\t\t\treturn type;\n\t\t\t},\n\t\t\tid: generateRandomId(),\n\t\t};\n\t},\n\t{\n\t\tgetCacheKey: (variants) => variants.join('~'),\n\t},\n);\n\n/**\n * Memoizes and returns an asset selection object based on provided file variants.\n * The selected asset depends on the client's support for various formats.\n *\n * @param {...string} variants - A variable number of strings, each representing a potential asset file URL.\n * @returns {NovelyAsset} An object representing the selected asset with `source` and `type` properties.\n *\n * @throws {Error} If in DEV mode and no arguments are provided.\n * @example\n * ```\n * import { asset } from 'novely';\n *\n * // Passed first have higher priority\n * const classroom = asset(\n * 'classroom.avif',\n * 'classroom.webp',\n * 'classroom.jpeg'\n * );\n *\n * setTimeout(() => {\n * console.log(classroom.source);\n * }, 100);\n * ```\n */\nconst asset = (...variants: string[]) => {\n\treturn assetPrivate(variants);\n};\n\nasset.image = (source: string): NovelyAsset => {\n\tif (assetPrivate.cache.has(source)) {\n\t\treturn assetPrivate.cache.get(source)!;\n\t}\n\n\tconst asset = {\n\t\ttype: 'image',\n\t\tsource,\n\t\tid: generateRandomId(),\n\t} as NovelyAsset;\n\n\tassetPrivate.cache.set(source, asset);\n\n\treturn asset;\n};\n\nasset.audio = (source: string): NovelyAsset => {\n\tif (assetPrivate.cache.has(source)) {\n\t\treturn assetPrivate.cache.get(source)!;\n\t}\n\n\tconst asset = {\n\t\ttype: 'audio',\n\t\tsource,\n\t\tid: generateRandomId(),\n\t} as NovelyAsset;\n\n\tassetPrivate.cache.set(source, asset);\n\n\treturn asset;\n};\n\nconst unwrapAsset = (asset: string | NovelyAsset) => {\n\treturn isAsset(asset) ? asset.source : asset;\n};\n\nconst unwrapAudioAsset = (asset: string | NovelyAsset) => {\n\tif (DEV && isAsset(asset) && asset.type !== 'audio') {\n\t\tthrow new Error('Attempt to use non-audio asset in audio action', { cause: asset });\n\t}\n\n\treturn unwrapAsset(asset);\n};\n\nconst unwrapImageAsset = (asset: string | NovelyAsset) => {\n\tif (DEV && isAsset(asset) && asset.type !== 'image') {\n\t\tthrow new Error('Attempt to use non-image asset in action that requires image assets', { cause: asset });\n\t}\n\n\treturn unwrapAsset(asset);\n};\n\nexport { asset, unwrapAsset, unwrapAudioAsset, unwrapImageAsset };\n","/**\n * This code is adapted from the Howler.js source code.\n * Howler.js: https://github.com/goldfire/howler.js\n */\n\n/**\n * I guess some browsers will return \"no\". So it's better to be safe\n */\nconst cut = (str: CanPlayTypeResult | 'no') => str.replace(/^no$/, '');\n\nconst audio = new Audio();\n\nconst canPlay = (type: string) => !!cut(audio.canPlayType(type));\nconst canPlayMultiple = (...types: string[]) => types.some((type) => canPlay(type));\n\nconst supportsMap = {\n\tmp3: canPlayMultiple('audio/mpeg;', 'audio/mp3;'),\n\tmpeg: canPlay('audio/mpeg;'),\n\topus: canPlay('audio/ogg; codecs=\"opus\"'),\n\togg: canPlay('audio/ogg; codecs=\"vorbis\"'),\n\toga: canPlay('audio/ogg; codecs=\"vorbis\"'),\n\twav: canPlayMultiple('audio/wav; codecs=\"1\"', 'audio/wav;'),\n\taac: canPlay('audio/aac;'),\n\tcaf: canPlay('audio/x-caf;'),\n\tm4a: canPlayMultiple('audio/x-m4a;', 'audio/m4a;', 'audio/aac;'),\n\tm4b: canPlayMultiple('audio/x-m4b;', 'audio/m4b;', 'audio/aac;'),\n\tmp4: canPlayMultiple('audio/x-mp4;', 'audio/mp4;', 'audio/aac;'),\n\tweba: canPlay('audio/webm; codecs=\"vorbis\"'),\n\twebm: canPlay('audio/webm; codecs=\"vorbis\"'),\n\tdolby: canPlay('audio/mp4; codecs=\"ec-3\"'),\n\tflac: canPlayMultiple('audio/x-flac;', 'audio/flac;'),\n};\n\nexport { supportsMap };\n","const avif =\n\t'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAAB0AAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAIAAAACAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQ0MAAAAABNjb2xybmNseAACAAIAAYAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAACVtZGF0EgAKCBgANogQEAwgMg8f8D///8WfhwB8+ErK42A=';\nconst jxl =\n\t'data:image/jxl;base64,/woIAAAMABKIAgC4AF3lEgAAFSqjjBu8nOv58kOHxbSN6wxttW1hSaLIODZJJ3BIEkkaoCUzGM6qJAE=';\nconst webp =\n\t'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA';\n\nconst supportsFormat = (source: string) => {\n\tconst { promise, resolve } = Promise.withResolvers<boolean>();\n\n\tconst img = Object.assign(document.createElement('img'), {\n\t\tsrc: source,\n\t});\n\n\timg.onload = img.onerror = () => {\n\t\tresolve(img.height === 2);\n\t};\n\n\treturn promise;\n};\n\nconst supportsMap = {\n\tavif: false,\n\tjxl: false,\n\twebp: false,\n};\n\nconst formatsMap = {\n\tavif,\n\tjxl,\n\twebp,\n} as const;\n\nconst loadImageFormatsSupport = async () => {\n\tconst promises = [];\n\n\tfor (const [format, source] of Object.entries(formatsMap)) {\n\t\tconst promise = supportsFormat(source).then((supported) => {\n\t\t\tsupportsMap[format as keyof typeof supportsMap] = supported;\n\t\t});\n\n\t\tpromises.push(promise);\n\t}\n\n\tawait Promise.all(promises);\n};\n\nloadImageFormatsSupport();\n\nexport { supportsMap };\n","import type { Story, ValidAction, CustomHandler, GetActionParameters } from '../action';\nimport type { CloneFN, Path, PathItem, Thenable } from '../types';\nimport type { NovelyAsset } from '../types';\nimport {\n\tisNull,\n\tisNumber,\n\tisAction,\n\tisSkippedDuringRestore,\n\tisUserRequiredAction,\n\tisPromise,\n\tisBlockExitStatement,\n\tisBlockStatement,\n\tisBlockingAction,\n} from './assertions';\nimport { unwrapAsset } from '../asset';\nimport { DEV } from 'esm-env';\n\n// #region Is Exit Impossible\nconst isExitImpossible = (path: Path) => {\n\tconst blockStatements = path.filter(([item]) => isBlockStatement(item));\n\tconst blockExitStatements = path.filter(([item]) => isBlockExitStatement(item));\n\n\t/**\n\t * There were no blocks nor exits from blocks\n\t */\n\tif (blockStatements.length === 0 && blockExitStatements.length === 0) {\n\t\treturn true;\n\t}\n\n\t/**\n\t * There is block that can be exited\n\t */\n\tif (blockStatements.length > blockExitStatements.length) {\n\t\treturn false;\n\t}\n\n\treturn !blockExitStatements.every(([name], i) => name && name.startsWith(blockStatements[i][0]!));\n};\n// #endregion\n\n// #region Refer\ntype CreateReferFunctionParams = {\n\tstory: Story;\n\tonUnknownSceneHit: (scene: string) => Thenable<void>;\n};\n\nconst createReferFunction = ({ story, onUnknownSceneHit }: CreateReferFunctionParams) => {\n\tconst refer = async (path: Path) => {\n\t\t/**\n\t\t * Are we ready to return a value.\n\t\t * We need to know are there any \"unknown\" scenes or not\n\t\t */\n\t\tconst { promise: ready, resolve: setReady } = Promise.withResolvers<boolean>();\n\n\t\tlet current: any = story;\n\t\tlet precurrent: any = story;\n\n\t\tconst blocks: any[] = [];\n\n\t\tconst refer = async () => {\n\t\t\tfor (const [type, val] of path) {\n\t\t\t\tif (type === 'jump') {\n\t\t\t\t\tif (!current[val]) {\n\t\t\t\t\t\tsetReady(true);\n\t\t\t\t\t\tawait onUnknownSceneHit(val);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (DEV && !story[val]) {\n\t\t\t\t\t\tthrow new Error(`Attempt to jump to unknown scene \"${val}\"`);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (DEV && story[val].length === 0) {\n\t\t\t\t\t\tthrow new Error(`Attempt to jump to empty scene \"${val}\"`);\n\t\t\t\t\t}\n\n\t\t\t\t\tprecurrent = story;\n\t\t\t\t\tcurrent = current[val];\n\t\t\t\t} else if (type === null) {\n\t\t\t\t\tprecurrent = current;\n\t\t\t\t\tcurrent = current[val];\n\t\t\t\t} else if (type === 'choice') {\n\t\t\t\t\tblocks.push(precurrent);\n\t\t\t\t\tcurrent = current[(val as number) + 1][1];\n\t\t\t\t} else if (type === 'condition') {\n\t\t\t\t\tblocks.push(precurrent);\n\t\t\t\t\tcurrent = current[2][val];\n\t\t\t\t} else if (type === 'block') {\n\t\t\t\t\tblocks.push(precurrent);\n\t\t\t\t\tcurrent = story[val];\n\t\t\t\t} else if (type === 'block:exit' || type === 'choice:exit' || type === 'condition:exit') {\n\t\t\t\t\tcurrent = blocks.pop();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsetReady(false);\n\n\t\t\treturn current as Exclude<ValidAction, ValidAction[]>;\n\t\t};\n\n\t\tconst value = refer();\n\t\tconst found = await ready;\n\n\t\treturn {\n\t\t\tfound,\n\t\t\tvalue,\n\t\t};\n\t};\n\n\tconst referGuarded = async (path: Path) => {\n\t\treturn await (await refer(path)).value;\n\t};\n\n\treturn {\n\t\trefer,\n\t\treferGuarded,\n\t};\n};\n\ntype GuardedReferFunction = ReturnType<typeof createReferFunction>['referGuarded'];\n\n// #endregion\n\ntype ExitPathConfig = {\n\tpath: Path;\n\trefer: GuardedReferFunction;\n\n\tonExitImpossible?: () => void;\n};\n\n// #region Exit Path\nconst exitPath = async ({ path, refer, onExitImpossible }: ExitPathConfig) => {\n\tconst last = path.at(-1);\n\tconst ignore: ('choice:exit' | 'condition:exit' | 'block:exit')[] = [];\n\n\tlet wasExitImpossible = false;\n\n\t/**\n\t * - should be an array\n\t * - first element is action name\n\t */\n\tif (!isAction(await refer(path))) {\n\t\tif (last && isNull(last[0]) && isNumber(last[1])) {\n\t\t\tlast[1]--;\n\t\t} else {\n\t\t\tpath.pop();\n\t\t}\n\t}\n\n\tif (isExitImpossible(path)) {\n\t\tconst referred = await refer(path);\n\n\t\tif (isAction(referred) && isSkippedDuringRestore(referred[0])) {\n\t\t\tonExitImpossible?.();\n\t\t}\n\n\t\twasExitImpossible = true;\n\n\t\treturn {\n\t\t\texitImpossible: wasExitImpossible,\n\t\t};\n\t}\n\n\tfor (let i = path.length - 1; i > 0; i--) {\n\t\tconst [name] = path[i];\n\n\t\t/**\n\t\t * Remember already exited paths\n\t\t */\n\t\tif (isBlockExitStatement(name)) {\n\t\t\tignore.push(name);\n\t\t}\n\n\t\t/**\n\t\t * Ignore everything that we do not need there\n\t\t */\n\t\tif (!isBlockStatement(name)) continue;\n\n\t\t/**\n\t\t * When we found an already exited path we remove it from the list\n\t\t */\n\t\tif (ignore.at(-1)?.startsWith(name)) {\n\t\t\tignore.pop();\n\t\t\tcontinue;\n\t\t}\n\n\t\t/**\n\t\t * Exit from the path\n\t\t */\n\t\tpath.push([`${name}:exit`]);\n\n\t\tconst prev = findLastPathItemBeforeItemOfType(path.slice(0, i + 1), name);\n\n\t\t/**\n\t\t * When possible also go to the next action (or exit from one layer above)\n\t\t */\n\t\tif (prev) path.push([null, prev[1] + 1]);\n\n\t\t/**\n\t\t * If we added an `[null, int]` but it points not to action, then\n\t\t *\n\t\t * - remove that item\n\t\t * - close another block\n\t\t */\n\t\tif (!isAction(await refer(path))) {\n\t\t\tpath.pop();\n\t\t\tcontinue;\n\t\t}\n\n\t\tbreak;\n\t}\n\n\treturn {\n\t\texitImpossible: wasExitImpossible,\n\t};\n};\n// #endregion\n\n// #region Next Path\nconst nextPath = (path: Path) => {\n\t/**\n\t * Last path element\n\t */\n\tconst last = path.at(-1);\n\n\tif (last && (isNull(last[0]) || last[0] === 'jump') && isNumber(last[1])) {\n\t\tlast[1]++;\n\t} else {\n\t\tpath.push([null, 0]);\n\t}\n\n\treturn path;\n};\n// #endregion\n\n// #region Collect Actions Before Blocking Action\ntype CollectActionsBeforeBlockingActionOptions = {\n\tpath: Path;\n\trefer: GuardedReferFunction;\n\tclone: CloneFN;\n};\n\nconst collectActionsBeforeBlockingAction = async ({\n\tpath,\n\trefer,\n\tclone,\n}: CollectActionsBeforeBlockingActionOptions) => {\n\tconst collection: Exclude<ValidAction, ValidAction[]>[] = [];\n\n\tlet action = await refer(path);\n\n\twhile (true) {\n\t\tif (action == undefined) {\n\t\t\tconst { exitImpossible } = await exitPath({\n\t\t\t\tpath,\n\t\t\t\trefer,\n\t\t\t});\n\n\t\t\tif (exitImpossible) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!action) {\n\t\t\tbreak;\n\t\t}\n\n\t\tif (isBlockingAction(action)) {\n\t\t\tconst [name, ...props] = action;\n\n\t\t\tif (name === 'choice') {\n\t\t\t\tconst choiceProps = props as unknown as GetActionParameters<'Choice'>;\n\n\t\t\t\tfor (let i = 0; i < choiceProps.length; i++) {\n\t\t\t\t\tconst branchContent = choiceProps[i];\n\n\t\t\t\t\t/**\n\t\t\t\t\t * This is a title\n\t\t\t\t\t */\n\t\t\t\t\tif (!Array.isArray(branchContent)) continue;\n\n\t\t\t\t\tconst virtualPath = clone(path);\n\n\t\t\t\t\tvirtualPath.push(['choice', i], [null, 0]);\n\n\t\t\t\t\tconst innerActions = await collectActionsBeforeBlockingAction({\n\t\t\t\t\t\tpath: virtualPath,\n\t\t\t\t\t\trefer,\n\t\t\t\t\t\tclone,\n\t\t\t\t\t});\n\n\t\t\t\t\tcollection.push(...innerActions);\n\t\t\t\t}\n\t\t\t} else if (name === 'condition') {\n\t\t\t\tconst conditionProps = props as unknown as GetActionParameters<'Condition'>;\n\t\t\t\tconst conditions = Object.keys(conditionProps[1]);\n\n\t\t\t\tfor (const condition of conditions) {\n\t\t\t\t\tconst virtualPath = clone(path);\n\n\t\t\t\t\tvirtualPath.push(['condition', condition], [null, 0]);\n\n\t\t\t\t\tconst innerActions = await collectActionsBeforeBlockingAction({\n\t\t\t\t\t\tpath: virtualPath,\n\t\t\t\t\t\trefer,\n\t\t\t\t\t\tclone,\n\t\t\t\t\t});\n\n\t\t\t\t\tcollection.push(...innerActions);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\n\t\tcollection.push(action);\n\n\t\t/**\n\t\t * These special actions requires path change\n\t\t */\n\t\tif (action[0] === 'jump') {\n\t\t\tpath = [\n\t\t\t\t['jump', action[1]],\n\t\t\t\t[null, 0],\n\t\t\t];\n\t\t} else if (action[0] == 'block') {\n\t\t\tpath.push(['block', action[1]], [null, 0]);\n\t\t} else {\n\t\t\tnextPath(path);\n\t\t}\n\n\t\taction = await refer(path);\n\t}\n\n\treturn collection;\n};\n// #endregion\n\n// #region Find Last Path Item Before Item Of Type\nconst findLastPathItemBeforeItemOfType = (path: Path, name: PathItem[0]) => {\n\tconst item = path.findLast(([_name, _value], i, array) => {\n\t\tconst next = array[i + 1];\n\n\t\treturn isNull(_name) && isNumber(_value) && next != null && next[0] === name;\n\t});\n\n\treturn item as undefined | [null, number];\n};\n// #endregion\n\n// #region Get Opposite Action\nconst getOppositeAction = (action: 'showCharacter' | 'playSound' | 'playMusic' | 'voice' | any) => {\n\tconst MAP = {\n\t\tshowCharacter: 'hideCharacter',\n\t\tplaySound: 'stopSound',\n\t\tplayMusic: 'stopMusic',\n\t\tvoice: 'stopVoice',\n\t} as const;\n\n\treturn MAP[action as keyof typeof MAP];\n};\n// #endregion\n\n// #region Get Actions From Path\ntype GetActionsFromPathParams = {\n\t/**\n\t * A story object\n\t */\n\tstory: Story;\n\t/**\n\t * A path by that actions will be gathered\n\t */\n\tpath: Path;\n\t/**\n\t * true — actions that should be skipped would not be returned\n\t */\n\tfilter: boolean;\n\treferGuarded: GuardedReferFunction;\n};\n\nconst getActionsFromPath = async ({ story, path, filter, referGuarded }: GetActionsFromPathParams) => {\n\t/**\n\t * Current item in the story\n\t */\n\tlet current: any = story;\n\t/**\n\t * Previous `current` value\n\t */\n\tlet precurrent: any;\n\t/**\n\t * Should we ignore some actions\n\t */\n\tlet ignoreNestedBefore: null | PathItem[0] = null;\n\t/**\n\t * Current item of type `[null, int]`\n\t */\n\tlet index = 0;\n\t/**\n\t * Skipped action that should be preserved\n\t */\n\tlet skipPreserve: Exclude<ValidAction, ValidAction[]> | undefined = undefined;\n\t/**\n\t * Actions that are either considered user action or skipped during restore process\n\t */\n\tconst skip = new Set<Exclude<ValidAction, ValidAction[]>>();\n\n\t/**\n\t * Cound of items of type `[null, int]`\n\t */\n\tconst max = path.reduce((acc, [type, val]) => {\n\t\tif (isNull(type) && isNumber(val)) {\n\t\t\treturn acc + 1;\n\t\t}\n\n\t\treturn acc;\n\t}, 0);\n\n\tconst queue = [] as Exclude<ValidAction, ValidAction[]>[];\n\tconst blocks = [];\n\n\t// Will guard future usage\n\tawait referGuarded(path);\n\n\tfor (const [type, val] of path) {\n\t\tif (type === 'jump') {\n\t\t\tprecurrent = story;\n\t\t\tcurrent = current[val];\n\t\t} else if (type === null) {\n\t\t\tprecurrent = current;\n\n\t\t\tif (isNumber(val)) {\n\t\t\t\tindex++;\n\n\t\t\t\tlet startIndex = 0;\n\n\t\t\t\tif (ignoreNestedBefore) {\n\t\t\t\t\tconst prev = findLastPathItemBeforeItemOfType(path.slice(0, index), ignoreNestedBefore);\n\n\t\t\t\t\tif (prev) {\n\t\t\t\t\t\tstartIndex = prev[1];\n\t\t\t\t\t\tignoreNestedBefore = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * Запустим все экшены которые идут в `[null, int]` от `0` до `int`\n\t\t\t\t * Почему-то потребовалось изменить `<` на `<=`, чтобы последний action попадал сюда\n\t\t\t\t */\n\t\t\t\tfor (let i = startIndex; i <= val; i++) {\n\t\t\t\t\tconst item = current[i];\n\n\t\t\t\t\t/**\n\t\t\t\t\t * In case of broken save at least not throw\n\t\t\t\t\t * But is should not happen\n\t\t\t\t\t */\n\t\t\t\t\tif (!isAction(item)) continue;\n\n\t\t\t\t\tconst [action] = item;\n\n\t\t\t\t\tconst last = index === max && i === val;\n\t\t\t\t\tconst shouldSkip = isSkippedDuringRestore(action) || isUserRequiredAction(item);\n\n\t\t\t\t\tif (shouldSkip) {\n\t\t\t\t\t\tskip.add(item);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (shouldSkip && last) {\n\t\t\t\t\t\tskipPreserve = item;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (filter && shouldSkip && !last) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tqueue.push(item);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcurrent = current[val];\n\t\t} else if (type === 'choice') {\n\t\t\tblocks.push(precurrent);\n\t\t\tcurrent = current[val + 1][1];\n\t\t} else if (type === 'condition') {\n\t\t\tblocks.push(precurrent);\n\t\t\tcurrent = current[2][val];\n\t\t} else if (type === 'block') {\n\t\t\tblocks.push(precurrent);\n\t\t\tcurrent = story[val];\n\t\t} else if (type === 'block:exit' || type === 'choice:exit' || type === 'condition:exit') {\n\t\t\tcurrent = blocks.pop();\n\t\t\tignoreNestedBefore = type.slice(0, -5) as PathItem[0];\n\t\t}\n\t}\n\n\treturn {\n\t\tqueue,\n\t\tskip,\n\t\tskipPreserve,\n\t};\n};\n// #endregion\n\n// #region Queue Processor\ntype QueueProcessorOptions = {\n\tskip: Set<Exclude<ValidAction, ValidAction[]>>;\n\tskipPreserve?: Exclude<ValidAction, ValidAction[]> | undefined;\n};\n\nconst createQueueProcessor = (queue: Exclude<ValidAction, ValidAction[]>[], options: QueueProcessorOptions) => {\n\tconst processedQueue: Exclude<ValidAction, ValidAction[]>[] = [];\n\n\tconst keep = new Set();\n\tconst characters = new Set();\n\tconst audio = {\n\t\tmusic: new Set(),\n\t\tsounds: new Set(),\n\t};\n\n\t/**\n\t * Get the next actions array.\n\t */\n\tconst next = (i: number) => queue.slice(i + 1);\n\n\tfor (const [i, item] of queue.entries()) {\n\t\tconst [action, ...params] = item;\n\n\t\tif (options.skip.has(item) && item !== options.skipPreserve) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tkeep.add(action);\n\n\t\tif (action === 'function' || action === 'custom') {\n\t\t\tif (action === 'custom') {\n\t\t\t\tconst fn = params[0] as CustomHandler;\n\n\t\t\t\tif (fn.callOnlyLatest) {\n\t\t\t\t\tconst notLatest = next(i).some(([name, func]) => {\n\t\t\t\t\t\tif (name !== 'custom') return;\n\n\t\t\t\t\t\t// Checks for `undefined`. In case two id's are undefined it would not be true\n\t\t\t\t\t\tconst isIdenticalId = Boolean(func.id && fn.id && func.id === fn.id);\n\t\t\t\t\t\tconst isIdenticalByReference = func === fn;\n\t\t\t\t\t\tconst isIdenticalByCode = String(func) === String(fn);\n\n\t\t\t\t\t\treturn isIdenticalId || isIdenticalByReference || isIdenticalByCode;\n\t\t\t\t\t});\n\n\t\t\t\t\tif (notLatest) continue;\n\t\t\t\t} else if (fn.skipOnRestore) {\n\t\t\t\t\tif (fn.skipOnRestore(next(i))) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tprocessedQueue.push(item);\n\t\t} else if (action === 'playSound') {\n\t\t\tconst closing = getOppositeAction(action);\n\n\t\t\tconst skip = next(i).some((item) => {\n\t\t\t\tif (isUserRequiredAction(item) || isSkippedDuringRestore(item[0])) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tconst [_action, target] = item;\n\n\t\t\t\tif (target !== params[0]) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn _action === closing || _action === action;\n\t\t\t});\n\n\t\t\tif (skip) continue;\n\n\t\t\taudio.sounds.add(unwrapAsset(params[0] as NovelyAsset));\n\t\t\tprocessedQueue.push(item);\n\t\t} else if (action === 'showCharacter' || action === 'playMusic' || action === 'voice') {\n\t\t\tconst closing = getOppositeAction(action);\n\n\t\t\tconst skip = next(i).some(([_action, target]) => {\n\t\t\t\tif (target !== params[0] && action !== 'voice') {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst musicWillBePaused = action === 'playMusic' && _action === 'pauseMusic';\n\n\t\t\t\t/**\n\t\t\t\t * It either will be closed OR same action will be ran again\n\t\t\t\t */\n\t\t\t\treturn musicWillBePaused || _action === closing || _action === action;\n\t\t\t});\n\n\t\t\tif (skip) continue;\n\n\t\t\t/**\n\t\t\t * Actually, we do not need check above to add there things to keep because if something was hidden already we could not keep it visible\n\t\t\t */\n\t\t\tif (action === 'showCharacter') {\n\t\t\t\tcharacters.add(params[0]);\n\t\t\t} else if (action === 'playMusic') {\n\t\t\t\taudio.music.add(unwrapAsset(params[0] as NovelyAsset));\n\t\t\t}\n\n\t\t\tprocessedQueue.push(item);\n\t\t} else if (action === 'showBackground' || action === 'preload') {\n\t\t\tconst skip = next(i).some(([_action]) => action === _action);\n\n\t\t\tif (skip) continue;\n\n\t\t\tprocessedQueue.push(item);\n\t\t} else if (action === 'animateCharacter') {\n\t\t\tconst skip = next(i).some(([_action, character], j, array) => {\n\t\t\t\t// Same character will be animated again.\n\t\t\t\tif (action === _action && character === params[0]) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tconst next = array.slice(j);\n\n\t\t\t\tconst characterWillAnimate = next.some(([__action, __character]) => action === __action);\n\t\t\t\tconst hasBlockingActions = next.some((item) => options.skip.has(item));\n\n\t\t\t\tconst differentCharacterWillAnimate =\n\t\t\t\t\t!hasBlockingActions &&\n\t\t\t\t\tnext.some(([__action, __character]) => __action === action && __character !== params[0]);\n\n\t\t\t\t// todo\n\t\t\t\treturn (characterWillAnimate && hasBlockingActions) || differentCharacterWillAnimate;\n\t\t\t});\n\n\t\t\tif (skip) continue;\n\n\t\t\tprocessedQueue.push(item);\n\t\t} else {\n\t\t\tprocessedQueue.push(item);\n\t\t}\n\t}\n\n\tconst run = async (match: (item: Exclude<ValidAction, ValidAction[]>) => Thenable<void>) => {\n\t\tfor (const item of processedQueue) {\n\t\t\tconst result = match(item);\n\n\t\t\tif (isPromise(result)) {\n\t\t\t\tawait result;\n\t\t\t}\n\t\t}\n\n\t\tprocessedQueue.length = 0;\n\t};\n\n\treturn {\n\t\trun,\n\t\tkeep: {\n\t\t\tkeep,\n\t\t\tcharacters,\n\t\t\taudio,\n\t\t},\n\t};\n};\n// #endregion\n\nexport {\n\tfindLastPathItemBeforeItemOfType,\n\tgetActionsFromPath,\n\tgetOppositeAction,\n\tcreateQueueProcessor,\n\tcreateReferFunction,\n\texitPath,\n\tcollectActionsBeforeBlockingAction,\n\tnextPath,\n\tisExitImpossible,\n};\n\nexport type { GuardedReferFunction };\n","type ControlledPromise<T> = Promise<\n\t| {\n\t\t\tvalue: T;\n\t\t\tcancelled: false;\n\t }\n\t| {\n\t\t\tvalue: null;\n\t\t\tcancelled: true;\n\t }\n>;\n\ntype ControlledPromiseObj<T> = {\n\tresolve: (value: T | PromiseLike<T>) => void;\n\treject: (reason?: any) => void;\n\n\tpromise: ControlledPromise<T>;\n\n\tcancel: () => void;\n};\n\nconst createControlledPromise = <T = void>() => {\n\tconst object = {\n\t\tresolve: null,\n\t\treject: null,\n\n\t\tpromise: null,\n\n\t\tcancel: null,\n\t} as unknown as ControlledPromiseObj<T>;\n\n\tconst init = () => {\n\t\tconst promise = new Promise((resolve, reject) => {\n\t\t\tobject.reject = reject;\n\t\t\tobject.resolve = (value) => {\n\t\t\t\tresolve({ cancelled: false, value });\n\t\t\t};\n\n\t\t\tobject.cancel = () => {\n\t\t\t\tresolve({ cancelled: true, value: null });\n\t\t\t\tinit();\n\t\t\t};\n\t\t});\n\n\t\tobject.promise = promise as ControlledPromise<T>;\n\t};\n\n\treturn init(), object;\n};\n\nexport { createControlledPromise };\nexport type { ControlledPromise, ControlledPromiseObj };\n","import { memoize } from 'es-toolkit/function';\nimport { HOWLER_SUPPORTED_FILE_FORMATS, SUPPORTED_IMAGE_FILE_FORMATS } from '../constants';\nimport { isCSSImageURL } from './assertions';\nimport { DEV } from 'esm-env';\n\nconst getUrlFileExtension = (address: string) => {\n\ttry {\n\t\tconst { pathname } = new URL(address, location.href);\n\n\t\t/**\n\t\t * By using pathname we remove search params from URL, but some things are still preserved\n\t\t *\n\t\t * Imagine pathname like `image.png!private:1230`\n\t\t */\n\t\treturn pathname.split('.').at(-1)!.split('!')[0].split(':')[0];\n\t} catch (error) {\n\t\tif (DEV) {\n\t\t\tconsole.error(new Error(`Could not construct URL \"${address}\".`, { cause: error }));\n\t\t}\n\n\t\treturn '';\n\t}\n};\n\nconst fetchContentType = async (url: string, request: typeof fetch) => {\n\ttry {\n\t\tconst response = await request(url, {\n\t\t\tmethod: 'HEAD',\n\t\t});\n\n\t\treturn response.headers.get('Content-Type') || '';\n\t} catch (error) {\n\t\tif (DEV) {\n\t\t\tconsole.error(new Error(`Failed to fetch file at \"${url}\"`, { cause: error }));\n\t\t}\n\n\t\treturn '';\n\t}\n};\n\ntype GetResourceTypeParams = {\n\turl: string;\n\trequest: typeof fetch;\n};\n\nconst getResourseType = memoize(\n\tasync ({ url, request }: GetResourceTypeParams) => {\n\t\t/**\n\t\t * If url is not http we should not check\n\t\t *\n\t\t * startsWith('http') || startsWith('/') || startsWith('.') || startsWith('data')\n\t\t */\n\t\tif (!isCSSImageURL(url)) {\n\t\t\treturn 'other';\n\t\t}\n\n\t\tconst extension = getUrlFileExtension(url);\n\n\t\tif (HOWLER_SUPPORTED_FILE_FORMATS.has(extension as any)) {\n\t\t\treturn 'audio';\n\t\t}\n\n\t\tif (SUPPORTED_IMAGE_FILE_FORMATS.has(extension as any)) {\n\t\t\treturn 'image';\n\t\t}\n\n\t\t/**\n\t\t * If checks above didn't worked we will fetch content type\n\t\t * This might not work because of CORS\n\t\t */\n\t\tconst contentType = await fetchContentType(url, request);\n\n\t\tif (contentType.includes('audio')) {\n\t\t\treturn 'audio';\n\t\t}\n\n\t\tif (contentType.includes('image')) {\n\t\t\treturn 'image';\n\t\t}\n\n\t\treturn 'other';\n\t},\n\t{\n\t\tgetCacheKey: ({ url }) => url,\n\t},\n);\n\nexport { getUrlFileExtension, getResourseType, fetchContentType };\n\nexport type { GetResourceTypeParams };\n","import { memoize } from 'es-toolkit/function';\nimport type { Context, Renderer } from '../renderer';\nimport type { Save, StackHolder, UseStackFunctionReturnType } from '../types';\nimport { STACK_MAP } from '../shared';\n\nconst getStack = memoize(\n\t(_: Context) => {\n\t\treturn [] as unknown as StackHolder;\n\t},\n\t{\n\t\tcache: STACK_MAP,\n\t\tgetCacheKey: (ctx) => ctx.id,\n\t},\n);\n\nconst createUseStackFunction = (renderer: Renderer) => {\n\tconst useStack = (context: Context | string): UseStackFunctionReturnType => {\n\t\tconst ctx = typeof context === 'string' ? renderer.getContext(context) : context;\n\t\tconst stack = getStack(ctx);\n\n\t\treturn {\n\t\t\tget previous() {\n\t\t\t\treturn stack.previous;\n\t\t\t},\n\t\t\tget value() {\n\t\t\t\treturn stack.at(-1)!;\n\t\t\t},\n\t\t\tset value(value) {\n\t\t\t\tstack[stack.length - 1] = value;\n\t\t\t},\n\n\t\t\tback() {\n\t\t\t\tstack.previous = stack.length > 1 ? stack.pop() : this.value;\n\t\t\t\tctx.meta.goingBack = true;\n\t\t\t},\n\t\t\tpush(value: Save) {\n\t\t\t\tstack.push(value);\n\t\t\t},\n\t\t\tclear() {\n\t\t\t\tstack.previous = undefined;\n\n\t\t\t\tstack.length = 0;\n\t\t\t\tstack.length = 1;\n\t\t\t},\n\t\t};\n\t};\n\n\treturn useStack;\n};\n\nexport { getStack, createUseStackFunction };\n","import type { Story, ValidAction } from '../action';\n\nconst flatActions = (item: (ValidAction | ValidAction[])[]): ValidAction[] => {\n\treturn item.flatMap((data) => {\n\t\tconst type = data[0];\n\n\t\t/**\n\t\t * This is not just an action like `['name', ...arguments]`, but an array of actions\n\t\t */\n\t\tif (Array.isArray(type)) return flatActions(data as ValidAction[]);\n\n\t\treturn [data as ValidAction];\n\t});\n};\n\n/**\n * Transforms `(ValidAction | ValidAction[])[]` to `ValidAction[]`. Mutates provided `Story`\n */\nconst flatStory = (story: Story) => {\n\tfor (const key in story) {\n\t\tstory[key] = flatActions(story[key]);\n\t}\n\n\treturn story;\n};\n\nexport { flatActions, flatStory };\n","import { memoize } from 'es-toolkit/function';\nimport type { Lang } from '../types';\n\nconst getLanguage = (languages: string[]) => {\n\tlet { language } = navigator;\n\n\tif (languages.includes(language)) {\n\t\treturn language;\n\t} else if (languages.includes((language = language.slice(0, 2)))) {\n\t\treturn language;\n\t} else if ((language = languages.find((value) => navigator.languages.includes(value))!)) {\n\t\treturn language;\n\t}\n\n\t/**\n\t * We'v checked the `en-GB` format, `en` format, and maybe any second languages, but there were no matches\n\t */\n\treturn languages[0];\n};\n\nconst getIntlLanguageDisplayName = memoize((lang: Lang) => {\n\t/**\n\t * When using Intl fails we just return language key.\n\t */\n\ttry {\n\t\tconst intl = new Intl.DisplayNames([lang], {\n\t\t\ttype: 'language',\n\t\t});\n\n\t\treturn intl.of(lang) || lang;\n\t} catch {\n\t\treturn lang;\n\t}\n});\n\n/**\n * Capitalizes the string\n * @param str String without emojis or complex graphemes\n */\nconst capitalize = (str: string) => {\n\treturn str[0].toUpperCase() + str.slice(1);\n};\n\nexport { getLanguage, getIntlLanguageDisplayName, capitalize };\n","const noop = () => {};\n\nexport { noop };\n","import type { Stored } from '../store';\nimport type { Lang, StorageData } from '../types';\n\nconst getLanguageFromStore = <$Language extends Lang>(store: Stored<StorageData<$Language, any>>) => {\n\treturn store.get().meta[0];\n};\n\nconst getVolumeFromStore = <$Language extends Lang>(store: Stored<StorageData<$Language, any>>) => {\n\tconst { meta } = store.get();\n\n\treturn {\n\t\tmusic: meta[2],\n\t\tsound: meta[3],\n\t\tvoice: meta[4],\n\t};\n};\n\nexport { getLanguageFromStore, getVolumeFromStore };\n","const mapSet = <T, K>(set: Set<T>, fn: (value: T, index: number, array: T[]) => K): K[] => {\n\treturn [...set].map(fn);\n};\n\nconst toArray = <T>(target: T | T[]) => {\n\treturn Array.isArray(target) ? target : [target];\n};\n\nexport { mapSet, toArray };\n","import type { Character } from '../character';\nimport type { CharactersData, Lang } from '../types';\n\nconst getCharactersData = <Characters extends Record<string, Character<Lang>>>(characters: Characters) => {\n\tconst entries = Object.entries(characters);\n\tconst mapped = entries.map(([key, value]) => [key, { name: value.name, emotions: Object.keys(value.emotions) }]);\n\n\treturn Object.fromEntries(mapped) as CharactersData<Characters>;\n};\n\nexport { getCharactersData };\n","import { noop } from './utilities';\n\ntype Stored<T> = {\n\tsubscribe: (cb: (value: T) => void) => () => void;\n\tupdate: (fn: (prev: T) => T) => void;\n\tset: (val: T) => void;\n\tget: () => T;\n};\n\ntype Derived<T> = {\n\tsubscribe: (cb: (value: T) => void) => () => void;\n\tget: () => T;\n};\n\nconst store = <T>(current: T, subscribers = new Set<(value: T) => void>()): Stored<T> => {\n\tconst subscribe = (cb: (value: T) => void) => {\n\t\tsubscribers.add(cb), cb(current);\n\n\t\treturn () => {\n\t\t\tsubscribers.delete(cb);\n\t\t};\n\t};\n\n\tconst push = (value: T) => {\n\t\tfor (const cb of subscribers) cb(value);\n\t};\n\n\tconst update = (fn: (prev: T) => T) => {\n\t\tpush((current = fn(current)));\n\t};\n\n\tconst set = (val: T) => {\n\t\tupdate(() => val);\n\t};\n\n\tconst get = () => {\n\t\treturn current;\n\t};\n\n\treturn { subscribe, update, set, get } as const;\n};\n\nconst derive = <T, K>(input: Stored<T>, map: (value: T) => K): Derived<K> => {\n\treturn {\n\t\tget: () => map(input.get()),\n\t\tsubscribe: (subscriber) => {\n\t\t\treturn input.subscribe((value) => {\n\t\t\t\treturn subscriber(map(value));\n\t\t\t});\n\t\t},\n\t};\n};\n\nconst immutable = <T>(value: T): Derived<T> => {\n\treturn {\n\t\tget: () => value,\n\t\tsubscribe: (subscriber) => {\n\t\t\tsubscriber(value);\n\n\t\t\treturn noop;\n\t\t},\n\t};\n};\n\nexport { store, derive, immutable };\nexport type { Stored, Derived };\n","import type { CustomHandler, CustomHandlerFunctionGetFn, CustomHandlerGetResult, TextContent } from './action';\nimport type { Context, CustomActionHandle } from './renderer';\nimport type { Derived } from './store';\nimport { CUSTOM_ACTION_CLEANUP_MAP, CUSTOM_ACTION_MAP } from './shared';\nimport type { Data, Lang, Stack, State, StateFunction } from './types';\nimport { noop } from './utilities';\nimport { immutable } from './store';\nimport { once } from 'es-toolkit/function';\n\ntype CleanupFn = () => void;\n\ntype CustomActionCleanupHolderItem = {\n\tfn: CustomHandler;\n\tlist: CleanupFn[];\n\tnode: CleanupFn;\n};\n\ntype CustomActionCleanupHolder = CustomActionCleanupHolderItem[];\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};\n\ntype HandleCustomActionOptions = CustomActionHandle & {\n\t/**\n\t * State Function\n\t */\n\tstate: StateFunction<State>;\n\t/**\n\t * Current Game Language\n\t */\n\tlang: Lang;\n\t/**\n\t * Function to get Stack\n\t */\n\tgetStack: (ctx: Context) => Stack;\n\t/**\n\t * Template Replace Function\n\t */\n\ttemplateReplace: (content: TextContent<Lang, Data>, values?: Data) => string;\n\t/**\n\t * Paused Store\n\t */\n\tpaused: Derived<boolean>;\n};\n\nconst createCustomActionNode = (id: string) => {\n\tconst div = document.createElement('div');\n\n\tdiv.setAttribute('data-id', id);\n\n\treturn div;\n};\n\nconst getCustomActionHolder = (ctx: Context, fn: CustomHandler) => {\n\tconst cached = CUSTOM_ACTION_MAP.get(ctx.id + fn.key);\n\n\tif (cached) {\n\t\treturn cached;\n\t}\n\n\tconst holder = {\n\t\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 getCustomActionCleanupHolder = (ctx: Context) => {\n\tconst existing = CUSTOM_ACTION_CLEANUP_MAP.get(ctx.id);\n\n\tif (existing) {\n\t\treturn existing;\n\t}\n\n\tconst holder: CustomActionCleanupHolder = [];\n\n\tCUSTOM_ACTION_CLEANUP_MAP.set(ctx.id, holder);\n\n\treturn holder;\n};\n\nconst cleanCleanupSource = ({ list }: CustomActionCleanupHolderItem) => {\n\twhile (list.length) {\n\t\ttry {\n\t\t\tlist.pop()!();\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t}\n};\n\nconst handleCustomAction = (\n\tctx: Context,\n\tfn: CustomHandler,\n\t{\n\t\tlang,\n\t\tstate,\n\t\tsetMountElement,\n\t\tremove: renderersRemove,\n\t\tgetStack,\n\t\ttemplateReplace,\n\t\tpaused,\n\t}: HandleCustomActionOptions,\n) => {\n\tconst holder = getCustomActionHolder(ctx, fn);\n\tconst cleanupHolder = getCustomActionCleanupHolder(ctx);\n\n\tconst cleanupNode = () => {\n\t\tif (!cleanupHolder.some((item) => item.fn.id === fn.id && item.fn.key === fn.key)) {\n\t\t\tholder.node = null;\n\t\t\tsetMountElement(null);\n\t\t}\n\t};\n\n\tconst cleanupSource: CustomActionCleanupHolderItem = {\n\t\tfn,\n\t\tlist: [],\n\t\tnode: cleanupNode,\n\t};\n\n\tcleanupHolder.push(cleanupSource);\n\n\tconst getDomNodes = (insert = true): CustomHandlerGetResult<boolean> => {\n\t\tif (holder.node || !insert) {\n\t\t\tsetMountElement(holder.node);\n\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\tcleanupSource.list.push(once(func));\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\tcleanCleanupSource(cleanupSource);\n\n\t\t// When requested not hestitate\n\t\tholder.node = null;\n\t\tsetMountElement(null);\n\n\t\trenderersRemove();\n\t};\n\n\tconst stack = getStack(ctx);\n\n\tconst getSave = () => {\n\t\treturn stack.value;\n\t};\n\n\treturn fn({\n\t\tflags: ctx.meta,\n\n\t\tlang,\n\n\t\tstate,\n\t\tdata,\n\n\t\tdataAtKey: (key) => CUSTOM_ACTION_MAP.get(ctx.id + key)?.localData || null,\n\n\t\ttemplateReplace,\n\n\t\tclear,\n\t\tremove,\n\n\t\trendererContext: ctx,\n\n\t\tgetDomNodes: getDomNodes as CustomHandlerFunctionGetFn,\n\n\t\tgetSave,\n\n\t\tcontextKey: ctx.id,\n\n\t\tpaused: ctx.meta.preview ? immutable(false) : paused,\n\t});\n};\n\nexport { getCustomActionHolder, handleCustomAction, getCustomActionCleanupHolder, cleanCleanupSource };\nexport type { CustomActionHolder, CustomActionCleanupHolder, HandleCustomActionOptions, CleanupFn };\n","import type { CustomHandler, DefaultActionProxy } from './action';\nimport type { Character } from './character';\nimport { ASSETS_TO_PRELOAD, PRELOADED_ASSETS } from './shared';\nimport type { Lang } from './types';\nimport { isAudioAction, isImageAsset, isString, isAsset, getResourseType, mapSet, toArray } from './utilities';\nimport { unwrapAudioAsset, unwrapImageAsset } from './asset';\n\nconst ACTION_NAME_TO_VOLUME_MAP = {\n\tplayMusic: 'music',\n\tplaySound: 'sound',\n\tvoice: 'voice',\n} as const;\n\n/**\n * Adds asset to `ASSETS_TO_PRELOAD` firstly checking if is was already preloaded\n */\nconst enqueueAssetForPreloading = (asset: string) => {\n\tif (!PRELOADED_ASSETS.has(asset)) {\n\t\tASSETS_TO_PRELOAD.add(asset);\n\t}\n};\n\ntype HandleAssetsPreloadingOptions = {\n\trequest: typeof fetch;\n\n\tlimiter: (fn: () => void | PromiseLike<void>) => Promise<void>;\n\n\tpreloadAudioBlocking: (source: string) => Promise<void>;\n\tpreloadImageBlocking: (source: string) => Promise<void>;\n};\n\n/**\n * Preloads assets\n */\nconst handleAssetsPreloading = async ({\n\trequest,\n\tlimiter,\n\tpreloadAudioBlocking,\n\tpreloadImageBlocking,\n}: HandleAssetsPreloadingOptions) => {\n\tconst list = mapSet(ASSETS_TO_PRELOAD, (asset) => {\n\t\treturn limiter(async () => {\n\t\t\tconst type = await getResourseType({\n\t\t\t\turl: asset,\n\t\t\t\trequest,\n\t\t\t});\n\n\t\t\tswitch (type) {\n\t\t\t\tcase 'audio': {\n\t\t\t\t\tawait preloadAudioBlocking(asset);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase 'image': {\n\t\t\t\t\tawait preloadImageBlocking(asset);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tASSETS_TO_PRELOAD.delete(asset);\n\t\t\tPRELOADED_ASSETS.add(asset);\n\t\t});\n\t});\n\n\t/**\n\t * `allSettled` is used because even if error happens game should run\n\t *\n\t * Ideally, there could be a notification for player, maybe developer could be also notified\n\t * But I don't think it's really needed\n\t */\n\tawait Promise.allSettled(list);\n\n\tASSETS_TO_PRELOAD.clear();\n};\n\ntype HuntAssetsOptions = {\n\t/**\n\t * Audio Volume\n\t */\n\tvolume: {\n\t\tmusic: number;\n\t\tsound: number;\n\t\tvoice: number;\n\t};\n\t/**\n\t * Current Language\n\t */\n\tlang: Lang;\n\t/**\n\t * Characters object from user config\n\t */\n\tcharacters: Record<string, Character>;\n\t/**\n\t * Action name\n\t */\n\taction: keyof DefaultActionProxy;\n\t/**\n\t * Action props\n\t */\n\tprops: Parameters<DefaultActionProxy[keyof DefaultActionProxy]>;\n\t/**\n\t * Function to handle found asset\n\t */\n\thandle: (asset: string) => void;\n};\n\nconst huntAssets = ({ volume, lang, characters, action, props, handle }: HuntAssetsOptions) => {\n\tif (action === 'showBackground') {\n\t\t/**\n\t\t * There are two types of showBackground currently\n\t\t *\n\t\t * Parameter is a `string`\n\t\t * Parameter is a `Record<'CSS Media', string>`\n\t\t */\n\t\tif (isString(props[0])) {\n\t\t\thandle(unwrapAudioAsset(props[0]));\n\t\t}\n\n\t\tif (props[0] && typeof props[0] === 'object') {\n\t\t\tfor (const value of Object.values(props[0])) {\n\t\t\t\tif (isImageAsset(value)) {\n\t\t\t\t\thandle(value);\n\t\t\t\t} else if (isAsset(value)) {\n\t\t\t\t\tconst unwrapped = unwrapImageAsset(value);\n\n\t\t\t\t\tif (isImageAsset(unwrapped)) {\n\t\t\t\t\t\thandle(unwrapped);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn;\n\t}\n\n\tconst getVolumeFor = (action: 'playMusic' | 'stopMusic' | 'playSound' | 'stopSound' | 'voice' | 'stopVoice') => {\n\t\tif (action in ACTION_NAME_TO_VOLUME_MAP) {\n\t\t\t// typescript don't be silly please\n\t\t\treturn volume[ACTION_NAME_TO_VOLUME_MAP[action as keyof typeof ACTION_NAME_TO_VOLUME_MAP]];\n\t\t}\n\n\t\treturn 0;\n\t};\n\n\t/**\n\t * Here \"stop\" action also matches condition, but because `ASSETS_TO_PRELOAD` is a Set, there is no problem\n\t */\n\tif (isAudioAction(action) && isString(props[0])) {\n\t\tif (getVolumeFor(action) > 0) {\n\t\t\thandle(unwrapAudioAsset(props[0]));\n\t\t}\n\n\t\treturn;\n\t}\n\n\tif (action === 'voice' && typeof props[0] === 'object') {\n\t\t/**\n\t\t * Early return in case of disabled voices\n\t\t */\n\t\tif (getVolumeFor('voice') == 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const [language, value] of Object.entries(props[0])) {\n\t\t\tif (language === lang) {\n\t\t\t\t/**\n\t\t\t\t * todo: decide how to make language comparison (maybe use some function)\n\t\t\t\t *\n\t\t\t\t * We can use en-US for both en-US and en-GB. Same thing applies to `dialog` and `text` action.\n\t\t\t\t * Maybe voice over language can be selected separately\n\t\t\t\t */\n\t\t\t\tvalue && handle(unwrapAudioAsset(value));\n\t\t\t}\n\t\t}\n\n\t\treturn;\n\t}\n\n\t/**\n\t * Load characters\n\t */\n\tif (action === 'showCharacter' && isString(props[0]) && isString(props[1])) {\n\t\tconst images = toArray(characters[props[0]].emotions[props[1]]);\n\n\t\tfor (const asset of images) {\n\t\t\thandle(unwrapImageAsset(asset));\n\t\t}\n\n\t\treturn;\n\t}\n\n\t/**\n\t * Custom action assets\n\t */\n\tif (action === 'custom' && (props[0] as CustomHandler).assets) {\n\t\tfor (const asset of (props[0] as CustomHandler).assets!) {\n\t\t\tisAsset(asset) ? handle(asset.source) : handle(asset);\n\t\t}\n\n\t\treturn;\n\t}\n\n\tif (action === 'choice') {\n\t\tfor (let i = 1; i < props.length; i++) {\n\t\t\tconst data = props[i];\n\n\t\t\tif (Array.isArray(data)) {\n\t\t\t\thandle(unwrapImageAsset(data[5] as string));\n\t\t\t}\n\t\t}\n\t}\n};\n\nexport { enqueueAssetForPreloading, handleAssetsPreloading, huntAssets };\n","import type { StorageData } from './types';\n\ntype StorageAdapter = {\n\tget: () => Promise<StorageData>;\n\tset: (data: StorageData) => Promise<void>;\n};\n\ntype StorageAdapterLocalOptions = {\n\tkey: string;\n};\n\n/**\n * Stores data in localStorage\n */\nconst storageAdapterLocal = ({ key }: StorageAdapterLocalOptions): StorageAdapter => {\n\treturn {\n\t\tasync get() {\n\t\t\tconst fallback = { saves: [], data: {}, meta: [] };\n\n\t\t\ttry {\n\t\t\t\tconst value = localStorage.getItem(key);\n\n\t\t\t\treturn value ? JSON.parse(value) : fallback;\n\t\t\t} catch {\n\t\t\t\treturn fallback;\n\t\t\t}\n\t\t},\n\t\tasync set(data) {\n\t\t\ttry {\n\t\t\t\tlocalStorage.setItem(key, JSON.stringify(data));\n\t\t\t} catch {}\n\t\t},\n\t};\n};\n\nexport type { StorageAdapter };\nexport { storageAdapterLocal };\n","import type { Data, State } from './types';\n\ntype PluralType = Intl.LDMLPluralRule;\ntype Pluralization = Partial<Record<PluralType, string>>;\ntype AllowedContent =\n\t| string\n\t| ((state: State | Data) => string | string[])\n\t| string[]\n\t| (string | ((state: State | Data) => string | string[]))[];\ntype TranslationActions = Partial<Record<string, (str: string) => string>>;\n\nconst RGX = /{{(.*?)}}/g;\n\nconst split = (input: string, delimeters: string[]) => {\n\tconst output: (string | undefined)[] = [];\n\n\tfor (const delimeter of delimeters) {\n\t\tif (!input) break;\n\n\t\tconst [start, end] = input.split(delimeter, 2);\n\n\t\toutput.push(start);\n\t\tinput = end;\n\t}\n\n\toutput.push(input);\n\n\treturn output;\n};\n\n/**\n * Turns any allowed content into string\n * @param c Content\n */\nconst flattenAllowedContent = (c: AllowedContent, state: State | Data): string => {\n\tif (Array.isArray(c)) {\n\t\treturn c.map((item) => flattenAllowedContent(item, state)).join('<br>');\n\t}\n\n\tif (typeof c === 'function') {\n\t\treturn flattenAllowedContent(c(state), state);\n\t}\n\n\treturn c;\n};\n\nconst replace = (\n\tinput: string,\n\tdata: Record<string, unknown>,\n\tpluralization?: Record<string, Pluralization>,\n\tactions?: TranslationActions,\n\tpr?: Intl.PluralRules,\n) => {\n\treturn input.replaceAll(RGX, (x: any, key: string, y: any) => {\n\t\tx = 0;\n\t\ty = data;\n\n\t\tconst [pathstr, plural, action] = split(key.trim(), ['@', '%']);\n\n\t\tif (!pathstr) {\n\t\t\treturn '';\n\t\t}\n\n\t\tconst path = pathstr.split('.');\n\n\t\twhile (y && x < path.length) y = y[path[x++]];\n\n\t\tif (plural && pluralization && y && pr) {\n\t\t\ty = pluralization[plural][pr.select(y)];\n\t\t}\n\n\t\tconst actionHandler = actions && action ? actions[action] : void 0;\n\n\t\tif (actionHandler) y = actionHandler(y);\n\n\t\treturn y == null ? '' : y;\n\t});\n};\n\nexport { flattenAllowedContent, replace };\nexport type { AllowedContent, PluralType, Pluralization, TranslationActions };\n","import { DEV } from 'esm-env';\nimport type { ActionChoiceChoiceObject, DefaultActionProxy, ValidAction, VirtualActions } from '../action';\nimport { flatActions } from './story';\nimport type { Data, Lang, State } from '../types';\nimport type { Character } from '../character';\n\ntype BuildActionObjectParams<$Lang extends Lang, $Data extends Data> = {\n\trendererActions: Record<string, (...args: any[]) => ValidAction>;\n\tnativeActions: string[];\n\n\tcharacters: Record<string, Character>;\n};\n\ntype VirtualActionsGlobal = VirtualActions<Record<string, Character>, Lang, State>;\ntype ActionsGlobal = DefaultActionProxy & VirtualActionsGlobal;\n\n/**\n * In this case actions that get overwritten with another action\n */\nconst VIRTUAL_ACTIONS: (keyof VirtualActionsGlobal)[] = ['say'];\n\nconst buildActionObject = <$Lang extends Lang, $Data extends Data>({\n\trendererActions,\n\tnativeActions,\n\tcharacters,\n}: BuildActionObjectParams<$Lang, $Data>) => {\n\tconst allActions = [...nativeActions, ...VIRTUAL_ACTIONS];\n\tconst object = { ...rendererActions };\n\n\tfor (let action of allActions) {\n\t\tobject[action] = (...props: Parameters<ActionsGlobal[keyof ActionsGlobal]>) => {\n\t\t\tif (action === 'say') {\n\t\t\t\taction = 'dialog';\n\n\t\t\t\tconst [character] = props as Parameters<VirtualActionsGlobal['say']>;\n\n\t\t\t\tif (DEV && !characters[character]) {\n\t\t\t\t\tthrow new Error(`Attempt to call Say action with unknown character \"${character}\"`);\n\t\t\t\t}\n\t\t\t} else if (action === 'choice') {\n\t\t\t\tif (props.slice(1).every((choice) => !Array.isArray(choice))) {\n\t\t\t\t\tfor (let i = 1; i < props.length; i++) {\n\t\t\t\t\t\tconst choice = props[i] as ActionChoiceChoiceObject<Lang, State>;\n\n\t\t\t\t\t\t(props as Parameters<DefaultActionProxy['choice']>)[i] = [\n\t\t\t\t\t\t\tchoice.title,\n\t\t\t\t\t\t\tflatActions(choice.children),\n\t\t\t\t\t\t\tchoice.active,\n\t\t\t\t\t\t\tchoice.visible,\n\t\t\t\t\t\t\tchoice.onSelect,\n\t\t\t\t\t\t\tchoice.image,\n\t\t\t\t\t\t];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor (let i = 1; i < props.length; i++) {\n\t\t\t\t\t\tconst choice = props[i];\n\n\t\t\t\t\t\tif (Array.isArray(choice)) {\n\t\t\t\t\t\t\tchoice[1] = flatActions(choice[1]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (action === 'condition') {\n\t\t\t\tconst actions = (props as Parameters<ActionsGlobal['condition']>)[1];\n\n\t\t\t\tfor (const key in actions) {\n\t\t\t\t\tactions[key] = flatActions(actions[key]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn [action, ...props] as ValidAction;\n\t\t};\n\t}\n\n\treturn object;\n};\n\nexport { buildActionObject };\n","import type { Story, TextContent } from '../action';\nimport { unwrapAudioAsset } from '../asset';\nimport type {\n\tData,\n\tDialogOverview,\n\tDialogOverviewEntry,\n\tLang,\n\tNovelyAsset,\n\tState,\n\tUseStackFunctionReturnType,\n} from '../types';\nimport { getActionsFromPath, type GuardedReferFunction } from './actions-processing';\nimport { isAsset, isSkippedDuringRestore, isString, isUserRequiredAction } from './assertions';\n\ntype GetDialogOverviewContext = {\n\tstory: Story;\n\treferGuarded: GuardedReferFunction;\n\n\tgetCharacterName: (character: string) => string;\n\tgetLanguage: () => string;\n\tgetStack: () => UseStackFunctionReturnType;\n\ttemplateReplace: (content: TextContent<Lang, Data>, values?: Data) => string;\n};\n\nconst getDialogOverview = async function (this: GetDialogOverviewContext) {\n\t/**\n\t * Dialog Overview is possible only in main context\n\t */\n\tconst { value: save } = this.getStack();\n\tconst stateSnapshots = save[3];\n\n\t/**\n\t * Easy mode\n\t */\n\tif (stateSnapshots.length == 0) {\n\t\treturn [];\n\t}\n\n\tconst { queue } = await getActionsFromPath({\n\t\tstory: this.story,\n\t\tpath: save[0],\n\t\tfilter: false,\n\t\treferGuarded: this.referGuarded,\n\t});\n\n\tconst lang = this.getLanguage();\n\n\ttype DialogItem = {\n\t\tname: undefined | string;\n\t\ttext: TextContent<string, State>;\n\t\tvoice: undefined | string | NovelyAsset | Record<string, string | NovelyAsset>;\n\t};\n\n\tconst dialogItems: DialogItem[] = [];\n\n\t/**\n\t * For every available state snapshot find dialog corresponding to it\n\t */\n\tfor (let p = 0, a = stateSnapshots.length, i = queue.length - 1; a > 0 && i > 0; i--) {\n\t\tconst action = queue[i];\n\n\t\tif (action[0] === 'dialog') {\n\t\t\tconst [_, name, text] = action;\n\n\t\t\tlet voice: undefined | string | NovelyAsset | Record<string, string | NovelyAsset> = undefined;\n\n\t\t\t/**\n\t\t\t * Search for the most recent `voice` action before current dialog\n\t\t\t */\n\t\t\tfor (let j = i - 1; j > p && j > 0; j--) {\n\t\t\t\tconst action = queue[j];\n\n\t\t\t\tif (isUserRequiredAction(action) || isSkippedDuringRestore(action[0])) break;\n\t\t\t\tif (action[0] === 'stopVoice') break;\n\n\t\t\t\tif (action[0] === 'voice') {\n\t\t\t\t\tvoice = action[1];\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdialogItems.push({\n\t\t\t\tname,\n\t\t\t\ttext,\n\t\t\t\tvoice,\n\t\t\t});\n\n\t\t\tp = i;\n\t\t\ta--;\n\t\t}\n\t}\n\n\tconst entries: DialogOverview = dialogItems.reverse().map(({ name, text, voice }, i) => {\n\t\tconst state = stateSnapshots[i];\n\t\tconst audioSource = isString(voice)\n\t\t\t? voice\n\t\t\t: isAsset(voice)\n\t\t\t\t? voice\n\t\t\t\t: voice == undefined\n\t\t\t\t\t? voice\n\t\t\t\t\t: voice[lang];\n\n\t\tname = name ? this.getCharacterName(name) : '';\n\n\t\treturn {\n\t\t\tname: this.templateReplace(name, state),\n\t\t\ttext: this.templateReplace(text, state),\n\t\t\tvoice: audioSource ? unwrapAudioAsset(audioSource) : '',\n\t\t} satisfies DialogOverviewEntry;\n\t});\n\n\treturn entries;\n};\n\nexport { getDialogOverview };\n","import type { Lang } from '../types';\n\nconst setDocumentLanguage = (language: Lang) => {\n\tdocument.documentElement.lang = language;\n};\n\nexport { setDocumentLanguage };\n","import type { ValidAction } from './action';\nimport type { Assign } from './types';\n\ntype Part = Record<string, (...args: any[]) => ValidAction>;\n\n/**\n * Extens core action with custom actions\n * @param base Actions object you will extend, `engine.action`\n * @param extension Actions object you will extend with\n * @example\n * ```ts\n * const action = extendAction(engine.action, {\n * particles: (options: Parameters<typeof particles>[0]) => {\n * return ['custom', particles(options)]\n * }\n * })\n * ```\n */\nconst extendAction = <Part0 extends Part, Part1 extends Part>(\n\tbase: Part0,\n\textension: Part1,\n): Readonly<Assign<Part0, Part1>> => {\n\treturn {\n\t\t...extension,\n\t\t...base,\n\t};\n};\n\nexport { extendAction };\n","const RU = {\n\tNewGame: 'Новая игра',\n\tHomeScreen: 'Главный экран',\n\tToTheGame: 'К игре',\n\tLanguage: 'Язык',\n\tNoSaves: 'Сохранений нет',\n\tLoadSave: 'Загрузить',\n\tSaves: 'Сохранения',\n\tSettings: 'Настройки',\n\tSumbit: 'Подтвердить',\n\tGoBack: 'Назад',\n\tDoSave: 'Сохранение',\n\tAuto: 'Авто',\n\tStop: 'Стоп',\n\tExit: 'Выход',\n\tAutomatic: 'Автоматическое',\n\tManual: 'Ручное',\n\tRemove: 'Удалить',\n\tLoadASaveFrom: 'Загрузить сохранение от',\n\tDeleteASaveFrom: 'Удалить сохранение от',\n\tTextSpeed: 'Скорость текста',\n\tTextSpeedSlow: 'Медленная',\n\tTextSpeedMedium: 'Средняя',\n\tTextSpeedFast: 'Быстрая',\n\tTextSpeedAuto: 'Автоматическая',\n\tCompleteText: 'Завершить текст',\n\tGoForward: 'Перейти вперёд',\n\tExitDialogWarning: 'Вы уверены, что хотите выйти? Прогресс будет сохранён.',\n\tExitDialogExit: 'Выйти',\n\tExitDialogBack: 'Вернуться в игру',\n\tOpenMenu: 'Открыть меню',\n\tCloseMenu: 'Закрыть меню',\n\tMusicVolume: 'Громкость музыки',\n\tSoundVolume: 'Громкость звуков',\n\tVoiceVolume: 'Громкость речи',\n\tClose: 'Закрыть',\n\tDialogOverview: 'Обзор диалога',\n};\n\ntype BaseTranslationStrings = keyof typeof RU;\n\nconst EN: Record<BaseTranslationStrings, string> = {\n\tNewGame: 'New Game',\n\tHomeScreen: 'Home Screen',\n\tToTheGame: 'To the Game',\n\tLanguage: 'Language',\n\tNoSaves: 'No saves',\n\tLoadSave: 'Load',\n\tSaves: 'Saves',\n\tSettings: 'Settings',\n\tSumbit: 'Submit',\n\tGoBack: 'Go back',\n\tDoSave: 'Save',\n\tAuto: 'Auto',\n\tStop: 'Stop',\n\tExit: 'Exit',\n\tAutomatic: 'Automatic',\n\tManual: 'Manual',\n\tRemove: 'Remove',\n\tLoadASaveFrom: 'Load a save from',\n\tDeleteASaveFrom: 'Delete a save from',\n\tTextSpeed: 'Text Speed',\n\tTextSpeedSlow: 'Slow',\n\tTextSpeedMedium: 'Medium',\n\tTextSpeedFast: 'Fast',\n\tTextSpeedAuto: 'Auto',\n\tCompleteText: 'Complete text',\n\tGoForward: 'Go forward',\n\tExitDialogWarning: 'Are you sure you want to exit? Progress will be saved.',\n\tExitDialogExit: 'Exit',\n\tExitDialogBack: 'Return to game',\n\tOpenMenu: 'Open menu',\n\tCloseMenu: 'Close menu',\n\tMusicVolume: 'Music volume',\n\tSoundVolume: 'Sound volume',\n\tVoiceVolume: 'Voice volume',\n\tClose: 'Close',\n\tDialogOverview: 'Dialog Overview',\n};\n\nexport { RU, EN };\nexport type { BaseTranslationStrings };\n","type EventHandler<T> = (this: Document, event: T) => void;\n\ntype BlurEventHandler = EventHandler<Event>;\ntype FocusEventHandler = EventHandler<FocusEvent>;\n\nconst BLUR_HANDLERS = new Set<BlurEventHandler>();\nconst FOCUS_HANDLERS = new Set<FocusEventHandler>();\n\ntype EventListeners = {\n\tfocus: FocusEventHandler;\n\tblur: BlurEventHandler;\n};\n\nconst registerEventListeners = (listeners: EventListeners) => {\n\tBLUR_HANDLERS.add(listeners.blur);\n\tFOCUS_HANDLERS.add(listeners.focus);\n\n\treturn () => {\n\t\tBLUR_HANDLERS.delete(listeners.blur);\n\t\tFOCUS_HANDLERS.delete(listeners.focus);\n\t};\n};\n\naddEventListener('focus', function (event) {\n\tfor (const handler of FOCUS_HANDLERS) {\n\t\ttry {\n\t\t\thandler.call(this.document, event);\n\t\t} catch {}\n\t}\n});\n\naddEventListener('blur', function (event) {\n\tfor (const handler of BLUR_HANDLERS) {\n\t\ttry {\n\t\t\thandler.call(this.document, event);\n\t\t} catch {}\n\t}\n});\n\nconst pauseOnBlur = (engine: { setFocused: (focused: boolean) => void }) => {\n\treturn {\n\t\tunsubscribe: registerEventListeners({\n\t\t\tfocus: () => {\n\t\t\t\tengine.setFocused(true);\n\t\t\t},\n\t\t\tblur: () => {\n\t\t\t\tengine.setFocused(false);\n\t\t\t},\n\t\t}),\n\t};\n};\n\nexport { pauseOnBlur };\n"],"mappings":"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","names":["memoize","DEV","asset","supportsMap","supportsMap","asset","DEV","refer","audio","item","next","memoize","DEV","memoize","memoize","memoize","memoize","store","set","set","once","getStack","asset","action","DEV","DEV","action","getLanguage","memoize","DEV","data","save","replace","set","action","characters","audio","type","props","asset","preview","next","t","paused"]}
1
+ {"version":3,"sources":["../../../node_modules/.pnpm/dequal@2.0.3/node_modules/dequal/lite/index.mjs","../src/novely.ts","../../../node_modules/.pnpm/klona@2.0.6/node_modules/klona/full/index.mjs","../src/constants.ts","../src/shared.ts","../src/utilities/assertions.ts","../src/utilities/match-action.ts","../src/asset.ts","../src/audio-codecs.ts","../src/image-formats.ts","../src/utilities/actions-processing.ts","../src/utilities/controlled-promise.ts","../src/utilities/resources.ts","../src/utilities/stack.ts","../src/utilities/story.ts","../src/utilities/internationalization.ts","../src/utilities/noop.ts","../src/utilities/store.ts","../src/utilities/array.ts","../src/utilities/else.ts","../src/store.ts","../src/custom-action.ts","../src/preloading.ts","../src/storage.ts","../src/translation.ts","../src/utilities/actions.ts","../src/utilities/dialog-overview.ts","../src/utilities/document.ts","../src/ticker.ts","../src/extend-actions.ts","../src/translations.ts","../src/browser-events.ts"],"sourcesContent":["var has = Object.prototype.hasOwnProperty;\n\nexport function dequal(foo, bar) {\n\tvar ctor, len;\n\tif (foo === bar) return true;\n\n\tif (foo && bar && (ctor=foo.constructor) === bar.constructor) {\n\t\tif (ctor === Date) return foo.getTime() === bar.getTime();\n\t\tif (ctor === RegExp) return foo.toString() === bar.toString();\n\n\t\tif (ctor === Array) {\n\t\t\tif ((len=foo.length) === bar.length) {\n\t\t\t\twhile (len-- && dequal(foo[len], bar[len]));\n\t\t\t}\n\t\t\treturn len === -1;\n\t\t}\n\n\t\tif (!ctor || typeof foo === 'object') {\n\t\t\tlen = 0;\n\t\t\tfor (ctor in foo) {\n\t\t\t\tif (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false;\n\t\t\t\tif (!(ctor in bar) || !dequal(foo[ctor], bar[ctor])) return false;\n\t\t\t}\n\t\t\treturn Object.keys(bar).length === len;\n\t\t}\n\t}\n\n\treturn foo !== foo && bar !== bar;\n}\n","import { dequal } from 'dequal/lite';\nimport { memoize, throttle } from 'es-toolkit/function';\nimport { merge as deepmerge } from 'es-toolkit/object';\nimport { DEV } from 'esm-env';\nimport { klona } from 'klona/full';\nimport pLimit from 'p-limit';\nimport type {\n\tActionChoiceChoice,\n\tActionProxy,\n\tChoiceCheckFunction,\n\tCustomHandler,\n\tStory,\n\tTextContent,\n\tValidAction,\n\tVirtualActions,\n} from './action';\nimport type { Character } from './character';\nimport type { CleanupFn } from './custom-action';\nimport { DEFAULT_TYPEWRITER_SPEED, EMPTY_SET, MAIN_CONTEXT_KEY } from './constants';\nimport { cleanCleanupSource, getCustomActionCleanupHolder, handleCustomAction } from './custom-action';\nimport { enqueueAssetForPreloading, handleAssetsPreloading, huntAssets } from './preloading';\nimport type { Context, RendererInitPreviewReturn } from './renderer';\nimport { PRELOADED_ASSETS, STACK_MAP } from './shared';\nimport { storageAdapterLocal } from './storage';\nimport type { Stored } from './store';\nimport { derive, store } from './store';\nimport { flattenAllowedContent, replace as replaceTranslation } from './translation';\nimport type { BaseTranslationStrings } from './translations';\nimport type {\n\tCoreData,\n\tData,\n\tEngineTypes,\n\tLang,\n\tNovelyInit,\n\tSave,\n\tState,\n\tStateFunction,\n\tStorageData,\n} from './types';\nimport type { ControlledPromise } from './utilities';\nimport {\n\tisAction,\n\tisAudioAction,\n\tisBlockingAction,\n\tisEmpty,\n\tisFunction,\n\tisPromise,\n\tisString,\n\tisAsset,\n\tmatchAction,\n\tcreateQueueProcessor,\n\tgetActionsFromPath,\n\tcreateReferFunction,\n\texitPath,\n\tcollectActionsBeforeBlockingAction,\n\tnextPath,\n\tcreateControlledPromise,\n\tgetResourseType,\n\tcreateUseStackFunction,\n\tflatStory,\n\tcapitalize,\n\tgetLanguage as defaultGetLanguage,\n\tgetCharactersData,\n\tgetIntlLanguageDisplayName,\n\tgetLanguageFromStore,\n\tgetVolumeFromStore,\n\tnoop,\n\ttoArray,\n} from './utilities';\nimport type { MatchActionHandlers } from './utilities';\nimport { buildActionObject } from './utilities/actions';\nimport { unwrapAsset, unwrapAudioAsset, unwrapImageAsset } from './asset';\nimport { getDialogOverview } from './utilities/dialog-overview';\nimport { setDocumentLanguage } from './utilities/document';\nimport { TickerFactory } from './ticker';\n\nconst novely = <\n\t$Language extends string,\n\t$Characters extends Record<string, Character<$Language>>,\n\t$State extends State,\n\t$Data extends Data,\n\t$Actions extends Record<string, (...args: any[]) => ValidAction>,\n>({\n\tcharacters,\n\tcharacterAssetSizes = {},\n\tdefaultEmotions = {},\n\tstorage = storageAdapterLocal({ key: 'novely-game-storage' }),\n\tstorageDelay = Promise.resolve(),\n\trenderer: createRenderer,\n\tinitialScreen = 'mainmenu',\n\ttranslation,\n\tstate: defaultState = {} as $State,\n\tdata: defaultData = {} as $Data,\n\tautosaves = true,\n\tmigrations = [],\n\tthrottleTimeout = 850,\n\tgetLanguage = defaultGetLanguage,\n\toverrideLanguage = false,\n\taskBeforeExit = true,\n\tpreloadAssets = 'automatic',\n\tparallelAssetsDownloadLimit = 15,\n\tfetch: request = fetch,\n\tcloneFunction: clone = klona,\n\tsaveOnUnload = true,\n\tstartKey = 'start',\n\tdefaultTypewriterSpeed = DEFAULT_TYPEWRITER_SPEED,\n\tstoryOptions = { mode: 'static' },\n\tonLanguageChange,\n}: NovelyInit<$Language, $Characters, $State, $Data, $Actions>) => {\n\ttype $ActionProxy = ActionProxy<$Characters, $Language, $State>;\n\ttype $VirtualActions = VirtualActions<$Characters, $Language, $State>;\n\n\t// All action functions\n\ttype Actions = $Actions & $ActionProxy & $VirtualActions;\n\n\tconst languages = Object.keys(translation) as $Language[];\n\n\tconst limitScript = pLimit(1);\n\tconst limitAssetsDownload = pLimit(parallelAssetsDownloadLimit);\n\n\tconst story: Story = {};\n\n\tconst times = new Set<number>();\n\n\tconst dataLoaded = createControlledPromise();\n\n\tlet initialScreenWasShown = false;\n\tlet destroyed = false;\n\n\tif (storyOptions.mode === 'dynamic') {\n\t\tstoryOptions.preloadSaves ??= 4;\n\t}\n\n\tconst storyLoad = storyOptions.mode === 'static' ? noop : storyOptions.load;\n\tconst onUnknownSceneHit = memoize(async (scene: string) => {\n\t\tconst part = await storyLoad(scene);\n\n\t\tif (part) {\n\t\t\tawait script(part);\n\t\t}\n\t});\n\n\t/**\n\t * Saves timestamps created in this session\n\t */\n\tconst intime = (value: number) => {\n\t\treturn times.add(value), value;\n\t};\n\n\tconst scriptBase = async (part: Story) => {\n\t\t// In case script was called after destroy\n\t\tif (destroyed) return;\n\n\t\tObject.assign(story, flatStory(part));\n\n\t\t// This is the first `script` call, likely data did not loaded yet\n\t\tif (!initialScreenWasShown) {\n\t\t\trenderer.ui.showLoading();\n\t\t}\n\n\t\tawait dataLoaded.promise;\n\n\t\trenderer.ui.hideLoading();\n\n\t\tif (!initialScreenWasShown) {\n\t\t\tinitialScreenWasShown = true;\n\n\t\t\tif (initialScreen === 'game') {\n\t\t\t\trestore(undefined);\n\t\t\t} else {\n\t\t\t\trenderer.ui.showScreen(initialScreen);\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Setup your story here\n\t *\n\t * Call more than once to merge different story parts\n\t *\n\t * @example\n\t *\n\t * ```js\n\t * engine.script({\n\t * start: [action.jump('another-part')]\n\t * })\n\t *\n\t * engine.script({\n\t * 'another-part': []\n\t * })\n\t * ```\n\t */\n\tconst script = (part: Story) => {\n\t\treturn limitScript(() => scriptBase(part));\n\t};\n\n\tconst getDefaultSave = (state: $State) => {\n\t\treturn [\n\t\t\t[\n\t\t\t\t['jump', startKey],\n\t\t\t\t[null, 0],\n\t\t\t],\n\t\t\tstate,\n\t\t\t[intime(Date.now()), 'auto'],\n\t\t\t[],\n\t\t] as Save<$State>;\n\t};\n\n\t/**\n\t * Calls `getLanguage`, passes needed arguments\n\t * @returns language\n\t */\n\tconst getLanguageWithoutParameters = () => {\n\t\tconst language = getLanguage(languages, defaultGetLanguage);\n\n\t\t// This is valid language\n\t\tif (languages.includes(language as $Language)) {\n\t\t\tsetDocumentLanguage(language);\n\n\t\t\treturn language as $Language;\n\t\t}\n\n\t\tif (DEV) {\n\t\t\tthrow new Error(\n\t\t\t\t`Attempt to use unsupported language \"${language}\". Supported languages: ${languages.join(', ')}.`,\n\t\t\t);\n\t\t}\n\n\t\tthrow 0;\n\t};\n\n\t/**\n\t * 1) Novely rendered using the `initialData`, but you can't start new game or `load` an empty one - this is scary, imagine losing your progress\n\t * 2) Actual stored data is loaded, language and etc is changed\n\t */\n\tconst initialData: StorageData<$Language, $Data> = {\n\t\tsaves: [],\n\t\tdata: clone(defaultData),\n\t\tmeta: [getLanguageWithoutParameters(), DEFAULT_TYPEWRITER_SPEED, 1, 1, 1],\n\t};\n\n\tconst storageData = store(initialData);\n\tconst coreData = store<CoreData>({\n\t\tdataLoaded: false,\n\t\tpaused: false,\n\t\tfocused: document.visibilityState === 'visible',\n\t});\n\n\tconst paused = derive(coreData, (s) => s.paused || !s.focused);\n\n\tconst onDataLoadedPromise = async ({ cancelled }: Awaited<ControlledPromise<void>>) => {\n\t\t/**\n\t\t * Promise cancelled? Re-subscribe\n\t\t */\n\t\tif (cancelled) {\n\t\t\tdataLoaded.promise.then(onDataLoadedPromise);\n\t\t\treturn;\n\t\t}\n\n\t\tconst preload = () => {\n\t\t\tconst saves = [...storageData.get().saves].reverse();\n\t\t\tconst sliced = saves.slice(0, storyOptions.mode === 'dynamic' ? storyOptions.preloadSaves : 0);\n\n\t\t\tfor (const [path] of sliced) {\n\t\t\t\treferGuarded(path);\n\t\t\t}\n\t\t};\n\n\t\tpreload();\n\n\t\t/**\n\t\t * When promise is resolved data is marked loaded\n\t\t */\n\t\tcoreData.update((data) => {\n\t\t\tdata.dataLoaded = true;\n\n\t\t\treturn data;\n\t\t});\n\t};\n\n\tdataLoaded.promise.then(onDataLoadedPromise);\n\n\tconst onStorageDataChange = (value: StorageData) => {\n\t\tif (!coreData.get().dataLoaded) return;\n\n\t\tconst data = clone(value);\n\n\t\t/**\n\t\t * Empty out data snapshots\n\t\t */\n\t\tfor (const save of data.saves) {\n\t\t\tsave[3] = [];\n\t\t}\n\n\t\tstorage.set(data);\n\t};\n\n\t/**\n\t * Short one is used in conditions like `beforeunload` when waiting for too long is not a case\n\t * Another one relies on short one to prevent double saving\n\t */\n\tconst throttledShortOnStorageDataChange = throttle(() => onStorageDataChange(storageData.get()), 10);\n\tconst throttledOnStorageDataChange = throttle(throttledShortOnStorageDataChange, throttleTimeout);\n\n\tstorageData.subscribe(throttledOnStorageDataChange);\n\n\tif (saveOnUnload === true || (saveOnUnload === 'prod' && !DEV)) {\n\t\taddEventListener('beforeunload', throttledShortOnStorageDataChange);\n\t}\n\n\tconst getStoredData = async () => {\n\t\tlet stored = await storage.get();\n\n\t\tfor (const migration of migrations) {\n\t\t\tstored = migration(stored) as StorageData;\n\n\t\t\tif (DEV && !stored) {\n\t\t\t\tthrow new Error('Migrations should return a value.');\n\t\t\t}\n\t\t}\n\n\t\tif (overrideLanguage || !stored.meta[0]) {\n\t\t\tstored.meta[0] = getLanguageWithoutParameters();\n\t\t}\n\n\t\t/**\n\t\t * Default `localStorageStorage` returns empty array\n\t\t */\n\t\tstored.meta[1] ||= defaultTypewriterSpeed;\n\n\t\t/**\n\t\t * Sound Volumes\n\t\t */\n\t\tstored.meta[2] ??= 1;\n\t\tstored.meta[3] ??= 1;\n\t\tstored.meta[4] ??= 1;\n\n\t\t/**\n\t\t * When data is empty replace it with `defaultData`\n\t\t * It also might be empty (default to empty)\n\t\t */\n\t\tif (isEmpty(stored.data)) {\n\t\t\tstored.data = defaultData as Data;\n\t\t}\n\n\t\t/**\n\t\t * Now the next store updates will entail saving via storage.set\n\t\t */\n\t\tdataLoaded.resolve();\n\n\t\tstorageData.set(stored as StorageData<$Language, $Data>);\n\t};\n\n\t/**\n\t * By default this is resolved immediately, but also can be delayed.\n\t * I.e. storage has not loaded yet\n\t */\n\tstorageDelay.then(getStoredData);\n\n\tconst initial = getDefaultSave(clone(defaultState));\n\n\t// #region Save Function\n\tconst save = (type: Save[2][1]) => {\n\t\tif (!coreData.get().dataLoaded) return;\n\n\t\t/**\n\t\t * When autosaves diabled just return\n\t\t */\n\t\tif (!autosaves && type === 'auto') return;\n\n\t\t/**\n\t\t * Saves only possible in main context, so there is no reason for context to be used here\n\t\t */\n\t\tconst stack = useStack(MAIN_CONTEXT_KEY);\n\t\tconst current = clone(stack.value);\n\n\t\tstorageData.update((prev) => {\n\t\t\tconst replace = () => {\n\t\t\t\tprev.saves[prev.saves.length - 1] = current;\n\n\t\t\t\treturn prev;\n\t\t\t};\n\n\t\t\tconst add = () => {\n\t\t\t\tprev.saves.push(current);\n\n\t\t\t\treturn prev;\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * Get latest\n\t\t\t */\n\t\t\tconst last = prev.saves.at(-1);\n\n\t\t\t/**\n\t\t\t * We cannot compare anything here, thus just reutrn\n\t\t\t */\n\t\t\tif (!last) return add();\n\n\t\t\t/**\n\t\t\t * Update type and time information\n\t\t\t */\n\t\t\tcurrent[2][0] = intime(Date.now());\n\t\t\tcurrent[2][1] = type;\n\n\t\t\t/**\n\t\t\t * Empty out state snapshots\n\t\t\t */\n\t\t\tcurrent[3] = [];\n\n\t\t\tconst isIdentical = dequal(last[0], current[0]) && dequal(last[1], current[1]);\n\t\t\tconst isLastMadeInCurrentSession = times.has(last[2][0]);\n\n\t\t\t/**\n\t\t\t * Even if override is false, we will replace auto save with manual, because they are the same thing basically\n\t\t\t */\n\t\t\tif (isLastMadeInCurrentSession && last[2][1] === 'auto' && type === 'manual') {\n\t\t\t\treturn replace();\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Player has made a manual save, novely decided to make an auto save\n\t\t\t * But it is identical to previously created manual save so completely not wanted\n\t\t\t */\n\t\t\tif (last[2][1] === 'manual' && type === 'auto' && isIdentical) {\n\t\t\t\treturn prev;\n\t\t\t}\n\n\t\t\tif (isLastMadeInCurrentSession && last[2][1] === 'auto' && type === 'auto') {\n\t\t\t\treturn replace();\n\t\t\t}\n\n\t\t\treturn add();\n\t\t});\n\t};\n\t// #endregion\n\n\t// #region New Game\n\tconst newGame = () => {\n\t\tif (!coreData.get().dataLoaded) return;\n\n\t\tconst save = getDefaultSave(clone(defaultState));\n\n\t\t/**\n\t\t * Initial save is automatic, and should be ignored when autosaves is turned off\n\t\t */\n\t\tif (autosaves) {\n\t\t\tstorageData.update((prev) => {\n\t\t\t\treturn prev.saves.push(save), prev;\n\t\t\t});\n\t\t}\n\n\t\tconst context = renderer.getContext(MAIN_CONTEXT_KEY);\n\t\tconst stack = useStack(context);\n\n\t\tstack.value = save;\n\t\tcontext.meta.restoring = context.meta.goingBack = false;\n\n\t\trenderer.ui.showScreen('game');\n\n\t\trender(context);\n\t};\n\t// #endregion\n\n\t/**\n\t * Set's the save and restores onto it\n\t */\n\tconst set = (save: Save, ctx?: Context) => {\n\t\tconst stack = useStack(ctx || MAIN_CONTEXT_KEY);\n\n\t\tstack.value = save;\n\n\t\treturn restore(save);\n\t};\n\n\tlet interacted = 0;\n\n\t// #region Restore Function\n\t/**\n\t * Restore save or if none is passed then look for latest save, if there is no saves will create a new save\n\t */\n\tconst restore = async (save: Save | undefined) => {\n\t\tif (isEmpty(story)) {\n\t\t\tif (DEV) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Story is empty. You should call an `enine.script` function [https://novely.pages.dev/guide/story.html]',\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (!coreData.get().dataLoaded) return;\n\n\t\tlet latest = save || storageData.get().saves.at(-1);\n\n\t\t/**\n\t\t * When there is no save, make a new save\n\t\t */\n\t\tif (!latest) {\n\t\t\tlatest = clone(initial);\n\n\t\t\tstorageData.update((prev) => {\n\t\t\t\tprev.saves.push(latest!);\n\n\t\t\t\treturn prev;\n\t\t\t});\n\t\t}\n\n\t\tconst context = renderer.getContext(MAIN_CONTEXT_KEY);\n\t\tconst stack = useStack(context);\n\n\t\tcontext.meta.restoring = true;\n\n\t\tconst previous = stack.previous;\n\n\t\tconst [path] = (stack.value = latest);\n\n\t\trenderer.ui.showScreen('game');\n\n\t\tconst { found } = await refer(path);\n\n\t\tif (found) context.loading(true);\n\n\t\tconst { queue, skip, skipPreserve } = await getActionsFromPath({\n\t\t\tstory,\n\t\t\tpath,\n\t\t\tfilter: false,\n\t\t\treferGuarded,\n\t\t});\n\n\t\tconst cleanupHolder = getCustomActionCleanupHolder(context);\n\n\t\tif (previous) {\n\t\t\tconst { queue: prevQueue } = await getActionsFromPath({\n\t\t\t\tstory,\n\t\t\t\tpath: previous[0],\n\t\t\t\tfilter: false,\n\t\t\t\treferGuarded,\n\t\t\t});\n\n\t\t\tconst futures: CustomHandler[] = [];\n\n\t\t\tconst isFromDifferentBranches = previous[0][0][1] !== path[0][1];\n\t\t\tconst end = isFromDifferentBranches ? 0 : queue.length - 1;\n\n\t\t\tfor (let i = prevQueue.length - 1; i >= end; i--) {\n\t\t\t\tconst [action, fn] = prevQueue[i];\n\n\t\t\t\tif (action === 'custom') {\n\t\t\t\t\tfutures.push(fn);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfutures.reverse();\n\n\t\t\tconst nodeCleanup = new Set<CleanupFn>();\n\n\t\t\tfor (const future of futures) {\n\t\t\t\tinner: for (let i = cleanupHolder.length - 1; i >= 0; i--) {\n\t\t\t\t\tconst item = cleanupHolder[i];\n\n\t\t\t\t\tif (future === item.fn) {\n\t\t\t\t\t\tcleanCleanupSource(item);\n\t\t\t\t\t\tnodeCleanup.add(item.node);\n\n\t\t\t\t\t\tcleanupHolder.splice(i, 1);\n\n\t\t\t\t\t\tbreak inner;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tnodeCleanup.forEach((f) => f());\n\t\t}\n\n\t\tconst {\n\t\t\trun,\n\t\t\tkeep: { keep, characters, audio },\n\t\t} = createQueueProcessor(queue, {\n\t\t\tskip,\n\t\t\tskipPreserve,\n\t\t});\n\n\t\tif (context.meta.goingBack) {\n\t\t\t/**\n\t\t\t * Context is cleared at exit, so it is dirty only when goingBack\n\t\t\t */\n\t\t\tmatch('clear', [keep, characters, audio], {\n\t\t\t\tctx: context,\n\t\t\t\tdata: latest[1],\n\t\t\t});\n\t\t}\n\n\t\tcontext.loading(false);\n\n\t\tconst lastQueueItem = queue.at(-1);\n\t\tconst lastQueueItemRequiresUserAction = lastQueueItem && isBlockingAction(lastQueueItem);\n\n\t\tawait run((item) => {\n\t\t\tif (!latest) return;\n\n\t\t\t/**\n\t\t\t * Skip because last item will be ran again by `render(context)` call\n\t\t\t */\n\t\t\tif (lastQueueItem === item && lastQueueItemRequiresUserAction) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst [action, ...props] = item;\n\n\t\t\tif (action === 'custom') {\n\t\t\t\t/**\n\t\t\t\t * We check if there's an existing cleanup function for this action.\n\t\t\t\t * If found, it means the previous run hasn't been cleaned up yet.\n\t\t\t\t * In that case, we avoid re-running.\n\t\t\t\t */\n\t\t\t\tif (cleanupHolder.some((holder) => holder.fn === props[0])) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn match(action, props, {\n\t\t\t\tctx: context,\n\t\t\t\tdata: latest[1],\n\t\t\t});\n\t\t});\n\n\t\tif (!context.meta.goingBack) {\n\t\t\t/**\n\t\t\t * When not goingBack setting restoring to false is required to go forward\n\t\t\t * Because when restoring action do not call the resolve function which goes to next action but are controlled\n\t\t\t */\n\t\t\tcontext.meta.restoring = false;\n\t\t}\n\n\t\tawait render(context);\n\n\t\tcontext.meta.restoring = context.meta.goingBack = false;\n\t};\n\t// #endregion\n\n\tconst { refer, referGuarded } = createReferFunction({\n\t\tstory,\n\t\tonUnknownSceneHit,\n\t});\n\n\t// #region Exit Function\n\t/**\n\t * @param force Force exit\n\t */\n\tconst exit = (force = false, saving = true) => {\n\t\t/**\n\t\t * Exit only possible in main context\n\t\t */\n\t\tconst ctx = renderer.getContext(MAIN_CONTEXT_KEY);\n\n\t\tconst stack = useStack(ctx);\n\t\tconst current = stack.value;\n\n\t\tconst isSaved = () => {\n\t\t\tconst { saves } = storageData.get();\n\t\t\tconst [currentPath, currentData] = stack.value;\n\n\t\t\treturn saves.some(\n\t\t\t\t([path, data, [date, type]]) =>\n\t\t\t\t\ttype === 'manual' && times.has(date) && dequal(path, currentPath) && dequal(data, currentData),\n\t\t\t);\n\t\t};\n\n\t\tif (interacted > 1 && !force && askBeforeExit && !isSaved()) {\n\t\t\trenderer.ui.showExitPrompt();\n\t\t\treturn;\n\t\t}\n\n\t\t/**\n\t\t * Imagine list of actions like\n\t\t *\n\t\t * [\n\t\t * ['input', ...args]\n\t\t * ['dialog', ...args]\n\t\t * ]\n\t\t *\n\t\t * When you have done with input, you will go to the dialog\n\t\t * And at that moment you exit the game\n\t\t *\n\t\t * What happens? Input was \"enmemoried\", but dialog not. So when you will open saves, you'll see input action.\n\t\t * We cannot \"enmemory\" dialog when it's just started, because goingBack is going to last enmemoried item, which will be that dialog, so impossible to go back.\n\t\t *\n\t\t * What we do is enmemory on exit.\n\t\t */\n\t\tif (interacted > 0 && saving) {\n\t\t\tsave('auto');\n\t\t}\n\n\t\tstack.clear();\n\t\tclearCustomActionsAtContext(ctx);\n\t\tctx.clear(EMPTY_SET, EMPTY_SET, { music: EMPTY_SET, sounds: EMPTY_SET }, noop);\n\t\trenderer.ui.showScreen('mainmenu');\n\t\tctx.audio.destroy();\n\n\t\tconst [time, type] = current[2];\n\n\t\t/**\n\t\t * This is auto save and belongs to the current session\n\t\t * Player did not interacted or did it once, so this is probably not-needed save\n\t\t */\n\t\tif (type === 'auto' && interacted <= 1 && times.has(time)) {\n\t\t\tstorageData.update((prev) => {\n\t\t\t\tprev.saves = prev.saves.filter((save) => save !== current);\n\n\t\t\t\treturn prev;\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Reset interactive value\n\t\t */\n\t\tinteractivity(false);\n\t\t/**\n\t\t * Reset session times\n\t\t */\n\t\ttimes.clear();\n\t};\n\t// #endregion\n\n\tconst back = async () => {\n\t\t/**\n\t\t * Back also happens in main context only\n\t\t */\n\t\tconst stack = useStack(MAIN_CONTEXT_KEY);\n\n\t\tconst valueBeforeBack = stack.value;\n\n\t\tstack.back();\n\n\t\t/**\n\t\t * There was only one item in the stack so there is no `stack.previous`, also `ctx.meta.goingBack` did not changed\n\t\t */\n\t\tif (dequal(valueBeforeBack, stack.value) && !stack.previous) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait restore(stack.value);\n\t};\n\n\tconst t = (key: BaseTranslationStrings, lang: string | $Language) => {\n\t\treturn translation[lang as $Language].internal[key];\n\t};\n\n\t// #region Preview Function\n\t/**\n\t * Execute save in context named `name`\n\t * @param save Save\n\t * @param name Context name\n\t */\n\tconst preview = async (save: Save, name: string): Promise<RendererInitPreviewReturn> => {\n\t\tif (isEmpty(story)) {\n\t\t\treturn Promise.resolve({\n\t\t\t\tassets: [],\n\t\t\t});\n\t\t}\n\n\t\tconst [path, data] = save;\n\n\t\tconst ctx = renderer.getContext(name);\n\n\t\tconst { found } = await refer(path);\n\n\t\tif (found) ctx.loading(true);\n\n\t\tconst { queue } = await getActionsFromPath({\n\t\t\tstory,\n\t\t\tpath,\n\t\t\tfilter: true,\n\t\t\treferGuarded,\n\t\t});\n\n\t\tctx.loading(false);\n\n\t\t// Enter restoring mode in action\n\t\tctx.meta.restoring = true;\n\t\tctx.meta.preview = true;\n\n\t\tconst processor = createQueueProcessor(queue, {\n\t\t\tskip: EMPTY_SET,\n\t\t});\n\n\t\tuseStack(ctx).push(clone(save));\n\n\t\tconst assets: string[] = [];\n\n\t\tawait processor.run(([action, ...props]) => {\n\t\t\tif (isAudioAction(action)) return;\n\t\t\tif (action === 'vibrate') return;\n\t\t\tif (action === 'end') return;\n\n\t\t\thuntAssets({\n\t\t\t\taction,\n\t\t\t\tprops: props as any,\n\n\t\t\t\tcharacters,\n\n\t\t\t\tlang: getLanguageFromStore(storageData),\n\t\t\t\tvolume: getVolumeFromStore(storageData),\n\n\t\t\t\thandle: assets.push.bind(assets),\n\t\t\t});\n\n\t\t\treturn match(action, props, {\n\t\t\t\tctx,\n\t\t\t\tdata,\n\t\t\t});\n\t\t});\n\n\t\treturn {\n\t\t\tassets,\n\t\t};\n\t};\n\t// #endregion\n\n\tconst removeContext = (name: string) => {\n\t\tSTACK_MAP.delete(name);\n\t};\n\n\tconst getStateAtCtx = (context: string | Context) => {\n\t\treturn useStack(context).value[1];\n\t};\n\n\tconst getStateFunction = (context: string | Context) => {\n\t\tconst stack = useStack(context);\n\n\t\tconst state = ((value) => {\n\t\t\tconst _state = getStateAtCtx(context);\n\n\t\t\tif (!value) {\n\t\t\t\treturn _state;\n\t\t\t}\n\n\t\t\tconst prev = _state;\n\t\t\tconst val = isFunction(value) ? value(prev) : deepmerge(prev, value);\n\n\t\t\tstack.value[1] = val;\n\n\t\t\treturn undefined;\n\t\t}) as StateFunction<State>;\n\n\t\treturn state;\n\t};\n\n\tconst getLanguageDisplayName = (lang: Lang) => {\n\t\tconst language = translation[lang as $Language];\n\n\t\tif (DEV && !language) {\n\t\t\tthrow new Error(\n\t\t\t\t`Attempt to use unsupported language \"${language}\". Supported languages: ${languages.join(', ')}.`,\n\t\t\t);\n\t\t}\n\n\t\treturn capitalize(language.nameOverride || getIntlLanguageDisplayName(lang));\n\t};\n\n\tconst clearCustomActionsAtContext = (ctx: Context) => {\n\t\tconst cleanupHolder = getCustomActionCleanupHolder(ctx);\n\t\tconst nodeCleanup = new Set<CleanupFn>();\n\n\t\tfor (const item of cleanupHolder) {\n\t\t\tcleanCleanupSource(item);\n\t\t\tnodeCleanup.add(item.node);\n\t\t}\n\n\t\tcleanupHolder.length = 0;\n\t\tnodeCleanup.forEach((fn) => fn());\n\t};\n\n\tconst getResourseTypeWrapper = (url: string) => {\n\t\treturn getResourseType({\n\t\t\turl,\n\t\t\trequest,\n\t\t});\n\t};\n\n\tconst getCharacterColor = (c: keyof $Characters) => {\n\t\treturn c in characters ? characters[c].color : '#000000';\n\t};\n\n\tconst getCharacterAssets = (character: string, emotion: string) => {\n\t\treturn toArray(characters[character].emotions[emotion]).map(unwrapImageAsset);\n\t};\n\n\tconst getCharacterName = (character: keyof $Characters): string => {\n\t\tconst c = character;\n\t\tconst cs = characters;\n\t\tconst lang = getLanguageFromStore(storageData);\n\n\t\tif (c && c in cs) {\n\t\t\tconst block = cs[c].name;\n\n\t\t\tif (typeof block === 'string') {\n\t\t\t\treturn block;\n\t\t\t}\n\n\t\t\tif (lang in block) {\n\t\t\t\treturn block[lang];\n\t\t\t}\n\t\t}\n\n\t\treturn String(c);\n\t};\n\n\tconst setLanguage = (lang: string) => {\n\t\tstorageData.update((prev) => {\n\t\t\tif (languages.includes(lang as $Language)) {\n\t\t\t\tprev.meta[0] = lang as $Language;\n\t\t\t}\n\n\t\t\tif (lang === prev.meta[0]) {\n\t\t\t\tsetDocumentLanguage(lang);\n\t\t\t\tonLanguageChange?.(lang as $Language);\n\t\t\t}\n\n\t\t\treturn prev;\n\t\t});\n\t};\n\n\t// #region Renderer Creation\n\tconst renderer = createRenderer({\n\t\tmainContextKey: MAIN_CONTEXT_KEY,\n\n\t\tcharacters: getCharactersData(characters),\n\t\tcharacterAssetSizes,\n\t\tset,\n\t\trestore,\n\t\tsave,\n\t\tnewGame,\n\t\texit,\n\t\tback,\n\t\tt,\n\t\tpreview,\n\t\tremoveContext,\n\t\tgetStateFunction,\n\t\tclearCustomActionsAtContext,\n\t\tlanguages,\n\t\tstorageData: storageData as unknown as Stored<StorageData<string, Data>>,\n\t\tcoreData,\n\n\t\tgetLanguageDisplayName,\n\t\tgetCharacterColor,\n\t\tgetCharacterAssets,\n\t\tgetDialogOverview: getDialogOverview.bind({\n\t\t\treferGuarded,\n\t\t\tstory,\n\t\t\tgetCharacterName,\n\t\t\tgetLanguage: () => getLanguageFromStore(storageData),\n\t\t\tgetStack: () => useStack(MAIN_CONTEXT_KEY),\n\t\t\ttemplateReplace: (...args) => templateReplace(...args),\n\t\t}),\n\n\t\tgetResourseType: getResourseTypeWrapper,\n\n\t\tsetLanguage,\n\t});\n\t// #endregion\n\n\tconst useStack = createUseStackFunction(renderer);\n\n\t/**\n\t * Initiate\n\t */\n\tuseStack(MAIN_CONTEXT_KEY).push(initial);\n\n\tconst UIInstance = renderer.ui.start();\n\n\tconst enmemory = (ctx: Context) => {\n\t\tif (ctx.meta.restoring) return;\n\n\t\tconst stack = useStack(ctx);\n\n\t\tconst current = clone(stack.value);\n\n\t\tcurrent[2][1] = 'auto';\n\n\t\tstack.push(current);\n\n\t\tsave('auto');\n\t};\n\n\tconst next = (ctx: Context) => {\n\t\tconst stack = useStack(ctx);\n\t\tconst path = stack.value[0];\n\n\t\tnextPath(path);\n\t};\n\n\tconst matchActionOptions: MatchActionHandlers = {\n\t\tgetContext: renderer.getContext,\n\t\tpush(ctx) {\n\t\t\tif (ctx.meta.restoring) return;\n\n\t\t\tnext(ctx);\n\t\t\trender(ctx);\n\t\t},\n\t\tforward(ctx) {\n\t\t\tif (!ctx.meta.preview) enmemory(ctx);\n\n\t\t\tmatchActionOptions.push(ctx);\n\n\t\t\tif (!ctx.meta.preview) interactivity(true);\n\t\t},\n\t\tasync onBeforeActionCall({ action, props, ctx }) {\n\t\t\tif (preloadAssets !== 'automatic') return;\n\t\t\tif (ctx.meta.preview || ctx.meta.restoring) return;\n\t\t\tif (!isBlockingAction([action, ...props] as unknown as Exclude<ValidAction, ValidAction[]>)) return;\n\n\t\t\ttry {\n\t\t\t\tconst collection = await collectActionsBeforeBlockingAction({\n\t\t\t\t\tpath: nextPath(clone(useStack(ctx).value[0])),\n\t\t\t\t\trefer: referGuarded,\n\t\t\t\t\tclone,\n\t\t\t\t});\n\n\t\t\t\tfor (const [action, ...props] of collection) {\n\t\t\t\t\thuntAssets({\n\t\t\t\t\t\taction,\n\t\t\t\t\t\tprops: props as any,\n\n\t\t\t\t\t\tcharacters,\n\n\t\t\t\t\t\tlang: getLanguageFromStore(storageData),\n\t\t\t\t\t\tvolume: getVolumeFromStore(storageData),\n\n\t\t\t\t\t\thandle: enqueueAssetForPreloading,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\thandleAssetsPreloading({\n\t\t\t\t\t...renderer.misc,\n\t\t\t\t\trequest,\n\t\t\t\t\tlimiter: limitAssetsDownload,\n\t\t\t\t});\n\t\t\t} catch (cause) {\n\t\t\t\tconsole.error(cause);\n\t\t\t}\n\t\t},\n\t};\n\n\tconst ticker = new TickerFactory(paused);\n\n\t// #region Match Action\n\tconst { match, nativeActions } = matchAction(matchActionOptions, {\n\t\twait({ ctx, data, push }, [time]) {\n\t\t\tif (ctx.meta.restoring) return;\n\n\t\t\tsetTimeout(push, isFunction(time) ? time(data) : time);\n\t\t},\n\t\tshowBackground({ ctx, push }, [background]) {\n\t\t\tif (isString(background) || isAsset(background)) {\n\t\t\t\tctx.background({\n\t\t\t\t\tall: unwrapImageAsset(background),\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tctx.background(\n\t\t\t\t\tObject.fromEntries(Object.entries(background).map(([media, asset]) => [media, unwrapImageAsset(asset)])),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tpush();\n\t\t},\n\t\tplayMusic({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'music').play(true);\n\t\t\tpush();\n\t\t},\n\t\tpauseMusic({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'music').pause();\n\t\t\tpush();\n\t\t},\n\t\tstopMusic({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'music').stop();\n\t\t\tpush();\n\t\t},\n\t\tplaySound({ ctx, push }, [source, loop]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'sound').play(loop || false);\n\t\t\tpush();\n\t\t},\n\t\tpauseSound({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'sound').pause();\n\t\t\tpush();\n\t\t},\n\t\tstopSound({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'sound').stop();\n\t\t\tpush();\n\t\t},\n\t\tvoice({ ctx, push }, [source]) {\n\t\t\tconst lang = getLanguageFromStore(storageData);\n\t\t\tconst audioSource = isString(source) ? source : isAsset(source) ? source : source[lang];\n\n\t\t\t/**\n\t\t\t * We allow ignoring voice because it is okay to not have voiceover for certain languages\n\t\t\t */\n\t\t\tif (!audioSource) {\n\t\t\t\tpush();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tctx.audio.voice(unwrapAudioAsset(audioSource), paused);\n\t\t\tpush();\n\t\t},\n\t\tstopVoice({ ctx, push }) {\n\t\t\tctx.audio.voiceStop();\n\t\t\tpush();\n\t\t},\n\t\tshowCharacter({ ctx, push }, [character, emotion, className, style]) {\n\t\t\temotion ??= defaultEmotions[character];\n\n\t\t\tif (DEV && !emotion) {\n\t\t\t\tthrow new Error(`Attemp to show character \"${character}\" without emotion provided.`);\n\t\t\t}\n\n\t\t\tif (!emotion) return;\n\n\t\t\tif (DEV && !characters[character].emotions[emotion]) {\n\t\t\t\tthrow new Error(`Attempt to show character \"${character}\" with unknown emotion \"${emotion}\"`);\n\t\t\t}\n\n\t\t\tconst handle = ctx.character(character);\n\n\t\t\thandle.append(className, style, ctx.meta.restoring);\n\t\t\thandle.emotion(emotion, true);\n\n\t\t\tpush();\n\t\t},\n\t\thideCharacter({ ctx, push }, [character, className, style, duration]) {\n\t\t\tctx.character(character).remove(className, style, duration, ctx.meta.restoring).then(push);\n\t\t},\n\t\tdialog({ ctx, data, forward }, [character, content, emotion]) {\n\t\t\tconst name = getCharacterName(character);\n\t\t\tconst stack = useStack(ctx);\n\n\t\t\t/**\n\t\t\t * For each \"dialog\" we save copy of current game state\n\t\t\t * It's used for dialog overview\n\t\t\t */\n\t\t\tif (!ctx.meta.restoring && !ctx.meta.goingBack) {\n\t\t\t\tstack.value[3].push(clone(data));\n\t\t\t}\n\n\t\t\tctx.clearBlockingActions('dialog');\n\n\t\t\tctx.dialog(templateReplace(content, data), templateReplace(name, data), character, emotion, forward);\n\t\t},\n\t\tfunction({ ctx, push }, [fn]) {\n\t\t\tconst { restoring, goingBack, preview } = ctx.meta;\n\n\t\t\tconst result = fn({\n\t\t\t\tlang: getLanguageFromStore(storageData),\n\t\t\t\tgoingBack,\n\t\t\t\trestoring,\n\t\t\t\tpreview,\n\t\t\t\tstate: getStateFunction(ctx),\n\t\t\t});\n\n\t\t\tif (!ctx.meta.restoring) {\n\t\t\t\tresult ? result.then(push) : push();\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\t\tchoice({ ctx, data }, [question, ...choices]) {\n\t\t\tconst isWithoutQuestion = Array.isArray(question);\n\n\t\t\tif (isWithoutQuestion) {\n\t\t\t\t/**\n\t\t\t\t * Can be string or a choice\n\t\t\t\t */\n\t\t\t\tchoices.unshift(question as unknown as ActionChoiceChoice<string, State>);\n\n\t\t\t\t/**\n\t\t\t\t * Omitted then\n\t\t\t\t */\n\t\t\t\tquestion = '';\n\t\t\t}\n\n\t\t\tconst transformedChoices = choices.map(([content, _children, active, visible, onSelect, image]) => {\n\t\t\t\tconst active$ = store(false);\n\t\t\t\tconst visible$ = store(false);\n\n\t\t\t\tconst lang = getLanguageFromStore(storageData);\n\n\t\t\t\tconst getCheckValue = (fn: ChoiceCheckFunction<string, State> | undefined) => {\n\t\t\t\t\t// If there is no explicit \"no\" choice will be active or visible, etc...\n\t\t\t\t\tif (!fn) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Here we need to use \"fresh\" state instead of \"data\" parameter\n\t\t\t\t\treturn fn({\n\t\t\t\t\t\tlang,\n\t\t\t\t\t\tstate: getStateAtCtx(ctx),\n\t\t\t\t\t});\n\t\t\t\t};\n\n\t\t\t\tconst update = () => {\n\t\t\t\t\tactive$.set(getCheckValue(active));\n\t\t\t\t\tvisible$.set(getCheckValue(visible));\n\t\t\t\t};\n\n\t\t\t\tupdate();\n\n\t\t\t\tconst onSelectGuarded = onSelect || noop;\n\t\t\t\tconst onSelectWrapped = () => {\n\t\t\t\t\tonSelectGuarded({\n\t\t\t\t\t\trecompute: update,\n\t\t\t\t\t});\n\t\t\t\t};\n\n\t\t\t\tconst imageValue = image ? unwrapImageAsset(image) : '';\n\n\t\t\t\treturn [templateReplace(content, data), active$, visible$, onSelectWrapped, imageValue] as [\n\t\t\t\t\tstring,\n\t\t\t\t\tStored<boolean>,\n\t\t\t\t\tStored<boolean>,\n\t\t\t\t\t() => void,\n\t\t\t\t\tstring,\n\t\t\t\t];\n\t\t\t});\n\n\t\t\tif (DEV && transformedChoices.length === 0) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Running choice without variants to choose from, look at how to use Choice action properly [https://novely.pages.dev/guide/actions/choice#usage]`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tctx.clearBlockingActions('choice');\n\n\t\t\tctx.choices(templateReplace(question, data), transformedChoices, (selected) => {\n\t\t\t\tif (!ctx.meta.preview) {\n\t\t\t\t\tenmemory(ctx);\n\t\t\t\t}\n\n\t\t\t\tconst stack = useStack(ctx);\n\n\t\t\t\t/**\n\t\t\t\t * If there is a question, then `index` should be shifted by `1`\n\t\t\t\t */\n\t\t\t\tconst offset = isWithoutQuestion ? 0 : 1;\n\n\t\t\t\tif (DEV && !transformedChoices[selected]) {\n\t\t\t\t\tthrow new Error('Choice children is empty, either add content there or make item not selectable');\n\t\t\t\t}\n\n\t\t\t\tstack.value[0].push(['choice', selected + offset], [null, 0]);\n\t\t\t\trender(ctx);\n\t\t\t\tinteractivity(true);\n\t\t\t});\n\t\t},\n\t\tjump({ ctx, data }, [scene]) {\n\t\t\tconst stack = useStack(ctx);\n\n\t\t\t/**\n\t\t\t * `-1` index is used here because `clear` will run `next` that will increase index to `0`\n\t\t\t */\n\t\t\tstack.value[0] = [\n\t\t\t\t['jump', scene],\n\t\t\t\t[null, -1],\n\t\t\t];\n\n\t\t\tstack.value[3] = [];\n\n\t\t\tmatch('clear', [], {\n\t\t\t\tctx,\n\t\t\t\tdata,\n\t\t\t});\n\t\t},\n\t\tclear({ ctx, push }, [keep, characters, audio]) {\n\t\t\t/**\n\t\t\t * Remove vibration\n\t\t\t */\n\t\t\tctx.vibrate(0);\n\n\t\t\t/**\n\t\t\t * Call the actual `clear`\n\t\t\t */\n\t\t\tctx.clear(\n\t\t\t\tkeep || EMPTY_SET,\n\t\t\t\tcharacters || EMPTY_SET,\n\t\t\t\taudio || { music: EMPTY_SET, sounds: EMPTY_SET },\n\t\t\t\tpush,\n\t\t\t);\n\t\t},\n\t\tcondition({ ctx, data }, [condition, variants]) {\n\t\t\tif (DEV && Object.values(variants).length === 0) {\n\t\t\t\tthrow new Error(`Attempt to use Condition action with empty variants object`);\n\t\t\t}\n\n\t\t\tif (!ctx.meta.restoring) {\n\t\t\t\tconst val = String(condition(data));\n\n\t\t\t\tif (DEV && !variants[val]) {\n\t\t\t\t\tthrow new Error(`Attempt to go to unknown variant \"${val}\"`);\n\t\t\t\t}\n\n\t\t\t\tif (DEV && variants[val].length === 0) {\n\t\t\t\t\tthrow new Error(`Attempt to go to empty variant \"${val}\"`);\n\t\t\t\t}\n\n\t\t\t\tconst stack = useStack(ctx);\n\n\t\t\t\tstack.value[0].push(['condition', val], [null, 0]);\n\n\t\t\t\trender(ctx);\n\t\t\t}\n\t\t},\n\t\tend({ ctx }) {\n\t\t\tif (ctx.meta.preview) return;\n\n\t\t\texit(true, false);\n\t\t},\n\t\tinput({ ctx, data, forward }, [question, onInput, setup]) {\n\t\t\tctx.clearBlockingActions('input');\n\n\t\t\tctx.input(templateReplace(question, data), onInput, setup || noop, forward);\n\t\t},\n\t\tcustom({ ctx, push }, [fn]) {\n\t\t\tif (fn.requireUserAction) {\n\t\t\t\tctx.clearBlockingActions(undefined);\n\t\t\t}\n\n\t\t\tconst state = getStateFunction(ctx);\n\t\t\tconst lang = getLanguageFromStore(storageData);\n\n\t\t\tconst result = handleCustomAction(ctx, fn, {\n\t\t\t\t...ctx.custom(fn),\n\t\t\t\tstate,\n\t\t\t\tlang,\n\t\t\t\tgetStack: useStack,\n\t\t\t\tpaused,\n\t\t\t\tticker: ticker.fork(),\n\t\t\t\ttemplateReplace,\n\t\t\t\trequest\n\t\t\t});\n\n\t\t\tconst next = () => {\n\t\t\t\tif (fn.requireUserAction && !ctx.meta.preview) {\n\t\t\t\t\tenmemory(ctx);\n\t\t\t\t\tinteractivity(true);\n\t\t\t\t}\n\n\t\t\t\tpush();\n\t\t\t};\n\n\t\t\tif (!ctx.meta.restoring || ctx.meta.goingBack) {\n\t\t\t\tif (isPromise(result)) {\n\t\t\t\t\tresult.then(next);\n\t\t\t\t} else {\n\t\t\t\t\tnext();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\t\tvibrate({ ctx, push }, pattern) {\n\t\t\tctx.vibrate(pattern);\n\t\t\tpush();\n\t\t},\n\t\tnext({ push }) {\n\t\t\tpush();\n\t\t},\n\t\tanimateCharacter({ ctx, push }, [character, className]) {\n\t\t\tconst classes = className.split(' ');\n\n\t\t\tif (DEV && classes.length === 0) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Attempt to use AnimateCharacter without classes. Classes should be provided [https://novely.pages.dev/guide/actions/animateCharacter.html]',\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (ctx.meta.preview) return;\n\n\t\t\tctx.character(character).animate(classes);\n\n\t\t\tpush();\n\t\t},\n\t\ttext({ ctx, data, forward }, text) {\n\t\t\tconst string = text.map((content) => templateReplace(content, data)).join(' ');\n\n\t\t\tif (DEV && string.length === 0) {\n\t\t\t\tthrow new Error(`Action Text was called with empty string or array`);\n\t\t\t}\n\n\t\t\tctx.clearBlockingActions('text');\n\n\t\t\tctx.text(string, forward);\n\t\t},\n\t\tasync exit({ ctx, data }) {\n\t\t\tif (ctx.meta.restoring) return;\n\n\t\t\tconst { exitImpossible } = await exitPath({\n\t\t\t\tpath: useStack(ctx).value[0],\n\t\t\t\trefer: referGuarded,\n\t\t\t\tonExitImpossible: () => {\n\t\t\t\t\tmatch('end', [], {\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\tdata,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (exitImpossible) {\n\t\t\t\tctx.clearBlockingActions(undefined);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\trender(ctx);\n\t\t},\n\t\tpreload({ ctx, push }, [source]) {\n\t\t\tif (DEV && preloadAssets !== 'lazy') {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`You do not need a preload action because \"preloadAssets\" strategy was set to \"${preloadAssets}\"`,\n\t\t\t\t);\n\n\t\t\t\tpush();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst src = unwrapAsset(source);\n\n\t\t\tif (!ctx.meta.goingBack && !ctx.meta.restoring && !PRELOADED_ASSETS.has(src)) {\n\t\t\t\tconst process = async () => {\n\t\t\t\t\tconst type = isAsset(source) ? source.type : await getResourseTypeWrapper(src);\n\n\t\t\t\t\tif (type === 'image') {\n\t\t\t\t\t\trenderer.misc.preloadAudioBlocking(src);\n\t\t\t\t\t} else if (type === 'audio') {\n\t\t\t\t\t\trenderer.misc.preloadImage(src);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (DEV) {\n\t\t\t\t\t\t\tconsole.error(`Preload error: Unknown type of the following resource: `, source);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Add to preloaded before it was loaded to prevent downloading multiple times\n\t\t\t\t\tPRELOADED_ASSETS.add(src);\n\t\t\t\t};\n\n\t\t\t\tprocess();\n\t\t\t}\n\n\t\t\tpush();\n\t\t},\n\t\tblock({ ctx }, [scene]) {\n\t\t\tif (DEV && !story[scene]) {\n\t\t\t\tthrow new Error(`Attempt to call Block action with unknown scene \"${scene}\"`);\n\t\t\t}\n\n\t\t\tif (DEV && story[scene].length === 0) {\n\t\t\t\tthrow new Error(`Attempt to call Block action with empty scene \"${scene}\"`);\n\t\t\t}\n\n\t\t\tif (!ctx.meta.restoring) {\n\t\t\t\tconst stack = useStack(ctx);\n\n\t\t\t\tstack.value[0].push(['block', scene], [null, 0]);\n\n\t\t\t\trender(ctx);\n\t\t\t}\n\t\t},\n\t});\n\t// #endregion\n\n\t// #region Action\n\tconst action = buildActionObject({\n\t\trendererActions: renderer.actions,\n\t\tnativeActions,\n\t\tcharacters,\n\t});\n\t// #endregion\n\n\t// #region Render Function\n\tconst render = async (ctx: Context) => {\n\t\tconst stack = useStack(ctx);\n\t\tconst [path, state] = stack.value;\n\n\t\tconst { found, value } = await refer(path);\n\n\t\tif (found) {\n\t\t\tctx.loading(true);\n\t\t}\n\n\t\tconst referred = await value;\n\n\t\tif (found) {\n\t\t\tctx.loading(false);\n\t\t}\n\n\t\tif (isAction(referred)) {\n\t\t\tconst [action, ...props] = referred;\n\n\t\t\tmatch(action, props, {\n\t\t\t\tctx,\n\t\t\t\tdata: state,\n\t\t\t});\n\t\t} else if (Object.values(story).some((branch) => branch === referred)) {\n\t\t\t/**\n\t\t\t * Developer might not write the end action on their own, so we will catch situation when there are no other options than end the game.\n\t\t\t *\n\t\t\t * There are three options right now.\n\t\t\t * - We've got to the action — gonna render it\n\t\t\t * - We've got `undefined`. This means we are tried to go forward, but story array ended already, so we are gonna run exit\n\t\t\t * - We've got branch of story object. This means we exitied from where it's possible to exit and now we can only end the game\n\t\t\t */\n\t\t\tmatch('end', [], {\n\t\t\t\tctx,\n\t\t\t\tdata: state,\n\t\t\t});\n\t\t} else {\n\t\t\tmatch('exit', [], {\n\t\t\t\tctx,\n\t\t\t\tdata: state,\n\t\t\t});\n\t\t}\n\t};\n\t// #endregion\n\n\tconst interactivity = (value = false) => {\n\t\tinteracted = value ? interacted + 1 : 0;\n\t};\n\n\t/**\n\t * Replaces content inside of {{braces}}.\n\t */\n\tconst templateReplace = (content: TextContent<$Language, Data>, values?: Data) => {\n\t\tconst {\n\t\t\tdata,\n\t\t\tmeta: [lang],\n\t\t} = storageData.get();\n\n\t\t// Object to take values from\n\t\tconst obj = values || data;\n\n\t\t// String\n\t\tconst str = flattenAllowedContent(!isFunction(content) && !isString(content) ? content[lang] : content, obj);\n\n\t\tconst t = translation[lang];\n\t\tconst pluralRules = (t.plural || t.actions) && new Intl.PluralRules(t.tag || lang);\n\n\t\treturn replaceTranslation(str, obj, t.plural, t.actions, pluralRules);\n\t};\n\n\tconst data = ((value) => {\n\t\tconst _data = storageData.get().data;\n\n\t\tif (!value) return _data;\n\n\t\tconst val = isFunction(value) ? value(_data) : deepmerge(_data, value as $Data);\n\n\t\tstorageData.update((prev) => {\n\t\t\tprev.data = val;\n\n\t\t\treturn prev;\n\t\t});\n\n\t\treturn undefined;\n\t}) as StateFunction<$Data>;\n\n\tconst getCurrentStorageData = () => {\n\t\treturn coreData.get().dataLoaded ? clone(storageData.get()) : null;\n\t};\n\n\tconst setStorageData = (data: StorageData<$Language, $Data>) => {\n\t\tif (destroyed) {\n\t\t\tif (DEV) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`function \\`setStorageData\\` was called after novely instance was destroyed. Data is not updater nor synced after destroy.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tstorageData.set(data);\n\t};\n\n\t// #region Function Return\n\treturn {\n\t\t/**\n\t\t * Function to set game script\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * engine.script({\n\t\t * start: [\n\t\t * action.function(() => {})\n\t\t * ]\n\t\t * })\n\t\t * ```\n\t\t */\n\t\tscript,\n\t\t/**\n\t\t * Get actions\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * engine.script({\n\t\t * start: [\n\t\t * action.function(() => {})\n\t\t * ]\n\t\t * })\n\t\t * ```\n\t\t */\n\t\taction: action as Actions,\n\t\t/**\n\t\t * State bound to `$MAIN` game context\n\t\t * @deprecated Use `state` function provided from action arguments\n\t\t */\n\t\tstate: getStateFunction(MAIN_CONTEXT_KEY),\n\t\t/**\n\t\t * Store data between games\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * engine.script({\n\t\t * start: [\n\t\t * action.function(() => {\n\t\t * // Paid content should be purchased only once\n\t\t * // So it will be available in any save\n\t\t * data({ paid_content_purchased: true })\n\t\t * })\n\t\t * ]\n\t\t * })\n\t\t * ```\n\t\t */\n\t\tdata,\n\t\t/**\n\t\t * Used in combination with type utilities\n\t\t * @example\n\t\t * ```ts\n\t\t * import type { TypesFromEngine, ConditionParams, StateFunction } from '@novely/core';\n\t\t *\n\t\t * type Types = TypesFromEngine<typeof engine>;\n\t\t *\n\t\t * const conditionCheck = (state: StateFunction<ConditionParams<Types>>) => {\n\t\t * return state.age >= 18;\n\t\t * }\n\t\t * ```\n\t\t */\n\t\ttypes: null as EngineTypes<$Language, $State, $Data, $Characters> | null,\n\t\t/**\n\t\t * Replaces content inside {{braces}} using global data\n\t\t * @example\n\t\t * ```ts\n\t\t * data({ name: 'Alexei' })\n\t\t *\n\t\t * templateReplace('{{name}} is our hero')\n\t\t * templateReplace({\n\t\t * en: (data) => 'Hello, ' + data.name\n\t\t * })\n\t\t * ```\n\t\t */\n\t\ttemplateReplace(content: TextContent<$Language, $Data>) {\n\t\t\treturn templateReplace(content as TextContent<$Language, Data>);\n\t\t},\n\t\t/**\n\t\t * Same as `templateReplace` but uses state and requires explicitly providing it\n\t\t */\n\t\ttemplateReplaceState(content: TextContent<$Language, $State>, state: State) {\n\t\t\treturn templateReplace(content as TextContent<$Language, State>, state);\n\t\t},\n\t\t/**\n\t\t * Cancel data loading, hide UI, ignore page change events\n\t\t * Data updates still will work in case Novely already was loaded\n\t\t */\n\t\tdestroy() {\n\t\t\tif (destroyed) return;\n\n\t\t\tdataLoaded.cancel();\n\n\t\t\tUIInstance.unmount();\n\n\t\t\tticker.destroy();\n\n\t\t\tremoveEventListener('beforeunload', throttledShortOnStorageDataChange);\n\n\t\t\tdestroyed = true;\n\t\t},\n\t\t/**\n\t\t * Funtion to get current storage data\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * const currentStorageData = engine.getCurrentStorageData();\n\t\t * ```\n\t\t */\n\t\tgetCurrentStorageData,\n\t\t/**\n\t\t * Function to set storage data. Using this function is not recommended.\n\t\t *\n\t\t * @deprecated\n\t\t * @example\n\t\t * ```ts\n\t\t * const currentStorageData = engine.getCurrentStorageData();\n\t\t *\n\t\t * if (currentStorageData) {\n\t\t * // update music volume\n\t\t * currentStorageData.meta[2] = 1;\n\t\t *\n\t\t * setStorageData(currentStorageData)\n\t\t * }\n\t\t * ```\n\t\t */\n\t\tsetStorageData,\n\t\t/**\n\t\t * Function to control paused state. Custom Actions are provided with `paused` store they can subscribe to.\n\t\t * This function will notify Custom Actions. Pause state can be used when showing ads.\n\t\t * @example\n\t\t * ```ts\n\t\t * sdk.on('pause' () => engine.setPaused(true));\n\t\t * sdk.on('resume', () => engine.setPaused(false));\n\t\t * ```\n\t\t */\n\t\tsetPaused: (paused: boolean) => {\n\t\t\tcoreData.update((prev) => {\n\t\t\t\tprev.paused = paused;\n\n\t\t\t\treturn prev;\n\t\t\t});\n\t\t},\n\t\t/**\n\t\t * Function to control focused state. It will affect `paused` store passed to Custom Actions.\n\t\t * This function can be used to pause game when it's not focused.\n\t\t * @example\n\t\t * ```ts\n\t\t * import { pauseOnBlur } from '@novely/core';\n\t\t *\n\t\t * // Will subscribe to blur/focus events and call `setFocused`\n\t\t * pauseOnBlur(engine);\n\t\t *\n\t\t * // OR\n\t\t *\n\t\t * sdk.on('focus' () => engine.setFocused(true));\n\t\t * sdk.on('blur', () => engine.setFocused(false));\n\t\t * ```\n\t\t */\n\t\tsetFocused: (focused: boolean) => {\n\t\t\tcoreData.update((prev) => {\n\t\t\t\tprev.focused = focused;\n\n\t\t\t\treturn prev;\n\t\t\t});\n\t\t},\n\t};\n\t// #endregion\n};\n\nexport { novely };\n","function set(obj, key, val) {\n\tif (typeof val.value === 'object') val.value = klona(val.value);\n\tif (!val.enumerable || val.get || val.set || !val.configurable || !val.writable || key === '__proto__') {\n\t\tObject.defineProperty(obj, key, val);\n\t} else obj[key] = val.value;\n}\n\nexport function klona(x) {\n\tif (typeof x !== 'object') return x;\n\n\tvar i=0, k, list, tmp, str=Object.prototype.toString.call(x);\n\n\tif (str === '[object Object]') {\n\t\ttmp = Object.create(x.__proto__ || null);\n\t} else if (str === '[object Array]') {\n\t\ttmp = Array(x.length);\n\t} else if (str === '[object Set]') {\n\t\ttmp = new Set;\n\t\tx.forEach(function (val) {\n\t\t\ttmp.add(klona(val));\n\t\t});\n\t} else if (str === '[object Map]') {\n\t\ttmp = new Map;\n\t\tx.forEach(function (val, key) {\n\t\t\ttmp.set(klona(key), klona(val));\n\t\t});\n\t} else if (str === '[object Date]') {\n\t\ttmp = new Date(+x);\n\t} else if (str === '[object RegExp]') {\n\t\ttmp = new RegExp(x.source, x.flags);\n\t} else if (str === '[object DataView]') {\n\t\ttmp = new x.constructor( klona(x.buffer) );\n\t} else if (str === '[object ArrayBuffer]') {\n\t\ttmp = x.slice(0);\n\t} else if (str.slice(-6) === 'Array]') {\n\t\t// ArrayBuffer.isView(x)\n\t\t// ~> `new` bcuz `Buffer.slice` => ref\n\t\ttmp = new x.constructor(x);\n\t}\n\n\tif (tmp) {\n\t\tfor (list=Object.getOwnPropertySymbols(x); i < list.length; i++) {\n\t\t\tset(tmp, list[i], Object.getOwnPropertyDescriptor(x, list[i]));\n\t\t}\n\n\t\tfor (i=0, list=Object.getOwnPropertyNames(x); i < list.length; i++) {\n\t\t\tif (Object.hasOwnProperty.call(tmp, k=list[i]) && tmp[k] === x[k]) continue;\n\t\t\tset(tmp, k, Object.getOwnPropertyDescriptor(x, k));\n\t\t}\n\t}\n\n\treturn tmp || x;\n}\n","import type { TypewriterSpeed } from './types';\n\nconst SKIPPED_DURING_RESTORE = new Set(['dialog', 'choice', 'input', 'vibrate', 'text'] as const);\n\nconst BLOCK_EXIT_STATEMENTS = new Set(['choice:exit', 'condition:exit', 'block:exit'] as const);\n\nconst BLOCK_STATEMENTS = new Set(['choice', 'condition', 'block'] as const);\n\nconst AUDIO_ACTIONS = new Set(['playMusic', 'stopMusic', 'playSound', 'stopSound', 'voice', 'stopVoice'] as const);\n\nconst EMPTY_SET = new Set<any>();\n\nconst DEFAULT_TYPEWRITER_SPEED: TypewriterSpeed = 'Medium';\n\nconst HOWLER_SUPPORTED_FILE_FORMATS = new Set([\n\t'mp3',\n\t'mpeg',\n\t'opus',\n\t'ogg',\n\t'oga',\n\t'wav',\n\t'aac',\n\t'caf',\n\t'm4a',\n\t'm4b',\n\t'mp4',\n\t'weba',\n\t'webm',\n\t'dolby',\n\t'flac',\n] as const);\n\nconst SUPPORTED_IMAGE_FILE_FORMATS = new Set([\n\t'apng',\n\t'avif',\n\t'gif',\n\t'jpg',\n\t'jpeg',\n\t'jfif',\n\t'pjpeg',\n\t'pjp',\n\t'png',\n\t'svg',\n\t'webp',\n\t'bmp',\n] as const);\n\n/**\n * @internal\n */\nconst MAIN_CONTEXT_KEY = '$MAIN';\n\nexport {\n\tSKIPPED_DURING_RESTORE,\n\tEMPTY_SET,\n\tDEFAULT_TYPEWRITER_SPEED,\n\tBLOCK_EXIT_STATEMENTS,\n\tBLOCK_STATEMENTS,\n\tMAIN_CONTEXT_KEY,\n\tAUDIO_ACTIONS,\n\tHOWLER_SUPPORTED_FILE_FORMATS,\n\tSUPPORTED_IMAGE_FILE_FORMATS,\n};\n","import type { CustomActionHolder, CustomActionCleanupHolder } 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\n/**\n * @internal\n */\nconst CUSTOM_ACTION_CLEANUP_MAP = new Map<string, CustomActionCleanupHolder>();\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, CUSTOM_ACTION_CLEANUP_MAP };\n","import type { ValidAction, CustomHandler } from '../action';\nimport type { NovelyAsset } from '../types';\nimport { AUDIO_ACTIONS, BLOCK_EXIT_STATEMENTS, BLOCK_STATEMENTS, SKIPPED_DURING_RESTORE } from '../constants';\n\nconst isNumber = (val: unknown): val is number => {\n\treturn typeof val === 'number';\n};\n\nconst isNull = (val: unknown): val is null => {\n\treturn val === null;\n};\n\nconst isString = (val: unknown): val is string => {\n\treturn typeof val === 'string';\n};\n\nconst isFunction = (val: unknown): val is (...parameters: any[]) => any => {\n\treturn typeof val === 'function';\n};\n\nconst isPromise = (val: unknown): val is Promise<any> => {\n\treturn Boolean(val) && (typeof val === 'object' || isFunction(val)) && isFunction((val as any).then);\n};\n\nconst isEmpty = (val: unknown): val is Record<PropertyKey, never> => {\n\treturn typeof val === 'object' && !isNull(val) && Object.keys(val).length === 0;\n};\n\n/**\n * Checks if a given string starts with 'http', '/', '.', or 'data'\n */\nconst isCSSImageURL = (url: string): boolean => {\n\tconst startsWith = String.prototype.startsWith.bind(url);\n\n\treturn startsWith('http') || startsWith('/') || startsWith('.') || startsWith('data');\n};\n\n/**\n * Determines if a given action requires user interaction based on its type and metadata.\n */\nconst isUserRequiredAction = ([action, ...meta]: ValidAction) => {\n\treturn Boolean(action === 'custom' && meta[0] && (meta[0] as unknown as CustomHandler).requireUserAction);\n};\n\nconst isBlockStatement = (statement: unknown): statement is 'choice' | 'condition' | 'block' => {\n\treturn BLOCK_STATEMENTS.has(statement as any);\n};\n\nconst isBlockExitStatement = (\n\tstatement: unknown,\n): statement is 'choice:exit' | 'condition:exit' | 'block:exit' => {\n\treturn BLOCK_EXIT_STATEMENTS.has(statement as any);\n};\n\nconst isSkippedDuringRestore = (item: unknown): item is 'vibrate' | 'dialog' | 'input' | 'choice' | 'text' => {\n\treturn SKIPPED_DURING_RESTORE.has(item as any);\n};\n\ntype AudioActionName = 'playMusic' | 'stopMusic' | 'playSound' | 'stopSound' | 'voice' | 'stopVoice';\n\nconst isAudioAction = (action: unknown): action is AudioActionName => {\n\treturn AUDIO_ACTIONS.has(action as any);\n};\n\nconst isAction = (element: unknown): element is Exclude<ValidAction, ValidAction[]> => {\n\treturn Array.isArray(element) && isString(element[0]);\n};\n\nconst isImageAsset = (asset: unknown): asset is string => {\n\treturn isString(asset) && isCSSImageURL(asset);\n};\n\n/**\n * Is custom and requires user action or skipped during restoring\n */\nconst isBlockingAction = (action: Exclude<ValidAction, ValidAction[]>) => {\n\treturn isUserRequiredAction(action) || (isSkippedDuringRestore(action[0]) && action[0] !== 'vibrate');\n};\n\nconst isAsset = (suspect: unknown): suspect is NovelyAsset => {\n\treturn suspect !== null && typeof suspect === 'object' && 'source' in suspect && 'type' in suspect;\n};\n\nexport {\n\tisNumber,\n\tisNull,\n\tisString,\n\tisFunction,\n\tisPromise,\n\tisEmpty,\n\tisCSSImageURL,\n\tisUserRequiredAction,\n\tisBlockStatement,\n\tisBlockExitStatement,\n\tisSkippedDuringRestore,\n\tisAudioAction,\n\tisAction,\n\tisImageAsset,\n\tisBlockingAction,\n\tisAsset,\n};\n\nexport type { AudioActionName };\n","import type { CustomHandler, DefaultActionProxy } from '../action';\nimport type { Thenable, State } from '../types';\nimport type { Context } from '../renderer';\n\ntype MatchActionParams = {\n\tdata: State;\n\tctx: Context;\n\n\tpush: () => void;\n\tforward: () => void;\n};\n\ntype MatchActionMap = {\n\t[Key in keyof DefaultActionProxy]: (\n\t\tparams: MatchActionParams,\n\t\tdata: Parameters<DefaultActionProxy[Key]>,\n\t) => void;\n};\n\ntype MatchActionMapComplete = Omit<MatchActionMap, 'custom'> & {\n\tcustom: (params: MatchActionParams, value: [handler: CustomHandler]) => Thenable<void>;\n};\n\ntype MatchActionParameters = {\n\t/**\n\t * Name of context or context\n\t */\n\tctx: string | Context;\n\t/**\n\t * Data from the save\n\t */\n\tdata: State;\n};\n\ntype OnBeforeActionCallPayload = {\n\taction: keyof MatchActionMapComplete;\n\tprops: Parameters<DefaultActionProxy[keyof MatchActionMapComplete]>;\n\tctx: Context;\n};\n\ntype MatchActionHandlers = {\n\tpush: (ctx: Context) => void;\n\tforward: (ctx: Context) => void;\n\n\tgetContext: (name: string) => Context;\n\n\tonBeforeActionCall: (payload: OnBeforeActionCallPayload) => void;\n};\n\nconst matchAction = (callbacks: MatchActionHandlers, values: MatchActionMapComplete) => {\n\tconst { getContext, onBeforeActionCall, push, forward } = callbacks;\n\n\tconst match = (action: keyof MatchActionMapComplete, props: any, { ctx, data }: MatchActionParameters) => {\n\t\tconst context = typeof ctx === 'string' ? getContext(ctx) : ctx;\n\n\t\tonBeforeActionCall({\n\t\t\taction,\n\t\t\tprops,\n\t\t\tctx: context,\n\t\t});\n\n\t\treturn values[action](\n\t\t\t{\n\t\t\t\tctx: context,\n\t\t\t\tdata,\n\n\t\t\t\tpush() {\n\t\t\t\t\tif (context.meta.preview) return;\n\n\t\t\t\t\tpush(context);\n\t\t\t\t},\n\t\t\t\tforward() {\n\t\t\t\t\tif (context.meta.preview) return;\n\n\t\t\t\t\tforward(context);\n\t\t\t\t},\n\t\t\t},\n\t\t\tprops,\n\t\t);\n\t};\n\n\treturn {\n\t\tmatch,\n\t\tnativeActions: Object.keys(values),\n\t};\n};\n\nexport { matchAction };\nexport type { MatchActionHandlers, MatchActionMapComplete };\n","import { memoize, once } from 'es-toolkit/function';\nimport { DEV } from 'esm-env';\nimport { supportsMap as audioSupport } from './audio-codecs';\nimport { HOWLER_SUPPORTED_FILE_FORMATS, SUPPORTED_IMAGE_FILE_FORMATS } from './constants';\nimport { supportsMap as imageSupport } from './image-formats';\nimport type { NovelyAsset } from './types';\nimport { getUrlFileExtension, isAsset } from './utilities';\n\nconst generateRandomId = () => Math.random().toString(36);\n\n/**\n * Function to get assets type. All assets must be of the same type. Only works with supported types.\n */\nconst getType = memoize(\n\t(extensions: string[]) => {\n\t\tif (extensions.every((extension) => HOWLER_SUPPORTED_FILE_FORMATS.has(extension as any))) {\n\t\t\treturn 'audio';\n\t\t}\n\n\t\tif (extensions.every((extension) => SUPPORTED_IMAGE_FILE_FORMATS.has(extension as any))) {\n\t\t\treturn 'image';\n\t\t}\n\n\t\tif (DEV) {\n\t\t\tthrow new Error(`Unsupported file extensions: ${JSON.stringify(extensions)}`);\n\t\t}\n\n\t\tthrow extensions;\n\t},\n\t{\n\t\tgetCacheKey: (extensions) => extensions.join('~'),\n\t},\n);\n\nconst SUPPORT_MAPS = {\n\timage: imageSupport,\n\taudio: audioSupport,\n} as const;\n\n/**\n * This function uses array instead of spread because memoize only works with first argument\n */\nconst assetPrivate = memoize(\n\t(variants: string[]): NovelyAsset => {\n\t\tif (DEV && variants.length === 0) {\n\t\t\tthrow new Error(`Attempt to use \"asset\" function without arguments`);\n\t\t}\n\n\t\tconst map: Record<string, string> = {};\n\t\tconst extensions: string[] = [];\n\n\t\tfor (const v of variants) {\n\t\t\tconst e = getUrlFileExtension(v);\n\n\t\t\tmap[e] = v;\n\t\t\textensions.push(e);\n\t\t}\n\n\t\tconst type = getType(extensions);\n\n\t\tconst getSource = once(() => {\n\t\t\tconst support = SUPPORT_MAPS[type];\n\n\t\t\tfor (const extension of extensions) {\n\t\t\t\tif (extension in support) {\n\t\t\t\t\tif (support[extension as keyof typeof support]) {\n\t\t\t\t\t\treturn map[extension];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\treturn map[extension];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (DEV) {\n\t\t\t\tthrow new Error(`No matching asset was found for ${variants.map((v) => `\"${v}\"`).join(', ')}`);\n\t\t\t}\n\n\t\t\treturn '';\n\t\t});\n\n\t\treturn {\n\t\t\tget source() {\n\t\t\t\treturn getSource();\n\t\t\t},\n\t\t\tget type() {\n\t\t\t\treturn type;\n\t\t\t},\n\t\t\tid: generateRandomId(),\n\t\t};\n\t},\n\t{\n\t\tgetCacheKey: (variants) => variants.join('~'),\n\t},\n);\n\n/**\n * Memoizes and returns an asset selection object based on provided file variants.\n * The selected asset depends on the client's support for various formats.\n *\n * @param {...string} variants - A variable number of strings, each representing a potential asset file URL.\n * @returns {NovelyAsset} An object representing the selected asset with `source` and `type` properties.\n *\n * @throws {Error} If in DEV mode and no arguments are provided.\n * @example\n * ```\n * import { asset } from 'novely';\n *\n * // Passed first have higher priority\n * const classroom = asset(\n * 'classroom.avif',\n * 'classroom.webp',\n * 'classroom.jpeg'\n * );\n *\n * setTimeout(() => {\n * console.log(classroom.source);\n * }, 100);\n * ```\n */\nconst asset = (...variants: string[]) => {\n\treturn assetPrivate(variants);\n};\n\nasset.image = (source: string): NovelyAsset => {\n\tif (assetPrivate.cache.has(source)) {\n\t\treturn assetPrivate.cache.get(source)!;\n\t}\n\n\tconst asset = {\n\t\ttype: 'image',\n\t\tsource,\n\t\tid: generateRandomId(),\n\t} as NovelyAsset;\n\n\tassetPrivate.cache.set(source, asset);\n\n\treturn asset;\n};\n\nasset.audio = (source: string): NovelyAsset => {\n\tif (assetPrivate.cache.has(source)) {\n\t\treturn assetPrivate.cache.get(source)!;\n\t}\n\n\tconst asset = {\n\t\ttype: 'audio',\n\t\tsource,\n\t\tid: generateRandomId(),\n\t} as NovelyAsset;\n\n\tassetPrivate.cache.set(source, asset);\n\n\treturn asset;\n};\n\nconst unwrapAsset = (asset: string | NovelyAsset) => {\n\treturn isAsset(asset) ? asset.source : asset;\n};\n\nconst unwrapAudioAsset = (asset: string | NovelyAsset) => {\n\tif (DEV && isAsset(asset) && asset.type !== 'audio') {\n\t\tthrow new Error('Attempt to use non-audio asset in audio action', { cause: asset });\n\t}\n\n\treturn unwrapAsset(asset);\n};\n\nconst unwrapImageAsset = (asset: string | NovelyAsset) => {\n\tif (DEV && isAsset(asset) && asset.type !== 'image') {\n\t\tthrow new Error('Attempt to use non-image asset in action that requires image assets', { cause: asset });\n\t}\n\n\treturn unwrapAsset(asset);\n};\n\nexport { asset, unwrapAsset, unwrapAudioAsset, unwrapImageAsset };\n","/**\n * This code is adapted from the Howler.js source code.\n * Howler.js: https://github.com/goldfire/howler.js\n */\n\n/**\n * I guess some browsers will return \"no\". So it's better to be safe\n */\nconst cut = (str: CanPlayTypeResult | 'no') => str.replace(/^no$/, '');\n\nconst audio = new Audio();\n\nconst canPlay = (type: string) => !!cut(audio.canPlayType(type));\nconst canPlayMultiple = (...types: string[]) => types.some((type) => canPlay(type));\n\nconst supportsMap = {\n\tmp3: canPlayMultiple('audio/mpeg;', 'audio/mp3;'),\n\tmpeg: canPlay('audio/mpeg;'),\n\topus: canPlay('audio/ogg; codecs=\"opus\"'),\n\togg: canPlay('audio/ogg; codecs=\"vorbis\"'),\n\toga: canPlay('audio/ogg; codecs=\"vorbis\"'),\n\twav: canPlayMultiple('audio/wav; codecs=\"1\"', 'audio/wav;'),\n\taac: canPlay('audio/aac;'),\n\tcaf: canPlay('audio/x-caf;'),\n\tm4a: canPlayMultiple('audio/x-m4a;', 'audio/m4a;', 'audio/aac;'),\n\tm4b: canPlayMultiple('audio/x-m4b;', 'audio/m4b;', 'audio/aac;'),\n\tmp4: canPlayMultiple('audio/x-mp4;', 'audio/mp4;', 'audio/aac;'),\n\tweba: canPlay('audio/webm; codecs=\"vorbis\"'),\n\twebm: canPlay('audio/webm; codecs=\"vorbis\"'),\n\tdolby: canPlay('audio/mp4; codecs=\"ec-3\"'),\n\tflac: canPlayMultiple('audio/x-flac;', 'audio/flac;'),\n};\n\nexport { supportsMap };\n","const avif =\n\t'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAAB0AAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAIAAAACAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQ0MAAAAABNjb2xybmNseAACAAIAAYAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAACVtZGF0EgAKCBgANogQEAwgMg8f8D///8WfhwB8+ErK42A=';\nconst jxl =\n\t'data:image/jxl;base64,/woIAAAMABKIAgC4AF3lEgAAFSqjjBu8nOv58kOHxbSN6wxttW1hSaLIODZJJ3BIEkkaoCUzGM6qJAE=';\nconst webp =\n\t'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA';\n\nconst supportsFormat = (source: string) => {\n\tconst { promise, resolve } = Promise.withResolvers<boolean>();\n\n\tconst img = Object.assign(document.createElement('img'), {\n\t\tsrc: source,\n\t});\n\n\timg.onload = img.onerror = () => {\n\t\tresolve(img.height === 2);\n\t};\n\n\treturn promise;\n};\n\nconst supportsMap = {\n\tavif: false,\n\tjxl: false,\n\twebp: false,\n};\n\nconst formatsMap = {\n\tavif,\n\tjxl,\n\twebp,\n} as const;\n\nconst loadImageFormatsSupport = async () => {\n\tconst promises = [];\n\n\tfor (const [format, source] of Object.entries(formatsMap)) {\n\t\tconst promise = supportsFormat(source).then((supported) => {\n\t\t\tsupportsMap[format as keyof typeof supportsMap] = supported;\n\t\t});\n\n\t\tpromises.push(promise);\n\t}\n\n\tawait Promise.all(promises);\n};\n\nloadImageFormatsSupport();\n\nexport { supportsMap };\n","import type { Story, ValidAction, CustomHandler, GetActionParameters } from '../action';\nimport type { CloneFN, Path, PathItem, Thenable } from '../types';\nimport type { NovelyAsset } from '../types';\nimport {\n\tisNull,\n\tisNumber,\n\tisAction,\n\tisSkippedDuringRestore,\n\tisUserRequiredAction,\n\tisPromise,\n\tisBlockExitStatement,\n\tisBlockStatement,\n\tisBlockingAction,\n} from './assertions';\nimport { unwrapAsset } from '../asset';\nimport { DEV } from 'esm-env';\n\n// #region Is Exit Impossible\nconst isExitImpossible = (path: Path) => {\n\tconst blockStatements = path.filter(([item]) => isBlockStatement(item));\n\tconst blockExitStatements = path.filter(([item]) => isBlockExitStatement(item));\n\n\t/**\n\t * There were no blocks nor exits from blocks\n\t */\n\tif (blockStatements.length === 0 && blockExitStatements.length === 0) {\n\t\treturn true;\n\t}\n\n\t/**\n\t * There is block that can be exited\n\t */\n\tif (blockStatements.length > blockExitStatements.length) {\n\t\treturn false;\n\t}\n\n\treturn !blockExitStatements.every(([name], i) => name && name.startsWith(blockStatements[i][0]!));\n};\n// #endregion\n\n// #region Refer\ntype CreateReferFunctionParams = {\n\tstory: Story;\n\tonUnknownSceneHit: (scene: string) => Thenable<void>;\n};\n\nconst createReferFunction = ({ story, onUnknownSceneHit }: CreateReferFunctionParams) => {\n\tconst refer = async (path: Path) => {\n\t\t/**\n\t\t * Are we ready to return a value.\n\t\t * We need to know are there any \"unknown\" scenes or not\n\t\t */\n\t\tconst { promise: ready, resolve: setReady } = Promise.withResolvers<boolean>();\n\n\t\tlet current: any = story;\n\t\tlet precurrent: any = story;\n\n\t\tconst blocks: any[] = [];\n\n\t\tconst refer = async () => {\n\t\t\tfor (const [type, val] of path) {\n\t\t\t\tif (type === 'jump') {\n\t\t\t\t\tif (!current[val]) {\n\t\t\t\t\t\tsetReady(true);\n\t\t\t\t\t\tawait onUnknownSceneHit(val);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (DEV && !story[val]) {\n\t\t\t\t\t\tthrow new Error(`Attempt to jump to unknown scene \"${val}\"`);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (DEV && story[val].length === 0) {\n\t\t\t\t\t\tthrow new Error(`Attempt to jump to empty scene \"${val}\"`);\n\t\t\t\t\t}\n\n\t\t\t\t\tprecurrent = story;\n\t\t\t\t\tcurrent = current[val];\n\t\t\t\t} else if (type === null) {\n\t\t\t\t\tprecurrent = current;\n\t\t\t\t\tcurrent = current[val];\n\t\t\t\t} else if (type === 'choice') {\n\t\t\t\t\tblocks.push(precurrent);\n\t\t\t\t\tcurrent = current[(val as number) + 1][1];\n\t\t\t\t} else if (type === 'condition') {\n\t\t\t\t\tblocks.push(precurrent);\n\t\t\t\t\tcurrent = current[2][val];\n\t\t\t\t} else if (type === 'block') {\n\t\t\t\t\tblocks.push(precurrent);\n\t\t\t\t\tcurrent = story[val];\n\t\t\t\t} else if (type === 'block:exit' || type === 'choice:exit' || type === 'condition:exit') {\n\t\t\t\t\tcurrent = blocks.pop();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsetReady(false);\n\n\t\t\treturn current as Exclude<ValidAction, ValidAction[]>;\n\t\t};\n\n\t\tconst value = refer();\n\t\tconst found = await ready;\n\n\t\treturn {\n\t\t\tfound,\n\t\t\tvalue,\n\t\t};\n\t};\n\n\tconst referGuarded = async (path: Path) => {\n\t\treturn await (await refer(path)).value;\n\t};\n\n\treturn {\n\t\trefer,\n\t\treferGuarded,\n\t};\n};\n\ntype GuardedReferFunction = ReturnType<typeof createReferFunction>['referGuarded'];\n\n// #endregion\n\ntype ExitPathConfig = {\n\tpath: Path;\n\trefer: GuardedReferFunction;\n\n\tonExitImpossible?: () => void;\n};\n\n// #region Exit Path\nconst exitPath = async ({ path, refer, onExitImpossible }: ExitPathConfig) => {\n\tconst last = path.at(-1);\n\tconst ignore: ('choice:exit' | 'condition:exit' | 'block:exit')[] = [];\n\n\tlet wasExitImpossible = false;\n\n\t/**\n\t * - should be an array\n\t * - first element is action name\n\t */\n\tif (!isAction(await refer(path))) {\n\t\tif (last && isNull(last[0]) && isNumber(last[1])) {\n\t\t\tlast[1]--;\n\t\t} else {\n\t\t\tpath.pop();\n\t\t}\n\t}\n\n\tif (isExitImpossible(path)) {\n\t\tconst referred = await refer(path);\n\n\t\tif (isAction(referred) && isSkippedDuringRestore(referred[0])) {\n\t\t\tonExitImpossible?.();\n\t\t}\n\n\t\twasExitImpossible = true;\n\n\t\treturn {\n\t\t\texitImpossible: wasExitImpossible,\n\t\t};\n\t}\n\n\tfor (let i = path.length - 1; i > 0; i--) {\n\t\tconst [name] = path[i];\n\n\t\t/**\n\t\t * Remember already exited paths\n\t\t */\n\t\tif (isBlockExitStatement(name)) {\n\t\t\tignore.push(name);\n\t\t}\n\n\t\t/**\n\t\t * Ignore everything that we do not need there\n\t\t */\n\t\tif (!isBlockStatement(name)) continue;\n\n\t\t/**\n\t\t * When we found an already exited path we remove it from the list\n\t\t */\n\t\tif (ignore.at(-1)?.startsWith(name)) {\n\t\t\tignore.pop();\n\t\t\tcontinue;\n\t\t}\n\n\t\t/**\n\t\t * Exit from the path\n\t\t */\n\t\tpath.push([`${name}:exit`]);\n\n\t\tconst prev = findLastPathItemBeforeItemOfType(path.slice(0, i + 1), name);\n\n\t\t/**\n\t\t * When possible also go to the next action (or exit from one layer above)\n\t\t */\n\t\tif (prev) path.push([null, prev[1] + 1]);\n\n\t\t/**\n\t\t * If we added an `[null, int]` but it points not to action, then\n\t\t *\n\t\t * - remove that item\n\t\t * - close another block\n\t\t */\n\t\tif (!isAction(await refer(path))) {\n\t\t\tpath.pop();\n\t\t\tcontinue;\n\t\t}\n\n\t\tbreak;\n\t}\n\n\treturn {\n\t\texitImpossible: wasExitImpossible,\n\t};\n};\n// #endregion\n\n// #region Next Path\nconst nextPath = (path: Path) => {\n\t/**\n\t * Last path element\n\t */\n\tconst last = path.at(-1);\n\n\tif (last && (isNull(last[0]) || last[0] === 'jump') && isNumber(last[1])) {\n\t\tlast[1]++;\n\t} else {\n\t\tpath.push([null, 0]);\n\t}\n\n\treturn path;\n};\n// #endregion\n\n// #region Collect Actions Before Blocking Action\ntype CollectActionsBeforeBlockingActionOptions = {\n\tpath: Path;\n\trefer: GuardedReferFunction;\n\tclone: CloneFN;\n};\n\nconst collectActionsBeforeBlockingAction = async ({\n\tpath,\n\trefer,\n\tclone,\n}: CollectActionsBeforeBlockingActionOptions) => {\n\tconst collection: Exclude<ValidAction, ValidAction[]>[] = [];\n\n\tlet action = await refer(path);\n\n\twhile (true) {\n\t\tif (action == undefined) {\n\t\t\tconst { exitImpossible } = await exitPath({\n\t\t\t\tpath,\n\t\t\t\trefer,\n\t\t\t});\n\n\t\t\tif (exitImpossible) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!action) {\n\t\t\tbreak;\n\t\t}\n\n\t\tif (isBlockingAction(action)) {\n\t\t\tconst [name, ...props] = action;\n\n\t\t\tif (name === 'choice') {\n\t\t\t\tconst choiceProps = props as unknown as GetActionParameters<'Choice'>;\n\n\t\t\t\tfor (let i = 0; i < choiceProps.length; i++) {\n\t\t\t\t\tconst branchContent = choiceProps[i];\n\n\t\t\t\t\t/**\n\t\t\t\t\t * This is a title\n\t\t\t\t\t */\n\t\t\t\t\tif (!Array.isArray(branchContent)) continue;\n\n\t\t\t\t\tconst virtualPath = clone(path);\n\n\t\t\t\t\tvirtualPath.push(['choice', i], [null, 0]);\n\n\t\t\t\t\tconst innerActions = await collectActionsBeforeBlockingAction({\n\t\t\t\t\t\tpath: virtualPath,\n\t\t\t\t\t\trefer,\n\t\t\t\t\t\tclone,\n\t\t\t\t\t});\n\n\t\t\t\t\tcollection.push(...innerActions);\n\t\t\t\t}\n\t\t\t} else if (name === 'condition') {\n\t\t\t\tconst conditionProps = props as unknown as GetActionParameters<'Condition'>;\n\t\t\t\tconst conditions = Object.keys(conditionProps[1]);\n\n\t\t\t\tfor (const condition of conditions) {\n\t\t\t\t\tconst virtualPath = clone(path);\n\n\t\t\t\t\tvirtualPath.push(['condition', condition], [null, 0]);\n\n\t\t\t\t\tconst innerActions = await collectActionsBeforeBlockingAction({\n\t\t\t\t\t\tpath: virtualPath,\n\t\t\t\t\t\trefer,\n\t\t\t\t\t\tclone,\n\t\t\t\t\t});\n\n\t\t\t\t\tcollection.push(...innerActions);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\n\t\tcollection.push(action);\n\n\t\t/**\n\t\t * These special actions requires path change\n\t\t */\n\t\tif (action[0] === 'jump') {\n\t\t\tpath = [\n\t\t\t\t['jump', action[1]],\n\t\t\t\t[null, 0],\n\t\t\t];\n\t\t} else if (action[0] == 'block') {\n\t\t\tpath.push(['block', action[1]], [null, 0]);\n\t\t} else {\n\t\t\tnextPath(path);\n\t\t}\n\n\t\taction = await refer(path);\n\t}\n\n\treturn collection;\n};\n// #endregion\n\n// #region Find Last Path Item Before Item Of Type\nconst findLastPathItemBeforeItemOfType = (path: Path, name: PathItem[0]) => {\n\tconst item = path.findLast(([_name, _value], i, array) => {\n\t\tconst next = array[i + 1];\n\n\t\treturn isNull(_name) && isNumber(_value) && next != null && next[0] === name;\n\t});\n\n\treturn item as undefined | [null, number];\n};\n// #endregion\n\n// #region Get Opposite Action\nconst getOppositeAction = (action: 'showCharacter' | 'playSound' | 'playMusic' | 'voice' | any) => {\n\tconst MAP = {\n\t\tshowCharacter: 'hideCharacter',\n\t\tplaySound: 'stopSound',\n\t\tplayMusic: 'stopMusic',\n\t\tvoice: 'stopVoice',\n\t} as const;\n\n\treturn MAP[action as keyof typeof MAP];\n};\n// #endregion\n\n// #region Get Actions From Path\ntype GetActionsFromPathParams = {\n\t/**\n\t * A story object\n\t */\n\tstory: Story;\n\t/**\n\t * A path by that actions will be gathered\n\t */\n\tpath: Path;\n\t/**\n\t * true — actions that should be skipped would not be returned\n\t */\n\tfilter: boolean;\n\treferGuarded: GuardedReferFunction;\n};\n\nconst getActionsFromPath = async ({ story, path, filter, referGuarded }: GetActionsFromPathParams) => {\n\t/**\n\t * Current item in the story\n\t */\n\tlet current: any = story;\n\t/**\n\t * Previous `current` value\n\t */\n\tlet precurrent: any;\n\t/**\n\t * Should we ignore some actions\n\t */\n\tlet ignoreNestedBefore: null | PathItem[0] = null;\n\t/**\n\t * Current item of type `[null, int]`\n\t */\n\tlet index = 0;\n\t/**\n\t * Skipped action that should be preserved\n\t */\n\tlet skipPreserve: Exclude<ValidAction, ValidAction[]> | undefined = undefined;\n\t/**\n\t * Actions that are either considered user action or skipped during restore process\n\t */\n\tconst skip = new Set<Exclude<ValidAction, ValidAction[]>>();\n\n\t/**\n\t * Cound of items of type `[null, int]`\n\t */\n\tconst max = path.reduce((acc, [type, val]) => {\n\t\tif (isNull(type) && isNumber(val)) {\n\t\t\treturn acc + 1;\n\t\t}\n\n\t\treturn acc;\n\t}, 0);\n\n\tconst queue = [] as Exclude<ValidAction, ValidAction[]>[];\n\tconst blocks = [];\n\n\t// Will guard future usage\n\tawait referGuarded(path);\n\n\tfor (const [type, val] of path) {\n\t\tif (type === 'jump') {\n\t\t\tprecurrent = story;\n\t\t\tcurrent = current[val];\n\t\t} else if (type === null) {\n\t\t\tprecurrent = current;\n\n\t\t\tif (isNumber(val)) {\n\t\t\t\tindex++;\n\n\t\t\t\tlet startIndex = 0;\n\n\t\t\t\tif (ignoreNestedBefore) {\n\t\t\t\t\tconst prev = findLastPathItemBeforeItemOfType(path.slice(0, index), ignoreNestedBefore);\n\n\t\t\t\t\tif (prev) {\n\t\t\t\t\t\tstartIndex = prev[1];\n\t\t\t\t\t\tignoreNestedBefore = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * Запустим все экшены которые идут в `[null, int]` от `0` до `int`\n\t\t\t\t * Почему-то потребовалось изменить `<` на `<=`, чтобы последний action попадал сюда\n\t\t\t\t */\n\t\t\t\tfor (let i = startIndex; i <= val; i++) {\n\t\t\t\t\tconst item = current[i];\n\n\t\t\t\t\t/**\n\t\t\t\t\t * In case of broken save at least not throw\n\t\t\t\t\t * But is should not happen\n\t\t\t\t\t */\n\t\t\t\t\tif (!isAction(item)) continue;\n\n\t\t\t\t\tconst [action] = item;\n\n\t\t\t\t\tconst last = index === max && i === val;\n\t\t\t\t\tconst shouldSkip = isSkippedDuringRestore(action) || isUserRequiredAction(item);\n\n\t\t\t\t\tif (shouldSkip) {\n\t\t\t\t\t\tskip.add(item);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (shouldSkip && last) {\n\t\t\t\t\t\tskipPreserve = item;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (filter && shouldSkip && !last) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tqueue.push(item);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcurrent = current[val];\n\t\t} else if (type === 'choice') {\n\t\t\tblocks.push(precurrent);\n\t\t\tcurrent = current[val + 1][1];\n\t\t} else if (type === 'condition') {\n\t\t\tblocks.push(precurrent);\n\t\t\tcurrent = current[2][val];\n\t\t} else if (type === 'block') {\n\t\t\tblocks.push(precurrent);\n\t\t\tcurrent = story[val];\n\t\t} else if (type === 'block:exit' || type === 'choice:exit' || type === 'condition:exit') {\n\t\t\tcurrent = blocks.pop();\n\t\t\tignoreNestedBefore = type.slice(0, -5) as PathItem[0];\n\t\t}\n\t}\n\n\treturn {\n\t\tqueue,\n\t\tskip,\n\t\tskipPreserve,\n\t};\n};\n// #endregion\n\n// #region Queue Processor\ntype QueueProcessorOptions = {\n\tskip: Set<Exclude<ValidAction, ValidAction[]>>;\n\tskipPreserve?: Exclude<ValidAction, ValidAction[]> | undefined;\n};\n\nconst createQueueProcessor = (queue: Exclude<ValidAction, ValidAction[]>[], options: QueueProcessorOptions) => {\n\tconst processedQueue: Exclude<ValidAction, ValidAction[]>[] = [];\n\n\tconst keep = new Set();\n\tconst characters = new Set();\n\tconst audio = {\n\t\tmusic: new Set(),\n\t\tsounds: new Set(),\n\t};\n\n\t/**\n\t * Get the next actions array.\n\t */\n\tconst next = (i: number) => queue.slice(i + 1);\n\n\tfor (const [i, item] of queue.entries()) {\n\t\tconst [action, ...params] = item;\n\n\t\tif (options.skip.has(item) && item !== options.skipPreserve) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tkeep.add(action);\n\n\t\tif (action === 'function' || action === 'custom') {\n\t\t\tif (action === 'custom') {\n\t\t\t\tconst fn = params[0] as CustomHandler;\n\n\t\t\t\tif (fn.callOnlyLatest) {\n\t\t\t\t\tconst notLatest = next(i).some(([name, func]) => {\n\t\t\t\t\t\tif (name !== 'custom') return;\n\n\t\t\t\t\t\t// Checks for `undefined`. In case two id's are undefined it would not be true\n\t\t\t\t\t\tconst isIdenticalId = Boolean(func.id && fn.id && func.id === fn.id);\n\t\t\t\t\t\tconst isIdenticalByReference = func === fn;\n\t\t\t\t\t\tconst isIdenticalByCode = String(func) === String(fn);\n\n\t\t\t\t\t\treturn isIdenticalId || isIdenticalByReference || isIdenticalByCode;\n\t\t\t\t\t});\n\n\t\t\t\t\tif (notLatest) continue;\n\t\t\t\t} else if (fn.skipOnRestore) {\n\t\t\t\t\tif (fn.skipOnRestore(next(i))) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tprocessedQueue.push(item);\n\t\t} else if (action === 'playSound') {\n\t\t\tconst closing = getOppositeAction(action);\n\n\t\t\tconst skip = next(i).some((item) => {\n\t\t\t\tif (isUserRequiredAction(item) || isSkippedDuringRestore(item[0])) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tconst [_action, target] = item;\n\n\t\t\t\tif (target !== params[0]) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn _action === closing || _action === action;\n\t\t\t});\n\n\t\t\tif (skip) continue;\n\n\t\t\taudio.sounds.add(unwrapAsset(params[0] as NovelyAsset));\n\t\t\tprocessedQueue.push(item);\n\t\t} else if (action === 'showCharacter' || action === 'playMusic' || action === 'voice') {\n\t\t\tconst closing = getOppositeAction(action);\n\n\t\t\tconst skip = next(i).some(([_action, target]) => {\n\t\t\t\tif (target !== params[0] && action !== 'voice') {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst musicWillBePaused = action === 'playMusic' && _action === 'pauseMusic';\n\n\t\t\t\t/**\n\t\t\t\t * It either will be closed OR same action will be ran again\n\t\t\t\t */\n\t\t\t\treturn musicWillBePaused || _action === closing || _action === action;\n\t\t\t});\n\n\t\t\tif (skip) continue;\n\n\t\t\t/**\n\t\t\t * Actually, we do not need check above to add there things to keep because if something was hidden already we could not keep it visible\n\t\t\t */\n\t\t\tif (action === 'showCharacter') {\n\t\t\t\tcharacters.add(params[0]);\n\t\t\t} else if (action === 'playMusic') {\n\t\t\t\taudio.music.add(unwrapAsset(params[0] as NovelyAsset));\n\t\t\t}\n\n\t\t\tprocessedQueue.push(item);\n\t\t} else if (action === 'showBackground' || action === 'preload') {\n\t\t\tconst skip = next(i).some(([_action]) => action === _action);\n\n\t\t\tif (skip) continue;\n\n\t\t\tprocessedQueue.push(item);\n\t\t} else if (action === 'animateCharacter') {\n\t\t\tconst skip = next(i).some(([_action, character], j, array) => {\n\t\t\t\t// Same character will be animated again.\n\t\t\t\tif (action === _action && character === params[0]) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tconst next = array.slice(j);\n\n\t\t\t\tconst characterWillAnimate = next.some(([__action, __character]) => action === __action);\n\t\t\t\tconst hasBlockingActions = next.some((item) => options.skip.has(item));\n\n\t\t\t\tconst differentCharacterWillAnimate =\n\t\t\t\t\t!hasBlockingActions &&\n\t\t\t\t\tnext.some(([__action, __character]) => __action === action && __character !== params[0]);\n\n\t\t\t\t// todo\n\t\t\t\treturn (characterWillAnimate && hasBlockingActions) || differentCharacterWillAnimate;\n\t\t\t});\n\n\t\t\tif (skip) continue;\n\n\t\t\tprocessedQueue.push(item);\n\t\t} else {\n\t\t\tprocessedQueue.push(item);\n\t\t}\n\t}\n\n\tconst run = async (match: (item: Exclude<ValidAction, ValidAction[]>) => Thenable<void>) => {\n\t\tfor (const item of processedQueue) {\n\t\t\tconst result = match(item);\n\n\t\t\tif (isPromise(result)) {\n\t\t\t\tawait result;\n\t\t\t}\n\t\t}\n\n\t\tprocessedQueue.length = 0;\n\t};\n\n\treturn {\n\t\trun,\n\t\tkeep: {\n\t\t\tkeep,\n\t\t\tcharacters,\n\t\t\taudio,\n\t\t},\n\t};\n};\n// #endregion\n\nexport {\n\tfindLastPathItemBeforeItemOfType,\n\tgetActionsFromPath,\n\tgetOppositeAction,\n\tcreateQueueProcessor,\n\tcreateReferFunction,\n\texitPath,\n\tcollectActionsBeforeBlockingAction,\n\tnextPath,\n\tisExitImpossible,\n};\n\nexport type { GuardedReferFunction };\n","type ControlledPromise<T> = Promise<\n\t| {\n\t\t\tvalue: T;\n\t\t\tcancelled: false;\n\t }\n\t| {\n\t\t\tvalue: null;\n\t\t\tcancelled: true;\n\t }\n>;\n\ntype ControlledPromiseObj<T> = {\n\tresolve: (value: T | PromiseLike<T>) => void;\n\treject: (reason?: any) => void;\n\n\tpromise: ControlledPromise<T>;\n\n\tcancel: () => void;\n};\n\nconst createControlledPromise = <T = void>() => {\n\tconst object = {\n\t\tresolve: null,\n\t\treject: null,\n\n\t\tpromise: null,\n\n\t\tcancel: null,\n\t} as unknown as ControlledPromiseObj<T>;\n\n\tconst init = () => {\n\t\tconst promise = new Promise((resolve, reject) => {\n\t\t\tobject.reject = reject;\n\t\t\tobject.resolve = (value) => {\n\t\t\t\tresolve({ cancelled: false, value });\n\t\t\t};\n\n\t\t\tobject.cancel = () => {\n\t\t\t\tresolve({ cancelled: true, value: null });\n\t\t\t\tinit();\n\t\t\t};\n\t\t});\n\n\t\tobject.promise = promise as ControlledPromise<T>;\n\t};\n\n\treturn init(), object;\n};\n\nexport { createControlledPromise };\nexport type { ControlledPromise, ControlledPromiseObj };\n","import { memoize } from 'es-toolkit/function';\nimport { HOWLER_SUPPORTED_FILE_FORMATS, SUPPORTED_IMAGE_FILE_FORMATS } from '../constants';\nimport { isCSSImageURL } from './assertions';\nimport { DEV } from 'esm-env';\n\nconst getUrlFileExtension = (address: string) => {\n\ttry {\n\t\tconst { pathname } = new URL(address, location.href);\n\n\t\t/**\n\t\t * By using pathname we remove search params from URL, but some things are still preserved\n\t\t *\n\t\t * Imagine pathname like `image.png!private:1230`\n\t\t */\n\t\treturn pathname.split('.').at(-1)!.split('!')[0].split(':')[0];\n\t} catch (error) {\n\t\tif (DEV) {\n\t\t\tconsole.error(new Error(`Could not construct URL \"${address}\".`, { cause: error }));\n\t\t}\n\n\t\treturn '';\n\t}\n};\n\nconst fetchContentType = async (url: string, request: typeof fetch) => {\n\ttry {\n\t\tconst response = await request(url, {\n\t\t\tmethod: 'HEAD',\n\t\t});\n\n\t\treturn response.headers.get('Content-Type') || '';\n\t} catch (error) {\n\t\tif (DEV) {\n\t\t\tconsole.error(new Error(`Failed to fetch file at \"${url}\"`, { cause: error }));\n\t\t}\n\n\t\treturn '';\n\t}\n};\n\ntype GetResourceTypeParams = {\n\turl: string;\n\trequest: typeof fetch;\n};\n\nconst getResourseType = memoize(\n\tasync ({ url, request }: GetResourceTypeParams) => {\n\t\t/**\n\t\t * If url is not http we should not check\n\t\t *\n\t\t * startsWith('http') || startsWith('/') || startsWith('.') || startsWith('data')\n\t\t */\n\t\tif (!isCSSImageURL(url)) {\n\t\t\treturn 'other';\n\t\t}\n\n\t\tconst extension = getUrlFileExtension(url);\n\n\t\tif (HOWLER_SUPPORTED_FILE_FORMATS.has(extension as any)) {\n\t\t\treturn 'audio';\n\t\t}\n\n\t\tif (SUPPORTED_IMAGE_FILE_FORMATS.has(extension as any)) {\n\t\t\treturn 'image';\n\t\t}\n\n\t\t/**\n\t\t * If checks above didn't worked we will fetch content type\n\t\t * This might not work because of CORS\n\t\t */\n\t\tconst contentType = await fetchContentType(url, request);\n\n\t\tif (contentType.includes('audio')) {\n\t\t\treturn 'audio';\n\t\t}\n\n\t\tif (contentType.includes('image')) {\n\t\t\treturn 'image';\n\t\t}\n\n\t\treturn 'other';\n\t},\n\t{\n\t\tgetCacheKey: ({ url }) => url,\n\t},\n);\n\nexport { getUrlFileExtension, getResourseType, fetchContentType };\n\nexport type { GetResourceTypeParams };\n","import { memoize } from 'es-toolkit/function';\nimport type { Context, Renderer } from '../renderer';\nimport type { Save, StackHolder, UseStackFunctionReturnType } from '../types';\nimport { STACK_MAP } from '../shared';\n\nconst getStack = memoize(\n\t(_: Context) => {\n\t\treturn [] as unknown as StackHolder;\n\t},\n\t{\n\t\tcache: STACK_MAP,\n\t\tgetCacheKey: (ctx) => ctx.id,\n\t},\n);\n\nconst createUseStackFunction = (renderer: Renderer) => {\n\tconst useStack = (context: Context | string): UseStackFunctionReturnType => {\n\t\tconst ctx = typeof context === 'string' ? renderer.getContext(context) : context;\n\t\tconst stack = getStack(ctx);\n\n\t\treturn {\n\t\t\tget previous() {\n\t\t\t\treturn stack.previous;\n\t\t\t},\n\t\t\tget value() {\n\t\t\t\treturn stack.at(-1)!;\n\t\t\t},\n\t\t\tset value(value) {\n\t\t\t\tstack[stack.length - 1] = value;\n\t\t\t},\n\n\t\t\tback() {\n\t\t\t\tstack.previous = stack.length > 1 ? stack.pop() : this.value;\n\t\t\t\tctx.meta.goingBack = true;\n\t\t\t},\n\t\t\tpush(value: Save) {\n\t\t\t\tstack.push(value);\n\t\t\t},\n\t\t\tclear() {\n\t\t\t\tstack.previous = undefined;\n\n\t\t\t\tstack.length = 0;\n\t\t\t\tstack.length = 1;\n\t\t\t},\n\t\t};\n\t};\n\n\treturn useStack;\n};\n\nexport { getStack, createUseStackFunction };\n","import type { Story, ValidAction } from '../action';\n\nconst flatActions = (item: (ValidAction | ValidAction[])[]): ValidAction[] => {\n\treturn item.flatMap((data) => {\n\t\tconst type = data[0];\n\n\t\t/**\n\t\t * This is not just an action like `['name', ...arguments]`, but an array of actions\n\t\t */\n\t\tif (Array.isArray(type)) return flatActions(data as ValidAction[]);\n\n\t\treturn [data as ValidAction];\n\t});\n};\n\n/**\n * Transforms `(ValidAction | ValidAction[])[]` to `ValidAction[]`. Mutates provided `Story`\n */\nconst flatStory = (story: Story) => {\n\tfor (const key in story) {\n\t\tstory[key] = flatActions(story[key]);\n\t}\n\n\treturn story;\n};\n\nexport { flatActions, flatStory };\n","import { memoize } from 'es-toolkit/function';\nimport type { Lang } from '../types';\n\nconst getLanguage = (languages: string[]) => {\n\tlet { language } = navigator;\n\n\tif (languages.includes(language)) {\n\t\treturn language;\n\t} else if (languages.includes((language = language.slice(0, 2)))) {\n\t\treturn language;\n\t} else if ((language = languages.find((value) => navigator.languages.includes(value))!)) {\n\t\treturn language;\n\t}\n\n\t/**\n\t * We'v checked the `en-GB` format, `en` format, and maybe any second languages, but there were no matches\n\t */\n\treturn languages[0];\n};\n\nconst getIntlLanguageDisplayName = memoize((lang: Lang) => {\n\t/**\n\t * When using Intl fails we just return language key.\n\t */\n\ttry {\n\t\tconst intl = new Intl.DisplayNames([lang], {\n\t\t\ttype: 'language',\n\t\t});\n\n\t\treturn intl.of(lang) || lang;\n\t} catch {\n\t\treturn lang;\n\t}\n});\n\n/**\n * Capitalizes the string\n * @param str String without emojis or complex graphemes\n */\nconst capitalize = (str: string) => {\n\treturn str[0].toUpperCase() + str.slice(1);\n};\n\nexport { getLanguage, getIntlLanguageDisplayName, capitalize };\n","const noop = () => {};\n\nexport { noop };\n","import type { Stored } from '../store';\nimport type { Lang, StorageData } from '../types';\n\nconst getLanguageFromStore = <$Language extends Lang>(store: Stored<StorageData<$Language, any>>) => {\n\treturn store.get().meta[0];\n};\n\nconst getVolumeFromStore = <$Language extends Lang>(store: Stored<StorageData<$Language, any>>) => {\n\tconst { meta } = store.get();\n\n\treturn {\n\t\tmusic: meta[2],\n\t\tsound: meta[3],\n\t\tvoice: meta[4],\n\t};\n};\n\nexport { getLanguageFromStore, getVolumeFromStore };\n","const mapSet = <T, K>(set: Set<T>, fn: (value: T, index: number, array: T[]) => K): K[] => {\n\treturn [...set].map(fn);\n};\n\nconst toArray = <T>(target: T | T[]) => {\n\treturn Array.isArray(target) ? target : [target];\n};\n\nexport { mapSet, toArray };\n","import type { Character } from '../character';\nimport type { CharactersData, Lang } from '../types';\n\nconst getCharactersData = <Characters extends Record<string, Character<Lang>>>(characters: Characters) => {\n\tconst entries = Object.entries(characters);\n\tconst mapped = entries.map(([key, value]) => [key, { name: value.name, emotions: Object.keys(value.emotions) }]);\n\n\treturn Object.fromEntries(mapped) as CharactersData<Characters>;\n};\n\nexport { getCharactersData };\n","import { noop } from './utilities';\n\ntype Stored<T> = {\n\tsubscribe: (cb: (value: T) => void) => () => void;\n\tupdate: (fn: (prev: T) => T) => void;\n\tset: (val: T) => void;\n\tget: () => T;\n};\n\ntype Derived<T> = {\n\tsubscribe: (cb: (value: T) => void) => () => void;\n\tget: () => T;\n};\n\nconst store = <T>(current: T, subscribers = new Set<(value: T) => void>()): Stored<T> => {\n\tconst subscribe = (cb: (value: T) => void) => {\n\t\tsubscribers.add(cb), cb(current);\n\n\t\treturn () => {\n\t\t\tsubscribers.delete(cb);\n\t\t};\n\t};\n\n\tconst push = (value: T) => {\n\t\tfor (const cb of subscribers) cb(value);\n\t};\n\n\tconst update = (fn: (prev: T) => T) => {\n\t\tpush((current = fn(current)));\n\t};\n\n\tconst set = (val: T) => {\n\t\tupdate(() => val);\n\t};\n\n\tconst get = () => {\n\t\treturn current;\n\t};\n\n\treturn { subscribe, update, set, get } as const;\n};\n\nconst derive = <T, K>(input: Stored<T>, map: (value: T) => K): Derived<K> => {\n\treturn {\n\t\tget: () => map(input.get()),\n\t\tsubscribe: (subscriber) => {\n\t\t\treturn input.subscribe((value) => {\n\t\t\t\treturn subscriber(map(value));\n\t\t\t});\n\t\t},\n\t};\n};\n\nconst immutable = <T>(value: T): Derived<T> => {\n\treturn {\n\t\tget: () => value,\n\t\tsubscribe: (subscriber) => {\n\t\t\tsubscriber(value);\n\n\t\t\treturn noop;\n\t\t},\n\t};\n};\n\nexport { store, derive, immutable };\nexport type { Stored, Derived };\n","import type { CustomHandler, CustomHandlerFunctionGetFn, CustomHandlerGetResult, TextContent } from './action';\nimport type { Context, CustomActionHandle } from './renderer';\nimport type { Derived } from './store';\nimport { CUSTOM_ACTION_CLEANUP_MAP, CUSTOM_ACTION_MAP } from './shared';\nimport type { Data, Lang, Stack, State, StateFunction } from './types';\nimport { noop } from './utilities';\nimport { immutable } from './store';\nimport { once } from 'es-toolkit/function';\nimport type { Ticker } from './ticker';\n\ntype CleanupFn = () => void;\n\ntype CustomActionCleanupHolderItem = {\n\tfn: CustomHandler;\n\tlist: CleanupFn[];\n\tnode: CleanupFn;\n};\n\ntype CustomActionCleanupHolder = CustomActionCleanupHolderItem[];\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};\n\ntype HandleCustomActionOptions = CustomActionHandle & {\n\t/**\n\t * State Function\n\t */\n\tstate: StateFunction<State>;\n\t/**\n\t * Current Game Language\n\t */\n\tlang: Lang;\n\t/**\n\t * Function to get Stack\n\t */\n\tgetStack: (ctx: Context) => Stack;\n\t/**\n\t * Template Replace Function\n\t */\n\ttemplateReplace: (content: TextContent<Lang, Data>, values?: Data) => string;\n\t/**\n\t * Paused Store\n\t */\n\tpaused: Derived<boolean>;\n\t/**\n\t * Ticker\n\t */\n\tticker: Ticker;\n\t/**\n\t * Fetching function\n\t */\n\trequest: typeof fetch;\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\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 getCustomActionCleanupHolder = (ctx: Context) => {\n\tconst existing = CUSTOM_ACTION_CLEANUP_MAP.get(ctx.id);\n\n\tif (existing) {\n\t\treturn existing;\n\t}\n\n\tconst holder: CustomActionCleanupHolder = [];\n\n\tCUSTOM_ACTION_CLEANUP_MAP.set(ctx.id, holder);\n\n\treturn holder;\n};\n\nconst cleanCleanupSource = ({ list }: CustomActionCleanupHolderItem) => {\n\twhile (list.length) {\n\t\ttry {\n\t\t\tlist.pop()!();\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t}\n};\n\nconst handleCustomAction = (\n\tctx: Context,\n\tfn: CustomHandler,\n\t{\n\t\tlang,\n\t\tstate,\n\t\tsetMountElement,\n\t\tremove: renderersRemove,\n\t\tgetStack,\n\t\ttemplateReplace,\n\t\tpaused,\n\t\tticker,\n\t\trequest\n\t}: HandleCustomActionOptions,\n) => {\n\tconst holder = getCustomActionHolder(ctx, fn);\n\tconst cleanupHolder = getCustomActionCleanupHolder(ctx);\n\n\tconst cleanupNode = () => {\n\t\tif (!cleanupHolder.some((item) => item.fn.id === fn.id && item.fn.key === fn.key)) {\n\t\t\tholder.node = null;\n\t\t\tsetMountElement(null);\n\t\t}\n\t};\n\n\tconst cleanupSource: CustomActionCleanupHolderItem = {\n\t\tfn,\n\t\tlist: [ticker.detach],\n\t\tnode: cleanupNode,\n\t};\n\n\tcleanupHolder.push(cleanupSource);\n\n\tconst getDomNodes = (insert = true): CustomHandlerGetResult<boolean> => {\n\t\tif (holder.node || !insert) {\n\t\t\tsetMountElement(holder.node);\n\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\tcleanupSource.list.push(once(func));\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\tcleanCleanupSource(cleanupSource);\n\n\t\t// When requested not hestitate\n\t\tholder.node = null;\n\t\tsetMountElement(null);\n\n\t\trenderersRemove();\n\t};\n\n\tconst stack = getStack(ctx);\n\n\tconst getSave = () => {\n\t\treturn stack.value;\n\t};\n\n\treturn fn({\n\t\tflags: ctx.meta,\n\n\t\tlang,\n\n\t\tstate,\n\t\tdata,\n\n\t\tdataAtKey: (key) => CUSTOM_ACTION_MAP.get(ctx.id + key)?.localData || null,\n\n\t\ttemplateReplace,\n\n\t\tclear,\n\t\tremove,\n\n\t\trendererContext: ctx,\n\n\t\tgetDomNodes: getDomNodes as CustomHandlerFunctionGetFn,\n\n\t\tgetSave,\n\n\t\tcontextKey: ctx.id,\n\n\t\tpaused: ctx.meta.preview ? immutable(false) : paused,\n\n\t\tticker,\n\n\t\trequest\n\t});\n};\n\nexport { getCustomActionHolder, handleCustomAction, getCustomActionCleanupHolder, cleanCleanupSource };\nexport type { CustomActionHolder, CustomActionCleanupHolder, HandleCustomActionOptions, CleanupFn };\n","import type { CustomHandler, DefaultActionProxy } from './action';\nimport type { Character } from './character';\nimport { ASSETS_TO_PRELOAD, PRELOADED_ASSETS } from './shared';\nimport type { Lang } from './types';\nimport { isAudioAction, isImageAsset, isString, isAsset, getResourseType, mapSet, toArray } from './utilities';\nimport { unwrapAudioAsset, unwrapImageAsset } from './asset';\n\nconst ACTION_NAME_TO_VOLUME_MAP = {\n\tplayMusic: 'music',\n\tplaySound: 'sound',\n\tvoice: 'voice',\n} as const;\n\n/**\n * Adds asset to `ASSETS_TO_PRELOAD` firstly checking if is was already preloaded\n */\nconst enqueueAssetForPreloading = (asset: string) => {\n\tif (!PRELOADED_ASSETS.has(asset)) {\n\t\tASSETS_TO_PRELOAD.add(asset);\n\t}\n};\n\ntype HandleAssetsPreloadingOptions = {\n\trequest: typeof fetch;\n\n\tlimiter: (fn: () => void | PromiseLike<void>) => Promise<void>;\n\n\tpreloadAudioBlocking: (source: string) => Promise<void>;\n\tpreloadImageBlocking: (source: string) => Promise<void>;\n};\n\n/**\n * Preloads assets\n */\nconst handleAssetsPreloading = async ({\n\trequest,\n\tlimiter,\n\tpreloadAudioBlocking,\n\tpreloadImageBlocking,\n}: HandleAssetsPreloadingOptions) => {\n\tconst list = mapSet(ASSETS_TO_PRELOAD, (asset) => {\n\t\treturn limiter(async () => {\n\t\t\tconst type = await getResourseType({\n\t\t\t\turl: asset,\n\t\t\t\trequest,\n\t\t\t});\n\n\t\t\tswitch (type) {\n\t\t\t\tcase 'audio': {\n\t\t\t\t\tawait preloadAudioBlocking(asset);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase 'image': {\n\t\t\t\t\tawait preloadImageBlocking(asset);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tASSETS_TO_PRELOAD.delete(asset);\n\t\t\tPRELOADED_ASSETS.add(asset);\n\t\t});\n\t});\n\n\t/**\n\t * `allSettled` is used because even if error happens game should run\n\t *\n\t * Ideally, there could be a notification for player, maybe developer could be also notified\n\t * But I don't think it's really needed\n\t */\n\tawait Promise.allSettled(list);\n\n\tASSETS_TO_PRELOAD.clear();\n};\n\ntype HuntAssetsOptions = {\n\t/**\n\t * Audio Volume\n\t */\n\tvolume: {\n\t\tmusic: number;\n\t\tsound: number;\n\t\tvoice: number;\n\t};\n\t/**\n\t * Current Language\n\t */\n\tlang: Lang;\n\t/**\n\t * Characters object from user config\n\t */\n\tcharacters: Record<string, Character>;\n\t/**\n\t * Action name\n\t */\n\taction: keyof DefaultActionProxy;\n\t/**\n\t * Action props\n\t */\n\tprops: Parameters<DefaultActionProxy[keyof DefaultActionProxy]>;\n\t/**\n\t * Function to handle found asset\n\t */\n\thandle: (asset: string) => void;\n};\n\nconst huntAssets = ({ volume, lang, characters, action, props, handle }: HuntAssetsOptions) => {\n\tif (action === 'showBackground') {\n\t\t/**\n\t\t * There are two types of showBackground currently\n\t\t *\n\t\t * Parameter is a `string`\n\t\t * Parameter is a `Record<'CSS Media', string>`\n\t\t */\n\t\tif (isString(props[0])) {\n\t\t\thandle(unwrapAudioAsset(props[0]));\n\t\t}\n\n\t\tif (props[0] && typeof props[0] === 'object') {\n\t\t\tfor (const value of Object.values(props[0])) {\n\t\t\t\tif (isImageAsset(value)) {\n\t\t\t\t\thandle(value);\n\t\t\t\t} else if (isAsset(value)) {\n\t\t\t\t\tconst unwrapped = unwrapImageAsset(value);\n\n\t\t\t\t\tif (isImageAsset(unwrapped)) {\n\t\t\t\t\t\thandle(unwrapped);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn;\n\t}\n\n\tconst getVolumeFor = (action: 'playMusic' | 'stopMusic' | 'playSound' | 'stopSound' | 'voice' | 'stopVoice') => {\n\t\tif (action in ACTION_NAME_TO_VOLUME_MAP) {\n\t\t\t// typescript don't be silly please\n\t\t\treturn volume[ACTION_NAME_TO_VOLUME_MAP[action as keyof typeof ACTION_NAME_TO_VOLUME_MAP]];\n\t\t}\n\n\t\treturn 0;\n\t};\n\n\t/**\n\t * Here \"stop\" action also matches condition, but because `ASSETS_TO_PRELOAD` is a Set, there is no problem\n\t */\n\tif (isAudioAction(action) && isString(props[0])) {\n\t\tif (getVolumeFor(action) > 0) {\n\t\t\thandle(unwrapAudioAsset(props[0]));\n\t\t}\n\n\t\treturn;\n\t}\n\n\tif (action === 'voice' && typeof props[0] === 'object') {\n\t\t/**\n\t\t * Early return in case of disabled voices\n\t\t */\n\t\tif (getVolumeFor('voice') == 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const [language, value] of Object.entries(props[0])) {\n\t\t\tif (language === lang) {\n\t\t\t\t/**\n\t\t\t\t * todo: decide how to make language comparison (maybe use some function)\n\t\t\t\t *\n\t\t\t\t * We can use en-US for both en-US and en-GB. Same thing applies to `dialog` and `text` action.\n\t\t\t\t * Maybe voice over language can be selected separately\n\t\t\t\t */\n\t\t\t\tvalue && handle(unwrapAudioAsset(value));\n\t\t\t}\n\t\t}\n\n\t\treturn;\n\t}\n\n\t/**\n\t * Load characters\n\t */\n\tif (action === 'showCharacter' && isString(props[0]) && isString(props[1])) {\n\t\tconst images = toArray(characters[props[0]].emotions[props[1]]);\n\n\t\tfor (const asset of images) {\n\t\t\thandle(unwrapImageAsset(asset));\n\t\t}\n\n\t\treturn;\n\t}\n\n\t/**\n\t * Custom action assets\n\t */\n\tif (action === 'custom' && (props[0] as CustomHandler).assets) {\n\t\tfor (const asset of (props[0] as CustomHandler).assets!) {\n\t\t\tisAsset(asset) ? handle(asset.source) : handle(asset);\n\t\t}\n\n\t\treturn;\n\t}\n\n\tif (action === 'choice') {\n\t\tfor (let i = 1; i < props.length; i++) {\n\t\t\tconst data = props[i];\n\n\t\t\tif (Array.isArray(data)) {\n\t\t\t\thandle(unwrapImageAsset(data[5] as string));\n\t\t\t}\n\t\t}\n\t}\n};\n\nexport { enqueueAssetForPreloading, handleAssetsPreloading, huntAssets };\n","import type { StorageData } from './types';\n\ntype StorageAdapter = {\n\tget: () => Promise<StorageData>;\n\tset: (data: StorageData) => Promise<void>;\n};\n\ntype StorageAdapterLocalOptions = {\n\tkey: string;\n};\n\n/**\n * Stores data in localStorage\n */\nconst storageAdapterLocal = ({ key }: StorageAdapterLocalOptions): StorageAdapter => {\n\treturn {\n\t\tasync get() {\n\t\t\tconst fallback = { saves: [], data: {}, meta: [] };\n\n\t\t\ttry {\n\t\t\t\tconst value = localStorage.getItem(key);\n\n\t\t\t\treturn value ? JSON.parse(value) : fallback;\n\t\t\t} catch {\n\t\t\t\treturn fallback;\n\t\t\t}\n\t\t},\n\t\tasync set(data) {\n\t\t\ttry {\n\t\t\t\tlocalStorage.setItem(key, JSON.stringify(data));\n\t\t\t} catch {}\n\t\t},\n\t};\n};\n\nexport type { StorageAdapter };\nexport { storageAdapterLocal };\n","import type { Data, State } from './types';\n\ntype PluralType = Intl.LDMLPluralRule;\ntype Pluralization = Partial<Record<PluralType, string>>;\ntype AllowedContent =\n\t| string\n\t| ((state: State | Data) => string | string[])\n\t| string[]\n\t| (string | ((state: State | Data) => string | string[]))[];\ntype TranslationActions = Partial<Record<string, (str: string) => string>>;\n\nconst RGX = /{{(.*?)}}/g;\n\nconst split = (input: string, delimeters: string[]) => {\n\tconst output: (string | undefined)[] = [];\n\n\tfor (const delimeter of delimeters) {\n\t\tif (!input) break;\n\n\t\tconst [start, end] = input.split(delimeter, 2);\n\n\t\toutput.push(start);\n\t\tinput = end;\n\t}\n\n\toutput.push(input);\n\n\treturn output;\n};\n\n/**\n * Turns any allowed content into string\n * @param c Content\n */\nconst flattenAllowedContent = (c: AllowedContent, state: State | Data): string => {\n\tif (Array.isArray(c)) {\n\t\treturn c.map((item) => flattenAllowedContent(item, state)).join('<br>');\n\t}\n\n\tif (typeof c === 'function') {\n\t\treturn flattenAllowedContent(c(state), state);\n\t}\n\n\treturn c;\n};\n\nconst replace = (\n\tinput: string,\n\tdata: Record<string, unknown>,\n\tpluralization?: Record<string, Pluralization>,\n\tactions?: TranslationActions,\n\tpr?: Intl.PluralRules,\n) => {\n\treturn input.replaceAll(RGX, (x: any, key: string, y: any) => {\n\t\tx = 0;\n\t\ty = data;\n\n\t\tconst [pathstr, plural, action] = split(key.trim(), ['@', '%']);\n\n\t\tif (!pathstr) {\n\t\t\treturn '';\n\t\t}\n\n\t\tconst path = pathstr.split('.');\n\n\t\twhile (y && x < path.length) y = y[path[x++]];\n\n\t\tif (plural && pluralization && y && pr) {\n\t\t\ty = pluralization[plural][pr.select(y)];\n\t\t}\n\n\t\tconst actionHandler = actions && action ? actions[action] : void 0;\n\n\t\tif (actionHandler) y = actionHandler(y);\n\n\t\treturn y == null ? '' : y;\n\t});\n};\n\nexport { flattenAllowedContent, replace };\nexport type { AllowedContent, PluralType, Pluralization, TranslationActions };\n","import { DEV } from 'esm-env';\nimport type { ActionChoiceChoiceObject, DefaultActionProxy, ValidAction, VirtualActions } from '../action';\nimport { flatActions } from './story';\nimport type { Data, Lang, State } from '../types';\nimport type { Character } from '../character';\n\ntype BuildActionObjectParams<$Lang extends Lang, $Data extends Data> = {\n\trendererActions: Record<string, (...args: any[]) => ValidAction>;\n\tnativeActions: string[];\n\n\tcharacters: Record<string, Character>;\n};\n\ntype VirtualActionsGlobal = VirtualActions<Record<string, Character>, Lang, State>;\ntype ActionsGlobal = DefaultActionProxy & VirtualActionsGlobal;\n\n/**\n * In this case actions that get overwritten with another action\n */\nconst VIRTUAL_ACTIONS: (keyof VirtualActionsGlobal)[] = ['say'];\n\nconst buildActionObject = <$Lang extends Lang, $Data extends Data>({\n\trendererActions,\n\tnativeActions,\n\tcharacters,\n}: BuildActionObjectParams<$Lang, $Data>) => {\n\tconst allActions = [...nativeActions, ...VIRTUAL_ACTIONS];\n\tconst object = { ...rendererActions };\n\n\tfor (let action of allActions) {\n\t\tobject[action] = (...props: Parameters<ActionsGlobal[keyof ActionsGlobal]>) => {\n\t\t\tif (action === 'say') {\n\t\t\t\taction = 'dialog';\n\n\t\t\t\tconst [character] = props as Parameters<VirtualActionsGlobal['say']>;\n\n\t\t\t\tif (DEV && !characters[character]) {\n\t\t\t\t\tthrow new Error(`Attempt to call Say action with unknown character \"${character}\"`);\n\t\t\t\t}\n\t\t\t} else if (action === 'choice') {\n\t\t\t\tif (props.slice(1).every((choice) => !Array.isArray(choice))) {\n\t\t\t\t\tfor (let i = 1; i < props.length; i++) {\n\t\t\t\t\t\tconst choice = props[i] as ActionChoiceChoiceObject<Lang, State>;\n\n\t\t\t\t\t\t(props as Parameters<DefaultActionProxy['choice']>)[i] = [\n\t\t\t\t\t\t\tchoice.title,\n\t\t\t\t\t\t\tflatActions(choice.children),\n\t\t\t\t\t\t\tchoice.active,\n\t\t\t\t\t\t\tchoice.visible,\n\t\t\t\t\t\t\tchoice.onSelect,\n\t\t\t\t\t\t\tchoice.image,\n\t\t\t\t\t\t];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor (let i = 1; i < props.length; i++) {\n\t\t\t\t\t\tconst choice = props[i];\n\n\t\t\t\t\t\tif (Array.isArray(choice)) {\n\t\t\t\t\t\t\tchoice[1] = flatActions(choice[1]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (action === 'condition') {\n\t\t\t\tconst actions = (props as Parameters<ActionsGlobal['condition']>)[1];\n\n\t\t\t\tfor (const key in actions) {\n\t\t\t\t\tactions[key] = flatActions(actions[key]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn [action, ...props] as ValidAction;\n\t\t};\n\t}\n\n\treturn object;\n};\n\nexport { buildActionObject };\n","import type { Story, TextContent } from '../action';\nimport { unwrapAudioAsset } from '../asset';\nimport type {\n\tData,\n\tDialogOverview,\n\tDialogOverviewEntry,\n\tLang,\n\tNovelyAsset,\n\tState,\n\tUseStackFunctionReturnType,\n} from '../types';\nimport { getActionsFromPath, type GuardedReferFunction } from './actions-processing';\nimport { isAsset, isSkippedDuringRestore, isString, isUserRequiredAction } from './assertions';\n\ntype GetDialogOverviewContext = {\n\tstory: Story;\n\treferGuarded: GuardedReferFunction;\n\n\tgetCharacterName: (character: string) => string;\n\tgetLanguage: () => string;\n\tgetStack: () => UseStackFunctionReturnType;\n\ttemplateReplace: (content: TextContent<Lang, Data>, values?: Data) => string;\n};\n\nconst getDialogOverview = async function (this: GetDialogOverviewContext) {\n\t/**\n\t * Dialog Overview is possible only in main context\n\t */\n\tconst { value: save } = this.getStack();\n\tconst stateSnapshots = save[3];\n\n\t/**\n\t * Easy mode\n\t */\n\tif (stateSnapshots.length == 0) {\n\t\treturn [];\n\t}\n\n\tconst { queue } = await getActionsFromPath({\n\t\tstory: this.story,\n\t\tpath: save[0],\n\t\tfilter: false,\n\t\treferGuarded: this.referGuarded,\n\t});\n\n\tconst lang = this.getLanguage();\n\n\ttype DialogItem = {\n\t\tname: undefined | string;\n\t\ttext: TextContent<string, State>;\n\t\tvoice: undefined | string | NovelyAsset | Record<string, string | NovelyAsset>;\n\t};\n\n\tconst dialogItems: DialogItem[] = [];\n\n\t/**\n\t * For every available state snapshot find dialog corresponding to it\n\t */\n\tfor (let p = 0, a = stateSnapshots.length, i = queue.length - 1; a > 0 && i > 0; i--) {\n\t\tconst action = queue[i];\n\n\t\tif (action[0] === 'dialog') {\n\t\t\tconst [_, name, text] = action;\n\n\t\t\tlet voice: undefined | string | NovelyAsset | Record<string, string | NovelyAsset> = undefined;\n\n\t\t\t/**\n\t\t\t * Search for the most recent `voice` action before current dialog\n\t\t\t */\n\t\t\tfor (let j = i - 1; j > p && j > 0; j--) {\n\t\t\t\tconst action = queue[j];\n\n\t\t\t\tif (isUserRequiredAction(action) || isSkippedDuringRestore(action[0])) break;\n\t\t\t\tif (action[0] === 'stopVoice') break;\n\n\t\t\t\tif (action[0] === 'voice') {\n\t\t\t\t\tvoice = action[1];\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdialogItems.push({\n\t\t\t\tname,\n\t\t\t\ttext,\n\t\t\t\tvoice,\n\t\t\t});\n\n\t\t\tp = i;\n\t\t\ta--;\n\t\t}\n\t}\n\n\tconst entries: DialogOverview = dialogItems.reverse().map(({ name, text, voice }, i) => {\n\t\tconst state = stateSnapshots[i];\n\t\tconst audioSource = isString(voice)\n\t\t\t? voice\n\t\t\t: isAsset(voice)\n\t\t\t\t? voice\n\t\t\t\t: voice == undefined\n\t\t\t\t\t? voice\n\t\t\t\t\t: voice[lang];\n\n\t\tname = name ? this.getCharacterName(name) : '';\n\n\t\treturn {\n\t\t\tname: this.templateReplace(name, state),\n\t\t\ttext: this.templateReplace(text, state),\n\t\t\tvoice: audioSource ? unwrapAudioAsset(audioSource) : '',\n\t\t} satisfies DialogOverviewEntry;\n\t});\n\n\treturn entries;\n};\n\nexport { getDialogOverview };\n","import type { Lang } from '../types';\n\nconst setDocumentLanguage = (language: Lang) => {\n\tdocument.documentElement.lang = language;\n};\n\nexport { setDocumentLanguage };\n","import type { Derived } from './store';\n\ntype TickHandler = (ticker: Ticker) => void;\n\nclass Ticker {\n\tpublic listeners = new Set<TickHandler>();\n\tpublic running = false;\n\n\tprivate _factory: TickerFactory;\n\n\tconstructor(factory: TickerFactory) {\n\t\tthis._factory = factory;\n\t}\n\n\tget deltaTime() {\n\t\treturn this._factory.deltaTime;\n\t}\n\n\tget lastTime() {\n\t\treturn this._factory.lastTime;\n\t}\n\n\tpublic add(cb: (ticker: Ticker) => void) {\n\t\tthis.listeners.add(cb);\n\n\t\tif (this.listeners.size === 1) {\n\t\t\tthis._factory.check(true);\n\t\t}\n\n\t\treturn () => {\n\t\t\tthis.remove(cb);\n\t\t};\n\t}\n\n\tpublic remove(cb: (ticker: Ticker) => void) {\n\t\tthis.listeners.delete(cb);\n\n\t\tif (this.listeners.size === 0) {\n\t\t\tthis._factory.check(false);\n\t\t}\n\t}\n\n\tpublic start = () => {\n\t\tthis.running = true;\n\n\t\tif (this.listeners.size > 0) {\n\t\t\tthis._factory.check(true);\n\t\t}\n\t};\n\n\tpublic stop = () => {\n\t\tthis.running = false;\n\t};\n\n\tpublic detach = () => {\n\t\tthis.listeners.clear();\n\t\tthis.stop();\n\t\tthis._factory.detach(this);\n\t};\n}\n\nclass TickerFactory {\n\tprivate _children = new Set<Ticker>();\n\tprivate _raf = -1;\n\tprivate _running = false;\n\tprivate _unsubscribe: () => void;\n\n\tpublic deltaTime = 0;\n\tpublic lastTime = performance.now();\n\n\tconstructor(paused: Derived<boolean>) {\n\t\tthis._unsubscribe = paused.subscribe((paused) => {\n\t\t\tif (paused) {\n\t\t\t\tthis.stop();\n\t\t\t} else if (Array.from(this._children).some((ticker) => ticker.running && ticker.listeners.size > 0)) {\n\t\t\t\tthis.start();\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic start() {\n\t\tif (this._running) {\n\t\t\treturn;\n\t\t}\n\n\t\tcancelAnimationFrame(this._raf);\n\n\t\tthis.lastTime = performance.now();\n\t\tthis._running = true;\n\t\tthis._raf = requestAnimationFrame(this.update);\n\t}\n\n\tpublic stop() {\n\t\tcancelAnimationFrame(this._raf);\n\t\tthis._running = false;\n\t\tthis._raf = -1;\n\t}\n\n\tpublic fork() {\n\t\tconst ticker = new Ticker(this);\n\n\t\tthis._children.add(ticker);\n\n\t\treturn ticker;\n\t}\n\n\tpublic check(positive: boolean) {\n\t\tif (positive) {\n\t\t\tthis.start();\n\t\t} else if (Array.from(this._children).every((ticker) => !ticker.running || ticker.listeners.size === 0)) {\n\t\t\tthis.stop();\n\t\t}\n\t}\n\n\tpublic destroy() {\n\t\tthis._unsubscribe();\n\t\tthis._children.forEach((child) => child.detach());\n\t}\n\n\tpublic detach(ticker: Ticker) {\n\t\tthis._children.delete(ticker);\n\t\tthis.check(false);\n\t}\n\n\tprivate update = (currentTime: DOMHighResTimeStamp) => {\n\t\tthis.deltaTime = currentTime - this.lastTime;\n\t\tthis._children.forEach((ticker) => {\n\t\t\tif (ticker.running) {\n\t\t\t\tticker.listeners.forEach((tick) => {\n\t\t\t\t\ttick(ticker);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tif (!this._running) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.lastTime = currentTime;\n\t\tthis._raf = requestAnimationFrame(this.update);\n\t};\n}\n\nexport { TickerFactory, Ticker };\n","import type { ValidAction } from './action';\nimport type { Assign } from './types';\n\ntype Part = Record<string, (...args: any[]) => ValidAction>;\n\n/**\n * Extens core action with custom actions\n * @param base Actions object you will extend, `engine.action`\n * @param extension Actions object you will extend with\n * @example\n * ```ts\n * const action = extendAction(engine.action, {\n * particles: (options: Parameters<typeof particles>[0]) => {\n * return ['custom', particles(options)]\n * }\n * })\n * ```\n */\nconst extendAction = <Part0 extends Part, Part1 extends Part>(\n\tbase: Part0,\n\textension: Part1,\n): Readonly<Assign<Part0, Part1>> => {\n\treturn {\n\t\t...extension,\n\t\t...base,\n\t};\n};\n\nexport { extendAction };\n","const RU = {\n\tNewGame: 'Новая игра',\n\tHomeScreen: 'Главный экран',\n\tToTheGame: 'К игре',\n\tLanguage: 'Язык',\n\tNoSaves: 'Сохранений нет',\n\tLoadSave: 'Загрузить',\n\tSaves: 'Сохранения',\n\tSettings: 'Настройки',\n\tSumbit: 'Подтвердить',\n\tGoBack: 'Назад',\n\tDoSave: 'Сохранение',\n\tAuto: 'Авто',\n\tStop: 'Стоп',\n\tExit: 'Выход',\n\tAutomatic: 'Автоматическое',\n\tManual: 'Ручное',\n\tRemove: 'Удалить',\n\tLoadASaveFrom: 'Загрузить сохранение от',\n\tDeleteASaveFrom: 'Удалить сохранение от',\n\tTextSpeed: 'Скорость текста',\n\tTextSpeedSlow: 'Медленная',\n\tTextSpeedMedium: 'Средняя',\n\tTextSpeedFast: 'Быстрая',\n\tTextSpeedAuto: 'Автоматическая',\n\tCompleteText: 'Завершить текст',\n\tGoForward: 'Перейти вперёд',\n\tExitDialogWarning: 'Вы уверены, что хотите выйти? Прогресс будет сохранён.',\n\tExitDialogExit: 'Выйти',\n\tExitDialogBack: 'Вернуться в игру',\n\tOpenMenu: 'Открыть меню',\n\tCloseMenu: 'Закрыть меню',\n\tMusicVolume: 'Громкость музыки',\n\tSoundVolume: 'Громкость звуков',\n\tVoiceVolume: 'Громкость речи',\n\tClose: 'Закрыть',\n\tDialogOverview: 'Обзор диалога',\n};\n\ntype BaseTranslationStrings = keyof typeof RU;\n\nconst EN: Record<BaseTranslationStrings, string> = {\n\tNewGame: 'New Game',\n\tHomeScreen: 'Home Screen',\n\tToTheGame: 'To the Game',\n\tLanguage: 'Language',\n\tNoSaves: 'No saves',\n\tLoadSave: 'Load',\n\tSaves: 'Saves',\n\tSettings: 'Settings',\n\tSumbit: 'Submit',\n\tGoBack: 'Go back',\n\tDoSave: 'Save',\n\tAuto: 'Auto',\n\tStop: 'Stop',\n\tExit: 'Exit',\n\tAutomatic: 'Automatic',\n\tManual: 'Manual',\n\tRemove: 'Remove',\n\tLoadASaveFrom: 'Load a save from',\n\tDeleteASaveFrom: 'Delete a save from',\n\tTextSpeed: 'Text Speed',\n\tTextSpeedSlow: 'Slow',\n\tTextSpeedMedium: 'Medium',\n\tTextSpeedFast: 'Fast',\n\tTextSpeedAuto: 'Auto',\n\tCompleteText: 'Complete text',\n\tGoForward: 'Go forward',\n\tExitDialogWarning: 'Are you sure you want to exit? Progress will be saved.',\n\tExitDialogExit: 'Exit',\n\tExitDialogBack: 'Return to game',\n\tOpenMenu: 'Open menu',\n\tCloseMenu: 'Close menu',\n\tMusicVolume: 'Music volume',\n\tSoundVolume: 'Sound volume',\n\tVoiceVolume: 'Voice volume',\n\tClose: 'Close',\n\tDialogOverview: 'Dialog Overview',\n};\n\nexport { RU, EN };\nexport type { BaseTranslationStrings };\n","type EventHandler<T> = (this: Document, event: T) => void;\n\ntype BlurEventHandler = EventHandler<Event>;\ntype FocusEventHandler = EventHandler<FocusEvent>;\n\nconst BLUR_HANDLERS = new Set<BlurEventHandler>();\nconst FOCUS_HANDLERS = new Set<FocusEventHandler>();\n\ntype EventListeners = {\n\tfocus: FocusEventHandler;\n\tblur: BlurEventHandler;\n};\n\nconst registerEventListeners = (listeners: EventListeners) => {\n\tBLUR_HANDLERS.add(listeners.blur);\n\tFOCUS_HANDLERS.add(listeners.focus);\n\n\treturn () => {\n\t\tBLUR_HANDLERS.delete(listeners.blur);\n\t\tFOCUS_HANDLERS.delete(listeners.focus);\n\t};\n};\n\naddEventListener('focus', function (event) {\n\tfor (const handler of FOCUS_HANDLERS) {\n\t\ttry {\n\t\t\thandler.call(this.document, event);\n\t\t} catch {}\n\t}\n});\n\naddEventListener('blur', function (event) {\n\tfor (const handler of BLUR_HANDLERS) {\n\t\ttry {\n\t\t\thandler.call(this.document, event);\n\t\t} catch {}\n\t}\n});\n\nconst pauseOnBlur = (engine: { setFocused: (focused: boolean) => void }) => {\n\treturn {\n\t\tunsubscribe: registerEventListeners({\n\t\t\tfocus: () => {\n\t\t\t\tengine.setFocused(true);\n\t\t\t},\n\t\t\tblur: () => {\n\t\t\t\tengine.setFocused(false);\n\t\t\t},\n\t\t}),\n\t};\n};\n\nexport { pauseOnBlur };\n"],"mappings":"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","names":["memoize","DEV","asset","supportsMap","supportsMap","asset","DEV","refer","audio","item","next","memoize","DEV","memoize","memoize","memoize","memoize","store","set","set","once","getStack","asset","action","DEV","DEV","action","paused","getLanguage","memoize","DEV","data","save","replace","set","action","characters","audio","type","props","asset","preview","next","t","paused"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@novely/core",
3
3
  "description": "Novely - powerful visual novel engine for creating interactive stories and games with branching narratives and rich multimedia content",
4
- "version": "0.52.0",
4
+ "version": "0.53.0-next.1",
5
5
  "type": "module",
6
6
  "sideEffects": false,
7
7
  "publishConfig": {