narrat 2.2.13 → 2.2.15

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.
Files changed (56) hide show
  1. package/dist/app.vue.d.ts +8 -2
  2. package/dist/components/in-game.vue.d.ts +46 -0
  3. package/dist/components/save-slots.vue.d.ts +27 -6
  4. package/dist/components/saves/save-slot.vue.d.ts +108 -0
  5. package/dist/components/transitions/NarratTransition.vue.d.ts +3 -3
  6. package/dist/components/utils/alert-modal.vue.d.ts +82 -0
  7. package/dist/components/utils/modal.vue.d.ts +14 -2
  8. package/dist/components/utils/yes-no.vue.d.ts +106 -0
  9. package/dist/config.d.ts +3 -0
  10. package/dist/{lib/lib.d.ts → lib.d.ts} +4 -5
  11. package/dist/main.d.ts +1 -1
  12. package/dist/narrat.es.js +25080 -22082
  13. package/dist/narrat.es.js.map +1 -1
  14. package/dist/narrat.umd.js +94 -94
  15. package/dist/narrat.umd.js.map +1 -1
  16. package/dist/stores/main-store.d.ts +346 -10
  17. package/dist/stores/vm-store.d.ts +3 -1
  18. package/dist/style.css +1 -1
  19. package/dist/types/game-save.d.ts +11 -5
  20. package/dist/utils/save-helpers.d.ts +13 -10
  21. package/dist/vm/commands/flow-commands.d.ts +6 -0
  22. package/package.json +88 -88
  23. package/README.md +0 -120
  24. package/dist/img/backgrounds/map.png +0 -0
  25. package/dist/img/backgrounds/narrat.png +0 -0
  26. package/dist/img/backgrounds/rpg.png +0 -0
  27. package/dist/img/backgrounds/test-layers.gif +0 -0
  28. package/dist/img/characters/cat_idle.jpg +0 -0
  29. package/dist/img/characters/helper_cat.png +0 -0
  30. package/dist/img/characters/inner_voice.png +0 -0
  31. package/dist/img/enemies/goblin.png +0 -0
  32. package/dist/img/enemies/skeleton.png +0 -0
  33. package/dist/img/enemies/slime.png +0 -0
  34. package/dist/img/h01.gif +0 -0
  35. package/dist/img/items/book.png +0 -0
  36. package/dist/img/items/bread.png +0 -0
  37. package/dist/img/levels/cave.png +0 -0
  38. package/dist/img/levels/dungeon.png +0 -0
  39. package/dist/img/levels/dungeon_F.png +0 -0
  40. package/dist/img/levels/dungeon_FL.png +0 -0
  41. package/dist/img/levels/dungeon_FR.png +0 -0
  42. package/dist/img/levels/dungeon_FRL.png +0 -0
  43. package/dist/img/levels/dungeon_LR.png +0 -0
  44. package/dist/img/levels/grass.png +0 -0
  45. package/dist/img/players/wizard.png +0 -0
  46. package/dist/img/skills/agility.jpg +0 -0
  47. package/dist/img/skills/logic.jpg +0 -0
  48. package/dist/img/splash-texture.png +0 -0
  49. package/dist/img/ui/energy.png +0 -0
  50. package/dist/img/ui/front.png +0 -0
  51. package/dist/img/ui/left.png +0 -0
  52. package/dist/img/ui/money.png +0 -0
  53. package/dist/img/ui/park-button.png +0 -0
  54. package/dist/img/ui/right.png +0 -0
  55. package/dist/img/ui/shop-button.png +0 -0
  56. package/dist/img/ui/start.png +0 -0
@@ -1,4 +1,5 @@
1
1
  import { GameSave } from '../types/game-save';
2
+ import { ChosenSlot } from '../utils/save-helpers';
2
3
  import { AppOptions, Config } from '../config';
3
4
  export interface ErrorState {
4
5
  text: string;
@@ -11,11 +12,23 @@ interface MainState {
11
12
  start: number;
12
13
  previousPlaytime: number;
13
14
  };
14
- saveSlot: number;
15
+ saveSlot: string;
15
16
  options: AppOptions;
16
17
  flowState: 'menu' | 'playing';
17
18
  modal: string | false;
18
19
  paused: boolean;
20
+ alerts: {
21
+ title: string;
22
+ text: string;
23
+ resolver: () => void;
24
+ id: string;
25
+ }[];
26
+ saving: {
27
+ withPrompt?: boolean;
28
+ name?: string;
29
+ resolver: () => void;
30
+ } | null;
31
+ saveData?: GameSave;
19
32
  }
20
33
  export interface MainSaveData {
21
34
  playTime: number;
@@ -31,7 +44,7 @@ export declare const useMain: import("pinia").StoreDefinition<"main", MainState,
31
44
  start: number;
32
45
  previousPlaytime: number;
33
46
  };
34
- saveSlot: number;
47
+ saveSlot: string;
35
48
  options: {
36
49
  baseAssetsPath?: string | undefined;
37
50
  logging: boolean;
@@ -40,13 +53,98 @@ export declare const useMain: import("pinia").StoreDefinition<"main", MainState,
40
53
  flowState: 'menu' | 'playing';
41
54
  modal: string | false;
42
55
  paused: boolean;
56
+ alerts: {
57
+ title: string;
58
+ text: string;
59
+ resolver: () => void;
60
+ id: string;
61
+ }[];
62
+ saving: {
63
+ withPrompt?: boolean | undefined;
64
+ name?: string | undefined;
65
+ resolver: () => void;
66
+ } | null;
67
+ saveData?: {
68
+ version: string;
69
+ skills: {
70
+ skillChecks: {
71
+ [key: string]: import("./skills").SkillCheckState;
72
+ };
73
+ skills: import("./skills").SkillsState;
74
+ };
75
+ screen: {
76
+ layers: string[];
77
+ buttons: import("./screens-store").ButtonsState;
78
+ };
79
+ main: {
80
+ playTime: number;
81
+ };
82
+ dialog: {
83
+ dialog: {
84
+ speaker: string;
85
+ text: string;
86
+ pose?: string | undefined;
87
+ cssClass?: string | undefined;
88
+ choices?: {
89
+ choice: string;
90
+ originalIndex: number;
91
+ allowed: boolean;
92
+ }[] | undefined;
93
+ textField?: boolean | undefined;
94
+ interactive: boolean;
95
+ id: string;
96
+ }[];
97
+ };
98
+ vm: {
99
+ lastLabel: string;
100
+ data: import("./vm-store").DataState;
101
+ };
102
+ audio: {
103
+ modes: {
104
+ [key: string]: import("./audio-store").AudioModeState;
105
+ };
106
+ masterVolume: number;
107
+ };
108
+ hud: {
109
+ hudStats: import("./hud-stats-store").HudStatsState;
110
+ };
111
+ inventory: {
112
+ items: {
113
+ [key: string]: import("./inventory-store").ItemState;
114
+ };
115
+ interactionTags: {
116
+ [key: string]: {
117
+ blockedInteraction: boolean;
118
+ };
119
+ };
120
+ };
121
+ quests: {
122
+ quests: {
123
+ [key: string]: import("./quest-log").QuestState;
124
+ };
125
+ };
126
+ metadata: {
127
+ saveDate: string;
128
+ name: string;
129
+ slotType: "manual" | "auto";
130
+ id: string;
131
+ createdCounter: number;
132
+ };
133
+ } | undefined;
43
134
  } & import("pinia").PiniaCustomStateProperties<MainState>): boolean;
44
135
  }, {
45
136
  setup(scriptPaths: string[], config: Config): Promise<void>;
137
+ alert(title: string, text: string): Promise<void>;
138
+ closeAlert(id: string): void;
46
139
  startMachine(): void;
47
- setSaveSlot(slot: number): void;
48
- startGame(saveSlot: number): Promise<void>;
49
- loadGame(save: GameSave, saveSlot: number): Promise<void>;
140
+ setSaveSlot(slot: string): void;
141
+ startGame(saveSlot: string): Promise<void>;
142
+ loadGame(save: GameSave, saveSlot: string): Promise<void>;
143
+ manualSave({ saveName, withPrompt, }: {
144
+ saveName?: string | undefined;
145
+ withPrompt?: boolean | undefined;
146
+ }): Promise<void>;
147
+ finishManualSave(slotData: ChosenSlot | null, yes: boolean): void;
50
148
  playerAnswered(choice: number | string): void;
51
149
  menuReturn(): void;
52
150
  createError(text: string): void;
@@ -63,7 +161,10 @@ export declare const useMain: import("pinia").StoreDefinition<"main", MainState,
63
161
  resetAllStores(): void;
64
162
  generateSaveData(): MainSaveData;
65
163
  loadSaveData(data: MainSaveData): void;
66
- saveGame(): void;
164
+ autoSaveGame({ slotId, name }: {
165
+ slotId?: string | undefined;
166
+ name?: string | undefined;
167
+ }): void;
67
168
  setLoadedData(save: GameSave): void;
68
169
  getAllStates(): {
69
170
  main: any & {
@@ -76,7 +177,7 @@ export declare const useMain: import("pinia").StoreDefinition<"main", MainState,
76
177
  start: number;
77
178
  previousPlaytime: number;
78
179
  };
79
- saveSlot: number;
180
+ saveSlot: string;
80
181
  options: {
81
182
  baseAssetsPath?: string | undefined;
82
183
  logging: boolean;
@@ -85,6 +186,84 @@ export declare const useMain: import("pinia").StoreDefinition<"main", MainState,
85
186
  flowState: 'menu' | 'playing';
86
187
  modal: string | false;
87
188
  paused: boolean;
189
+ alerts: {
190
+ title: string;
191
+ text: string;
192
+ resolver: () => void;
193
+ id: string;
194
+ }[];
195
+ saving: {
196
+ withPrompt?: boolean | undefined;
197
+ name?: string | undefined;
198
+ resolver: () => void;
199
+ } | null;
200
+ saveData?: {
201
+ version: string;
202
+ skills: {
203
+ skillChecks: {
204
+ [key: string]: import("./skills").SkillCheckState;
205
+ };
206
+ skills: import("./skills").SkillsState;
207
+ };
208
+ screen: {
209
+ layers: string[];
210
+ buttons: import("./screens-store").ButtonsState;
211
+ };
212
+ main: {
213
+ playTime: number;
214
+ };
215
+ dialog: {
216
+ dialog: {
217
+ speaker: string;
218
+ text: string;
219
+ pose?: string | undefined;
220
+ cssClass?: string | undefined;
221
+ choices?: {
222
+ choice: string;
223
+ originalIndex: number;
224
+ allowed: boolean;
225
+ }[] | undefined;
226
+ textField?: boolean | undefined;
227
+ interactive: boolean;
228
+ id: string;
229
+ }[];
230
+ };
231
+ vm: {
232
+ lastLabel: string;
233
+ data: import("./vm-store").DataState;
234
+ };
235
+ audio: {
236
+ modes: {
237
+ [key: string]: import("./audio-store").AudioModeState;
238
+ };
239
+ masterVolume: number;
240
+ };
241
+ hud: {
242
+ hudStats: import("./hud-stats-store").HudStatsState;
243
+ };
244
+ inventory: {
245
+ items: {
246
+ [key: string]: import("./inventory-store").ItemState;
247
+ };
248
+ interactionTags: {
249
+ [key: string]: {
250
+ blockedInteraction: boolean;
251
+ };
252
+ };
253
+ };
254
+ quests: {
255
+ quests: {
256
+ [key: string]: import("./quest-log").QuestState;
257
+ };
258
+ };
259
+ metadata: {
260
+ saveDate: string;
261
+ name: string;
262
+ slotType: "manual" | "auto";
263
+ id: string;
264
+ createdCounter: number;
265
+ };
266
+ } | undefined;
88
267
  } & import("pinia")._StoreWithState<"main", MainState, {
89
268
  isInGame(state: {
90
269
  ready: boolean;
@@ -96,7 +275,7 @@ export declare const useMain: import("pinia").StoreDefinition<"main", MainState,
96
275
  start: number;
97
276
  previousPlaytime: number;
98
277
  };
99
- saveSlot: number;
278
+ saveSlot: string;
100
279
  options: {
101
280
  baseAssetsPath?: string | undefined;
102
281
  logging: boolean;
@@ -105,6 +284,84 @@ export declare const useMain: import("pinia").StoreDefinition<"main", MainState,
105
284
  flowState: 'menu' | 'playing';
106
285
  modal: string | false;
107
286
  paused: boolean;
287
+ alerts: {
288
+ title: string;
289
+ text: string;
290
+ resolver: () => void;
291
+ id: string;
292
+ }[];
293
+ saving: {
294
+ withPrompt?: boolean | undefined;
295
+ name?: string | undefined;
296
+ resolver: () => void;
297
+ } | null;
298
+ saveData?: {
299
+ version: string;
300
+ skills: {
301
+ skillChecks: {
302
+ [key: string]: import("./skills").SkillCheckState;
303
+ };
304
+ skills: import("./skills").SkillsState;
305
+ };
306
+ screen: {
307
+ layers: string[];
308
+ buttons: import("./screens-store").ButtonsState;
309
+ };
310
+ main: {
311
+ playTime: number;
312
+ };
313
+ dialog: {
314
+ dialog: {
315
+ speaker: string;
316
+ text: string;
317
+ pose?: string | undefined;
318
+ cssClass?: string | undefined;
319
+ choices?: {
320
+ choice: string;
321
+ originalIndex: number;
322
+ allowed: boolean;
323
+ }[] | undefined;
324
+ textField?: boolean | undefined;
325
+ interactive: boolean;
326
+ id: string;
327
+ }[];
328
+ };
329
+ vm: {
330
+ lastLabel: string;
331
+ data: import("./vm-store").DataState;
332
+ };
333
+ audio: {
334
+ modes: {
335
+ [key: string]: import("./audio-store").AudioModeState;
336
+ };
337
+ masterVolume: number;
338
+ };
339
+ hud: {
340
+ hudStats: import("./hud-stats-store").HudStatsState;
341
+ };
342
+ inventory: {
343
+ items: {
344
+ [key: string]: import("./inventory-store").ItemState;
345
+ };
346
+ interactionTags: {
347
+ [key: string]: {
348
+ blockedInteraction: boolean;
349
+ };
350
+ };
351
+ };
352
+ quests: {
353
+ quests: {
354
+ [key: string]: import("./quest-log").QuestState;
355
+ };
356
+ };
357
+ metadata: {
358
+ saveDate: string;
359
+ name: string;
360
+ slotType: "manual" | "auto";
361
+ id: string;
362
+ createdCounter: number;
363
+ };
364
+ } | undefined;
108
365
  } & import("pinia").PiniaCustomStateProperties<MainState>): boolean;
109
366
  }, any> & import("pinia")._StoreWithGetters<{
110
367
  isInGame(state: {
@@ -117,7 +374,7 @@ export declare const useMain: import("pinia").StoreDefinition<"main", MainState,
117
374
  start: number;
118
375
  previousPlaytime: number;
119
376
  };
120
- saveSlot: number;
377
+ saveSlot: string;
121
378
  options: {
122
379
  baseAssetsPath?: string | undefined;
123
380
  logging: boolean;
@@ -126,6 +383,84 @@ export declare const useMain: import("pinia").StoreDefinition<"main", MainState,
126
383
  flowState: 'menu' | 'playing';
127
384
  modal: string | false;
128
385
  paused: boolean;
386
+ alerts: {
387
+ title: string;
388
+ text: string;
389
+ resolver: () => void;
390
+ id: string;
391
+ }[];
392
+ saving: {
393
+ withPrompt?: boolean | undefined;
394
+ name?: string | undefined;
395
+ resolver: () => void;
396
+ } | null;
397
+ saveData?: {
398
+ version: string;
399
+ skills: {
400
+ skillChecks: {
401
+ [key: string]: import("./skills").SkillCheckState;
402
+ };
403
+ skills: import("./skills").SkillsState;
404
+ };
405
+ screen: {
406
+ layers: string[];
407
+ buttons: import("./screens-store").ButtonsState;
408
+ };
409
+ main: {
410
+ playTime: number;
411
+ };
412
+ dialog: {
413
+ dialog: {
414
+ speaker: string;
415
+ text: string;
416
+ pose?: string | undefined;
417
+ cssClass?: string | undefined;
418
+ choices?: {
419
+ choice: string;
420
+ originalIndex: number;
421
+ allowed: boolean;
422
+ }[] | undefined;
423
+ textField?: boolean | undefined;
424
+ interactive: boolean;
425
+ id: string;
426
+ }[];
427
+ };
428
+ vm: {
429
+ lastLabel: string;
430
+ data: import("./vm-store").DataState;
431
+ };
432
+ audio: {
433
+ modes: {
434
+ [key: string]: import("./audio-store").AudioModeState;
435
+ };
436
+ masterVolume: number;
437
+ };
438
+ hud: {
439
+ hudStats: import("./hud-stats-store").HudStatsState;
440
+ };
441
+ inventory: {
442
+ items: {
443
+ [key: string]: import("./inventory-store").ItemState;
444
+ };
445
+ interactionTags: {
446
+ [key: string]: {
447
+ blockedInteraction: boolean;
448
+ };
449
+ };
450
+ };
451
+ quests: {
452
+ quests: {
453
+ [key: string]: import("./quest-log").QuestState;
454
+ };
455
+ };
456
+ metadata: {
457
+ saveDate: string;
458
+ name: string;
459
+ slotType: "manual" | "auto";
460
+ id: string;
461
+ createdCounter: number;
462
+ };
463
+ } | undefined;
129
464
  } & import("pinia").PiniaCustomStateProperties<MainState>): boolean;
130
465
  }> & import("pinia").PiniaCustomProperties<string, import("pinia").StateTree, import("pinia")._GettersTree<import("pinia").StateTree>, import("pinia")._ActionsTree>;
131
466
  screens: import("pinia").Store<"screens", import("./screens-store").ScreenState, {}, {
@@ -247,6 +582,7 @@ export declare const useMain: import("pinia").StoreDefinition<"main", MainState,
247
582
  } | undefined;
248
583
  args?: any[] | undefined;
249
584
  } | undefined;
585
+ hasJumped: boolean;
250
586
  } & import("pinia").PiniaCustomStateProperties<import("./vm-store").VMState>): import("./vm-store").MachineFrame | undefined;
251
587
  scope(): {
252
588
  [key: string]: any;
@@ -307,7 +643,7 @@ export declare const useMain: import("pinia").StoreDefinition<"main", MainState,
307
643
  runLineOnly(): Promise<any>;
308
644
  runLabelFunction(label: string, ...args: any[]): Promise<any>;
309
645
  runCustomFrame(stack: import("./vm-store").AddFrameOptions): void;
310
- jumpToLabel(label: string, ...args: any[]): void;
646
+ jumpToLabel(label: string, ...args: any[]): Promise<void>;
311
647
  runThenGoBackToPreviousDialog(label: string, ...args: any[]): Promise<any>;
312
648
  }>;
313
649
  hud: import("pinia").Store<"hud", import("./hud-stats-store").HudState, {}, {
@@ -33,6 +33,7 @@ export interface VMState {
33
33
  data: DataState;
34
34
  lastLabel: string;
35
35
  jumpTarget?: SetFrameOptions;
36
+ hasJumped: boolean;
36
37
  }
37
38
  export interface VMSave {
38
39
  lastLabel: string;
@@ -113,6 +114,7 @@ export declare const useVM: import("pinia").StoreDefinition<"vm", VMState, {
113
114
  } | undefined;
114
115
  args?: any[] | undefined;
115
116
  } | undefined;
117
+ hasJumped: boolean;
116
118
  } & import("pinia").PiniaCustomStateProperties<VMState>): MachineFrame | undefined;
117
119
  scope(): {
118
120
  [key: string]: any;
@@ -173,6 +175,6 @@ export declare const useVM: import("pinia").StoreDefinition<"vm", VMState, {
173
175
  runLineOnly(): Promise<any>;
174
176
  runLabelFunction(label: string, ...args: any[]): Promise<any>;
175
177
  runCustomFrame(stack: AddFrameOptions): void;
176
- jumpToLabel(label: string, ...args: any[]): void;
178
+ jumpToLabel(label: string, ...args: any[]): Promise<void>;
177
179
  runThenGoBackToPreviousDialog(label: string, ...args: any[]): Promise<any>;
178
180
  }>;
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- :root{--font-family: "Helvetica", sans-serif, "Arial", "sans-serif";--bg-color: #131720;--text-color: #d9e1f2;--primary: hsl(255, 30%, 55%);--focus: hsl(210, 90%, 50%);--secondary: #42b983;--border-color: hsla(0, 0%, 100%, .2);--light-1: hsl(210, 30%, 40%);--light-2: hsl(255, 30%, 50%);--light-background: linear-gradient(to right, var(--light-1), var(--light-2));--shadow-1: hsla(236, 50%, 50%, .3);--shadow-2: hsla(236, 50%, 50%, .4);--hud-background: rgba(0, 0, 0, .4);--hud-text-color: var(--text-color);--notifications-bg: darkslateblue;--skills-text-background: rgba(0, 0, 0, .5);--skills-text-color: var(--text-color);--skills-level-background: rgba(0, 0, 0, .5);--skills-level-color: orange;--skills-xp-bar-height: 40px;--skill-check-name-color: orange;--skill-check-difficulty: orange;--skill-check-success: green;--skill-check-failed: red;--skill-check-color: orange;--dialog-choice-color: orange;--dialog-choice-hover-color: var(--text-color);--inventory-text-background: rgba(0, 0, 0, .5);--inventory-text-color: var(--text-color);--inventory-amount-background: rgba(0, 0, 0, .5);--inventory-amount-color: orange;--quest-title-color: yellow;--completed-quest-title-color: grey;--objective-in-progress-color: white;--objective-completed-color: grey}body{font-family:var(--font-family);padding:0;margin:0;font-family:Arial,sans-serif;background-color:#000}*{font-family:var(--font-family)}.list-item{display:inline-block;margin-right:10px}.list-enter-active,.list-leave-active{transition:all .3s ease}.think-command{color:#0ff}#app{background-size:cover}.list-enter-from,.list-leave-to{opacity:0;transform:translate(300px)}.notification-item{display:inline-block;margin-right:10px}.notification-enter-active,.notification-leave-active{transition:all .3s ease}.notification-enter-from,.notification-leave-to{opacity:0;transform:translateY(-300px)}.fade-enter-active,.fade-leave-active{transition:opacity .3s ease}.fade-enter-from,.fade-leave-to{opacity:0}.fade-in-enter-active{transition:opacity .1s ease}.fade-in-enter-from{opacity:0}.select{background:var(--light-background);padding:10px}.option{background-color:var(--light-2);padding:5px;color:var(--text-color)}.button{background:var(--light-background);color:var(--text-color);box-shadow:.4rem .5rem 2.4rem .2rem var(--shadow-1),inset -2px -4px #0006,inset 2px 2px #fff7;border-radius:10px;padding:10px;font-weight:800;font-size:16px;margin:10px;transition:.2s;box-shadow:inset -2px -4px #0006,inset 2px 2px #fff7}.button.large{border-radius:20px}.menu-button{border-radius:5px}.button.main-menu-button{border-radius:20px}.button:focus,.button:hover{transform:translateY(-.2rem);box-shadow:0 0 1rem .2rem var(--shadow-2),inset -2px -4px #0006,inset 2px 2px #fff7}.disabled{user-select:none;pointer-events:none}.button.disabled{box-shadow:unset;color:gray;background:var(--border-color)}.input{background:var(--light-background);color:var(--text-color);box-shadow:.4rem .4rem 2.4rem .2rem var(--shadow-1);border-radius:100px;padding:10px;font-weight:800;font-size:16px;margin:10px;transition:.2s}.input:focus,.input:hover{transform:translateY(-.2rem);box-shadow:0 0 2.4rem .2rem var(--shadow-2)}a{color:pink;text-decoration:underline}th,td{padding:4px;border:1px solid var(--text-color);text-align:center}#game-holder{width:100vw;height:100vh;padding:0;margin:0;top:0;left:0;background-color:#000;display:flex;align-items:center;justify-content:center;min-height:-webkit-fill-available}.title{font-size:30px;font-weight:700;text-align:center}.container{padding:20px}h1,h2,h3,h4{font-weight:700}h1{font-size:30px}h2{font-size:26px}h3{font-size:24px}hr.solid{border:1px solid var(--text-color);margin-top:30px;margin-bottom:30px}.card-1{box-shadow:0 1px 3px #0000001f,0 1px 2px #0000003d;transition:all .3s cubic-bezier(.25,.8,.25,1)}.card-1:hover{box-shadow:0 14px 28px #00000040,0 10px 10px #00000038}.card-2{box-shadow:0 3px 6px #00000029,0 3px 6px #0000003b}.card-3{box-shadow:0 10px 20px #00000030,0 6px 6px #0000003b}.card-4{box-shadow:0 14px 28px #00000040,0 10px 10px #00000038}.card-5{box-shadow:0 19px 38px #0000004d,0 15px 12px #00000038}.dialog-choice{transition:.2s}.dialog-choice:hover{transform:scale(1.05);transform-origin:center}.dialog-choice:not(:hover)>.skill-check-name,.passive-skill-check>.skill-check-name{color:var(--skill-check-name-color)}.dialog-choice:not(:hover)>.skill-check-difficulty,.passive-skill-check>.skill-check-difficulty{color:var(--skill-check-difficulty)}.skill-check-difficulty{font-weight:700}.dialog-choice:not(:hover)>.skill-check-success,.passive-skill-check>.skill-check-success{color:var(--skill-check-success)}.dialog-choice:not(:hover)>.skill-check-failed,.passive-skill-check>.skill-check-failed{color:var(--skill-check-failed)}.dialog-choice:not(:hover)>.skill-check,.passive-skill-check.skill-check{color:var(--skill-check-color)}.narrat-canvas{position:absolute;height:100%;top:0;left:0}#touchTrigger{pointer-events:none}.narrat-transition-fade-enter-active,.narrat-transition-fade-leave-active{transition-property:opacity;transition-timing-function:ease;transition-duration:.3s}.narrat-transition-fade-enter-from,.narrat-transition-fade-leave-to{opacity:0}.narrat-transition-slide-right-enter-active,.narrat-transition-slide-right-leave-active{transition-property:transform;transition-timing-function:ease;transition-duration:.3s}.narrat-transition-slide-right-enter-from{transform:translate(-100%)}.narrat-transition-slide-right-leave-to{transform:translate(100%)}*,:before,:after{-webkit-box-sizing:border-box;box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}*{--tw-ring-inset: var(--tw-empty, );--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgba(59, 130, 246, .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000}:root{-moz-tab-size:4;-o-tab-size:4;tab-size:4}:-moz-focusring{outline:1px dotted ButtonText}:-moz-ui-invalid{box-shadow:none}::moz-focus-inner{border-style:none;padding:0}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}body{margin:0;font-family:inherit;line-height:inherit}b{font-weight:bolder}button,input,select{font-family:inherit;font-size:100%;line-height:1.15;margin:0;padding:0;line-height:inherit;color:inherit}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button{background-color:transparent;background-image:none}button,[role=button]{cursor:pointer}html{-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";line-height:1.5}hr{height:0;color:inherit;border-top-width:1px}h3,h2,hr,p,h1{margin:0}h3,h2,h1{font-size:inherit;font-weight:inherit}img{border-style:solid;display:block;vertical-align:middle;max-width:100%;height:auto}input::placeholder{opacity:1;color:#9ca3af}input::webkit-input-placeholder{opacity:1;color:#9ca3af}input::-moz-placeholder{opacity:1;color:#9ca3af}input:-ms-input-placeholder{opacity:1;color:#9ca3af}input::-ms-input-placeholder{opacity:1;color:#9ca3af}table{text-indent:0;border-color:inherit;border-collapse:collapse}ul{list-style:none;margin:0;padding:0}.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.bg-gray-800{--tw-bg-opacity: 1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.block{display:block}.inline{display:inline}.flex{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex}.grid{display:-ms-grid;display:grid}.hidden{display:none}.flex-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.flex-col{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column}.items-center{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.justify-between{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.justify-around{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.list-disc{list-style-type:disc}.static{position:static}.absolute{position:absolute}.resize{resize:both}.table-auto{table-layout:auto}.line-through{-webkit-text-decoration-line:line-through;text-decoration-line:line-through}.indent{text-indent:1.5rem}.w-full{width:100%}.gap-4{grid-gap:1rem;gap:1rem}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.transform{--tw-translate-x: 0;--tw-translate-y: 0;--tw-translate-z: 0;--tw-rotate: 0;--tw-rotate-x: 0;--tw-rotate-y: 0;--tw-rotate-z: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-scale-z: 1;-webkit-transform:translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) translateZ(var(--tw-translate-z)) rotate(var(--tw-rotate)) rotateX(var(--tw-rotate-x)) rotateY(var(--tw-rotate-y)) rotateZ(var(--tw-rotate-z)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)) scaleZ(var(--tw-scale-z));-ms-transform:translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) translateZ(var(--tw-translate-z)) rotate(var(--tw-rotate)) rotateX(var(--tw-rotate-x)) rotateY(var(--tw-rotate-y)) rotateZ(var(--tw-rotate-z)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)) scaleZ(var(--tw-scale-z));transform:translate(var(--tw-translate-x)) translateY(var(--tw-translate-y)) translateZ(var(--tw-translate-z)) rotate(var(--tw-rotate)) rotateX(var(--tw-rotate-x)) rotateY(var(--tw-rotate-y)) rotate(var(--tw-rotate-z)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)) scaleZ(var(--tw-scale-z))}.\<transition,.transition,.transition\.duration,.transition\.delay{-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform,filter,backdrop-filter;-o-transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,-webkit-box-shadow,transform,-webkit-transform,filter,backdrop-filter;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);-o-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-duration:.15s;-o-transition-duration:.15s;transition-duration:.15s}.duration{-webkit-transition-duration:.15s;-o-transition-duration:.15s;transition-duration:.15s}.modal-mask{position:absolute;z-index:9998;top:0;left:0;width:100%;height:100%;background-color:#00000080;transition:opacity .3s ease;display:flex;flex-direction:column;flex-shrink:2 2;align-items:center;justify-content:center}.modal-container{min-width:300px;max-width:90vw;max-height:100%;overflow-y:hidden;margin:10px auto;padding:20px 30px;border-radius:5px;transition:all .3s ease;font-family:Helvetica,Arial,sans-serif;background:linear-gradient(to right,hsl(210,30%,20%),hsl(255,30%,25%));display:flex;flex-direction:column}.modal-header{position:relative}.modal-header h3{flex-shrink:0;margin-top:0;color:var(--secondary)}.modal-body{margin:20px 0;overflow-y:auto;flex-shrink:2}.modal-default-button{float:right}.modal-enter,.modal-leave-active{opacity:0}.modal-enter .modal-container,.modal-leave-active .modal-container{-webkit-transform:scale(1.1);transform:scale(1.1)}.close-button{border:1px solid var(--text-color);border-radius:50px;font-size:30px;font-weight:700;position:absolute;right:-20px;top:-10px;width:50px;height:50px}.close-button:hover{background-color:var(--focus)}.debug-menu{z-index:9999}.debug-button{position:fixed;bottom:10px;right:10px;padding:5px}.error-message{color:#ff4500;margin-top:10px;margin-bottom:10px}.error-filename{color:gray;text-decoration:underline}.debug-menu-container{width:100%}.search-result{border:1px solid var(--text-color);padding:10px;font-weight:700;font-size:20px;width:100}.jump-menu-container{width:80%}.debug-info{position:fixed;background-color:#0009;border:1px dotted var(--text-color);top:0;left:0;padding:5px}.variables-viewer{height:100%}.hud{position:absolute;right:0;top:0;display:flex;flex-direction:row-reverse;z-index:3}.hud-stat{border:1px dotted white;background-color:var(--hud-background);color:var(--hud-text-color);padding:5px}.hud-icon{display:inline-block;height:1em}.hud-text{margin-left:5px}#loading-bar{position:relative;width:40vw;height:100px;border-radius:50px;background:black}#inner-loading-bar{height:100%;border-radius:50px 0 0 50px;background:var(--light-background)}#loading-text{z-index:99999;display:flex;align-items:center;justify-content:space-around;position:absolute;width:100%;height:100%;top:0}.notifications-holder{position:fixed;top:0;right:0;padding:10px;display:flex;flex-direction:column-reverse;align-items:center;pointer-events:none}.notification{margin-top:10px;margin-bottom:10px;border-radius:10px;padding:15px;background:var(--notifications-bg);width:40vh;text-align:center}.volume-label{font-size:20px;font-weight:700;width:180px;text-align:right;margin-right:20px}.volume-controls{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;background:var(--light-background);border:1px dashed white;padding:20px;margin:20px 0}.volume-control{width:100%;font-size:25px;display:flex;align-items:center;justify-content:space-between;margin:0 20px}.volume-slider{flex-grow:2;background-color:#00f}.quit-button{margin:20px;text-align:center}.main-menu-modal{width:60%}.skills-modal{width:800px}.skills-container{display:grid;grid-auto-rows:auto;grid-template-columns:repeat(3,1fr);grid-gap:20px 20px}.skill-display{width:200px;height:300px;position:relative;background-size:cover}.skill-title{position:absolute;bottom:0px;text-align:center;width:100%;color:var(--skills-text-color);background:var(--skills-text-background)}.skill-level{position:absolute;top:0;right:0;font-weight:700;font-size:25px;color:var(--skills-level-color);width:var(--skills-xp-bar-height);height:var(--skills-xp-bar-height);background-color:var(--skills-level-background)}.skill-description-container{justify-content:space-between;align-items:stretch}.skill-left{flex-direction:column;border:1px dashed white;padding:10px;justify-content:center}.skill-right{border:1px dashed white;flex-direction:column;align-items:baseline;flex-grow:2}.skill-xp-container{position:absolute;top:0;left:0;height:var(--skills-xp-bar-height);width:calc(100% - var(--skills-xp-bar-height));background-color:#00000080}.skill-xp-bar{position:absolute;top:0;left:0;width:50%;height:100%;background-color:#0000fa80}.skill-xp-text{z-index:2}.inventory-modal{width:800px;min-height:50%}.inventory-container{display:grid;grid-auto-rows:auto;grid-template-columns:repeat(3,1fr);grid-gap:20px 20px}.item-display{width:200px;height:300px;position:relative;background-repeat:no-repeat;background-size:contain}.item-title{position:absolute;bottom:0px;text-align:center;width:100%;color:var(--inventory-text-color);background:var(--inventory-text-background)}.item-amount{position:absolute;top:0;right:0;font-weight:700;font-size:25px;color:var(--inventory-amount-color);width:40px;height:40px;background-color:var(--inventory-amount-background)}.item-description-container{justify-content:space-between;align-items:stretch}.item-left{border:1px dashed white;flex-direction:column;padding:10px;justify-content:center}.item-right{border:1px dashed white;flex-direction:column;flex-grow:2;align-items:baseline;padding:10px}.dialog-picture{position:absolute;width:80px;height:80px;border:2px solid white;border-radius:10px;background-color:gray;z-index:99}.dialog-picture img{width:100%;height:100%}.dialog-title{font-size:20px;font-weight:700}.dialog-text{font-size:16px}.dialog-box{color:var(--text-color);padding:10px 10px 10px 2em;margin-bottom:10px}.dialog-choice{color:var(--dialog-choice-color)}.dialog-choice:hover{color:var(--dialog-choice-hover-color);cursor:pointer}.buttons-container{width:100%;padding:10px;display:flex;justify-content:space-evenly;align-items:stretch;box-sizing:border-box}.interact-button{cursor:pointer;user-select:none;height:50px;color:var(--text-color);border:1px solid black;font-weight:700;font-size:24px;text-align:center;flex-grow:2;display:flex;align-items:center;justify-content:center;box-sizing:border-box}.dialog-container{flex-shrink:2;min-height:100%;width:100%;background-color:(var(--bg-color));box-sizing:border-box;display:flex;flex-direction:column;justify-content:flex-end;align-items:center;overflow-x:hidden}.dialog{overflow-y:auto;overflow-x:hidden;position:relative;-ms-overflow-style:none;scrollbar-width:none;background:var(--bg-color)}.dialog::-webkit-scrollbar{display:none}.dialog *{overflow-anchor:none}.anchor{overflow-anchor:auto;height:1px}.quests-modal{width:100%;min-height:50%}.quest-header{display:flex;flex-direction:row;align-items:center}.quest-title{font-size:1.5rem;font-weight:700;margin-bottom:.5rem}.quest-completed{color:var(--completed-quest-title-color)}.quest-in-progress{color:var(--quest-title-color)}.quest-state{font-size:1.25rem;font-weight:700;margin-bottom:.5rem}.quest-description{font-size:1.1rem;text-align:justify;font-style:italic;margin-bottom:.5rem}.quest-objectives-container{margin-left:10px}.quest-objective-completed{color:var(--objective-completed-color);text-decoration:line-through}.quest-objective-in-progress{color:var(--objective-in-progress-color)}.quest-objective-description{font-size:1rem;margin-bottom:.5rem}.menu-content{text-align:center}.menu-toggle-button{margin:0;padding:2px;border-radius:5px}.menu-toggle-button:not(:last-child){margin-right:10px}.menu-modal{width:500px}.viewport-layer{background-size:cover;background-repeat:no-repeat;background-position:center;position:absolute;left:0;top:0}.viewport-button{position:absolute}.transition-holder{position:absolute;top:0;left:0;width:100%;height:100%}.viewport{position:relative}.layer-container{position:absolute;top:0;left:0;width:100%;height:100%}.save-modal{width:70%}.saves-container{padding:20px}.save-slot{background:var(--light-background);border:1px dashed white;width:100%;padding:20px}.save-slot:not(:last-child){margin-bottom:20px}#game-title-container{margin-bottom:80px}#game-title-text{text-align:center;font-size:50px}.menu-button{font-size:25px;margin-bottom:10px}#game-header{position:relative;top:100px}.start-menu-buttons-container{width:400px}#app{background-color:var(--bg-color);width:100%;height:100%;position:absolute;display:flex;flex-direction:row;align-items:center;justify-content:center;color:var(--text-color);box-sizing:border-box;overflow:hidden;transform-origin:center center}.game{background-color:var(--bg-color);position:relative;display:flex;flex-direction:row;align-items:center;justify-content:space-between;width:100%;height:100%;box-sizing:border-box;overflow:hidden}.interact-button{height:50px;border:1px solid black;font-weight:700;font-size:20px;text-align:center;flex-grow:2;display:flex;align-items:center;justify-content:center;box-sizing:border-box}.interact-button:not(:last-child){margin-right:10px}.background{margin:0}#background-canvas{height:100%}.menu-toggle{position:fixed;bottom:0px;right:15%;z-index:2}
1
+ *,:before,:after{-webkit-box-sizing:border-box;box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}*{--tw-ring-inset: var(--tw-empty, );--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgba(59, 130, 246, .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000}:root{-moz-tab-size:4;-o-tab-size:4;tab-size:4}:-moz-focusring{outline:1px dotted ButtonText}:-moz-ui-invalid{box-shadow:none}::moz-focus-inner{border-style:none;padding:0}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}body{margin:0;font-family:inherit;line-height:inherit}b{font-weight:bolder}button,input,select{font-family:inherit;font-size:100%;line-height:1.15;margin:0;padding:0;line-height:inherit;color:inherit}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button{background-color:transparent;background-image:none}button,[role=button]{cursor:pointer}html{-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";line-height:1.5}hr{height:0;color:inherit;border-top-width:1px}h3,h2,hr,p,h1{margin:0}h3,h2,h1{font-size:inherit;font-weight:inherit}img{border-style:solid;display:block;vertical-align:middle;max-width:100%;height:auto}input::placeholder{opacity:1;color:#9ca3af}input::webkit-input-placeholder{opacity:1;color:#9ca3af}input::-moz-placeholder{opacity:1;color:#9ca3af}input:-ms-input-placeholder{opacity:1;color:#9ca3af}input::-ms-input-placeholder{opacity:1;color:#9ca3af}table{text-indent:0;border-color:inherit;border-collapse:collapse}ul{list-style:none;margin:0;padding:0}.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.bg-gray-800{--tw-bg-opacity: 1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.block{display:block}.inline{display:inline}.flex{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex}.grid{display:-ms-grid;display:grid}.hidden{display:none}.flex-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.flex-col{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column}.items-center{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.justify-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.justify-between{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.list-disc{list-style-type:disc}.static{position:static}.absolute{position:absolute}.resize{resize:both}.table-auto{table-layout:auto}.line-through{-webkit-text-decoration-line:line-through;text-decoration-line:line-through}.indent{text-indent:1.5rem}.w-full{width:100%}.gap-4{grid-gap:1rem;gap:1rem}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.transform{--tw-translate-x: 0;--tw-translate-y: 0;--tw-translate-z: 0;--tw-rotate: 0;--tw-rotate-x: 0;--tw-rotate-y: 0;--tw-rotate-z: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-scale-z: 1;-webkit-transform:translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) translateZ(var(--tw-translate-z)) rotate(var(--tw-rotate)) rotateX(var(--tw-rotate-x)) rotateY(var(--tw-rotate-y)) rotateZ(var(--tw-rotate-z)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)) scaleZ(var(--tw-scale-z));-ms-transform:translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) translateZ(var(--tw-translate-z)) rotate(var(--tw-rotate)) rotateX(var(--tw-rotate-x)) rotateY(var(--tw-rotate-y)) rotateZ(var(--tw-rotate-z)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)) scaleZ(var(--tw-scale-z));transform:translate(var(--tw-translate-x)) translateY(var(--tw-translate-y)) translateZ(var(--tw-translate-z)) rotate(var(--tw-rotate)) rotateX(var(--tw-rotate-x)) rotateY(var(--tw-rotate-y)) rotate(var(--tw-rotate-z)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)) scaleZ(var(--tw-scale-z))}.\<transition,.transition,.transition\.duration,.transition\.delay{-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform,filter,backdrop-filter;-o-transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,-webkit-box-shadow,transform,-webkit-transform,filter,backdrop-filter;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);-o-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-duration:.15s;-o-transition-duration:.15s;transition-duration:.15s}.duration{-webkit-transition-duration:.15s;-o-transition-duration:.15s;transition-duration:.15s}:root{--font-family: "Helvetica", sans-serif, "Arial", "sans-serif";--bg-color: #131720;--text-color: #d9e1f2;--primary: hsl(255, 30%, 55%);--focus: hsl(210, 90%, 50%);--secondary: #42b983;--border-color: hsla(0, 0%, 100%, .2);--light-1: hsl(210, 30%, 40%);--light-2: hsl(255, 30%, 50%);--light-background: linear-gradient(to right, var(--light-1), var(--light-2));--shadow-1: hsla(236, 50%, 50%, .3);--shadow-2: hsla(236, 50%, 50%, .4);--hud-background: rgba(0, 0, 0, .4);--hud-text-color: var(--text-color);--notifications-bg: darkslateblue;--skills-text-background: rgba(0, 0, 0, .5);--skills-text-color: var(--text-color);--skills-level-background: rgba(0, 0, 0, .5);--skills-level-color: orange;--skills-xp-bar-height: 40px;--skill-check-name-color: orange;--skill-check-difficulty: orange;--skill-check-success: green;--skill-check-failed: red;--skill-check-color: orange;--dialog-choice-color: orange;--dialog-choice-hover-color: var(--text-color);--inventory-text-background: rgba(0, 0, 0, .5);--inventory-text-color: var(--text-color);--inventory-amount-background: rgba(0, 0, 0, .5);--inventory-amount-color: orange;--quest-title-color: yellow;--completed-quest-title-color: grey;--objective-in-progress-color: white;--objective-completed-color: grey}body{font-family:var(--font-family);padding:0;margin:0;font-family:Arial,sans-serif;background-color:#000}*{font-family:var(--font-family);user-select:none}.list-item{display:inline-block;margin-right:10px}.list-enter-active,.list-leave-active{transition:all .3s ease}.think-command{color:#0ff}#app{background-size:cover}.list-enter-from,.list-leave-to{opacity:0;transform:translate(300px)}.notification-item{display:inline-block;margin-right:10px}.notification-enter-active,.notification-leave-active{transition:all .3s ease}.notification-enter-from,.notification-leave-to{opacity:0;transform:translateY(-300px)}.fade-enter-active,.fade-leave-active{transition:opacity .3s ease}.fade-enter-from,.fade-leave-to{opacity:0}.fade-in-enter-active{transition:opacity .1s ease}.fade-in-enter-from{opacity:0}.select{background:var(--light-background);padding:10px}.option{background-color:var(--light-2);padding:5px;color:var(--text-color)}.button{background:var(--light-background);color:var(--text-color);box-shadow:.4rem .5rem 2.4rem .2rem var(--shadow-1),inset -2px -4px #0006,inset 2px 2px #fff7;border-radius:10px;padding:10px;font-weight:800;font-size:16px;margin:10px;transition:.2s;box-shadow:inset -2px -4px #0006,inset 2px 2px #fff7}.button.large{border-radius:20px}.menu-button{border-radius:5px}.button.main-menu-button{border-radius:20px}.button:focus,.button:hover{transform:translateY(-.2rem);box-shadow:0 0 1rem .2rem var(--shadow-2),inset -2px -4px #0006,inset 2px 2px #fff7}.disabled{user-select:none;pointer-events:none}.button.disabled{box-shadow:unset;color:gray;background:var(--border-color)}.input{background:var(--light-background);color:var(--text-color);box-shadow:.4rem .4rem 2.4rem .2rem var(--shadow-1);border-radius:100px;padding:10px;font-weight:800;font-size:16px;margin:10px;transition:.2s}.input:focus,.input:hover{transform:translateY(-.2rem);box-shadow:0 0 2.4rem .2rem var(--shadow-2)}a{color:pink;text-decoration:underline}th,td{padding:4px;border:1px solid var(--text-color);text-align:center}#game-holder{width:100vw;height:100vh;padding:0;margin:0;top:0;left:0;background-color:#000;display:flex;align-items:center;justify-content:center;min-height:-webkit-fill-available}.title{font-size:30px;font-weight:700;text-align:center}.container{padding:20px}h1,h2,h3,h4{font-weight:700}h1{font-size:30px}h2{font-size:26px}h3{font-size:24px}hr.solid{border:1px solid var(--text-color);margin-top:30px;margin-bottom:30px}.card-1{box-shadow:0 1px 3px #0000001f,0 1px 2px #0000003d;transition:all .3s cubic-bezier(.25,.8,.25,1)}.card-1:hover{box-shadow:0 14px 28px #00000040,0 10px 10px #00000038}.card-2{box-shadow:0 3px 6px #00000029,0 3px 6px #0000003b}.card-3{box-shadow:0 10px 20px #00000030,0 6px 6px #0000003b}.card-4{box-shadow:0 14px 28px #00000040,0 10px 10px #00000038}.card-5{box-shadow:0 19px 38px #0000004d,0 15px 12px #00000038}.dialog-choice{transition:.2s}.dialog-choice:hover{transform:scale(1.05);transform-origin:center}.dialog-choice:not(:hover)>.skill-check-name,.passive-skill-check>.skill-check-name{color:var(--skill-check-name-color)}.dialog-choice:not(:hover)>.skill-check-difficulty,.passive-skill-check>.skill-check-difficulty{color:var(--skill-check-difficulty)}.skill-check-difficulty{font-weight:700}.dialog-choice:not(:hover)>.skill-check-success,.passive-skill-check>.skill-check-success{color:var(--skill-check-success)}.dialog-choice:not(:hover)>.skill-check-failed,.passive-skill-check>.skill-check-failed{color:var(--skill-check-failed)}.dialog-choice:not(:hover)>.skill-check,.passive-skill-check.skill-check{color:var(--skill-check-color)}.narrat-canvas{position:absolute;height:100%;top:0;left:0}#touchTrigger{pointer-events:none}.narrat-transition-fade-enter-active,.narrat-transition-fade-leave-active{transition-property:opacity;transition-timing-function:ease;transition-duration:.3s}.narrat-transition-fade-enter-from,.narrat-transition-fade-leave-to{opacity:0}.narrat-transition-slide-right-enter-active,.narrat-transition-slide-right-leave-active{transition-property:transform;transition-timing-function:ease;transition-duration:.3s}.narrat-transition-slide-right-enter-from{transform:translate(-100%)}.narrat-transition-slide-right-leave-to{transform:translate(100%)}.modal-mask{position:absolute;z-index:9998;top:0;left:0;width:100%;height:100%;background-color:#00000080;transition:opacity .3s ease;display:flex;flex-direction:column;flex-shrink:2 2;align-items:center;justify-content:center}.modal-container{min-width:300px;max-width:90vw;max-height:100%;overflow-y:hidden;margin:10px auto;padding:20px 30px;border-radius:5px;transition:all .3s ease;font-family:Helvetica,Arial,sans-serif;background:linear-gradient(to right,hsl(210,30%,20%),hsl(255,30%,25%));display:flex;flex-direction:column}.modal-header{position:relative}.modal-header h3{flex-shrink:0;margin-top:0;color:var(--secondary)}.modal-body{margin:20px 0;overflow-y:auto;flex-shrink:2}.modal-default-button{float:right}.modal-enter,.modal-leave-active{opacity:0}.modal-enter .modal-container,.modal-leave-active .modal-container{-webkit-transform:scale(1.1);transform:scale(1.1)}.close-button{border:1px solid var(--text-color);border-radius:50px;font-size:30px;font-weight:700;position:absolute;right:-20px;top:-10px;width:50px;height:50px}.close-button:hover{background-color:var(--focus)}.debug-menu{z-index:9999}.debug-button{position:fixed;bottom:10px;right:10px;padding:5px}.error-message{color:#ff4500;margin-top:10px;margin-bottom:10px}.error-filename{color:gray;text-decoration:underline}.debug-menu-container{width:100%}.search-result{border:1px solid var(--text-color);padding:10px;font-weight:700;font-size:20px;width:100}.jump-menu-container{width:80%}.debug-info{position:fixed;background-color:#0009;border:1px dotted var(--text-color);top:0;left:0;padding:5px}.variables-viewer{height:100%}.hud{position:absolute;right:0;top:0;display:flex;flex-direction:row-reverse;z-index:3}.hud-stat{border:1px dotted white;background-color:var(--hud-background);color:var(--hud-text-color);padding:5px}.hud-icon{display:inline-block;height:1em}.hud-text{margin-left:5px}#loading-bar{position:relative;width:40vw;height:100px;border-radius:50px;background:black}#inner-loading-bar{height:100%;border-radius:50px 0 0 50px;background:var(--light-background)}#loading-text{z-index:99999;display:flex;align-items:center;justify-content:space-around;position:absolute;width:100%;height:100%;top:0}.notifications-holder{position:fixed;top:0;right:0;padding:10px;display:flex;flex-direction:column-reverse;align-items:center;pointer-events:none}.notification{margin-top:10px;margin-bottom:10px;border-radius:10px;padding:15px;background:var(--notifications-bg);width:40vh;text-align:center}.save-slot{background:var(--light-background);border:1px dashed white;width:100%;padding:20px}.save-slot:not(:last-child){margin-bottom:20px}.save-name{font-size:1.2rem;font-weight:700;background-color:var(--bg-color);color:var(--text-color)}.save-modal{width:70%}.saves-container{padding:20px}#game-title-container{margin-bottom:80px}#game-title-text{text-align:center;font-size:50px}.menu-button{font-size:25px;margin-bottom:10px}#game-header{position:relative;top:100px}.start-menu-buttons-container{width:400px}.save-modal{width:70%}.saves-container{padding:20px}.inventory-modal{width:800px;min-height:50%}.inventory-container{display:grid;grid-auto-rows:auto;grid-template-columns:repeat(3,1fr);grid-gap:20px 20px}.item-display{width:200px;height:300px;position:relative;background-repeat:no-repeat;background-size:contain}.item-title{position:absolute;bottom:0px;text-align:center;width:100%;color:var(--inventory-text-color);background:var(--inventory-text-background)}.item-amount{position:absolute;top:0;right:0;font-weight:700;font-size:25px;color:var(--inventory-amount-color);width:40px;height:40px;background-color:var(--inventory-amount-background)}.item-description-container{justify-content:space-between;align-items:stretch}.item-left{border:1px dashed white;flex-direction:column;padding:10px;justify-content:center}.item-right{border:1px dashed white;flex-direction:column;flex-grow:2;align-items:baseline;padding:10px}.dialog-picture{position:absolute;width:80px;height:80px;border:2px solid white;border-radius:10px;background-color:gray;z-index:99}.dialog-picture img{width:100%;height:100%}.dialog-title{font-size:20px;font-weight:700}.dialog-text{font-size:16px}.dialog-box{color:var(--text-color);padding:10px 10px 10px 2em;margin-bottom:10px}.dialog-choice{color:var(--dialog-choice-color)}.dialog-choice:hover{color:var(--dialog-choice-hover-color);cursor:pointer}.buttons-container{width:100%;padding:10px;display:flex;justify-content:space-evenly;align-items:stretch;box-sizing:border-box}.interact-button{cursor:pointer;user-select:none;height:50px;color:var(--text-color);border:1px solid black;font-weight:700;font-size:24px;text-align:center;flex-grow:2;display:flex;align-items:center;justify-content:center;box-sizing:border-box}.dialog-container{flex-shrink:2;min-height:100%;width:100%;background-color:(var(--bg-color));box-sizing:border-box;display:flex;flex-direction:column;justify-content:flex-end;align-items:center;overflow-x:hidden}.dialog{overflow-y:auto;overflow-x:hidden;position:relative;-ms-overflow-style:none;scrollbar-width:none;background:var(--bg-color)}.dialog::-webkit-scrollbar{display:none}.dialog *{overflow-anchor:none}.anchor{overflow-anchor:auto;height:1px}.quests-modal{width:100%;min-height:50%}.quest-header{display:flex;flex-direction:row;align-items:center}.quest-title{font-size:1.5rem;font-weight:700;margin-bottom:.5rem}.quest-completed{color:var(--completed-quest-title-color)}.quest-in-progress{color:var(--quest-title-color)}.quest-state{font-size:1.25rem;font-weight:700;margin-bottom:.5rem}.quest-description{font-size:1.1rem;text-align:justify;font-style:italic;margin-bottom:.5rem}.quest-objectives-container{margin-left:10px}.quest-objective-completed{color:var(--objective-completed-color);text-decoration:line-through}.quest-objective-in-progress{color:var(--objective-in-progress-color)}.quest-objective-description{font-size:1rem;margin-bottom:.5rem}.menu-content{text-align:center}.menu-toggle-button{margin:0;padding:2px;border-radius:5px}.menu-toggle-button:not(:last-child){margin-right:10px}.menu-modal{width:500px}.viewport-layer{background-size:cover;background-repeat:no-repeat;background-position:center;position:absolute;left:0;top:0}.viewport-button{position:absolute;display:flex;justify-content:center;align-items:center}.viewport-button.interactable{cursor:pointer}.viewport-button.disabled{pointer-events:none;user-select:none}.viewport-button.greyed{opacity:.3}.viewport-button.hidden{opacity:0;display:none}.transition-holder{position:absolute;top:0;left:0;width:100%;height:100%}.viewport{position:relative}.layer-container{position:absolute;top:0;left:0;width:100%;height:100%}.skills-modal{width:800px}.skills-container{display:grid;grid-auto-rows:auto;grid-template-columns:repeat(3,1fr);grid-gap:20px 20px}.skill-display{width:200px;height:300px;position:relative;background-size:cover}.skill-title{position:absolute;bottom:0px;text-align:center;width:100%;color:var(--skills-text-color);background:var(--skills-text-background)}.skill-level{position:absolute;top:0;right:0;font-weight:700;font-size:25px;color:var(--skills-level-color);width:var(--skills-xp-bar-height);height:var(--skills-xp-bar-height);background-color:var(--skills-level-background)}.skill-description-container{justify-content:space-between;align-items:stretch}.skill-left{flex-direction:column;border:1px dashed white;padding:10px;justify-content:center}.skill-right{border:1px dashed white;flex-direction:column;align-items:baseline;flex-grow:2}.skill-xp-container{position:absolute;top:0;left:0;height:var(--skills-xp-bar-height);width:calc(100% - var(--skills-xp-bar-height));background-color:#00000080}.skill-xp-bar{position:absolute;top:0;left:0;width:50%;height:100%;background-color:#0000fa80}.skill-xp-text{z-index:2}.volume-label{font-size:20px;font-weight:700;width:180px;text-align:right;margin-right:20px}.volume-controls{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;background:var(--light-background);border:1px dashed white;padding:20px;margin:20px 0}.volume-control{width:100%;font-size:25px;display:flex;align-items:center;justify-content:space-between;margin:0 20px}.volume-slider{flex-grow:2;background-color:#00f}.quit-button{margin:20px;text-align:center}.main-menu-modal{width:60%}.game{background-color:var(--bg-color);position:relative;display:flex;flex-direction:row;align-items:center;justify-content:space-between;width:100%;height:100%;box-sizing:border-box;overflow:hidden}.menu-toggle{position:fixed;bottom:0px;right:15%;z-index:2}#app{background-color:var(--bg-color);width:100%;height:100%;position:absolute;display:flex;flex-direction:row;align-items:center;justify-content:center;color:var(--text-color);box-sizing:border-box;overflow:hidden;transform-origin:center center}.interact-button{height:50px;border:1px solid black;font-weight:700;font-size:20px;text-align:center;flex-grow:2;display:flex;align-items:center;justify-content:center;box-sizing:border-box}.interact-button:not(:last-child){margin-right:10px}
@@ -18,13 +18,19 @@ export declare type GameSave = {
18
18
  hud: HudSave;
19
19
  inventory: InventorySave;
20
20
  quests: QuestLogSave;
21
- metadata: {
22
- saveDate: string;
23
- };
21
+ metadata: SaveSlotMetadata;
24
22
  };
23
+ export interface SaveSlotMetadata {
24
+ saveDate: string;
25
+ name: string;
26
+ slotType: 'manual' | 'auto';
27
+ id: string;
28
+ createdCounter: number;
29
+ }
25
30
  export declare type StoredSaveFile = SaveFile | GameSave;
26
31
  export declare type SaveFile = {
27
- slots: Array<GameSave | null>;
28
- lastSaveSlot?: number;
32
+ slots: Array<GameSave>;
33
+ lastSaveSlot?: string;
34
+ slotsCounter: number;
29
35
  };
30
36
  export declare function isOldSave(save: StoredSaveFile): save is GameSave;
@@ -1,15 +1,18 @@
1
- import { GameSave, SaveFile } from '../types/game-save';
2
- export declare const CURRENT_SAVE_VERSION = "1.2.0";
1
+ import { GameSave, SaveFile, SaveSlotMetadata } from '../types/game-save';
2
+ export declare const CURRENT_SAVE_VERSION = "1.3.0";
3
3
  export declare function getSaveFile(): SaveFile;
4
- export declare function saveSlot(saveData: GameSave, slot?: number): void;
5
- export declare function setSaveSlot(slot: number): void;
4
+ export declare function saveSlot(saveData: GameSave, slot: string): void;
5
+ export declare function setSaveSlot(slot: string): void;
6
6
  export declare function save(): void;
7
- export declare function getFreeSlot(): number;
8
- export declare function getSaveSlot(slot?: number): GameSave | null | undefined;
9
- export declare function createSaveSlot(slot: number | undefined, saveData: GameSave): void;
10
- export declare function deleteSlot(slot?: number): void;
11
- export declare function migrateSaveSlot(save: GameSave | null): void;
7
+ export declare function getFreeSlot(): string;
8
+ export declare function getSlotIndex(slotId: string): number;
9
+ export declare function getSaveSlot(slotId: string): GameSave | undefined;
10
+ export declare function findAutoSave(): GameSave | undefined;
11
+ export declare function deleteSave(id: string): void;
12
+ export declare function renameSave(id: string, newName: string): void;
13
+ export declare function migrateSaveSlot(save: GameSave | null, index: number): void;
14
+ export declare function generateMetadata(): SaveSlotMetadata;
12
15
  export declare type ChosenSlot = {
13
16
  saveData: GameSave | null;
14
- slot: number;
17
+ slotId: string;
15
18
  };
@@ -16,3 +16,9 @@ export declare const logPlugin: CommandPlugin<{
16
16
  value: any;
17
17
  }, {}>;
18
18
  export declare const returnMainMenuPlugin: CommandPlugin<{}, {}>;
19
+ export declare const savePlugin: CommandPlugin<{
20
+ name?: string | undefined;
21
+ }, {}>;
22
+ export declare const savePromptPlugin: CommandPlugin<{
23
+ name?: string | undefined;
24
+ }, {}>;