@novely/core 0.12.4 → 0.13.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/README.md CHANGED
@@ -1,3 +1,5 @@
1
1
  # @novely/core
2
2
 
3
- Novely - движок визуальных новелл для создания интерактивных историй и игр.
3
+ Novely - Novel Engine for creating interactive stories
4
+
5
+ See more on [website](https://novely.pages.dev)
package/dist/index.d.ts CHANGED
@@ -1,7 +1,3 @@
1
- import * as _novely_t9n from '@novely/t9n';
2
- import { BaseTranslationStrings, SetupT9N } from '@novely/t9n';
3
- export { BaseTranslationStrings } from '@novely/t9n';
4
-
5
1
  type Name<Keys extends string = string> = string | Record<Keys, string>;
6
2
  type Emotions<Keys extends string = string> = Record<Keys, string | {
7
3
  body: Record<'left' | 'right', string>;
@@ -51,7 +47,7 @@ type CoreData = {
51
47
 
52
48
  type ValidAction = ['choice', [number]] | ['clear', [Set<keyof DefaultActionProxyProvider>?, Set<string>?]] | ['condition', [() => boolean, Record<string, ValidAction[]>]] | ['dialog', [string | undefined, Unwrappable, string | undefined]] | ['end', []] | ['showBackground', [string | NonEmptyRecord<BackgroundImage>]] | ['playMusic', [string]] | ['stopMusic', [string]] | ['jump', [string]] | ['showCharacter', [string, keyof Character['emotions'], string?, string?]] | ['hideCharacter', [string, string?, string?, number?]] | ['animateCharacter', [string, number, ...string[]]] | ['wait', [FunctionableValue<number>]] | ['function', [() => Thenable<void>]] | ['input', [string, (meta: ActionInputOnInputMeta) => void, ActionInputSetup?]] | ['custom', [CustomHandler]] | ['vibrate', [...number[]]] | ['next', []] | ['text', [...string[]]] | ['exit', []] | ['preload', [string]] | ['block', [string]] | ValidAction[];
53
49
  type Story = Record<string, ValidAction[]>;
54
- type Unwrappable = string | ((lang: string, obj: Record<string, unknown>) => string) | Record<string, string | (() => string)>;
50
+ type Unwrappable = string | Record<string, string | (() => string)>;
55
51
  type FunctionableValue<T> = T | (() => T);
56
52
  type CustomHandlerGetResultDataFunction = {
57
53
  (data?: Record<string, unknown>): Record<string, unknown>;
@@ -141,6 +137,50 @@ type ActionProxyProvider<Characters extends Record<string, Character>> = {
141
137
  type DefaultActionProxyProvider = ActionProxyProvider<Record<string, Character>>;
142
138
  type GetActionParameters<T extends Capitalize<keyof DefaultActionProxyProvider>> = Parameters<DefaultActionProxyProvider[Uncapitalize<T>]>;
143
139
 
140
+ declare const RU: {
141
+ NewGame: string;
142
+ HomeScreen: string;
143
+ ToTheGame: string;
144
+ Language: string;
145
+ NoSaves: string;
146
+ LoadSave: string;
147
+ Saves: string;
148
+ Settings: string;
149
+ Sumbit: string;
150
+ GoBack: string;
151
+ DoSave: string;
152
+ Auto: string;
153
+ Stop: string;
154
+ Exit: string;
155
+ Automatic: string;
156
+ Manual: string;
157
+ Remove: string;
158
+ LoadASaveFrom: string;
159
+ DeleteASaveFrom: string;
160
+ TextSpeed: string;
161
+ TextSpeedSlow: string;
162
+ TextSpeedMedium: string;
163
+ TextSpeedFast: string;
164
+ TextSpeedAuto: string;
165
+ CompleteText: string;
166
+ GoForward: string;
167
+ ExitDialogWarning: string;
168
+ ExitDialogExit: string;
169
+ ExitDialogBack: string;
170
+ OpenMenu: string;
171
+ CloseMenu: string;
172
+ };
173
+ type BaseTranslationStrings = keyof typeof RU;
174
+ declare const EN: Record<BaseTranslationStrings, string>;
175
+ /**
176
+ * Translated automatically
177
+ */
178
+ declare const KK: Record<BaseTranslationStrings, string>;
179
+ /**
180
+ * Translated automatically
181
+ */
182
+ declare const JP: Record<BaseTranslationStrings, string>;
183
+
144
184
  type Stored<T> = {
145
185
  subscribe: (cb: (value: T) => void) => () => void;
146
186
  update: (fn: (prev: T) => T) => void;
@@ -243,9 +283,14 @@ interface Storage {
243
283
  }
244
284
  declare const localStorageStorage: (options: LocalStorageStorageSettings) => Storage;
245
285
 
286
+ type PluralType = Intl.LDMLPluralRule;
287
+ type Pluralization = Partial<Record<PluralType, string>>;
288
+ type AllowedContent = string | (() => string | string[]) | string[] | (string | (() => string | string[]))[];
289
+ type TranslationActions = Partial<Record<string, (str: string) => string>>;
290
+
246
291
  declare const getLanguage: (languages: string[]) => string;
247
292
 
248
- interface NovelyInit<Languages extends string, Characters extends Record<string, Character<Languages>>, Inter extends ReturnType<SetupT9N<Languages>>, StateScheme extends State, DataScheme extends Data> {
293
+ interface NovelyInit<Languages extends string, Characters extends Record<string, Character<Languages>>, StateScheme extends State, DataScheme extends Data> {
249
294
  /**
250
295
  * An array of languages supported by the game.
251
296
  */
@@ -256,8 +301,9 @@ interface NovelyInit<Languages extends string, Characters extends Record<string,
256
301
  characters: Characters;
257
302
  /**
258
303
  * An object that provides access to the game's storage system.
304
+ * @default localStorage // at key `novely-game-storage`
259
305
  */
260
- storage: Storage;
306
+ storage?: Storage;
261
307
  /**
262
308
  * Delay loading data until Promise is resolved
263
309
  */
@@ -273,7 +319,15 @@ interface NovelyInit<Languages extends string, Characters extends Record<string,
273
319
  /**
274
320
  * An object containing the translation functions used in the game
275
321
  */
276
- t9n: Inter;
322
+ translation: Record<Languages, {
323
+ internal: Record<BaseTranslationStrings, string>;
324
+ /**
325
+ * IETF BCP 47 language tag
326
+ */
327
+ tag?: string;
328
+ plural?: Record<string, Pluralization>;
329
+ actions?: TranslationActions;
330
+ }>;
277
331
  /**
278
332
  * Initial state value
279
333
  */
@@ -324,7 +378,7 @@ interface NovelyInit<Languages extends string, Characters extends Record<string,
324
378
  */
325
379
  preloadAssets?: "lazy" | "blocking";
326
380
  }
327
- declare const novely: <Languages extends string, Characters extends Record<string, Character<Languages>>, Inter extends _novely_t9n.T9N<Languages, string>, StateScheme extends State, DataScheme extends Data>({ characters, storage, storageDelay, renderer: createRenderer, initialScreen, t9n, languages, state: defaultState, data: defaultData, autosaves, migrations, throttleTimeout, getLanguage, overrideLanguage, askBeforeExit, preloadAssets }: NovelyInit<Languages, Characters, Inter, StateScheme, DataScheme>) => {
381
+ declare const novely: <Languages extends string, Characters extends Record<string, Character<Languages>>, StateScheme extends State, DataScheme extends Data>({ characters, storage, storageDelay, renderer: createRenderer, initialScreen, translation, languages, state: defaultState, data: defaultData, autosaves, migrations, throttleTimeout, getLanguage, overrideLanguage, askBeforeExit, preloadAssets }: NovelyInit<Languages, Characters, StateScheme, DataScheme>) => {
328
382
  /**
329
383
  * Function to set story
330
384
  */
@@ -351,10 +405,6 @@ declare const novely: <Languages extends string, Characters extends Record<strin
351
405
  * Unwraps translatable content to a string value
352
406
  */
353
407
  unwrap(content: Unwrappable | Record<Languages, string>): string;
354
- /**
355
- * Function that is used for translation
356
- */
357
- t: Inter["t"];
358
408
  };
359
409
 
360
- export { ActionProxyProvider, AudioHandle, Character, CharacterHandle, CoreData, CustomHandler, CustomHandlerGetResult, CustomHandlerGetResultDataFunction, DefaultActionProxyProvider, Emotions, FunctionableValue, GetActionParameters, Lang, NovelyScreen, Path, Renderer, RendererInit, RendererStore, Storage, StorageData, StorageMeta, Stored, Story, Thenable, TypewriterSpeed, Unwrappable, ValidAction, localStorageStorage, novely };
410
+ export { ActionProxyProvider, AllowedContent, AudioHandle, BaseTranslationStrings, Character, CharacterHandle, CoreData, CustomHandler, CustomHandlerGetResult, CustomHandlerGetResultDataFunction, DefaultActionProxyProvider, EN, Emotions, FunctionableValue, GetActionParameters, JP, KK, Lang, NovelyScreen, Path, PluralType, Pluralization, RU, Renderer, RendererInit, RendererStore, Storage, StorageData, StorageMeta, Stored, Story, Thenable, TranslationActions, TypewriterSpeed, Unwrappable, ValidAction, localStorageStorage, novely };
@@ -21,6 +21,10 @@ var Novely = (() => {
21
21
  // src/index.ts
22
22
  var src_exports = {};
23
23
  __export(src_exports, {
24
+ EN: () => EN,
25
+ JP: () => JP,
26
+ KK: () => KK,
27
+ RU: () => RU,
24
28
  localStorageStorage: () => localStorageStorage,
25
29
  novely: () => novely
26
30
  });
@@ -256,40 +260,79 @@ var Novely = (() => {
256
260
  return val;
257
261
  }
258
262
 
259
- // ../t9n/dist/index.js
260
- var g = (e, r) => {
261
- let o = [];
262
- for (let a of r) {
263
- if (!e)
263
+ // src/translation.ts
264
+ var RGX = /{{(.*?)}}/g;
265
+ var split = (input, delimeters) => {
266
+ const output = [];
267
+ for (const delimeter of delimeters) {
268
+ if (!input)
264
269
  break;
265
- let [n, i] = e.split(a, 2);
266
- o.push(n), e = i;
270
+ const [start, end] = input.split(delimeter, 2);
271
+ output.push(start);
272
+ input = end;
267
273
  }
268
- return o.push(e), o;
269
- };
270
- var c = /{{(.*?)}}/g;
271
- var l = (e) => Array.isArray(e) ? e.map((r) => l(r)).join("<br>") : typeof e == "function" ? l(e()) : e;
272
- var x = (e, r, o, a, n) => l(e).replaceAll(c, (i, s, t) => {
273
- i = 0, t = r;
274
- let [u, S, p] = g(s.trim(), ["@", "%"]);
275
- if (!u)
276
- return "";
277
- let m = u.split(".");
278
- for (; t && i < m.length; )
279
- t = t[m[i++]];
280
- S && o && t && n && (t = o[S][n.select(t)]);
281
- let d = a && p && a[p];
282
- return d && (t = d(t)), t ?? "";
283
- });
274
+ output.push(input);
275
+ return output;
276
+ };
277
+ var unwrap = (c) => {
278
+ if (Array.isArray(c)) {
279
+ return c.map((item) => unwrap(item)).join("<br>");
280
+ }
281
+ if (typeof c === "function") {
282
+ return unwrap(c());
283
+ }
284
+ return c;
285
+ };
286
+ var replace = (str2, obj, pluralization, actions, pr) => {
287
+ return unwrap(str2).replaceAll(RGX, (x, key, y) => {
288
+ x = 0;
289
+ y = obj;
290
+ const [pathstr, plural, action] = split(key.trim(), ["@", "%"]);
291
+ if (!pathstr) {
292
+ return "";
293
+ }
294
+ const path = pathstr.split(".");
295
+ while (y && x < path.length)
296
+ y = y[path[x++]];
297
+ if (plural && pluralization && y && pr) {
298
+ y = pluralization[plural][pr.select(y)];
299
+ }
300
+ const actionHandler = actions && action && actions[action];
301
+ if (actionHandler)
302
+ y = actionHandler(y);
303
+ return y == null ? "" : y;
304
+ });
305
+ };
306
+
307
+ // src/storage.ts
308
+ var localStorageStorage = (options) => {
309
+ return {
310
+ async get() {
311
+ const fallback = { saves: [], data: {}, meta: [] };
312
+ try {
313
+ const value = localStorage.getItem(options.key);
314
+ return value ? JSON.parse(value) : fallback;
315
+ } catch {
316
+ return fallback;
317
+ }
318
+ },
319
+ async set(data) {
320
+ try {
321
+ localStorage.setItem(options.key, JSON.stringify(data));
322
+ } catch {
323
+ }
324
+ }
325
+ };
326
+ };
284
327
 
285
328
  // src/novely.ts
286
329
  var novely = ({
287
330
  characters,
288
- storage,
331
+ storage = localStorageStorage({ key: "novely-game-storage" }),
289
332
  storageDelay = Promise.resolve(),
290
333
  renderer: createRenderer,
291
334
  initialScreen = "mainmenu",
292
- t9n,
335
+ translation,
293
336
  languages,
294
337
  state: defaultState,
295
338
  data: defaultData,
@@ -410,6 +453,9 @@ var Novely = (() => {
410
453
  storage.set(value);
411
454
  };
412
455
  const throttledOnStorageDataChange = throttle(onStorageDataChange, throttleTimeout);
456
+ const throttledEmergencyOnStorageDataChange = throttle(() => {
457
+ onStorageDataChange($.get());
458
+ }, 10);
413
459
  $.subscribe(throttledOnStorageDataChange);
414
460
  const getStoredData = async () => {
415
461
  let stored = await storage.get();
@@ -435,6 +481,12 @@ var Novely = (() => {
435
481
  storageDelay.then(getStoredData);
436
482
  const initial = getDefaultSave(klona(defaultState));
437
483
  const stack = createStack(initial);
484
+ addEventListener("visibilitychange", () => {
485
+ if (document.visibilityState === "hidden") {
486
+ throttledEmergencyOnStorageDataChange();
487
+ }
488
+ });
489
+ addEventListener("beforeunload", throttledEmergencyOnStorageDataChange);
438
490
  const save = (override = false, type = override ? "auto" : "manual") => {
439
491
  if (!$$.get().dataLoaded)
440
492
  return;
@@ -641,6 +693,9 @@ var Novely = (() => {
641
693
  const back = () => {
642
694
  return stack.back(), restore(stack.value);
643
695
  };
696
+ const t = (key, lang) => {
697
+ return translation[lang].internal[key];
698
+ };
644
699
  const renderer = createRenderer({
645
700
  characters,
646
701
  set,
@@ -649,9 +704,9 @@ var Novely = (() => {
649
704
  newGame,
650
705
  exit,
651
706
  back,
707
+ t,
652
708
  stack,
653
709
  languages,
654
- t: t9n.i,
655
710
  $,
656
711
  $$
657
712
  });
@@ -684,11 +739,11 @@ var Novely = (() => {
684
739
  },
685
740
  dialog([character, content, emotion]) {
686
741
  const name = (() => {
687
- const c2 = character;
742
+ const c = character;
688
743
  const cs = characters;
689
744
  const lang = $.get().meta[0];
690
- if (c2 && c2 in cs) {
691
- const block = cs[c2].name;
745
+ if (c && c in cs) {
746
+ const block = cs[c].name;
692
747
  if (typeof block === "string") {
693
748
  return block;
694
749
  }
@@ -696,9 +751,9 @@ var Novely = (() => {
696
751
  return block[lang];
697
752
  }
698
753
  }
699
- return c2 || "";
754
+ return c || "";
700
755
  })();
701
- const run = renderer.dialog(unwrap(content), unwrap(name), character, emotion);
756
+ const run = renderer.dialog(unwrap2(content), unwrap2(name), character, emotion);
702
757
  run(forward, goingBack);
703
758
  },
704
759
  function([fn]) {
@@ -714,10 +769,10 @@ var Novely = (() => {
714
769
  question = "";
715
770
  }
716
771
  const unwrapped = choices.map(([content, action2, visible]) => {
717
- return [unwrap(content), action2, visible];
772
+ return [unwrap2(content), action2, visible];
718
773
  });
719
774
  const run = renderer.choices(
720
- unwrap(question),
775
+ unwrap2(question),
721
776
  unwrapped
722
777
  );
723
778
  run((selected) => {
@@ -756,7 +811,7 @@ var Novely = (() => {
756
811
  times.clear();
757
812
  },
758
813
  input([question, onInput, setup]) {
759
- renderer.input(unwrap(question), onInput, setup)(forward);
814
+ renderer.input(unwrap2(question), onInput, setup)(forward);
760
815
  },
761
816
  custom([handler]) {
762
817
  const result = renderer.custom(handler, goingBack, () => {
@@ -796,7 +851,7 @@ var Novely = (() => {
796
851
  match("custom", [handler]);
797
852
  },
798
853
  text(text) {
799
- renderer.text(text.map((content) => unwrap(content)).join(" "), forward, goingBack);
854
+ renderer.text(text.map((content) => unwrap2(content)).join(" "), forward, goingBack);
800
855
  },
801
856
  exit() {
802
857
  if (restoring)
@@ -888,7 +943,7 @@ var Novely = (() => {
888
943
  const interactivity = (value = false) => {
889
944
  interacted = value ? interacted + 1 : 0;
890
945
  };
891
- const unwrap = (content, global = false) => {
946
+ const unwrap2 = (content, global = false) => {
892
947
  const {
893
948
  data: data2,
894
949
  meta: [lang]
@@ -896,7 +951,11 @@ var Novely = (() => {
896
951
  const obj = global ? data2 : state();
897
952
  const cnt = isFunction(content) ? content(lang, obj) : typeof content === "string" ? content : content[lang];
898
953
  const str2 = isFunction(cnt) ? cnt() : cnt;
899
- return x(str2, obj);
954
+ const trans = translation[lang];
955
+ if (trans.actions || trans.plural) {
956
+ return replace(str2, obj, trans.plural, trans.actions, new Intl.PluralRules(trans.tag || lang));
957
+ }
958
+ return replace(str2, obj);
900
959
  };
901
960
  function data(value) {
902
961
  if (!value)
@@ -929,26 +988,143 @@ var Novely = (() => {
929
988
  * Unwraps translatable content to a string value
930
989
  */
931
990
  unwrap(content) {
932
- return unwrap(content, true);
933
- },
934
- /**
935
- * Function that is used for translation
936
- */
937
- t: t9n.t
991
+ return unwrap2(content, true);
992
+ }
938
993
  };
939
994
  };
940
995
 
941
- // src/storage.ts
942
- var localStorageStorage = (options) => {
943
- return {
944
- async get() {
945
- const value = localStorage.getItem(options.key);
946
- return value ? JSON.parse(value) : { saves: [], data: {}, meta: [] };
947
- },
948
- async set(data) {
949
- localStorage.setItem(options.key, JSON.stringify(data));
950
- }
951
- };
996
+ // src/translations.ts
997
+ var RU = {
998
+ NewGame: "\u041D\u043E\u0432\u0430\u044F \u0438\u0433\u0440\u0430",
999
+ HomeScreen: "\u0413\u043B\u0430\u0432\u043D\u044B\u0439 \u044D\u043A\u0440\u0430\u043D",
1000
+ ToTheGame: "\u041A \u0438\u0433\u0440\u0435",
1001
+ Language: "\u042F\u0437\u044B\u043A",
1002
+ NoSaves: "\u0421\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u0439 \u043D\u0435\u0442",
1003
+ LoadSave: "\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C",
1004
+ Saves: "\u0421\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u044F",
1005
+ Settings: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438",
1006
+ Sumbit: "\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044C",
1007
+ GoBack: "\u041D\u0430\u0437\u0430\u0434",
1008
+ DoSave: "\u0421\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u0435",
1009
+ Auto: "\u0410\u0432\u0442\u043E",
1010
+ Stop: "\u0421\u0442\u043E\u043F",
1011
+ Exit: "\u0412\u044B\u0445\u043E\u0434",
1012
+ Automatic: "\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435",
1013
+ Manual: "\u0420\u0443\u0447\u043D\u043E\u0435",
1014
+ Remove: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C",
1015
+ LoadASaveFrom: "\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u0435 \u043E\u0442",
1016
+ DeleteASaveFrom: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u0435 \u043E\u0442",
1017
+ TextSpeed: "\u0421\u043A\u043E\u0440\u043E\u0441\u0442\u044C \u0422\u0435\u043A\u0441\u0442\u0430",
1018
+ TextSpeedSlow: "\u041C\u0435\u0434\u043B\u0435\u043D\u043D\u0430\u044F",
1019
+ TextSpeedMedium: "\u0421\u0440\u0435\u0434\u043D\u044F\u044F",
1020
+ TextSpeedFast: "\u0411\u044B\u0441\u0442\u0440\u0430\u044F",
1021
+ TextSpeedAuto: "\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0430\u044F",
1022
+ CompleteText: "\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044C \u0442\u0435\u043A\u0441\u0442",
1023
+ GoForward: "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u0432\u043F\u0435\u0440\u0451\u0434",
1024
+ ExitDialogWarning: "\u0412\u044B \u0443\u0432\u0435\u0440\u0435\u043D\u044B, \u0447\u0442\u043E \u0445\u043E\u0442\u0438\u0442\u0435 \u0432\u044B\u0439\u0442\u0438? \u041F\u0440\u043E\u0433\u0440\u0435\u0441\u0441 \u0431\u0443\u0434\u0435\u0442 \u0441\u043E\u0445\u0440\u0430\u043D\u0451\u043D.",
1025
+ ExitDialogExit: "\u0412\u044B\u0439\u0442\u0438",
1026
+ ExitDialogBack: "\u0412\u0435\u0440\u043D\u0443\u0442\u044C\u0441\u044F \u0432 \u0438\u0433\u0440\u0443",
1027
+ OpenMenu: "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u043C\u0435\u043D\u044E",
1028
+ CloseMenu: "\u0417\u0430\u043A\u0440\u044B\u0442\u044C \u043C\u0435\u043D\u044E"
1029
+ };
1030
+ var EN = {
1031
+ NewGame: "New Game",
1032
+ HomeScreen: "Home Screen",
1033
+ ToTheGame: "To the Game",
1034
+ Language: "Language",
1035
+ NoSaves: "No saves",
1036
+ LoadSave: "Load",
1037
+ Saves: "Saves",
1038
+ Settings: "Settings",
1039
+ Sumbit: "Submit",
1040
+ GoBack: "Go back",
1041
+ DoSave: "Save",
1042
+ Auto: "Auto",
1043
+ Stop: "Stop",
1044
+ Exit: "Exit",
1045
+ Automatic: "Automatic",
1046
+ Manual: "Manual",
1047
+ Remove: "Remove",
1048
+ LoadASaveFrom: "Load a save from",
1049
+ DeleteASaveFrom: "Delete a save from",
1050
+ TextSpeed: "Text Speed",
1051
+ TextSpeedSlow: "Slow",
1052
+ TextSpeedMedium: "Medium",
1053
+ TextSpeedFast: "Fast",
1054
+ TextSpeedAuto: "Auto",
1055
+ CompleteText: "Complete text",
1056
+ GoForward: "Go forward",
1057
+ ExitDialogWarning: "Are you sure you want to exit? Progress will be saved.",
1058
+ ExitDialogExit: "Exit",
1059
+ ExitDialogBack: "Return to game",
1060
+ OpenMenu: "Open menu",
1061
+ CloseMenu: "Close menu"
1062
+ };
1063
+ var KK = {
1064
+ NewGame: "\u0416\u0430\u04A3\u0430 \u043E\u0439\u044B\u043D",
1065
+ HomeScreen: "\u041D\u0435\u0433\u0456\u0437\u0433\u0456 \u044D\u043A\u0440\u0430\u043D",
1066
+ ToTheGame: "\u041E\u0439\u044B\u043D\u0493\u0430",
1067
+ Language: "\u0422\u0456\u043B",
1068
+ NoSaves: "\u0421\u0430\u049B\u0442\u0430\u0443 \u0436\u043E\u049B",
1069
+ LoadSave: "\u0416\u04AF\u043A\u0442\u0435\u0443",
1070
+ Saves: "\u0421\u0430\u049B\u0442\u0430\u0443",
1071
+ Settings: "\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043B\u0435\u0440",
1072
+ Sumbit: "\u0420\u0430\u0441\u0442\u0430\u0443",
1073
+ GoBack: "\u0410\u0440\u0442\u049B\u0430",
1074
+ DoSave: "\u0421\u0430\u049B\u0442\u0430\u0443",
1075
+ Auto: "\u0410\u0432\u0442\u043E",
1076
+ Stop: "\u0422\u043E\u049B\u0442\u0430",
1077
+ Exit: "\u0428\u044B\u0493\u0443",
1078
+ Automatic: "\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0442\u044B",
1079
+ Manual: "\u049A\u043E\u043B\u043C\u0435\u043D",
1080
+ Remove: "\u0416\u043E\u044E",
1081
+ LoadASaveFrom: "\u0421\u0430\u049B\u0442\u0430\u0443\u0434\u044B \u0436\u04AF\u043A\u0442\u0435\u0443",
1082
+ DeleteASaveFrom: "\u0421\u0430\u049B\u0442\u0430\u0443\u0434\u044B \u0436\u043E\u044E",
1083
+ TextSpeed: "\u041C\u04D9\u0442\u0456\u043D \u0416\u044B\u043B\u0434\u0430\u043C\u0434\u044B\u0493\u044B",
1084
+ TextSpeedSlow: "\u0411\u0430\u044F\u0443",
1085
+ TextSpeedMedium: "\u041E\u0440\u0442\u0430\u0448\u0430",
1086
+ TextSpeedFast: "\u0416\u044B\u043B\u0434\u0430\u043C",
1087
+ TextSpeedAuto: "\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0442\u044B",
1088
+ CompleteText: "\u041C\u04D9\u0442\u0456\u043D\u0434\u0456 \u0430\u044F\u049B\u0442\u0430\u0443",
1089
+ GoForward: "\u0410\u043B\u0493\u0430 \u0436\u044B\u043B\u0436\u0443",
1090
+ ExitDialogWarning: "\u0421\u0456\u0437 \u0448\u044B\u049B\u049B\u044B\u04A3\u044B\u0437 \u043A\u0435\u043B\u0435\u0442\u0456\u043D\u0456\u043D\u0435 \u0441\u0435\u043D\u0456\u043C\u0434\u0456\u0441\u0456\u0437 \u0431\u0435? \u041F\u0440\u043E\u0433\u0440\u0435\u0441\u0441 \u0441\u0430\u049B\u0442\u0430\u043B\u0430\u0434\u044B",
1091
+ ExitDialogExit: "\u0428\u044B\u0493\u0443",
1092
+ ExitDialogBack: "\u041E\u0439\u044B\u043D\u0493\u0430 \u043E\u0440\u0430\u043B\u0443",
1093
+ OpenMenu: "\u041C\u04D9\u0437\u0456\u0440\u0434\u0456 \u0430\u0448\u044B\u04A3\u044B\u0437",
1094
+ CloseMenu: "\u041C\u04D9\u0437\u0456\u0440\u0434\u0456 \u0436\u0430\u0431\u0443"
1095
+ };
1096
+ var JP = {
1097
+ NewGame: "\u300C\u65B0\u3057\u3044\u30B2\u30FC\u30E0\u300D",
1098
+ HomeScreen: "\u30DB\u30FC\u30E0\u753B\u9762",
1099
+ ToTheGame: "\u300C\u30B2\u30FC\u30E0\u306B\u623B\u308B\u300D",
1100
+ Language: "\u8A00\u8A9E",
1101
+ NoSaves: "\u30CE\u30FC\u30BB\u30FC\u30D6",
1102
+ LoadSave: "\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9",
1103
+ Saves: "\u4FDD\u5B58",
1104
+ Settings: "\u8A2D\u5B9A",
1105
+ Sumbit: "\u78BA\u8A8D",
1106
+ GoBack: "\u300C\u623B\u308B\u300D",
1107
+ DoSave: "\u4FDD\u5B58",
1108
+ Auto: "\u30AA\u30FC\u30C8",
1109
+ Stop: "\u6B62\u307E\u308C",
1110
+ Exit: "\u51FA\u53E3",
1111
+ Automatic: "\u81EA\u52D5",
1112
+ Manual: "\u30DE\u30CB\u30E5\u30A2\u30EB",
1113
+ Remove: "\u524A\u9664",
1114
+ LoadASaveFrom: "\u30ED\u30FC\u30C9\u30BB\u30FC\u30D6\u304B\u3089",
1115
+ DeleteASaveFrom: "\u304B\u3089\u4FDD\u5B58\u3092\u524A\u9664",
1116
+ TextSpeed: "\u30C6\u30AD\u30B9\u30C8\u30B9\u30D4\u30FC\u30C9",
1117
+ TextSpeedSlow: "\u300C\u9045\u3044\u300D",
1118
+ TextSpeedMedium: "\u30DF\u30C7\u30A3\u30A2\u30E0",
1119
+ TextSpeedFast: "\u300C\u901F\u3044\u300D",
1120
+ TextSpeedAuto: "\u81EA\u52D5",
1121
+ CompleteText: "\u30C6\u30AD\u30B9\u30C8\u3092\u5B8C\u6210\u3055\u305B\u308B",
1122
+ GoForward: "\u5148\u306B\u884C\u304F",
1123
+ ExitDialogWarning: "\u672C\u5F53\u306B\u7D42\u4E86\u3057\u307E\u3059\u304B\uFF1F\u9032\u884C\u72B6\u6CC1\u306F\u4FDD\u5B58\u3055\u308C\u307E\u3059",
1124
+ ExitDialogExit: "\u7D42\u4E86",
1125
+ ExitDialogBack: "\u30B2\u30FC\u30E0\u306B\u623B\u308B",
1126
+ OpenMenu: "\u30E1\u30CB\u30E5\u30FC\u3092\u958B\u304F",
1127
+ CloseMenu: "\u30E1\u30CB\u30E5\u30FC\u3092\u9589\u3058\u308B"
952
1128
  };
953
1129
  return __toCommonJS(src_exports);
954
1130
  })();