@novely/core 0.36.0-beta.2 → 0.36.0

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
@@ -72,7 +72,7 @@ interface CharacterHandle {
72
72
  emotion: (emotion: string, render: boolean) => void;
73
73
  append: (className?: string, style?: string, restoring?: boolean) => void;
74
74
  remove: (className?: string, style?: string, duration?: number, restoring?: boolean) => Promise<void>;
75
- animate: (timeout: number, classes: string[]) => void;
75
+ animate: (classes: string[]) => void;
76
76
  emotions: Record<string, HTMLImageElement[]>;
77
77
  }
78
78
  type CustomActionHandle = {
@@ -510,7 +510,7 @@ type ValidAction = ['choice', number] | ['clear', Set<keyof DefaultActionProxy>?
510
510
  type Story = Record<string, ValidAction[]>;
511
511
  type TextContent<L extends string, S extends State> = string | ((state: S) => string) | Record<L, string | ((state: S) => string)>;
512
512
  type FunctionableValue<T> = T | (() => T);
513
- type CustomHandlerGetResultDataFunction = (data?: Record<string, unknown>) => Record<string, unknown>;
513
+ type CustomHandlerGetResultDataFunction = <T = Record<string, unknown>>(data?: T) => T;
514
514
  type CustomHandlerGetResult<I extends boolean> = {
515
515
  /**
516
516
  * Element for the custom action to be rendered into
@@ -587,6 +587,10 @@ type CustomHandlerCalling = {
587
587
  skipOnRestore?: (getNext: () => Exclude<ValidAction, ValidAction[]>[]) => boolean;
588
588
  };
589
589
  type CustomHandlerInfo = CustomHandlerCalling & {
590
+ /**
591
+ * Assets (pictures, audio files) used by action
592
+ */
593
+ assets?: string[];
590
594
  /**
591
595
  * When true interacting with it will be saved in history
592
596
  */
@@ -597,10 +601,8 @@ type CustomHandlerInfo = CustomHandlerCalling & {
597
601
  skipClearOnGoingBack?: boolean;
598
602
  /**
599
603
  * Id by which we will determine what action is which
600
- *
601
- * It IS recommended to pass this property as it will speed up that check and make it more reliable
602
604
  */
603
- id?: string | symbol;
605
+ id: string | symbol;
604
606
  /**
605
607
  * Key by which we will save the data in the `get` function provided to custom action.
606
608
  *
@@ -714,7 +716,7 @@ type ActionProxy<Characters extends Record<string, Character>, Languages extends
714
716
  jump: (scene: string) => ValidAction;
715
717
  showCharacter: <C extends keyof Characters>(character: C, emotion?: keyof Characters[C]['emotions'], className?: string, style?: string) => ValidAction;
716
718
  hideCharacter: (character: keyof Characters, className?: string, style?: string, duration?: number) => ValidAction;
717
- animateCharacter: (character: keyof Characters, timeout: number, ...classes: string[]) => ValidAction;
719
+ animateCharacter: (character: keyof Characters, classes: string) => ValidAction;
718
720
  wait: (time: number | ((state: State) => number)) => ValidAction;
719
721
  function: (fn: FunctionAction<Languages, S>) => ValidAction;
720
722
  input: (question: TextContent<Languages, S>, onInput: (meta: ActionInputOnInputMeta<Languages, S>) => void, setup?: ActionInputSetup) => ValidAction;
@@ -729,6 +731,8 @@ type DefaultActionProxy = ActionProxy<Record<string, Character>, Lang, State>;
729
731
  type GetActionParameters<T extends Capitalize<keyof DefaultActionProxy>> = Parameters<DefaultActionProxy[Uncapitalize<T>]>;
730
732
 
731
733
  type ConditionParams<T> = T extends TypeEssentials<any, infer $State, any, any> ? $State : never;
734
+ type ChoiceParams<T> = T extends TypeEssentials<infer $Lang, infer $State, any, any> ? ChoiceCheckFunctionProps<$Lang, $State> : never;
735
+ type FunctionParams<T> = T extends TypeEssentials<infer $Lang, infer $State, any, any> ? FunctionActionProps<$Lang, $State> : never;
732
736
  type InputHandler<T> = T extends TypeEssentials<infer $Lang, infer $State, any, any> ? ActionInputOnInputMeta<$Lang, $State> : never;
733
737
 
734
738
  declare const novely: <$Language extends string, $Characters extends Record<string, Character<$Language>>, $State extends State, $Data extends Data, $Actions extends Record<string, (...args: any[]) => ValidAction>>({ characters, defaultEmotions, storage, storageDelay, renderer: createRenderer, initialScreen, translation, state: defaultState, data: defaultData, autosaves, migrations, throttleTimeout, getLanguage, overrideLanguage, askBeforeExit, preloadAssets, parallelAssetsDownloadLimit, fetch: request, saveOnUnload, startKey }: NovelyInit<$Language, $Characters, $State, $Data, $Actions>) => {
@@ -819,6 +823,23 @@ declare const novely: <$Language extends string, $Characters extends Record<stri
819
823
  * ```
820
824
  */
821
825
  getCurrentStorageData: () => StorageData<$Language, $Data> | null;
826
+ /**
827
+ * Function to set storage data. Using this function is not recommended.
828
+ *
829
+ * @deprecated
830
+ * @example
831
+ * ```ts
832
+ * const currentStorageData = engine.getCurrentStorageData();
833
+ *
834
+ * if (currentStorageData) {
835
+ * // update music volume
836
+ * currentStorageData.meta[2] = 1;
837
+ *
838
+ * setStorageData(currentStorageData)
839
+ * }
840
+ * ```
841
+ */
842
+ setStorageData: (data: StorageData<$Language, $Data>) => void;
822
843
  };
823
844
 
824
845
  /**
@@ -836,4 +857,4 @@ declare const novely: <$Language extends string, $Characters extends Record<stri
836
857
  */
837
858
  declare const extendAction: <Part0 extends Record<string, (...args: any[]) => ValidAction>, Part1 extends Record<string, (...args: any[]) => ValidAction>>(base: Part0, extension: Part1) => Readonly<Assign<Part0, Part1>>;
838
859
 
839
- export { type ActionInputOnInputMeta, type ActionInputSetup, type ActionInputSetupCleanup, type ActionProxy, type AllowedContent, type AudioHandle, type BackgroundImage, type BaseTranslationStrings, type Character, type CharacterHandle, type ConditionParams, type Context, type CoreData, type CustomActionHandle, type CustomHandler, type CustomHandlerFunctionGetFn, type CustomHandlerFunctionParameters, type CustomHandlerGetResult, type CustomHandlerGetResultDataFunction, type Data, type DeepPartial, type DefaultActionProxy, EN, type Emotions, type FunctionableValue, type GetActionParameters, type InputHandler, JP, KK, type Lang, type NovelyInit, type NovelyScreen, type Path, type PluralType, type Pluralization, RU, type Renderer, type RendererInit, type Save, type Stack, type StackHolder, type State, type StateFunction, type Storage, type StorageData, type StorageMeta, type Stored, type Story, type TextContent, type Thenable, type TranslationActions, type TypeEssentials, type TypewriterSpeed, type ValidAction, extendAction, localStorageStorage, novely };
860
+ export { type ActionInputOnInputMeta, type ActionInputSetup, type ActionInputSetupCleanup, type ActionProxy, type AllowedContent, type AudioHandle, type BackgroundImage, type BaseTranslationStrings, type Character, type CharacterHandle, type ChoiceParams, type ConditionParams, type Context, type CoreData, type CustomActionHandle, type CustomHandler, type CustomHandlerFunctionGetFn, type CustomHandlerFunctionParameters, type CustomHandlerGetResult, type CustomHandlerGetResultDataFunction, type Data, type DeepPartial, type DefaultActionProxy, EN, type Emotions, type FunctionParams, type FunctionableValue, type GetActionParameters, type InputHandler, JP, KK, type Lang, type NovelyInit, type NovelyScreen, type Path, type PluralType, type Pluralization, RU, type Renderer, type RendererInit, type Save, type Stack, type StackHolder, type State, type StateFunction, type Storage, type StorageData, type StorageMeta, type Stored, type Story, type TextContent, type Thenable, type TranslationActions, type TypeEssentials, type TypewriterSpeed, type ValidAction, extendAction, localStorageStorage, novely };
@@ -1156,6 +1156,7 @@ var Novely = (() => {
1156
1156
  const ASSETS_TO_PRELOAD = /* @__PURE__ */ new Set();
1157
1157
  const dataLoaded = createControlledPromise();
1158
1158
  let initialScreenWasShown = false;
1159
+ let destroyed = false;
1159
1160
  const intime = (value) => {
1160
1161
  return times.add(value), value;
1161
1162
  };
@@ -1185,6 +1186,8 @@ var Novely = (() => {
1185
1186
  }
1186
1187
  };
1187
1188
  const scriptBase = async (part) => {
1189
+ if (destroyed)
1190
+ return;
1188
1191
  Object.assign(story, flattenStory(part));
1189
1192
  let loadingIsShown = false;
1190
1193
  if (!initialScreenWasShown) {
@@ -1223,9 +1226,11 @@ var Novely = (() => {
1223
1226
  assetsToPreloadAdd(value);
1224
1227
  }
1225
1228
  }
1229
+ return;
1226
1230
  }
1227
1231
  if (isAudioAction(action2) && isString(props[0])) {
1228
1232
  assetsToPreloadAdd(props[0]);
1233
+ return;
1229
1234
  }
1230
1235
  if (action2 === "showCharacter" && isString(props[0]) && isString(props[1])) {
1231
1236
  const images = characters[props[0]].emotions[props[1]];
@@ -1236,6 +1241,12 @@ var Novely = (() => {
1236
1241
  } else {
1237
1242
  assetsToPreloadAdd(images);
1238
1243
  }
1244
+ return;
1245
+ }
1246
+ if (action2 === "custom" && props[0].assets && props[0].assets.length > 0) {
1247
+ for (const asset of props[0].assets) {
1248
+ assetsToPreloadAdd(asset);
1249
+ }
1239
1250
  }
1240
1251
  };
1241
1252
  const action = new Proxy({}, {
@@ -1879,16 +1890,14 @@ var Novely = (() => {
1879
1890
  next({ push }) {
1880
1891
  push();
1881
1892
  },
1882
- animateCharacter({ ctx, push }, [character, timeout, ...classes]) {
1893
+ animateCharacter({ ctx, push }, [character, className]) {
1894
+ const classes = className.split(" ");
1883
1895
  if (DEV && classes.length === 0) {
1884
1896
  throw new Error("Attempt to use AnimateCharacter without classes. Classes should be provided [https://novely.pages.dev/guide/actions/animateCharacter.html]");
1885
1897
  }
1886
- if (DEV && (timeout <= 0 || !Number.isFinite(timeout) || Number.isNaN(timeout))) {
1887
- throw new Error("Attempt to use AnimateCharacter with unacceptable timeout. It should be finite and greater than zero");
1888
- }
1889
1898
  if (ctx.meta.preview)
1890
1899
  return;
1891
- ctx.character(character).animate(timeout, classes);
1900
+ ctx.character(character).animate(classes);
1892
1901
  push();
1893
1902
  },
1894
1903
  text({ ctx, data: data2, forward }, text) {
@@ -2002,6 +2011,15 @@ var Novely = (() => {
2002
2011
  const getCurrentStorageData = () => {
2003
2012
  return coreData.get().dataLoaded ? klona(storageData.get()) : null;
2004
2013
  };
2014
+ const setStorageData = (data2) => {
2015
+ if (destroyed) {
2016
+ if (DEV) {
2017
+ throw new Error(`function \`setStorageData\` was called after novely instance was destroyed.`);
2018
+ }
2019
+ return;
2020
+ }
2021
+ storageData.set(data2);
2022
+ };
2005
2023
  return {
2006
2024
  /**
2007
2025
  * Function to set game script
@@ -2086,6 +2104,7 @@ var Novely = (() => {
2086
2104
  dataLoaded.cancel();
2087
2105
  UIInstance.unmount();
2088
2106
  unsubscribeFromBrowserVisibilityChange();
2107
+ destroyed = true;
2089
2108
  },
2090
2109
  /**
2091
2110
  * Funtion to get current storage data
@@ -2095,7 +2114,24 @@ var Novely = (() => {
2095
2114
  * const currentStorageData = engine.getCurrentStorageData();
2096
2115
  * ```
2097
2116
  */
2098
- getCurrentStorageData
2117
+ getCurrentStorageData,
2118
+ /**
2119
+ * Function to set storage data. Using this function is not recommended.
2120
+ *
2121
+ * @deprecated
2122
+ * @example
2123
+ * ```ts
2124
+ * const currentStorageData = engine.getCurrentStorageData();
2125
+ *
2126
+ * if (currentStorageData) {
2127
+ * // update music volume
2128
+ * currentStorageData.meta[2] = 1;
2129
+ *
2130
+ * setStorageData(currentStorageData)
2131
+ * }
2132
+ * ```
2133
+ */
2134
+ setStorageData
2099
2135
  };
2100
2136
  };
2101
2137