@kawaijs/runtime 0.1.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.
@@ -0,0 +1,16 @@
1
+ export interface DialogueHistoryEntry {
2
+ readonly id: string;
3
+ readonly speaker?: string;
4
+ readonly speakerDisplayName?: string;
5
+ readonly text: string;
6
+ readonly timestamp: number;
7
+ }
8
+ export declare class HistoryManager {
9
+ private entries;
10
+ private maxEntries;
11
+ constructor(maxEntries?: number);
12
+ addEntry(speaker: string | undefined, speakerDisplayName: string | undefined, text: string): DialogueHistoryEntry;
13
+ getEntries(): readonly DialogueHistoryEntry[];
14
+ clear(): void;
15
+ }
16
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,SAAM;IAIrB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,kBAAkB,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,oBAAoB;IAiBjH,UAAU,IAAI,SAAS,oBAAoB,EAAE;IAI7C,KAAK,IAAI,IAAI;CAGrB"}
@@ -0,0 +1,28 @@
1
+ export class HistoryManager {
2
+ entries = [];
3
+ maxEntries;
4
+ constructor(maxEntries = 200) {
5
+ this.maxEntries = maxEntries;
6
+ }
7
+ addEntry(speaker, speakerDisplayName, text) {
8
+ const entry = {
9
+ id: `hist_${Date.now()}_${Math.random().toString(36).substring(2, 7)}`,
10
+ speaker,
11
+ speakerDisplayName,
12
+ text,
13
+ timestamp: Date.now()
14
+ };
15
+ this.entries.push(entry);
16
+ if (this.entries.length > this.maxEntries) {
17
+ this.entries.shift();
18
+ }
19
+ return entry;
20
+ }
21
+ getEntries() {
22
+ return this.entries;
23
+ }
24
+ clear() {
25
+ this.entries = [];
26
+ }
27
+ }
28
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,cAAc;IACjB,OAAO,GAA2B,EAAE,CAAC;IACrC,UAAU,CAAS;IAE3B,YAAY,UAAU,GAAG,GAAG;QAC1B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAEM,QAAQ,CAAC,OAA2B,EAAE,kBAAsC,EAAE,IAAY;QAC/F,MAAM,KAAK,GAAyB;YAClC,EAAE,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;YACtE,OAAO;YACP,kBAAkB;YAClB,IAAI;YACJ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QAEF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAC1C,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,UAAU;QACf,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACpB,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ export * from './state.js';
2
+ export * from './history.js';
3
+ export * from './save.js';
4
+ export * from './vm.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export * from './state.js';
2
+ export * from './history.js';
3
+ export * from './save.js';
4
+ export * from './vm.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC"}
package/dist/save.d.ts ADDED
@@ -0,0 +1,34 @@
1
+ import type { Snapshot } from './state.js';
2
+ export interface SaveSlot {
3
+ readonly id: string;
4
+ readonly name: string;
5
+ readonly timestamp: number;
6
+ readonly snapshot: Snapshot;
7
+ readonly previewText?: string;
8
+ readonly screenshotUrl?: string;
9
+ }
10
+ export interface StorageAdapter {
11
+ getItem(key: string): string | null | Promise<string | null>;
12
+ setItem(key: string, value: string): void | Promise<void>;
13
+ removeItem(key: string): void | Promise<void>;
14
+ }
15
+ export declare class MemoryStorageAdapter implements StorageAdapter {
16
+ private store;
17
+ getItem(key: string): string | null;
18
+ setItem(key: string, value: string): void;
19
+ removeItem(key: string): void;
20
+ }
21
+ export declare class LocalStorageAdapter implements StorageAdapter {
22
+ getItem(key: string): string | null;
23
+ setItem(key: string, value: string): void;
24
+ removeItem(key: string): void;
25
+ }
26
+ export declare class SaveManager {
27
+ private readonly storage;
28
+ private readonly storagePrefix;
29
+ constructor(storage?: StorageAdapter, storagePrefix?: string);
30
+ saveSlot(slotId: string, snapshot: Snapshot, previewText?: string): Promise<SaveSlot>;
31
+ loadSlot(slotId: string): Promise<SaveSlot | null>;
32
+ deleteSlot(slotId: string): Promise<void>;
33
+ }
34
+ //# sourceMappingURL=save.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../src/save.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C;AAED,qBAAa,oBAAqB,YAAW,cAAc;IACzD,OAAO,CAAC,KAAK,CAA6B;IAEnC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAInC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAIzC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;CAGrC;AAED,qBAAa,mBAAoB,YAAW,cAAc;IACjD,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKnC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAKzC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;CAIrC;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;gBAE3B,OAAO,CAAC,EAAE,cAAc,EAAE,aAAa,SAAkB;IAKxD,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAcrF,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAYlD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAIvD"}
package/dist/save.js ADDED
@@ -0,0 +1,66 @@
1
+ export class MemoryStorageAdapter {
2
+ store = new Map();
3
+ getItem(key) {
4
+ return this.store.get(key) ?? null;
5
+ }
6
+ setItem(key, value) {
7
+ this.store.set(key, value);
8
+ }
9
+ removeItem(key) {
10
+ this.store.delete(key);
11
+ }
12
+ }
13
+ export class LocalStorageAdapter {
14
+ getItem(key) {
15
+ if (typeof localStorage === 'undefined')
16
+ return null;
17
+ return localStorage.getItem(key);
18
+ }
19
+ setItem(key, value) {
20
+ if (typeof localStorage === 'undefined')
21
+ return;
22
+ localStorage.setItem(key, value);
23
+ }
24
+ removeItem(key) {
25
+ if (typeof localStorage === 'undefined')
26
+ return;
27
+ localStorage.removeItem(key);
28
+ }
29
+ }
30
+ export class SaveManager {
31
+ storage;
32
+ storagePrefix;
33
+ constructor(storage, storagePrefix = 'kawaijs_save_') {
34
+ this.storage = storage ?? (typeof localStorage !== 'undefined' ? new LocalStorageAdapter() : new MemoryStorageAdapter());
35
+ this.storagePrefix = storagePrefix;
36
+ }
37
+ async saveSlot(slotId, snapshot, previewText) {
38
+ const slot = {
39
+ id: slotId,
40
+ name: `Slot ${slotId}`,
41
+ timestamp: Date.now(),
42
+ snapshot,
43
+ previewText
44
+ };
45
+ const key = `${this.storagePrefix}${slotId}`;
46
+ await this.storage.setItem(key, JSON.stringify(slot));
47
+ return slot;
48
+ }
49
+ async loadSlot(slotId) {
50
+ const key = `${this.storagePrefix}${slotId}`;
51
+ const raw = await this.storage.getItem(key);
52
+ if (!raw)
53
+ return null;
54
+ try {
55
+ return JSON.parse(raw);
56
+ }
57
+ catch {
58
+ return null;
59
+ }
60
+ }
61
+ async deleteSlot(slotId) {
62
+ const key = `${this.storagePrefix}${slotId}`;
63
+ await this.storage.removeItem(key);
64
+ }
65
+ }
66
+ //# sourceMappingURL=save.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"save.js","sourceRoot":"","sources":["../src/save.ts"],"names":[],"mappings":"AAiBA,MAAM,OAAO,oBAAoB;IACvB,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEnC,OAAO,CAAC,GAAW;QACxB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IACrC,CAAC;IAEM,OAAO,CAAC,GAAW,EAAE,KAAa;QACvC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAEM,UAAU,CAAC,GAAW;QAC3B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,mBAAmB;IACvB,OAAO,CAAC,GAAW;QACxB,IAAI,OAAO,YAAY,KAAK,WAAW;YAAE,OAAO,IAAI,CAAC;QACrD,OAAO,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAEM,OAAO,CAAC,GAAW,EAAE,KAAa;QACvC,IAAI,OAAO,YAAY,KAAK,WAAW;YAAE,OAAO;QAChD,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IAEM,UAAU,CAAC,GAAW;QAC3B,IAAI,OAAO,YAAY,KAAK,WAAW;YAAE,OAAO;QAChD,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,WAAW;IACL,OAAO,CAAiB;IACxB,aAAa,CAAS;IAEvC,YAAY,OAAwB,EAAE,aAAa,GAAG,eAAe;QACnE,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,CAAC,OAAO,YAAY,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,mBAAmB,EAAE,CAAC,CAAC,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;QACzH,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,QAAkB,EAAE,WAAoB;QAC5E,MAAM,IAAI,GAAa;YACrB,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,QAAQ,MAAM,EAAE;YACtB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,QAAQ;YACR,WAAW;SACZ,CAAC;QAEF,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,aAAa,GAAG,MAAM,EAAE,CAAC;QAC7C,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,MAAc;QAClC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,aAAa,GAAG,MAAM,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QAEtB,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAa,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,MAAc;QACpC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,aAAa,GAAG,MAAM,EAAE,CAAC;QAC7C,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;CACF"}
@@ -0,0 +1,44 @@
1
+ import type { ChoiceOption } from '@kawaijs/ast';
2
+ export interface CharacterState {
3
+ readonly expression?: string;
4
+ readonly position?: string;
5
+ }
6
+ export interface DialogueState {
7
+ readonly speaker?: string;
8
+ readonly speakerDisplayName?: string;
9
+ readonly speakerColor?: string;
10
+ readonly text: string;
11
+ }
12
+ export interface VisualState {
13
+ readonly background: string | null;
14
+ readonly transition: string | null;
15
+ readonly characters: Record<string, CharacterState>;
16
+ }
17
+ export interface AudioState {
18
+ readonly music: string | null;
19
+ readonly voice: string | null;
20
+ }
21
+ export interface CallFrame {
22
+ readonly returnLabel: string;
23
+ readonly returnPointer: number;
24
+ }
25
+ export interface StoryState {
26
+ readonly currentLabel: string;
27
+ readonly instructionPointer: number;
28
+ readonly callStack: readonly CallFrame[];
29
+ readonly variables: Record<string, unknown>;
30
+ readonly visual: VisualState;
31
+ readonly audio: AudioState;
32
+ readonly dialogue: DialogueState | null;
33
+ readonly choices: readonly ChoiceOption[] | null;
34
+ readonly isWaitingForInput: boolean;
35
+ readonly isFinished: boolean;
36
+ }
37
+ export interface Snapshot {
38
+ readonly id: string;
39
+ readonly timestamp: number;
40
+ readonly state: StoryState;
41
+ }
42
+ export declare function createInitialState(startLabel?: string): StoryState;
43
+ export declare function cloneState(state: StoryState): StoryState;
44
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,SAAS,SAAS,EAAE,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,GAAG,IAAI,CAAC;IACjD,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;CAC5B;AAED,wBAAgB,kBAAkB,CAAC,UAAU,SAAU,GAAG,UAAU,CAoBnE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAmBxD"}
package/dist/state.js ADDED
@@ -0,0 +1,40 @@
1
+ export function createInitialState(startLabel = 'start') {
2
+ return {
3
+ currentLabel: startLabel,
4
+ instructionPointer: 0,
5
+ callStack: [],
6
+ variables: {},
7
+ visual: {
8
+ background: null,
9
+ transition: null,
10
+ characters: {}
11
+ },
12
+ audio: {
13
+ music: null,
14
+ voice: null
15
+ },
16
+ dialogue: null,
17
+ choices: null,
18
+ isWaitingForInput: false,
19
+ isFinished: false
20
+ };
21
+ }
22
+ export function cloneState(state) {
23
+ return {
24
+ currentLabel: state.currentLabel,
25
+ instructionPointer: state.instructionPointer,
26
+ callStack: state.callStack.map(frame => ({ ...frame })),
27
+ variables: { ...state.variables },
28
+ visual: {
29
+ background: state.visual.background,
30
+ transition: state.visual.transition,
31
+ characters: Object.fromEntries(Object.entries(state.visual.characters).map(([k, v]) => [k, { ...v }]))
32
+ },
33
+ audio: { ...state.audio },
34
+ dialogue: state.dialogue ? { ...state.dialogue } : null,
35
+ choices: state.choices ? state.choices.map(c => ({ ...c })) : null,
36
+ isWaitingForInput: state.isWaitingForInput,
37
+ isFinished: state.isFinished
38
+ };
39
+ }
40
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAiDA,MAAM,UAAU,kBAAkB,CAAC,UAAU,GAAG,OAAO;IACrD,OAAO;QACL,YAAY,EAAE,UAAU;QACxB,kBAAkB,EAAE,CAAC;QACrB,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,EAAE;QACb,MAAM,EAAE;YACN,UAAU,EAAE,IAAI;YAChB,UAAU,EAAE,IAAI;YAChB,UAAU,EAAE,EAAE;SACf;QACD,KAAK,EAAE;YACL,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,IAAI;SACZ;QACD,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,IAAI;QACb,iBAAiB,EAAE,KAAK;QACxB,UAAU,EAAE,KAAK;KAClB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAiB;IAC1C,OAAO;QACL,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;QAC5C,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;QACvD,SAAS,EAAE,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE;QACjC,MAAM,EAAE;YACN,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU;YACnC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU;YACnC,UAAU,EAAE,MAAM,CAAC,WAAW,CAC5B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CACvE;SACF;QACD,KAAK,EAAE,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE;QACzB,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI;QACvD,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;QAClE,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;QAC1C,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAC;AACJ,CAAC"}
package/dist/vm.d.ts ADDED
@@ -0,0 +1,55 @@
1
+ import type { StoryPackage } from '@kawaijs/ast';
2
+ import { type StoryState } from './state.js';
3
+ import { HistoryManager } from './history.js';
4
+ import { SaveManager } from './save.js';
5
+ export interface AudioEvent {
6
+ readonly action: 'play' | 'stop';
7
+ readonly channel: 'music' | 'sound' | 'voice';
8
+ readonly track?: string;
9
+ readonly fade?: number;
10
+ readonly loop?: boolean;
11
+ }
12
+ export type StateChangeListener = (state: StoryState) => void;
13
+ export type AudioEventListener = (event: AudioEvent) => void;
14
+ export declare class StoryVM {
15
+ private readonly story;
16
+ private state;
17
+ private snapshotStack;
18
+ private readonly historyManager;
19
+ private readonly saveManager;
20
+ private stateChangeListeners;
21
+ private audioEventListeners;
22
+ constructor(story: StoryPackage, saveManager?: SaveManager);
23
+ getState(): StoryState;
24
+ getHistoryManager(): HistoryManager;
25
+ getSaveManager(): SaveManager;
26
+ onStateChange(listener: StateChangeListener): () => void;
27
+ onAudioEvent(listener: AudioEventListener): () => void;
28
+ start(): void;
29
+ /**
30
+ * Advances the story to the next dialogue, choice, or scene event.
31
+ */
32
+ next(): void;
33
+ /**
34
+ * Selects an option from the current choice menu.
35
+ */
36
+ choose(choiceIndex: number): void;
37
+ /**
38
+ * Jumps directly to a label.
39
+ */
40
+ jump(labelName: string): void;
41
+ /**
42
+ * Rolls back the story state to the previous snapshot.
43
+ */
44
+ rollback(): boolean;
45
+ canRollback(): boolean;
46
+ save(slotId: string): Promise<void>;
47
+ load(slotId: string): Promise<boolean>;
48
+ private executeUntilWaiting;
49
+ private executeInstruction;
50
+ private captureSnapshot;
51
+ private recordSnapshot;
52
+ private notifyStateChanged;
53
+ private emitAudioEvent;
54
+ }
55
+ //# sourceMappingURL=vm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vm.d.ts","sourceRoot":"","sources":["../src/vm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAiD,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC5F,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;IAC9C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;AAC9D,MAAM,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;AAE7D,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAE1C,OAAO,CAAC,oBAAoB,CAAkC;IAC9D,OAAO,CAAC,mBAAmB,CAAiC;gBAEhD,KAAK,EAAE,YAAY,EAAE,WAAW,CAAC,EAAE,WAAW;IAQnD,QAAQ,IAAI,UAAU;IAItB,iBAAiB,IAAI,cAAc;IAInC,cAAc,IAAI,WAAW;IAI7B,aAAa,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM,IAAI;IAKxD,YAAY,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,IAAI;IAKtD,KAAK,IAAI,IAAI;IAWpB;;OAEG;IACI,IAAI,IAAI,IAAI;IAgBnB;;OAEG;IACI,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAiBxC;;OAEG;IACI,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAgBpC;;OAEG;IACI,QAAQ,IAAI,OAAO;IAkBnB,WAAW,IAAI,OAAO;IAIhB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnC,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUnD,OAAO,CAAC,mBAAmB;IAyC3B,OAAO,CAAC,kBAAkB;IAoK1B,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,cAAc;CAKvB"}
package/dist/vm.js ADDED
@@ -0,0 +1,343 @@
1
+ import { cloneState, createInitialState } from './state.js';
2
+ import { HistoryManager } from './history.js';
3
+ import { SaveManager } from './save.js';
4
+ export class StoryVM {
5
+ story;
6
+ state;
7
+ snapshotStack = [];
8
+ historyManager;
9
+ saveManager;
10
+ stateChangeListeners = new Set();
11
+ audioEventListeners = new Set();
12
+ constructor(story, saveManager) {
13
+ this.story = story;
14
+ const startLabel = story.meta.startLabel ?? 'start';
15
+ this.state = createInitialState(startLabel);
16
+ this.historyManager = new HistoryManager();
17
+ this.saveManager = saveManager ?? new SaveManager();
18
+ }
19
+ getState() {
20
+ return this.state;
21
+ }
22
+ getHistoryManager() {
23
+ return this.historyManager;
24
+ }
25
+ getSaveManager() {
26
+ return this.saveManager;
27
+ }
28
+ onStateChange(listener) {
29
+ this.stateChangeListeners.add(listener);
30
+ return () => this.stateChangeListeners.delete(listener);
31
+ }
32
+ onAudioEvent(listener) {
33
+ this.audioEventListeners.add(listener);
34
+ return () => this.audioEventListeners.delete(listener);
35
+ }
36
+ start() {
37
+ const startLabel = this.story.meta.startLabel ?? 'start';
38
+ if (!this.story.labels[startLabel]) {
39
+ throw new Error(`Cannot start story: Start label '${startLabel}' not found in story package.`);
40
+ }
41
+ this.state = createInitialState(startLabel);
42
+ this.snapshotStack = [];
43
+ this.executeUntilWaiting();
44
+ }
45
+ /**
46
+ * Advances the story to the next dialogue, choice, or scene event.
47
+ */
48
+ next() {
49
+ if (this.state.isFinished)
50
+ return;
51
+ if (this.state.choices && this.state.choices.length > 0) {
52
+ // Must make a choice; cannot advance automatically
53
+ return;
54
+ }
55
+ this.state = {
56
+ ...this.state,
57
+ isWaitingForInput: false
58
+ };
59
+ this.executeUntilWaiting();
60
+ }
61
+ /**
62
+ * Selects an option from the current choice menu.
63
+ */
64
+ choose(choiceIndex) {
65
+ if (!this.state.choices || !this.state.choices[choiceIndex]) {
66
+ throw new Error(`Invalid choice index: ${choiceIndex}`);
67
+ }
68
+ const choice = this.state.choices[choiceIndex];
69
+ this.state = {
70
+ ...this.state,
71
+ choices: null,
72
+ isWaitingForInput: false,
73
+ currentLabel: choice.targetLabel,
74
+ instructionPointer: 0
75
+ };
76
+ this.executeUntilWaiting();
77
+ }
78
+ /**
79
+ * Jumps directly to a label.
80
+ */
81
+ jump(labelName) {
82
+ if (!this.story.labels[labelName]) {
83
+ throw new Error(`Target label '${labelName}' not found in story package.`);
84
+ }
85
+ this.state = {
86
+ ...this.state,
87
+ currentLabel: labelName,
88
+ instructionPointer: 0,
89
+ choices: null,
90
+ isWaitingForInput: false
91
+ };
92
+ this.executeUntilWaiting();
93
+ }
94
+ /**
95
+ * Rolls back the story state to the previous snapshot.
96
+ */
97
+ rollback() {
98
+ if (this.snapshotStack.length <= 1) {
99
+ return false;
100
+ }
101
+ // Pop current snapshot
102
+ this.snapshotStack.pop();
103
+ // Restore previous snapshot
104
+ const prev = this.snapshotStack[this.snapshotStack.length - 1];
105
+ if (prev) {
106
+ this.state = cloneState(prev.state);
107
+ this.notifyStateChanged();
108
+ return true;
109
+ }
110
+ return false;
111
+ }
112
+ canRollback() {
113
+ return this.snapshotStack.length > 1;
114
+ }
115
+ async save(slotId) {
116
+ const currentSnapshot = this.captureSnapshot();
117
+ const previewText = this.state.dialogue?.text ?? 'Game in progress';
118
+ await this.saveManager.saveSlot(slotId, currentSnapshot, previewText);
119
+ }
120
+ async load(slotId) {
121
+ const slot = await this.saveManager.loadSlot(slotId);
122
+ if (!slot)
123
+ return false;
124
+ this.state = cloneState(slot.snapshot.state);
125
+ this.snapshotStack = [slot.snapshot];
126
+ this.notifyStateChanged();
127
+ return true;
128
+ }
129
+ executeUntilWaiting() {
130
+ while (!this.state.isWaitingForInput && !this.state.isFinished) {
131
+ const labelInstructions = this.story.labels[this.state.currentLabel];
132
+ if (!labelInstructions || this.state.instructionPointer >= labelInstructions.length) {
133
+ // Handle end of label: check call stack
134
+ if (this.state.callStack.length > 0) {
135
+ const topFrame = this.state.callStack[this.state.callStack.length - 1];
136
+ this.state = {
137
+ ...this.state,
138
+ currentLabel: topFrame.returnLabel,
139
+ instructionPointer: topFrame.returnPointer,
140
+ callStack: this.state.callStack.slice(0, -1)
141
+ };
142
+ continue;
143
+ }
144
+ // Story finished
145
+ this.state = {
146
+ ...this.state,
147
+ isFinished: true,
148
+ isWaitingForInput: false
149
+ };
150
+ break;
151
+ }
152
+ const inst = labelInstructions[this.state.instructionPointer];
153
+ this.state = {
154
+ ...this.state,
155
+ instructionPointer: this.state.instructionPointer + 1
156
+ };
157
+ this.executeInstruction(inst);
158
+ }
159
+ if (this.state.isWaitingForInput) {
160
+ this.recordSnapshot();
161
+ }
162
+ this.notifyStateChanged();
163
+ }
164
+ executeInstruction(inst) {
165
+ switch (inst.type) {
166
+ case 'scene': {
167
+ this.state = {
168
+ ...this.state,
169
+ visual: {
170
+ background: inst.background,
171
+ transition: inst.transition ?? null,
172
+ characters: {} // Clear characters on new scene
173
+ }
174
+ };
175
+ break;
176
+ }
177
+ case 'show': {
178
+ const charDef = this.state.visual.characters[inst.character] ?? {};
179
+ this.state = {
180
+ ...this.state,
181
+ visual: {
182
+ ...this.state.visual,
183
+ characters: {
184
+ ...this.state.visual.characters,
185
+ [inst.character]: {
186
+ expression: inst.expression ?? charDef.expression,
187
+ position: inst.position ?? charDef.position ?? 'center'
188
+ }
189
+ }
190
+ }
191
+ };
192
+ break;
193
+ }
194
+ case 'hide': {
195
+ const nextChars = { ...this.state.visual.characters };
196
+ delete nextChars[inst.character];
197
+ this.state = {
198
+ ...this.state,
199
+ visual: {
200
+ ...this.state.visual,
201
+ characters: nextChars
202
+ }
203
+ };
204
+ break;
205
+ }
206
+ case 'dialogue': {
207
+ const charDef = inst.speaker ? this.story.characters[inst.speaker] : undefined;
208
+ const displayName = charDef?.name ?? inst.speaker;
209
+ const color = charDef?.color;
210
+ this.state = {
211
+ ...this.state,
212
+ dialogue: {
213
+ speaker: inst.speaker,
214
+ speakerDisplayName: displayName,
215
+ speakerColor: color,
216
+ text: inst.text
217
+ },
218
+ isWaitingForInput: true
219
+ };
220
+ this.historyManager.addEntry(inst.speaker, displayName, inst.text);
221
+ break;
222
+ }
223
+ case 'choice': {
224
+ this.state = {
225
+ ...this.state,
226
+ choices: inst.choices,
227
+ isWaitingForInput: true
228
+ };
229
+ break;
230
+ }
231
+ case 'jump': {
232
+ this.state = {
233
+ ...this.state,
234
+ currentLabel: inst.targetLabel,
235
+ instructionPointer: 0
236
+ };
237
+ break;
238
+ }
239
+ case 'set': {
240
+ this.state = {
241
+ ...this.state,
242
+ variables: {
243
+ ...this.state.variables,
244
+ [inst.variable]: inst.value
245
+ }
246
+ };
247
+ break;
248
+ }
249
+ case 'branch': {
250
+ const conditionVal = Boolean(this.state.variables[inst.condition] ?? inst.condition === 'true');
251
+ const targetLabel = conditionVal ? inst.thenLabel : (inst.elseLabel ?? inst.thenLabel);
252
+ this.state = {
253
+ ...this.state,
254
+ currentLabel: targetLabel,
255
+ instructionPointer: 0
256
+ };
257
+ break;
258
+ }
259
+ case 'play_audio': {
260
+ this.emitAudioEvent({
261
+ action: 'play',
262
+ channel: inst.channel,
263
+ track: inst.track,
264
+ fade: inst.fade,
265
+ loop: inst.loop
266
+ });
267
+ if (inst.channel === 'music') {
268
+ this.state = {
269
+ ...this.state,
270
+ audio: {
271
+ ...this.state.audio,
272
+ music: inst.track
273
+ }
274
+ };
275
+ }
276
+ break;
277
+ }
278
+ case 'stop_audio': {
279
+ this.emitAudioEvent({
280
+ action: 'stop',
281
+ channel: inst.channel,
282
+ fade: inst.fade
283
+ });
284
+ if (inst.channel === 'music') {
285
+ this.state = {
286
+ ...this.state,
287
+ audio: {
288
+ ...this.state.audio,
289
+ music: null
290
+ }
291
+ };
292
+ }
293
+ break;
294
+ }
295
+ case 'return': {
296
+ if (this.state.callStack.length > 0) {
297
+ const topFrame = this.state.callStack[this.state.callStack.length - 1];
298
+ this.state = {
299
+ ...this.state,
300
+ currentLabel: topFrame.returnLabel,
301
+ instructionPointer: topFrame.returnPointer,
302
+ callStack: this.state.callStack.slice(0, -1)
303
+ };
304
+ }
305
+ else {
306
+ this.state = {
307
+ ...this.state,
308
+ isFinished: true,
309
+ isWaitingForInput: false
310
+ };
311
+ }
312
+ break;
313
+ }
314
+ }
315
+ }
316
+ captureSnapshot() {
317
+ return {
318
+ id: `snap_${Date.now()}_${this.snapshotStack.length}`,
319
+ timestamp: Date.now(),
320
+ state: cloneState(this.state)
321
+ };
322
+ }
323
+ recordSnapshot() {
324
+ const snap = this.captureSnapshot();
325
+ this.snapshotStack.push(snap);
326
+ // Limit snapshot history to last 50 steps
327
+ if (this.snapshotStack.length > 50) {
328
+ this.snapshotStack.shift();
329
+ }
330
+ }
331
+ notifyStateChanged() {
332
+ const currentState = this.getState();
333
+ for (const listener of this.stateChangeListeners) {
334
+ listener(currentState);
335
+ }
336
+ }
337
+ emitAudioEvent(event) {
338
+ for (const listener of this.audioEventListeners) {
339
+ listener(event);
340
+ }
341
+ }
342
+ }
343
+ //# sourceMappingURL=vm.js.map
package/dist/vm.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vm.js","sourceRoot":"","sources":["../src/vm.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAkC,MAAM,YAAY,CAAC;AAC5F,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAaxC,MAAM,OAAO,OAAO;IACD,KAAK,CAAe;IAC7B,KAAK,CAAa;IAClB,aAAa,GAAe,EAAE,CAAC;IACtB,cAAc,CAAiB;IAC/B,WAAW,CAAc;IAElC,oBAAoB,GAAG,IAAI,GAAG,EAAuB,CAAC;IACtD,mBAAmB,GAAG,IAAI,GAAG,EAAsB,CAAC;IAE5D,YAAY,KAAmB,EAAE,WAAyB;QACxD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC;QACpD,IAAI,CAAC,KAAK,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAC5C,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;QAC3C,IAAI,CAAC,WAAW,GAAG,WAAW,IAAI,IAAI,WAAW,EAAE,CAAC;IACtD,CAAC;IAEM,QAAQ;QACb,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAEM,iBAAiB;QACtB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAEM,cAAc;QACnB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAEM,aAAa,CAAC,QAA6B;QAChD,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxC,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAEM,YAAY,CAAC,QAA4B;QAC9C,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvC,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzD,CAAC;IAEM,KAAK;QACV,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC;QACzD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,oCAAoC,UAAU,+BAA+B,CAAC,CAAC;QACjG,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAC5C,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACI,IAAI;QACT,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU;YAAE,OAAO;QAElC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxD,mDAAmD;YACnD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,KAAK,GAAG;YACX,GAAG,IAAI,CAAC,KAAK;YACb,iBAAiB,EAAE,KAAK;SACzB,CAAC;QAEF,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,WAAmB;QAC/B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5D,MAAM,IAAI,KAAK,CAAC,yBAAyB,WAAW,EAAE,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAE,CAAC;QAChD,IAAI,CAAC,KAAK,GAAG;YACX,GAAG,IAAI,CAAC,KAAK;YACb,OAAO,EAAE,IAAI;YACb,iBAAiB,EAAE,KAAK;YACxB,YAAY,EAAE,MAAM,CAAC,WAAW;YAChC,kBAAkB,EAAE,CAAC;SACtB,CAAC;QAEF,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACI,IAAI,CAAC,SAAiB;QAC3B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,iBAAiB,SAAS,+BAA+B,CAAC,CAAC;QAC7E,CAAC;QAED,IAAI,CAAC,KAAK,GAAG;YACX,GAAG,IAAI,CAAC,KAAK;YACb,YAAY,EAAE,SAAS;YACvB,kBAAkB,EAAE,CAAC;YACrB,OAAO,EAAE,IAAI;YACb,iBAAiB,EAAE,KAAK;SACzB,CAAC;QAEF,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACI,QAAQ;QACb,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACnC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,uBAAuB;QACvB,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC;QACzB,4BAA4B;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC/D,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,WAAW;QAChB,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;IACvC,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,MAAc;QAC9B,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,IAAI,kBAAkB,CAAC;QACpE,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE,eAAe,EAAE,WAAW,CAAC,CAAC;IACxE,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,MAAc;QAC9B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACrD,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QAExB,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,mBAAmB;QACzB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YAC/D,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACrE,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,KAAK,CAAC,kBAAkB,IAAI,iBAAiB,CAAC,MAAM,EAAE,CAAC;gBACpF,wCAAwC;gBACxC,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;oBACxE,IAAI,CAAC,KAAK,GAAG;wBACX,GAAG,IAAI,CAAC,KAAK;wBACb,YAAY,EAAE,QAAQ,CAAC,WAAW;wBAClC,kBAAkB,EAAE,QAAQ,CAAC,aAAa;wBAC1C,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;qBAC7C,CAAC;oBACF,SAAS;gBACX,CAAC;gBAED,iBAAiB;gBACjB,IAAI,CAAC,KAAK,GAAG;oBACX,GAAG,IAAI,CAAC,KAAK;oBACb,UAAU,EAAE,IAAI;oBAChB,iBAAiB,EAAE,KAAK;iBACzB,CAAC;gBACF,MAAM;YACR,CAAC;YAED,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAE,CAAC;YAC/D,IAAI,CAAC,KAAK,GAAG;gBACX,GAAG,IAAI,CAAC,KAAK;gBACb,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,CAAC;aACtD,CAAC;YAEF,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;YACjC,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,CAAC;QAED,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAEO,kBAAkB,CAAC,IAAiB;QAC1C,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,IAAI,CAAC,KAAK,GAAG;oBACX,GAAG,IAAI,CAAC,KAAK;oBACb,MAAM,EAAE;wBACN,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI;wBACnC,UAAU,EAAE,EAAE,CAAC,gCAAgC;qBAChD;iBACF,CAAC;gBACF,MAAM;YACR,CAAC;YAED,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;gBACnE,IAAI,CAAC,KAAK,GAAG;oBACX,GAAG,IAAI,CAAC,KAAK;oBACb,MAAM,EAAE;wBACN,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM;wBACpB,UAAU,EAAE;4BACV,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU;4BAC/B,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;gCAChB,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU;gCACjD,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,IAAI,QAAQ;6BACxD;yBACF;qBACF;iBACF,CAAC;gBACF,MAAM;YACR,CAAC;YAED,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,SAAS,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBACtD,OAAO,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACjC,IAAI,CAAC,KAAK,GAAG;oBACX,GAAG,IAAI,CAAC,KAAK;oBACb,MAAM,EAAE;wBACN,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM;wBACpB,UAAU,EAAE,SAAS;qBACtB;iBACF,CAAC;gBACF,MAAM;YACR,CAAC;YAED,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC/E,MAAM,WAAW,GAAG,OAAO,EAAE,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC;gBAClD,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,CAAC;gBAE7B,IAAI,CAAC,KAAK,GAAG;oBACX,GAAG,IAAI,CAAC,KAAK;oBACb,QAAQ,EAAE;wBACR,OAAO,EAAE,IAAI,CAAC,OAAO;wBACrB,kBAAkB,EAAE,WAAW;wBAC/B,YAAY,EAAE,KAAK;wBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;qBAChB;oBACD,iBAAiB,EAAE,IAAI;iBACxB,CAAC;gBAEF,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnE,MAAM;YACR,CAAC;YAED,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,IAAI,CAAC,KAAK,GAAG;oBACX,GAAG,IAAI,CAAC,KAAK;oBACb,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,iBAAiB,EAAE,IAAI;iBACxB,CAAC;gBACF,MAAM;YACR,CAAC;YAED,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,IAAI,CAAC,KAAK,GAAG;oBACX,GAAG,IAAI,CAAC,KAAK;oBACb,YAAY,EAAE,IAAI,CAAC,WAAW;oBAC9B,kBAAkB,EAAE,CAAC;iBACtB,CAAC;gBACF,MAAM;YACR,CAAC;YAED,KAAK,KAAK,CAAC,CAAC,CAAC;gBACX,IAAI,CAAC,KAAK,GAAG;oBACX,GAAG,IAAI,CAAC,KAAK;oBACb,SAAS,EAAE;wBACT,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS;wBACvB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,KAAK;qBAC5B;iBACF,CAAC;gBACF,MAAM;YACR,CAAC;YAED,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC;gBAChG,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;gBACvF,IAAI,CAAC,KAAK,GAAG;oBACX,GAAG,IAAI,CAAC,KAAK;oBACb,YAAY,EAAE,WAAW;oBACzB,kBAAkB,EAAE,CAAC;iBACtB,CAAC;gBACF,MAAM;YACR,CAAC;YAED,KAAK,YAAY,CAAC,CAAC,CAAC;gBAClB,IAAI,CAAC,cAAc,CAAC;oBAClB,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,IAAI,EAAE,IAAI,CAAC,IAAI;iBAChB,CAAC,CAAC;gBACH,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;oBAC7B,IAAI,CAAC,KAAK,GAAG;wBACX,GAAG,IAAI,CAAC,KAAK;wBACb,KAAK,EAAE;4BACL,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK;4BACnB,KAAK,EAAE,IAAI,CAAC,KAAK;yBAClB;qBACF,CAAC;gBACJ,CAAC;gBACD,MAAM;YACR,CAAC;YAED,KAAK,YAAY,CAAC,CAAC,CAAC;gBAClB,IAAI,CAAC,cAAc,CAAC;oBAClB,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,IAAI,EAAE,IAAI,CAAC,IAAI;iBAChB,CAAC,CAAC;gBACH,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;oBAC7B,IAAI,CAAC,KAAK,GAAG;wBACX,GAAG,IAAI,CAAC,KAAK;wBACb,KAAK,EAAE;4BACL,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK;4BACnB,KAAK,EAAE,IAAI;yBACZ;qBACF,CAAC;gBACJ,CAAC;gBACD,MAAM;YACR,CAAC;YAED,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;oBACxE,IAAI,CAAC,KAAK,GAAG;wBACX,GAAG,IAAI,CAAC,KAAK;wBACb,YAAY,EAAE,QAAQ,CAAC,WAAW;wBAClC,kBAAkB,EAAE,QAAQ,CAAC,aAAa;wBAC1C,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;qBAC7C,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,KAAK,GAAG;wBACX,GAAG,IAAI,CAAC,KAAK;wBACb,UAAU,EAAE,IAAI;wBAChB,iBAAiB,EAAE,KAAK;qBACzB,CAAC;gBACJ,CAAC;gBACD,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAEO,eAAe;QACrB,OAAO;YACL,EAAE,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;YACrD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;SAC9B,CAAC;IACJ,CAAC;IAEO,cAAc;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACpC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,0CAA0C;QAC1C,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACnC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC;IAEO,kBAAkB;QACxB,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QACrC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACjD,QAAQ,CAAC,YAAY,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,KAAiB;QACtC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAChD,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;CACF"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@kawaijs/runtime",
3
+ "version": "0.1.0",
4
+ "description": "Headless state machine, execution engine, save/load, and rollback system for Kawaijs",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "type": "module",
8
+ "files": [
9
+ "dist"
10
+ ],
11
+ "publishConfig": {
12
+ "access": "public"
13
+ },
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "git+https://github.com/biagio-scaglia/KawaiJS.git",
17
+ "directory": "packages/runtime"
18
+ },
19
+ "bugs": {
20
+ "url": "https://github.com/biagio-scaglia/KawaiJS/issues"
21
+ },
22
+ "homepage": "https://github.com/biagio-scaglia/KawaiJS#readme",
23
+ "scripts": {
24
+ "build": "tsc",
25
+ "typecheck": "tsc --noEmit"
26
+ },
27
+ "dependencies": {
28
+ "@kawaijs/ast": "^0.1.0"
29
+ },
30
+ "keywords": [
31
+ "kawaijs",
32
+ "runtime",
33
+ "virtual-machine",
34
+ "visual-novel",
35
+ "renpy"
36
+ ],
37
+ "author": "Biagio Scaglia",
38
+ "license": "MIT"
39
+ }