@datamoc/mw_games 0.12.0 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +124 -0
- package/README.md +5 -1
- package/dist/board/Classics.d.ts.map +1 -1
- package/dist/board/Classics.js +3 -2
- package/dist/board/Classics.js.map +1 -1
- package/dist/board/FogOfWar.d.ts.map +1 -1
- package/dist/board/FogOfWar.js +5 -2
- package/dist/board/FogOfWar.js.map +1 -1
- package/dist/board/HexSkirmish.d.ts.map +1 -1
- package/dist/board/HexSkirmish.js +2 -1
- package/dist/board/HexSkirmish.js.map +1 -1
- package/dist/core/DialogueText.d.ts +47 -0
- package/dist/core/DialogueText.d.ts.map +1 -0
- package/dist/core/DialogueText.js +43 -0
- package/dist/core/DialogueText.js.map +1 -0
- package/dist/core/Grid.d.ts +64 -0
- package/dist/core/Grid.d.ts.map +1 -0
- package/dist/core/Grid.js +76 -0
- package/dist/core/Grid.js.map +1 -0
- package/dist/core/Twee.d.ts +67 -0
- package/dist/core/Twee.d.ts.map +1 -0
- package/dist/core/Twee.js +140 -0
- package/dist/core/Twee.js.map +1 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +1 -1
- package/dist/mw_games.global.js +108 -107
- package/dist/roguelike/Level.d.ts.map +1 -1
- package/dist/roguelike/Level.js +5 -4
- package/dist/roguelike/Level.js.map +1 -1
- package/dist/rpg/EventRunner.d.ts +20 -0
- package/dist/rpg/EventRunner.d.ts.map +1 -1
- package/dist/rpg/EventRunner.js +52 -11
- package/dist/rpg/EventRunner.js.map +1 -1
- package/dist/rpg/dialogue-text.d.ts +81 -0
- package/dist/rpg/dialogue-text.d.ts.map +1 -0
- package/dist/rpg/dialogue-text.js +88 -0
- package/dist/rpg/dialogue-text.js.map +1 -0
- package/dist/rpg/index.d.ts +4 -1
- package/dist/rpg/index.d.ts.map +1 -1
- package/dist/rpg/index.js +2 -0
- package/dist/rpg/index.js.map +1 -1
- package/dist/rpg/twee-events.d.ts +48 -0
- package/dist/rpg/twee-events.d.ts.map +1 -0
- package/dist/rpg/twee-events.js +35 -0
- package/dist/rpg/twee-events.js.map +1 -0
- package/dist/two-d/Game.d.ts +24 -0
- package/dist/two-d/Game.d.ts.map +1 -1
- package/dist/two-d/Game.js +42 -1
- package/dist/two-d/Game.js.map +1 -1
- package/dist/two-d/ResolutionFit.d.ts +28 -0
- package/dist/two-d/ResolutionFit.d.ts.map +1 -0
- package/dist/two-d/ResolutionFit.js +39 -0
- package/dist/two-d/ResolutionFit.js.map +1 -0
- package/dist/two-d/stage/dialogue-text.d.ts +81 -0
- package/dist/two-d/stage/dialogue-text.d.ts.map +1 -0
- package/dist/two-d/stage/dialogue-text.js +95 -0
- package/dist/two-d/stage/dialogue-text.js.map +1 -0
- package/dist/two-d/stage/index.d.ts +1 -0
- package/dist/two-d/stage/index.d.ts.map +1 -1
- package/dist/two-d/stage/index.js +1 -0
- package/dist/two-d/stage/index.js.map +1 -1
- package/dist/two-d/stage/twee.d.ts +7 -25
- package/dist/two-d/stage/twee.d.ts.map +1 -1
- package/dist/two-d/stage/twee.js +10 -162
- package/dist/two-d/stage/twee.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +4 -1
- package/tools/classic-html.mjs +1 -1
- package/tools/compress-dist.d.mts +18 -0
- package/tools/compress-dist.mjs +5 -0
- package/tools/single-file.d.mts +16 -0
- package/tools/single-file.mjs +8 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Level.d.ts","sourceRoot":"","sources":["../../src/roguelike/Level.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Level.d.ts","sourceRoot":"","sources":["../../src/roguelike/Level.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AAEH,yFAAyF;AACzF,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,KAAK,CAAC;AAgD1C,gGAAgG;AAChG,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAE1F;AAED,MAAM,WAAW,WAAW;IAC3B,kCAAkC;IAClC,QAAQ,EAAE,OAAO,CAAC;IAElB,uCAAuC;IACvC,WAAW,EAAE,OAAO,CAAC;IAErB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,sFAAsF;IACtF,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC3C;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,IAAI,EAAE,WAAqD,CAAC;AACzE,eAAO,MAAM,KAAK,EAAE,WAAmD,CAAC;AAExE,MAAM,WAAW,IAAI;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,KAAK;IACjB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAE3B,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,iDAAiD;IACjD,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAE7B,OAAO,CAAC,KAAK,CAAgB;IAE7B,4EAA4E;IAC5E,KAAK,EAAE,IAAI,EAAE,CAAM;IAEnB,YACC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,WAAW,EAAE,EACpB,IAAI,SAAI,EACR,KAAK,GAAE,UAAqB,EAC5B,YAAY,CAAC,EAAE,MAAM,EAUrB;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAElC;IAED,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExB;IAED,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExB;IAED,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAEpC;IAED;;;;;;;OAOG;IACH,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,GAAE,CAAC,GAAG,CAAK,GAAG,KAAK,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAGpF;IAED;;;;;;;;OAQG;IACH,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAIpG;IAED;;;;;;OAMG;IACH,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAE9C;IAED,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAEhC;IAED,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAE5C;IAED,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,WAAW,CAExC;IAED,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAEtC;IAED,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAEzC;IAED,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAIvC;IAED,mEAAmE;IACnE,aAAa,IAAI,MAAM,EAAE,CAMxB;IAED,MAAM,IAAI;QACT,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,UAAU,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,KAAK,EAAE,IAAI,EAAE,CAAC;QACd,YAAY,CAAC,EAAE,MAAM,CAAC;KACtB,CASA;IAED;;;;OAIG;IACH,MAAM,CAAC,QAAQ,CACd,KAAK,EAAE,WAAW,EAAE,EACpB,IAAI,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,UAAU,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,KAAK,EAAE,IAAI,EAAE,CAAC;QACd,YAAY,CAAC,EAAE,MAAM,CAAC;KACtB,GACC,KAAK,CAKP;CACD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAK/D;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,SAAI,GAAG,OAAO,CAOlE"}
|
package/dist/roguelike/Level.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { hexNeighbors } from '../core/Hex.js';
|
|
2
|
+
import { cellIndex, cellInside, cellX, cellY } from '../core/Grid.js';
|
|
2
3
|
//one frozen table per topology, shared by every caller: these sit inside the hottest loops
|
|
3
4
|
//here (a flood fill calls `neighbors` per cell), so a fresh array per call was pure GC churn
|
|
4
5
|
const OFFSET_4 = [
|
|
@@ -76,16 +77,16 @@ export class Level {
|
|
|
76
77
|
return this.width * this.height;
|
|
77
78
|
}
|
|
78
79
|
index(x, y) {
|
|
79
|
-
return
|
|
80
|
+
return cellIndex(this.width, x, y);
|
|
80
81
|
}
|
|
81
82
|
xOf(cell) {
|
|
82
|
-
return
|
|
83
|
+
return cellX(this.width, cell);
|
|
83
84
|
}
|
|
84
85
|
yOf(cell) {
|
|
85
|
-
return
|
|
86
|
+
return cellY(this.width, cell);
|
|
86
87
|
}
|
|
87
88
|
inside(x, y) {
|
|
88
|
-
return
|
|
89
|
+
return cellInside(this.width, this.height, x, y);
|
|
89
90
|
}
|
|
90
91
|
/**
|
|
91
92
|
* The cells adjacent to `(x, y)` - six of them on a hex `Level`, four or eight on a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Level.js","sourceRoot":"","sources":["../../src/roguelike/Level.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"Level.js","sourceRoot":"","sources":["../../src/roguelike/Level.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,8 @@ export interface EventChoice {
|
|
|
6
6
|
text: string;
|
|
7
7
|
value?: unknown;
|
|
8
8
|
disabled?: boolean;
|
|
9
|
+
/** the passage to jump to when this choice is picked, in an `EventRunner.runStory` story */
|
|
10
|
+
goto?: string;
|
|
9
11
|
}
|
|
10
12
|
/** what the runner wants shown; how it looks is the presenter's business entirely */
|
|
11
13
|
export interface DialogueRequest {
|
|
@@ -70,9 +72,18 @@ export type EventCommand = {
|
|
|
70
72
|
target: string;
|
|
71
73
|
steps: MoveStep[];
|
|
72
74
|
};
|
|
75
|
+
} | {
|
|
76
|
+
goto: string;
|
|
73
77
|
} | {
|
|
74
78
|
call: (state: EventRunnerState) => void | Promise<void>;
|
|
75
79
|
};
|
|
80
|
+
/**
|
|
81
|
+
* A branching event script: named passages, the same graph shape `two-d/stage`'s
|
|
82
|
+
* `StoryScript` is - a passage runs until it falls off the end, a `{ goto }` command or a
|
|
83
|
+
* choice's own `goto` jumps to a different one. `EventRunner.runStory` follows it the same
|
|
84
|
+
* way `StageScript.runStory` follows a `StoryScript`.
|
|
85
|
+
*/
|
|
86
|
+
export type EventStoryScript = Record<string, readonly EventCommand[]>;
|
|
76
87
|
export interface EventRunnerState {
|
|
77
88
|
game: GameState;
|
|
78
89
|
/** whatever `ask` commands have stored, keyed by their `store` name */
|
|
@@ -106,6 +117,15 @@ export declare class EventRunner {
|
|
|
106
117
|
constructor(options: EventRunnerOptions);
|
|
107
118
|
cancel(): void;
|
|
108
119
|
run(commands: readonly EventCommand[]): Promise<EventRunnerState>;
|
|
120
|
+
/**
|
|
121
|
+
* Runs a graph of passages starting at `start`, following `goto` commands and choice
|
|
122
|
+
* jumps until a passage runs out or the script is cancelled - the `EventCommand`
|
|
123
|
+
* counterpart to `StageScript.runStory`.
|
|
124
|
+
*/
|
|
125
|
+
runStory(story: EventStoryScript, start: string): Promise<EventRunnerState>;
|
|
126
|
+
/** runs a plain list of commands, returning the passage to jump to, if any */
|
|
127
|
+
private runList;
|
|
128
|
+
/** runs one command; returns the passage to jump to, if the command jumps anywhere */
|
|
109
129
|
private step;
|
|
110
130
|
private speak;
|
|
111
131
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventRunner.d.ts","sourceRoot":"","sources":["../../src/rpg/EventRunner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"EventRunner.d.ts","sourceRoot":"","sources":["../../src/rpg/EventRunner.ts"],"names":[],"mappings":"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"}
|
package/dist/rpg/EventRunner.js
CHANGED
|
@@ -23,53 +23,94 @@ export class EventRunner {
|
|
|
23
23
|
this.cancelled = true;
|
|
24
24
|
}
|
|
25
25
|
async run(commands) {
|
|
26
|
-
|
|
26
|
+
const jump = await this.runList(commands);
|
|
27
|
+
if (jump !== undefined) {
|
|
28
|
+
throw new Error(`a "goto ${jump}" only runs inside runStory, not a straight run`);
|
|
29
|
+
}
|
|
30
|
+
return this.state;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Runs a graph of passages starting at `start`, following `goto` commands and choice
|
|
34
|
+
* jumps until a passage runs out or the script is cancelled - the `EventCommand`
|
|
35
|
+
* counterpart to `StageScript.runStory`.
|
|
36
|
+
*/
|
|
37
|
+
async runStory(story, start) {
|
|
38
|
+
if (!Object.prototype.hasOwnProperty.call(story, start)) {
|
|
39
|
+
throw new Error(`this event story has no passage named "${start}"`);
|
|
40
|
+
}
|
|
41
|
+
let commands = story[start];
|
|
42
|
+
let index = 0;
|
|
43
|
+
while (index < commands.length) {
|
|
27
44
|
if (this.cancelled)
|
|
28
45
|
break;
|
|
29
|
-
await this.step(
|
|
46
|
+
const jump = await this.step(commands[index]);
|
|
47
|
+
index++;
|
|
48
|
+
if (jump !== undefined) {
|
|
49
|
+
if (!Object.prototype.hasOwnProperty.call(story, jump)) {
|
|
50
|
+
throw new Error(`this event story has no passage named "${jump}"`);
|
|
51
|
+
}
|
|
52
|
+
commands = story[jump];
|
|
53
|
+
index = 0;
|
|
54
|
+
}
|
|
30
55
|
}
|
|
31
56
|
return this.state;
|
|
32
57
|
}
|
|
58
|
+
/** runs a plain list of commands, returning the passage to jump to, if any */
|
|
59
|
+
async runList(commands) {
|
|
60
|
+
for (const command of commands) {
|
|
61
|
+
if (this.cancelled)
|
|
62
|
+
break;
|
|
63
|
+
const jump = await this.step(command);
|
|
64
|
+
if (jump !== undefined)
|
|
65
|
+
return jump;
|
|
66
|
+
}
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
/** runs one command; returns the passage to jump to, if the command jumps anywhere */
|
|
33
70
|
async step(command) {
|
|
34
71
|
if ('say' in command) {
|
|
35
72
|
await this.speak(command.say, command.speaker, command.portrait);
|
|
36
|
-
return;
|
|
73
|
+
return undefined;
|
|
37
74
|
}
|
|
38
75
|
if ('ask' in command) {
|
|
39
76
|
const chosen = await this.speak(command.ask, command.speaker, command.portrait, command.choices);
|
|
40
77
|
if (command.store)
|
|
41
78
|
this.state.answers[command.store] = chosen;
|
|
42
|
-
|
|
79
|
+
//a MessageBox resolves with the chosen value, which defaults to the text
|
|
80
|
+
return command.choices.find((c) => (c.value ?? c.text) === chosen)?.goto;
|
|
43
81
|
}
|
|
44
82
|
if ('wait' in command) {
|
|
45
83
|
await new Promise((resolve) => setTimeout(resolve, command.wait * 1000));
|
|
46
|
-
return;
|
|
84
|
+
return undefined;
|
|
47
85
|
}
|
|
48
86
|
if ('setSwitch' in command) {
|
|
49
87
|
this.state.game.setSwitch(command.setSwitch, command.value);
|
|
50
|
-
return;
|
|
88
|
+
return undefined;
|
|
51
89
|
}
|
|
52
90
|
if ('setVariable' in command) {
|
|
53
91
|
this.state.game.setVariable(command.setVariable, command.value);
|
|
54
|
-
return;
|
|
92
|
+
return undefined;
|
|
55
93
|
}
|
|
56
94
|
if ('addVariable' in command) {
|
|
57
95
|
const current = this.state.game.variable(command.addVariable);
|
|
58
96
|
this.state.game.setVariable(command.addVariable, current + command.amount);
|
|
59
|
-
return;
|
|
97
|
+
return undefined;
|
|
60
98
|
}
|
|
61
99
|
if ('if' in command) {
|
|
62
100
|
const holds = conditionHolds(command.if, this.state.game);
|
|
63
|
-
|
|
64
|
-
return;
|
|
101
|
+
return this.runList(holds ? command.then : (command.else ?? []));
|
|
65
102
|
}
|
|
66
103
|
if ('move' in command) {
|
|
67
104
|
await this.options.move?.(command.move.target, command.move.steps);
|
|
68
|
-
return;
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
107
|
+
if ('goto' in command) {
|
|
108
|
+
return command.goto;
|
|
69
109
|
}
|
|
70
110
|
if ('call' in command) {
|
|
71
111
|
await command.call(this.state);
|
|
72
112
|
}
|
|
113
|
+
return undefined;
|
|
73
114
|
}
|
|
74
115
|
speak(text, speaker, portrait, choices) {
|
|
75
116
|
return this.options.present({ text, speaker, portrait, choices });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventRunner.js","sourceRoot":"","sources":["../../src/rpg/EventRunner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"EventRunner.js","sourceRoot":"","sources":["../../src/rpg/EventRunner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { Catalog, Direction } from '../i18n/index.ts';
|
|
2
|
+
import type { EventCommand } from './EventRunner.ts';
|
|
3
|
+
/**
|
|
4
|
+
* A terse, line-based text format for straight (non-branching) dialogue - the format a
|
|
5
|
+
* text-only RPG (`core` plus `rpg`, no renderer at all) can use for its own `EventCommand`
|
|
6
|
+
* scripts without depending on `two-d` for anything. `two-d/stage` has its own wrapper
|
|
7
|
+
* around the same parsing engine (`core.parseDialogueLines`) targeting `StageCommand`
|
|
8
|
+
* instead - declared separately for the same reason `EventChoice` is declared separately
|
|
9
|
+
* from `two-d/ui`'s `Choice`: a Pixi-based visual novel that never touches `rpg`'s map
|
|
10
|
+
* events should not have to pull the whole module in just to parse dialogue text, and a
|
|
11
|
+
* text-only RPG should not have to pull in Pixi either. The actual `@id`/`-` parsing logic
|
|
12
|
+
* lives once in `core.parseDialogueLines`, not copied between the two - only the final
|
|
13
|
+
* command shape (`speaker` here, `as` in `two-d/stage`) differs.
|
|
14
|
+
*
|
|
15
|
+
* Three kinds of line:
|
|
16
|
+
*
|
|
17
|
+
* - `@id text` names who is speaking and says `text`; `@id` alone (no text) just registers
|
|
18
|
+
* the speaker, without saying anything yet.
|
|
19
|
+
* - `- text` continues the two-speaker exchange the first two `@id` lines opened,
|
|
20
|
+
* alternating speaker on every line: the first `-` after the two openers goes to
|
|
21
|
+
* whichever of them did not speak last, and so on.
|
|
22
|
+
* - any other non-blank line narrates, with no speaker.
|
|
23
|
+
*
|
|
24
|
+
* ```
|
|
25
|
+
* @alice Hello.
|
|
26
|
+
* @bob Hi!
|
|
27
|
+
* - How are you?
|
|
28
|
+
* - Fine, and you?
|
|
29
|
+
* ```
|
|
30
|
+
*
|
|
31
|
+
* The `-` shorthand is deliberately capped at two speakers: it exists for the two-character
|
|
32
|
+
* back-and-forth, not as a guess at which of three or more people talks next. A third
|
|
33
|
+
* distinct `@id` anywhere in the source is a parse error rather than a silent guess; a scene
|
|
34
|
+
* with more than two speakers writes `@id` on every line instead, same as it does today.
|
|
35
|
+
*
|
|
36
|
+
* Lines reach `EventCommand.say` as plain, untranslated text - a game's own translation step
|
|
37
|
+
* decides how that text reaches a player, the same seam MWL's own `_("...")`-marked strings
|
|
38
|
+
* use (the source text doubles as the catalog key). `extractDialogueCatalog` builds that
|
|
39
|
+
* catalog the same way MWL's `extractCatalog` does, for a game that wants a translator-ready
|
|
40
|
+
* file to start from.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```ts
|
|
44
|
+
* import { parseDialogueText, EventRunner, GameState } from '@datamoc/mw_games/rpg';
|
|
45
|
+
*
|
|
46
|
+
* declare const game: GameState;
|
|
47
|
+
*
|
|
48
|
+
* const runner = new EventRunner({
|
|
49
|
+
* game,
|
|
50
|
+
* present: async (request) => {
|
|
51
|
+
* console.log(request.speaker ? `${request.speaker}: ${request.text}` : request.text);
|
|
52
|
+
* },
|
|
53
|
+
* });
|
|
54
|
+
* const commands = parseDialogueText(`
|
|
55
|
+
* @alice Hello.
|
|
56
|
+
* @bob Hi!
|
|
57
|
+
* - How are you?
|
|
58
|
+
* - Fine, and you?
|
|
59
|
+
* `);
|
|
60
|
+
* await runner.run(commands);
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export declare function parseDialogueText(source: string): EventCommand[];
|
|
64
|
+
/**
|
|
65
|
+
* Collects every `say`/`ask` line's text into an identity catalog - each key mapping to
|
|
66
|
+
* itself, the same shape MWL's own `extractCatalog` builds from `_("...")`-marked strings -
|
|
67
|
+
* so a translator has real entries to work from instead of a wall of untranslated dialogue.
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```ts
|
|
71
|
+
* import { parseDialogueText, extractDialogueCatalog } from '@datamoc/mw_games/rpg';
|
|
72
|
+
*
|
|
73
|
+
* const commands = parseDialogueText('@alice Hello.\n');
|
|
74
|
+
* console.log(extractDialogueCatalog(commands).messages); // { 'Hello.': 'Hello.' }
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
export declare function extractDialogueCatalog(commands: readonly EventCommand[], options?: {
|
|
78
|
+
locale?: string;
|
|
79
|
+
direction?: Direction;
|
|
80
|
+
}): Catalog;
|
|
81
|
+
//# sourceMappingURL=dialogue-text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialogue-text.d.ts","sourceRoot":"","sources":["../../src/rpg/dialogue-text.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,EAAE,CAIhE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CACrC,QAAQ,EAAE,SAAS,YAAY,EAAE,EACjC,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,SAAS,CAAA;CAAO,GACtD,OAAO,CAOT"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { parseDialogueLines } from '../core/DialogueText.js';
|
|
2
|
+
/**
|
|
3
|
+
* A terse, line-based text format for straight (non-branching) dialogue - the format a
|
|
4
|
+
* text-only RPG (`core` plus `rpg`, no renderer at all) can use for its own `EventCommand`
|
|
5
|
+
* scripts without depending on `two-d` for anything. `two-d/stage` has its own wrapper
|
|
6
|
+
* around the same parsing engine (`core.parseDialogueLines`) targeting `StageCommand`
|
|
7
|
+
* instead - declared separately for the same reason `EventChoice` is declared separately
|
|
8
|
+
* from `two-d/ui`'s `Choice`: a Pixi-based visual novel that never touches `rpg`'s map
|
|
9
|
+
* events should not have to pull the whole module in just to parse dialogue text, and a
|
|
10
|
+
* text-only RPG should not have to pull in Pixi either. The actual `@id`/`-` parsing logic
|
|
11
|
+
* lives once in `core.parseDialogueLines`, not copied between the two - only the final
|
|
12
|
+
* command shape (`speaker` here, `as` in `two-d/stage`) differs.
|
|
13
|
+
*
|
|
14
|
+
* Three kinds of line:
|
|
15
|
+
*
|
|
16
|
+
* - `@id text` names who is speaking and says `text`; `@id` alone (no text) just registers
|
|
17
|
+
* the speaker, without saying anything yet.
|
|
18
|
+
* - `- text` continues the two-speaker exchange the first two `@id` lines opened,
|
|
19
|
+
* alternating speaker on every line: the first `-` after the two openers goes to
|
|
20
|
+
* whichever of them did not speak last, and so on.
|
|
21
|
+
* - any other non-blank line narrates, with no speaker.
|
|
22
|
+
*
|
|
23
|
+
* ```
|
|
24
|
+
* @alice Hello.
|
|
25
|
+
* @bob Hi!
|
|
26
|
+
* - How are you?
|
|
27
|
+
* - Fine, and you?
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* The `-` shorthand is deliberately capped at two speakers: it exists for the two-character
|
|
31
|
+
* back-and-forth, not as a guess at which of three or more people talks next. A third
|
|
32
|
+
* distinct `@id` anywhere in the source is a parse error rather than a silent guess; a scene
|
|
33
|
+
* with more than two speakers writes `@id` on every line instead, same as it does today.
|
|
34
|
+
*
|
|
35
|
+
* Lines reach `EventCommand.say` as plain, untranslated text - a game's own translation step
|
|
36
|
+
* decides how that text reaches a player, the same seam MWL's own `_("...")`-marked strings
|
|
37
|
+
* use (the source text doubles as the catalog key). `extractDialogueCatalog` builds that
|
|
38
|
+
* catalog the same way MWL's `extractCatalog` does, for a game that wants a translator-ready
|
|
39
|
+
* file to start from.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```ts
|
|
43
|
+
* import { parseDialogueText, EventRunner, GameState } from '@datamoc/mw_games/rpg';
|
|
44
|
+
*
|
|
45
|
+
* declare const game: GameState;
|
|
46
|
+
*
|
|
47
|
+
* const runner = new EventRunner({
|
|
48
|
+
* game,
|
|
49
|
+
* present: async (request) => {
|
|
50
|
+
* console.log(request.speaker ? `${request.speaker}: ${request.text}` : request.text);
|
|
51
|
+
* },
|
|
52
|
+
* });
|
|
53
|
+
* const commands = parseDialogueText(`
|
|
54
|
+
* @alice Hello.
|
|
55
|
+
* @bob Hi!
|
|
56
|
+
* - How are you?
|
|
57
|
+
* - Fine, and you?
|
|
58
|
+
* `);
|
|
59
|
+
* await runner.run(commands);
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
export function parseDialogueText(source) {
|
|
63
|
+
return parseDialogueLines(source).map((line) => line.speaker === undefined ? { say: line.text } : { say: line.text, speaker: line.speaker });
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Collects every `say`/`ask` line's text into an identity catalog - each key mapping to
|
|
67
|
+
* itself, the same shape MWL's own `extractCatalog` builds from `_("...")`-marked strings -
|
|
68
|
+
* so a translator has real entries to work from instead of a wall of untranslated dialogue.
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```ts
|
|
72
|
+
* import { parseDialogueText, extractDialogueCatalog } from '@datamoc/mw_games/rpg';
|
|
73
|
+
*
|
|
74
|
+
* const commands = parseDialogueText('@alice Hello.\n');
|
|
75
|
+
* console.log(extractDialogueCatalog(commands).messages); // { 'Hello.': 'Hello.' }
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
export function extractDialogueCatalog(commands, options = {}) {
|
|
79
|
+
const messages = {};
|
|
80
|
+
for (const command of commands) {
|
|
81
|
+
if ('say' in command)
|
|
82
|
+
messages[command.say] = command.say;
|
|
83
|
+
else if ('ask' in command)
|
|
84
|
+
messages[command.ask] = command.ask;
|
|
85
|
+
}
|
|
86
|
+
return { locale: options.locale ?? 'en', direction: options.direction ?? 'ltr', messages };
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=dialogue-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialogue-text.js","sourceRoot":"","sources":["../../src/rpg/dialogue-text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAI7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC/C,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC9C,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAC3F,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,sBAAsB,CACrC,QAAiC,EACjC,OAAO,GAA+C,EAAE;IAExD,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAChC,IAAI,KAAK,IAAI,OAAO;YAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;aACrD,IAAI,KAAK,IAAI,OAAO;YAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;IAChE,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,KAAK,EAAE,QAAQ,EAAE,CAAC;AAC5F,CAAC"}
|
package/dist/rpg/index.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export { GameState } from './GameState.ts';
|
|
|
6
6
|
export { activePage, conditionHolds } from './Event.ts';
|
|
7
7
|
export type { EventTrigger, EventCondition, EventPage, MapEvent } from './Event.ts';
|
|
8
8
|
export { EventRunner } from './EventRunner.ts';
|
|
9
|
-
export type { EventCommand, EventRunnerState, EventRunnerOptions, MoveStep, DialoguePresenter, DialogueRequest, EventChoice, } from './EventRunner.ts';
|
|
9
|
+
export type { EventCommand, EventStoryScript, EventRunnerState, EventRunnerOptions, MoveStep, DialoguePresenter, DialogueRequest, EventChoice, } from './EventRunner.ts';
|
|
10
10
|
export { GridMover } from './GridMover.ts';
|
|
11
11
|
export type { GridMoverOptions, Direction4 } from './GridMover.ts';
|
|
12
12
|
export { MoveRouteRunner } from './MoveRoute.ts';
|
|
@@ -19,4 +19,7 @@ export { QuestLog, questsFromRows } from './Quest.ts';
|
|
|
19
19
|
export type { QuestStage, QuestDefinition, QuestStatus, QuestMarker, QuestStageRow } from './Quest.ts';
|
|
20
20
|
export { decodeMarshal, encodeMarshal, RubySymbol, hashDefaultOf, withHashDefault } from './Marshal.ts';
|
|
21
21
|
export type { RubyObject, RubyUserDefined } from './Marshal.ts';
|
|
22
|
+
export { parseDialogueText, extractDialogueCatalog } from './dialogue-text.ts';
|
|
23
|
+
export { importTwee } from './twee-events.ts';
|
|
24
|
+
export type { EventTwineStory } from './twee-events.ts';
|
|
22
25
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/rpg/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rpg/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAE,KAAK,IAAI,aAAa,EAAE,MAAM,cAAc,CAAC;AACtD,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACxD,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACpF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EACX,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,QAAQ,EACR,iBAAiB,EACjB,eAAe,EACf,WAAW,GACX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACxG,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACtF,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACtD,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACvG,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACxG,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rpg/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAE,KAAK,IAAI,aAAa,EAAE,MAAM,cAAc,CAAC;AACtD,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACxD,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACpF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EACX,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,QAAQ,EACR,iBAAiB,EACjB,eAAe,EACf,WAAW,GACX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACxG,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACtF,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACtD,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACvG,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACxG,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/rpg/index.js
CHANGED
|
@@ -9,4 +9,6 @@ export { FreeMover } from './FreeMover.js';
|
|
|
9
9
|
export { aabbOverlap, circleOverlap, circleAabbOverlap, resolveAabbAgainstTiles } from './Collision.js';
|
|
10
10
|
export { QuestLog, questsFromRows } from './Quest.js';
|
|
11
11
|
export { decodeMarshal, encodeMarshal, RubySymbol, hashDefaultOf, withHashDefault } from './Marshal.js';
|
|
12
|
+
export { parseDialogueText, extractDialogueCatalog } from './dialogue-text.js';
|
|
13
|
+
export { importTwee } from './twee-events.js';
|
|
12
14
|
//# sourceMappingURL=index.js.map
|
package/dist/rpg/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rpg/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,KAAK,IAAI,aAAa,EAAE,MAAM,cAAc,CAAC;AAEtD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rpg/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,KAAK,IAAI,aAAa,EAAE,MAAM,cAAc,CAAC;AAEtD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAW/C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAExG,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAExG,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { EventStoryScript } from './EventRunner.ts';
|
|
2
|
+
/**
|
|
3
|
+
* A story imported from Twine's Twee notation, ready for `EventRunner.runStory`.
|
|
4
|
+
*
|
|
5
|
+
* The `two-d/stage` counterpart, `importTwee`, targets `StageCommand`/`StoryScript` instead -
|
|
6
|
+
* declared independently here for the same reason `EventChoice` already duplicates
|
|
7
|
+
* `two-d/ui`'s `Choice`: a text-only RPG (`core` plus `rpg`, no renderer at all) should not
|
|
8
|
+
* have to depend on `two-d` just to import a branching Twee story, and a Pixi-based visual
|
|
9
|
+
* novel that never touches map events should not have to depend on `rpg` either.
|
|
10
|
+
*/
|
|
11
|
+
export interface EventTwineStory {
|
|
12
|
+
story: EventStoryScript;
|
|
13
|
+
/** `StoryData`'s start passage when the file names one, else the first passage */
|
|
14
|
+
start: string;
|
|
15
|
+
/** the `StoryTitle` passage, when the file has one */
|
|
16
|
+
title?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Reads a `.twee` file into an `EventStoryScript`.
|
|
20
|
+
*
|
|
21
|
+
* The actual parsing (passages, `[[links]]`, `StoryData`/`StoryTitle`) lives once in
|
|
22
|
+
* `core.parseTwee` - this is a thin wrapper naming the `rpg`-specific return type, the same
|
|
23
|
+
* way `two-d/stage.importTwee` wraps the same engine for `StageCommand`.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```ts
|
|
27
|
+
* import { importTwee, EventRunner, GameState, type DialoguePresenter } from '@datamoc/mw_games/rpg';
|
|
28
|
+
*
|
|
29
|
+
* declare const present: DialoguePresenter;
|
|
30
|
+
*
|
|
31
|
+
* const story = importTwee(`:: Start
|
|
32
|
+
* You stand at a crossroads.
|
|
33
|
+
*
|
|
34
|
+
* [[Take the left path->Left]]
|
|
35
|
+
* [[Take the right path->Right]]
|
|
36
|
+
*
|
|
37
|
+
* :: Left
|
|
38
|
+
* The path ends at a wall.
|
|
39
|
+
*
|
|
40
|
+
* :: Right
|
|
41
|
+
* An open road.
|
|
42
|
+
* `);
|
|
43
|
+
* const runner = new EventRunner({ present, game: new GameState() });
|
|
44
|
+
* await runner.runStory(story.story, story.start);
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export declare function importTwee(source: string): EventTwineStory;
|
|
48
|
+
//# sourceMappingURL=twee-events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"twee-events.d.ts","sourceRoot":"","sources":["../../src/rpg/twee-events.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD;;;;;;;;GAQG;AACH,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,gBAAgB,CAAC;IACxB,kFAAkF;IAClF,KAAK,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,CAG1D"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { parseTwee } from '../core/Twee.js';
|
|
2
|
+
/**
|
|
3
|
+
* Reads a `.twee` file into an `EventStoryScript`.
|
|
4
|
+
*
|
|
5
|
+
* The actual parsing (passages, `[[links]]`, `StoryData`/`StoryTitle`) lives once in
|
|
6
|
+
* `core.parseTwee` - this is a thin wrapper naming the `rpg`-specific return type, the same
|
|
7
|
+
* way `two-d/stage.importTwee` wraps the same engine for `StageCommand`.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { importTwee, EventRunner, GameState, type DialoguePresenter } from '@datamoc/mw_games/rpg';
|
|
12
|
+
*
|
|
13
|
+
* declare const present: DialoguePresenter;
|
|
14
|
+
*
|
|
15
|
+
* const story = importTwee(`:: Start
|
|
16
|
+
* You stand at a crossroads.
|
|
17
|
+
*
|
|
18
|
+
* [[Take the left path->Left]]
|
|
19
|
+
* [[Take the right path->Right]]
|
|
20
|
+
*
|
|
21
|
+
* :: Left
|
|
22
|
+
* The path ends at a wall.
|
|
23
|
+
*
|
|
24
|
+
* :: Right
|
|
25
|
+
* An open road.
|
|
26
|
+
* `);
|
|
27
|
+
* const runner = new EventRunner({ present, game: new GameState() });
|
|
28
|
+
* await runner.runStory(story.story, story.start);
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export function importTwee(source) {
|
|
32
|
+
const { story, start, title } = parseTwee(source);
|
|
33
|
+
return title === undefined ? { story, start } : { story, start, title };
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=twee-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"twee-events.js","sourceRoot":"","sources":["../../src/rpg/twee-events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAoB5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,UAAU,UAAU,CAAC,MAAc;IACxC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAClD,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACzE,CAAC"}
|
package/dist/two-d/Game.d.ts
CHANGED
|
@@ -53,6 +53,13 @@ export interface GameOptions {
|
|
|
53
53
|
* The application: owns the renderer, the loop, and the current scene.
|
|
54
54
|
*
|
|
55
55
|
* Construct it, `await start(FirstScene)`, and the rest is scenes.
|
|
56
|
+
*
|
|
57
|
+
* The canvas is drawn at the display's `devicePixelRatio`, up to what the device can actually
|
|
58
|
+
* make: a backing store of `viewport * devicePixelRatio` pixels is refused past the GPU's
|
|
59
|
+
* `MAX_TEXTURE_SIZE` (WebGL clamps it rather than failing, with nothing reported), so the
|
|
60
|
+
* resolution is reduced to the largest whole number that fits and a warning says so. A game
|
|
61
|
+
* therefore keeps rendering on a device with a small limit, softer than the display asked for
|
|
62
|
+
* rather than wrong; nothing changes on a device that can afford what it asked for.
|
|
56
63
|
*/
|
|
57
64
|
export declare class Game {
|
|
58
65
|
private static instance;
|
|
@@ -132,6 +139,23 @@ export declare class Game {
|
|
|
132
139
|
* Neither is read by the framework. Nothing depends on them existing.
|
|
133
140
|
*/
|
|
134
141
|
private expose;
|
|
142
|
+
/**
|
|
143
|
+
* Resizes the renderer to a resolution this device can actually afford.
|
|
144
|
+
*
|
|
145
|
+
* A full-window canvas at device resolution can ask for a backing store larger than the
|
|
146
|
+
* GPU's `MAX_TEXTURE_SIZE`, and WebGL clamps that silently instead of failing: the canvas
|
|
147
|
+
* keeps its size, the scene keeps being rendered into a surface that is not the one asked
|
|
148
|
+
* for, and nothing anywhere says so. A 1080-wide phone at `devicePixelRatio` 2.625 asks for
|
|
149
|
+
* 2121x4709 against the 4096 limit one emulator reported, and got a 2121x4096 drawing
|
|
150
|
+
* buffer; see `fitResolution` for the arithmetic and for what that investigation did and
|
|
151
|
+
* did not establish about the black screen that process showed.
|
|
152
|
+
*
|
|
153
|
+
* Called after `init`, whenever the renderer is resized (a rotation changes which one fits),
|
|
154
|
+
* and when `devicePixelRatio` itself changes. It returns immediately when the device can
|
|
155
|
+
* afford what was asked for, which is every ordinary case, so nothing about a normal
|
|
156
|
+
* startup changes.
|
|
157
|
+
*/
|
|
158
|
+
private fitResolutionToDevice;
|
|
135
159
|
private frame;
|
|
136
160
|
private switchNow;
|
|
137
161
|
/** a new scene alone: everything else is destroyed, the clocks restart */
|
package/dist/two-d/Game.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Game.d.ts","sourceRoot":"","sources":["../../src/two-d/Game.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAiB,MAAM,SAAS,CAAC;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"Game.d.ts","sourceRoot":"","sources":["../../src/two-d/Game.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAiB,MAAM,SAAS,CAAC;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAsD3C,MAAM,WAAW,WAAW;IAC3B,sEAAsE;IACtE,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAE3B,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC;IAEhC;;;;;;;;;;;;;;;;OAgBG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;CACrC;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,IAAI;IAChB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAqB;IAE5C,QAAQ,CAAC,GAAG,0CAAqB;IAEjC,mEAAmE;IACnE,OAAO,SAAK;IAEZ,wDAAwD;IACxD,SAAS,SAAK;IAEd,+EAA+E;IAC/E,SAAS,SAAK;IAEd,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,iBAAwB;IAExC,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,YAAY,CAAK;IAEzB,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,eAAe,CAA6B;IAEpD,YAAY,OAAO,GAAE,WAAgB,EAwBpC;IAED,6EAA6E;IAC7E,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,wEAAwE;IACxE,MAAM,KAAK,OAAO,IAAI,IAAI,CAGzB;IAEK,KAAK,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA+DrD;IAED;;;;;OAKG;IACH,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,IAAI,CAE3C;IAED;;;;;;OAMG;IACH,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,IAAI,CAEzC;IAED;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAE/B;IAED,yDAAyD;IACzD,IAAI,YAAY,IAAI,OAAO,GAAG,IAAI,CAEjC;IAED;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,IAAI,CAGzC;IAED;;;;;;;;OAQG;IACH,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAGrB;IAED;;;;;;;;;;OAUG;IACH,OAAO,CAAC,MAAM;IAMd;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,qBAAqB;IAc7B,OAAO,CAAC,KAAK;IA8Bb,OAAO,CAAC,SAAS;IAIjB,0EAA0E;IAC1E,OAAO,CAAC,WAAW;IAanB,+EAA+E;IAC/E,OAAO,CAAC,SAAS;IAYjB,kEAAkE;IAClE,OAAO,CAAC,QAAQ;IAMhB,OAAO,IAAI,IAAI,CAOd;CACD"}
|