@kawaijs/runtime 0.1.11 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -33,10 +33,22 @@ vm.rollback(); // Rolls back to Welcome
33
33
  ```
34
34
 
35
35
  ## Features
36
- - **Deterministic Virtual Machine**: Headless execution loop.
37
- - **Time-Travel Rollback**: Deep state snapshots for backwards navigation.
38
- - **Save & Load**: Pluggable storage adapters (LocalStorage, Memory).
39
- - **Dialogue History**: Built-in history logging for spoken lines.
36
+ - **Deterministic Virtual Machine**: Headless execution loop (dialogue, choices, audio, VFX state, camera events).
37
+ - **Time-Travel Rollback**: Deep state snapshots for backwards navigation (dialogue history trims with rollback).
38
+ - **Save & Load**: Pluggable storage adapters (LocalStorage, Memory). Schema **v2** persists dialogue history and migrates older slots via `migrateSaveSlot` / `migrateSaveV1ToV2`.
39
+ - **Dialogue History**: Built-in backlog with `trimTo` / `replaceAll` for rollback and load restore.
40
+ - **VFX state**: `sakura` / `rain` / `snow` / `fog` / `tint` — tint overlays keep the active weather effect.
41
+
42
+ ## Save schema
43
+
44
+ Current version: **2** (`CURRENT_SAVE_SCHEMA_VERSION`).
45
+
46
+ | Version | Notes |
47
+ |--------|--------|
48
+ | 1 | Snapshot + storyHash; history not persisted |
49
+ | 2 | Adds `historyEntries`; snapshot may include `historyLength` for rollback |
50
+
51
+ Loads always run through `migrateSaveSlot`, which normalizes missing fields and upgrades v1 → v2.
40
52
 
41
53
  ## License
42
54
  MIT © Biagio Scaglia
@@ -0,0 +1,25 @@
1
+ import type { SaveSlot } from './save.js';
2
+ /** Compact continue-link payload (schema-aligned SaveSlot, history trimmed). */
3
+ export interface ContinueLinkPayload {
4
+ readonly v: 1;
5
+ readonly slot: SaveSlot;
6
+ }
7
+ /** Soft limit for query string friendliness across browsers/hosts. */
8
+ export declare const CONTINUE_LINK_SOFT_MAX_CHARS = 7000;
9
+ /** Strip bulky / non-essential fields for URL transport. */
10
+ export declare function compactSaveForContinueLink(slot: SaveSlot, includeHistory?: boolean): SaveSlot;
11
+ /**
12
+ * Encode a save slot into a URL-safe continue token.
13
+ * Returns null if the payload cannot be kept under the soft size limit.
14
+ */
15
+ export declare function encodeContinueToken(slot: SaveSlot): string | null;
16
+ /** Decode a continue token back into a migrated SaveSlot. */
17
+ export declare function decodeContinueToken(token: string): SaveSlot | null;
18
+ /**
19
+ * Read a continue token from URL search / hash.
20
+ * Accepts `?continue=`, `?c=`, `#continue=`, `#c=`.
21
+ */
22
+ export declare function resolveContinueToken(search?: string, hash?: string): string | undefined;
23
+ /** Build a shareable absolute URL with `?continue=` (clears prior at/label/c). */
24
+ export declare function buildContinueHref(token: string, baseHref?: string): string;
25
+ //# sourceMappingURL=continue-link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"continue-link.d.ts","sourceRoot":"","sources":["../src/continue-link.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAG1C,gFAAgF;AAChF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;IACd,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;CACzB;AAGD,sEAAsE;AACtE,eAAO,MAAM,4BAA4B,OAAO,CAAC;AAyCjD,4DAA4D;AAC5D,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,QAAQ,EAAE,cAAc,UAAO,GAAG,QAAQ,CAuB1F;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAejE;AAED,6DAA6D;AAC7D,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAYlE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA6BvF;AAED,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAa1E"}
@@ -0,0 +1,144 @@
1
+ import { migrateSaveSlot } from './save.js';
2
+ const MAX_HISTORY_IN_LINK = 24;
3
+ /** Soft limit for query string friendliness across browsers/hosts. */
4
+ export const CONTINUE_LINK_SOFT_MAX_CHARS = 7000;
5
+ function toBase64Url(bytes) {
6
+ let binary = '';
7
+ for (let i = 0; i < bytes.length; i++) {
8
+ binary += String.fromCharCode(bytes[i]);
9
+ }
10
+ const b64 = typeof btoa === 'function'
11
+ ? btoa(binary)
12
+ : Buffer.from(bytes).toString('base64');
13
+ return b64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/g, '');
14
+ }
15
+ function fromBase64Url(input) {
16
+ const padded = input.replace(/-/g, '+').replace(/_/g, '/');
17
+ const padLen = (4 - (padded.length % 4)) % 4;
18
+ const b64 = padded + '='.repeat(padLen);
19
+ if (typeof atob === 'function') {
20
+ const binary = atob(b64);
21
+ const out = new Uint8Array(binary.length);
22
+ for (let i = 0; i < binary.length; i++)
23
+ out[i] = binary.charCodeAt(i);
24
+ return out;
25
+ }
26
+ return new Uint8Array(Buffer.from(b64, 'base64'));
27
+ }
28
+ function utf8Encode(text) {
29
+ if (typeof TextEncoder !== 'undefined') {
30
+ return new TextEncoder().encode(text);
31
+ }
32
+ return new Uint8Array(Buffer.from(text, 'utf8'));
33
+ }
34
+ function utf8Decode(bytes) {
35
+ if (typeof TextDecoder !== 'undefined') {
36
+ return new TextDecoder().decode(bytes);
37
+ }
38
+ return Buffer.from(bytes).toString('utf8');
39
+ }
40
+ /** Strip bulky / non-essential fields for URL transport. */
41
+ export function compactSaveForContinueLink(slot, includeHistory = true) {
42
+ const history = includeHistory
43
+ ? (slot.historyEntries ?? []).slice(-MAX_HISTORY_IN_LINK)
44
+ : [];
45
+ return {
46
+ schemaVersion: slot.schemaVersion ?? 2,
47
+ storyHash: slot.storyHash,
48
+ id: slot.id || 'continue',
49
+ name: slot.name || 'Continue Link',
50
+ timestamp: slot.timestamp,
51
+ snapshot: {
52
+ id: slot.snapshot.id,
53
+ timestamp: slot.snapshot.timestamp,
54
+ state: slot.snapshot.state,
55
+ historyLength: typeof slot.snapshot.historyLength === 'number'
56
+ ? slot.snapshot.historyLength
57
+ : history.length
58
+ },
59
+ previewText: slot.previewText,
60
+ historyEntries: history
61
+ };
62
+ }
63
+ /**
64
+ * Encode a save slot into a URL-safe continue token.
65
+ * Returns null if the payload cannot be kept under the soft size limit.
66
+ */
67
+ export function encodeContinueToken(slot) {
68
+ let compact = compactSaveForContinueLink(slot, true);
69
+ let payload = { v: 1, slot: compact };
70
+ let token = toBase64Url(utf8Encode(JSON.stringify(payload)));
71
+ if (token.length > CONTINUE_LINK_SOFT_MAX_CHARS) {
72
+ compact = compactSaveForContinueLink(slot, false);
73
+ payload = { v: 1, slot: compact };
74
+ token = toBase64Url(utf8Encode(JSON.stringify(payload)));
75
+ }
76
+ if (token.length > CONTINUE_LINK_SOFT_MAX_CHARS) {
77
+ return null;
78
+ }
79
+ return token;
80
+ }
81
+ /** Decode a continue token back into a migrated SaveSlot. */
82
+ export function decodeContinueToken(token) {
83
+ try {
84
+ const json = utf8Decode(fromBase64Url(token.trim()));
85
+ const parsed = JSON.parse(json);
86
+ const rawSlot = parsed && typeof parsed === 'object' && 'v' in parsed && parsed.v === 1
87
+ ? parsed.slot
88
+ : parsed;
89
+ return migrateSaveSlot(rawSlot);
90
+ }
91
+ catch {
92
+ return null;
93
+ }
94
+ }
95
+ /**
96
+ * Read a continue token from URL search / hash.
97
+ * Accepts `?continue=`, `?c=`, `#continue=`, `#c=`.
98
+ */
99
+ export function resolveContinueToken(search, hash) {
100
+ const tryParams = (raw, stripHash) => {
101
+ if (!raw)
102
+ return undefined;
103
+ const q = stripHash ? raw.replace(/^#/, '') : raw.replace(/^\?/, '');
104
+ if (!q)
105
+ return undefined;
106
+ // Support bare `#c=TOKEN` and `?c=TOKEN`
107
+ const params = new URLSearchParams(q.includes('=') ? q : '');
108
+ const fromKnown = (params.get('continue') ?? params.get('c') ?? '').trim();
109
+ if (fromKnown)
110
+ return fromKnown || undefined;
111
+ // Also accept `#continue=TOKEN` where the whole hash is key=value
112
+ if (stripHash && q.startsWith('continue=')) {
113
+ return decodeURIComponent(q.slice('continue='.length)).trim() || undefined;
114
+ }
115
+ if (stripHash && q.startsWith('c=')) {
116
+ return decodeURIComponent(q.slice(2)).trim() || undefined;
117
+ }
118
+ return undefined;
119
+ };
120
+ let searchStr = search;
121
+ let hashStr = hash;
122
+ if (searchStr === undefined && typeof window !== 'undefined') {
123
+ searchStr = window.location.search;
124
+ }
125
+ if (hashStr === undefined && typeof window !== 'undefined') {
126
+ hashStr = window.location.hash;
127
+ }
128
+ return tryParams(searchStr, false) ?? tryParams(hashStr, true);
129
+ }
130
+ /** Build a shareable absolute URL with `?continue=` (clears prior at/label/c). */
131
+ export function buildContinueHref(token, baseHref) {
132
+ const href = baseHref ??
133
+ (typeof window !== 'undefined' ? window.location.href : 'http://localhost/');
134
+ const url = new URL(href);
135
+ url.searchParams.delete('c');
136
+ url.searchParams.delete('at');
137
+ url.searchParams.delete('label');
138
+ url.searchParams.set('continue', token);
139
+ if (url.hash.startsWith('#continue=') || url.hash.startsWith('#c=')) {
140
+ url.hash = '';
141
+ }
142
+ return url.toString();
143
+ }
144
+ //# sourceMappingURL=continue-link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"continue-link.js","sourceRoot":"","sources":["../src/continue-link.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,10 @@
1
+ export declare const DANGEROUS_KEYS: Set<string>;
2
+ export declare function isSafeKey(key: string): boolean;
3
+ export declare function hasVar(variables: Record<string, unknown>, key: string): boolean;
1
4
  /**
2
5
  * Resolves a token or identifier against the current runtime variable store.
3
6
  */
4
- export declare function resolveValue(token: string, variables: Record<string, unknown>): unknown;
7
+ export declare function resolveValue(token: string, variables: Record<string, unknown>, isVariable?: boolean): unknown;
5
8
  /**
6
9
  * Evaluates a condition expression against the current variables.
7
10
  */
@@ -9,5 +12,15 @@ export declare function evaluateCondition(condition: string, variables: Record<s
9
12
  /**
10
13
  * Applies a variable assignment / arithmetic update.
11
14
  */
12
- export declare function applySetOperation(currentValue: unknown, operator: '=' | '+=' | '-=' | undefined, assignedValue: unknown, variables: Record<string, unknown>): unknown;
15
+ export declare function applySetOperation(currentValue: unknown, operator: '=' | '+=' | '-=' | undefined, assignedValue: unknown, variables: Record<string, unknown>, isVariable?: boolean): unknown;
16
+ /**
17
+ * Interpolates variables in dialogue or prompt strings (e.g. "Hello [player_name]!").
18
+ */
19
+ export declare function interpolateVariables(text: string, variables: Record<string, unknown>, options?: {
20
+ readonly lang?: string | null;
21
+ readonly i18n?: Readonly<Record<string, Readonly<Record<string, string>>>>;
22
+ }): string;
23
+ /** Built-in layer → z-index map (overridable with explicit `z N`). */
24
+ export declare const DEFAULT_LAYER_Z: Readonly<Record<string, number>>;
25
+ export declare function resolveSpriteZ(layer: string | undefined | null, z: number | undefined): number;
13
26
  //# sourceMappingURL=evaluator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"evaluator.d.ts","sourceRoot":"","sources":["../src/evaluator.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CA0BvF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAwDhG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,OAAO,EACrB,QAAQ,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,EACvC,aAAa,EAAE,OAAO,EACtB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAcT"}
1
+ {"version":3,"file":"evaluator.d.ts","sourceRoot":"","sources":["../src/evaluator.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,aAAqD,CAAC;AAEjF,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE9C;AAED,wBAAgB,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAG/E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,UAAU,CAAC,EAAE,OAAO,GACnB,OAAO,CAoCT;AAiDD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAuEhG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,OAAO,EACrB,QAAQ,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,EACvC,aAAa,EAAE,OAAO,EACtB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,UAAU,CAAC,EAAE,OAAO,GACnB,OAAO,CAiBT;AACD;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,OAAO,CAAC,EAAE;IACR,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;CAC5E,GACA,MAAM,CAwBR;AAED,sEAAsE;AACtE,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAK5D,CAAC;AAEF,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAI9F"}
package/dist/evaluator.js CHANGED
@@ -1,7 +1,16 @@
1
+ export const DANGEROUS_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
2
+ export function isSafeKey(key) {
3
+ return !DANGEROUS_KEYS.has(key);
4
+ }
5
+ export function hasVar(variables, key) {
6
+ if (!isSafeKey(key))
7
+ return false;
8
+ return Object.prototype.hasOwnProperty.call(variables, key);
9
+ }
1
10
  /**
2
11
  * Resolves a token or identifier against the current runtime variable store.
3
12
  */
4
- export function resolveValue(token, variables) {
13
+ export function resolveValue(token, variables, isVariable) {
5
14
  const trimmed = token.trim();
6
15
  // Boolean literals
7
16
  if (trimmed === 'true')
@@ -17,12 +26,62 @@ export function resolveValue(token, variables) {
17
26
  (trimmed.startsWith("'") && trimmed.endsWith("'"))) {
18
27
  return trimmed.slice(1, -1);
19
28
  }
29
+ // Explicitly marked as not a variable (string literal without quotes)
30
+ if (isVariable === false) {
31
+ return trimmed;
32
+ }
20
33
  // Lookup in variable store
21
- if (trimmed in variables) {
34
+ if (hasVar(variables, trimmed)) {
22
35
  return variables[trimmed];
23
36
  }
37
+ // If token is a valid identifier syntax but not defined in store, resolve to undefined
38
+ if (/^[a-zA-Z_][a-zA-Z0-9_-]*$/.test(trimmed)) {
39
+ return undefined;
40
+ }
24
41
  return trimmed;
25
42
  }
43
+ function findOperatorOutsideQuotes(str, targetOps) {
44
+ let inQuote = null;
45
+ for (let i = 0; i < str.length; i++) {
46
+ const ch = str[i];
47
+ if (inQuote) {
48
+ if (ch === inQuote && str[i - 1] !== '\\')
49
+ inQuote = null;
50
+ continue;
51
+ }
52
+ if (ch === '"' || ch === "'") {
53
+ inQuote = ch;
54
+ continue;
55
+ }
56
+ for (const op of targetOps) {
57
+ if (str.startsWith(op, i)) {
58
+ if (op === 'and' || op === 'or') {
59
+ const before = i === 0 ? ' ' : str[i - 1];
60
+ const after = i + op.length >= str.length ? ' ' : str[i + op.length];
61
+ if (/\s/.test(before) && /\s/.test(after)) {
62
+ return { op, index: i };
63
+ }
64
+ }
65
+ else {
66
+ return { op, index: i };
67
+ }
68
+ }
69
+ }
70
+ }
71
+ return null;
72
+ }
73
+ function isTruthy(val) {
74
+ if (val === false ||
75
+ val === 'false' ||
76
+ val === 0 ||
77
+ val === '0' ||
78
+ val === undefined ||
79
+ val === null ||
80
+ val === '') {
81
+ return false;
82
+ }
83
+ return Boolean(val);
84
+ }
26
85
  /**
27
86
  * Evaluates a condition expression against the current variables.
28
87
  */
@@ -32,6 +91,20 @@ export function evaluateCondition(condition, variables) {
32
91
  return true;
33
92
  if (trimmed === 'false')
34
93
  return false;
94
+ // 1. Compound OR ('||' or ' or ')
95
+ const orMatch = findOperatorOutsideQuotes(trimmed, ['||', 'or']);
96
+ if (orMatch) {
97
+ const left = trimmed.slice(0, orMatch.index);
98
+ const right = trimmed.slice(orMatch.index + orMatch.op.length);
99
+ return evaluateCondition(left, variables) || evaluateCondition(right, variables);
100
+ }
101
+ // 2. Compound AND ('&&' or ' and ')
102
+ const andMatch = findOperatorOutsideQuotes(trimmed, ['&&', 'and']);
103
+ if (andMatch) {
104
+ const left = trimmed.slice(0, andMatch.index);
105
+ const right = trimmed.slice(andMatch.index + andMatch.op.length);
106
+ return evaluateCondition(left, variables) && evaluateCondition(right, variables);
107
+ }
35
108
  const toNum = (v) => {
36
109
  if (typeof v === 'number')
37
110
  return v;
@@ -42,56 +115,61 @@ export function evaluateCondition(condition, variables) {
42
115
  const n = Number(v);
43
116
  return isNaN(n) ? 0 : n;
44
117
  };
45
- // Binary comparison operators: >=, <=, !=, ==, >, <
118
+ // 3. Binary comparison operators: >=, <=, !=, ==, >, <
46
119
  const operators = ['>=', '<=', '!=', '==', '>', '<'];
47
- for (const op of operators) {
48
- const idx = trimmed.indexOf(op);
49
- if (idx !== -1) {
50
- const leftRaw = trimmed.slice(0, idx);
51
- const rightRaw = trimmed.slice(idx + op.length);
52
- const leftVal = resolveValue(leftRaw, variables);
53
- const rightVal = resolveValue(rightRaw, variables);
54
- switch (op) {
55
- case '>=':
120
+ const cmpMatch = findOperatorOutsideQuotes(trimmed, operators);
121
+ if (cmpMatch) {
122
+ const op = cmpMatch.op;
123
+ const leftRaw = trimmed.slice(0, cmpMatch.index);
124
+ const rightRaw = trimmed.slice(cmpMatch.index + op.length);
125
+ const leftVal = resolveValue(leftRaw, variables);
126
+ const rightVal = resolveValue(rightRaw, variables);
127
+ const isLeftNumeric = typeof leftVal === 'number' || (!isNaN(Number(leftVal)) && typeof leftVal === 'string' && leftVal.trim() !== '');
128
+ const isRightNumeric = typeof rightVal === 'number' || (!isNaN(Number(rightVal)) && typeof rightVal === 'string' && rightVal.trim() !== '');
129
+ switch (op) {
130
+ case '==':
131
+ return leftVal === rightVal || String(leftVal) === String(rightVal);
132
+ case '!=':
133
+ return leftVal !== rightVal && String(leftVal) !== String(rightVal);
134
+ case '>=':
135
+ if (isLeftNumeric && isRightNumeric)
56
136
  return toNum(leftVal) >= toNum(rightVal);
57
- case '<=':
137
+ return String(leftVal ?? '') >= String(rightVal ?? '');
138
+ case '<=':
139
+ if (isLeftNumeric && isRightNumeric)
58
140
  return toNum(leftVal) <= toNum(rightVal);
59
- case '>':
141
+ return String(leftVal ?? '') <= String(rightVal ?? '');
142
+ case '>':
143
+ if (isLeftNumeric && isRightNumeric)
60
144
  return toNum(leftVal) > toNum(rightVal);
61
- case '<':
145
+ return String(leftVal ?? '') > String(rightVal ?? '');
146
+ case '<':
147
+ if (isLeftNumeric && isRightNumeric)
62
148
  return toNum(leftVal) < toNum(rightVal);
63
- case '==':
64
- return leftVal === rightVal || String(leftVal) === String(rightVal);
65
- case '!=':
66
- return leftVal !== rightVal && String(leftVal) !== String(rightVal);
67
- }
149
+ return String(leftVal ?? '') < String(rightVal ?? '');
68
150
  }
69
151
  }
70
- // Negation
152
+ // 4. Negation
71
153
  if (trimmed.startsWith('!')) {
72
- const varName = trimmed.slice(1).trim();
73
- const val = variables[varName];
74
- if (val === false || val === 'false' || val === 0 || val === '0' || val === undefined || val === null || val === '') {
75
- return true;
76
- }
77
- return false;
78
- }
79
- // Single identifier / flag
80
- const val = trimmed in variables ? variables[trimmed] : resolveValue(trimmed, variables);
81
- if (val === false || val === 'false' || val === 0 || val === '0' || val === undefined || val === null || val === '') {
82
- return false;
154
+ const inner = trimmed.slice(1).trim();
155
+ return !evaluateCondition(inner, variables);
83
156
  }
84
- return Boolean(val);
157
+ // 5. Single identifier / flag
158
+ const val = hasVar(variables, trimmed) ? variables[trimmed] : resolveValue(trimmed, variables);
159
+ return isTruthy(val);
85
160
  }
86
161
  /**
87
162
  * Applies a variable assignment / arithmetic update.
88
163
  */
89
- export function applySetOperation(currentValue, operator, assignedValue, variables) {
90
- const resolved = typeof assignedValue === 'string' && assignedValue in variables
164
+ export function applySetOperation(currentValue, operator, assignedValue, variables, isVariable) {
165
+ const resolved = isVariable !== false && typeof assignedValue === 'string' && hasVar(variables, assignedValue)
91
166
  ? variables[assignedValue]
92
167
  : assignedValue;
93
168
  switch (operator) {
94
169
  case '+=':
170
+ if (typeof currentValue === 'string' || typeof resolved === 'string') {
171
+ return String(currentValue ?? '') + String(resolved ?? '');
172
+ }
95
173
  return Number(currentValue ?? 0) + Number(resolved);
96
174
  case '-=':
97
175
  return Number(currentValue ?? 0) - Number(resolved);
@@ -100,4 +178,48 @@ export function applySetOperation(currentValue, operator, assignedValue, variabl
100
178
  return resolved;
101
179
  }
102
180
  }
181
+ /**
182
+ * Interpolates variables in dialogue or prompt strings (e.g. "Hello [player_name]!").
183
+ */
184
+ export function interpolateVariables(text, variables, options) {
185
+ if (!text)
186
+ return text;
187
+ let out = text;
188
+ // i18n: {t:key} or {t:key|fallback}
189
+ if (out.includes('{t:')) {
190
+ const lang = options?.lang || 'en';
191
+ const table = options?.i18n?.[lang] ?? options?.i18n?.['en'];
192
+ out = out.replace(/\{t:([a-zA-Z0-9_.-]+)(?:\|([^}]*))?\}/g, (match, key, fallback) => {
193
+ const val = table?.[key];
194
+ if (val !== undefined)
195
+ return val;
196
+ if (fallback !== undefined)
197
+ return fallback;
198
+ return match;
199
+ });
200
+ }
201
+ if (!out.includes('['))
202
+ return out;
203
+ return out.replace(/\[([a-zA-Z_][a-zA-Z0-9_]*)\]/g, (match, varName) => {
204
+ if (hasVar(variables, varName)) {
205
+ const val = variables[varName];
206
+ return val !== undefined && val !== null ? String(val) : '';
207
+ }
208
+ return match;
209
+ });
210
+ }
211
+ /** Built-in layer → z-index map (overridable with explicit `z N`). */
212
+ export const DEFAULT_LAYER_Z = {
213
+ background: 0,
214
+ master: 10,
215
+ overlay: 30,
216
+ ui: 50
217
+ };
218
+ export function resolveSpriteZ(layer, z) {
219
+ if (typeof z === 'number' && Number.isFinite(z))
220
+ return z;
221
+ if (layer && DEFAULT_LAYER_Z[layer] !== undefined)
222
+ return DEFAULT_LAYER_Z[layer];
223
+ return DEFAULT_LAYER_Z.master ?? 10;
224
+ }
103
225
  //# sourceMappingURL=evaluator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../src/evaluator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../src/evaluator.ts"],"names":[],"mappings":"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"}
package/dist/history.d.ts CHANGED
@@ -11,6 +11,11 @@ export declare class HistoryManager {
11
11
  constructor(maxEntries?: number);
12
12
  addEntry(speaker: string | undefined, speakerDisplayName: string | undefined, text: string): DialogueHistoryEntry;
13
13
  getEntries(): readonly DialogueHistoryEntry[];
14
+ getLength(): number;
15
+ /** Keep only the first `count` entries (used on rollback). */
16
+ trimTo(count: number): void;
17
+ /** Replace backlog (used on load / save restore). */
18
+ replaceAll(entries: readonly DialogueHistoryEntry[]): void;
14
19
  clear(): void;
15
20
  }
16
21
  //# sourceMappingURL=history.d.ts.map
@@ -1 +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"}
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,SAAS,IAAI,MAAM;IAI1B,8DAA8D;IACvD,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAOlC,qDAAqD;IAC9C,UAAU,CAAC,OAAO,EAAE,SAAS,oBAAoB,EAAE,GAAG,IAAI;IAI1D,KAAK,IAAI,IAAI;CAGrB"}
package/dist/history.js CHANGED
@@ -1,7 +1,7 @@
1
1
  export class HistoryManager {
2
2
  entries = [];
3
3
  maxEntries;
4
- constructor(maxEntries = 200) {
4
+ constructor(maxEntries = 120) {
5
5
  this.maxEntries = maxEntries;
6
6
  }
7
7
  addEntry(speaker, speakerDisplayName, text) {
@@ -21,6 +21,20 @@ export class HistoryManager {
21
21
  getEntries() {
22
22
  return this.entries;
23
23
  }
24
+ getLength() {
25
+ return this.entries.length;
26
+ }
27
+ /** Keep only the first `count` entries (used on rollback). */
28
+ trimTo(count) {
29
+ const n = Math.max(0, Math.min(count, this.entries.length));
30
+ if (n < this.entries.length) {
31
+ this.entries = this.entries.slice(0, n);
32
+ }
33
+ }
34
+ /** Replace backlog (used on load / save restore). */
35
+ replaceAll(entries) {
36
+ this.entries = entries.slice(-this.maxEntries).map((e) => ({ ...e }));
37
+ }
24
38
  clear() {
25
39
  this.entries = [];
26
40
  }
@@ -1 +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"}
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,SAAS;QACd,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,8DAA8D;IACvD,MAAM,CAAC,KAAa;QACzB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5D,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,qDAAqD;IAC9C,UAAU,CAAC,OAAwC;QACxD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACxE,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACpB,CAAC;CACF"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export * from './state.js';
2
2
  export * from './history.js';
3
3
  export * from './save.js';
4
+ export * from './continue-link.js';
4
5
  export * from './evaluator.js';
5
6
  export * from './vm.js';
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC"}
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,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  export * from './state.js';
2
2
  export * from './history.js';
3
3
  export * from './save.js';
4
+ export * from './continue-link.js';
4
5
  export * from './evaluator.js';
5
6
  export * from './vm.js';
6
7
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +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,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC"}
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,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC"}