@datamoc/mw_games 0.7.2 → 0.7.4
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 +33 -0
- package/README.md +1 -1
- package/dist/board/FogOfWar.d.ts +6 -0
- package/dist/board/FogOfWar.d.ts.map +1 -1
- package/dist/board/FogOfWar.js +15 -0
- package/dist/board/FogOfWar.js.map +1 -1
- package/dist/core/ActionJournal.d.ts +36 -0
- package/dist/core/ActionJournal.d.ts.map +1 -0
- package/dist/core/ActionJournal.js +60 -0
- package/dist/core/ActionJournal.js.map +1 -0
- package/dist/core/Pathfinding.d.ts +41 -0
- package/dist/core/Pathfinding.d.ts.map +1 -0
- package/dist/core/Pathfinding.js +86 -0
- package/dist/core/Pathfinding.js.map +1 -0
- package/dist/core/State.d.ts +59 -0
- package/dist/core/State.d.ts.map +1 -0
- package/dist/core/State.js +100 -0
- package/dist/core/State.js.map +1 -0
- package/dist/core/index.d.ts +6 -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 +97 -97
- package/dist/mwl/hooks.d.ts +3 -2
- package/dist/mwl/hooks.d.ts.map +1 -1
- package/dist/mwl/hooks.js.map +1 -1
- package/dist/mwl/index.d.ts +3 -3
- package/dist/mwl/index.d.ts.map +1 -1
- package/dist/mwl/index.js +1 -1
- package/dist/mwl/index.js.map +1 -1
- package/dist/mwl/report.d.ts +17 -1
- package/dist/mwl/report.d.ts.map +1 -1
- package/dist/mwl/report.js +33 -0
- package/dist/mwl/report.js.map +1 -1
- package/dist/mwl/runtime.d.ts +46 -1
- package/dist/mwl/runtime.d.ts.map +1 -1
- package/dist/mwl/runtime.js +237 -19
- package/dist/mwl/runtime.js.map +1 -1
- package/dist/mwl/schema.d.ts.map +1 -1
- package/dist/mwl/schema.js +136 -1
- package/dist/mwl/schema.js.map +1 -1
- package/dist/roguelike/FieldOfView.d.ts +3 -2
- package/dist/roguelike/FieldOfView.d.ts.map +1 -1
- package/dist/roguelike/FieldOfView.js +3 -2
- package/dist/roguelike/FieldOfView.js.map +1 -1
- package/dist/roguelike/Level.d.ts +9 -1
- package/dist/roguelike/Level.d.ts.map +1 -1
- package/dist/roguelike/Level.js +6 -2
- package/dist/roguelike/Level.js.map +1 -1
- package/dist/roguelike/MultiTurnBeam.d.ts +70 -0
- package/dist/roguelike/MultiTurnBeam.d.ts.map +1 -0
- package/dist/roguelike/MultiTurnBeam.js +117 -0
- package/dist/roguelike/MultiTurnBeam.js.map +1 -0
- package/dist/roguelike/Scheduler.d.ts +5 -1
- package/dist/roguelike/Scheduler.d.ts.map +1 -1
- package/dist/roguelike/Scheduler.js +10 -3
- package/dist/roguelike/Scheduler.js.map +1 -1
- package/dist/roguelike/Targeting.d.ts +51 -0
- package/dist/roguelike/Targeting.d.ts.map +1 -1
- package/dist/roguelike/Targeting.js +87 -2
- package/dist/roguelike/Targeting.js.map +1 -1
- package/dist/roguelike/index.d.ts +4 -2
- package/dist/roguelike/index.d.ts.map +1 -1
- package/dist/roguelike/index.js +2 -1
- package/dist/roguelike/index.js.map +1 -1
- package/dist/rpg/automap.d.ts +4 -0
- package/dist/rpg/automap.d.ts.map +1 -1
- package/dist/rpg/automap.js +5 -2
- package/dist/rpg/automap.js.map +1 -1
- package/dist/simulation/Campaign.d.ts +60 -0
- package/dist/simulation/Campaign.d.ts.map +1 -0
- package/dist/simulation/Campaign.js +85 -0
- package/dist/simulation/Campaign.js.map +1 -0
- package/dist/simulation/Harness.d.ts +26 -0
- package/dist/simulation/Harness.d.ts.map +1 -0
- package/dist/simulation/Harness.js +25 -0
- package/dist/simulation/Harness.js.map +1 -0
- package/dist/simulation/index.d.ts +4 -0
- package/dist/simulation/index.d.ts.map +1 -1
- package/dist/simulation/index.js +2 -0
- package/dist/simulation/index.js.map +1 -1
- package/dist/two-d/render/ImageModifiers.d.ts +58 -0
- package/dist/two-d/render/ImageModifiers.d.ts.map +1 -0
- package/dist/two-d/render/ImageModifiers.js +145 -0
- package/dist/two-d/render/ImageModifiers.js.map +1 -0
- package/dist/two-d/render/Minimap.d.ts +24 -0
- package/dist/two-d/render/Minimap.d.ts.map +1 -1
- package/dist/two-d/render/Minimap.js +52 -14
- package/dist/two-d/render/Minimap.js.map +1 -1
- package/dist/two-d/render/Particles.d.ts +16 -0
- package/dist/two-d/render/Particles.d.ts.map +1 -1
- package/dist/two-d/render/Particles.js +15 -2
- package/dist/two-d/render/Particles.js.map +1 -1
- package/dist/two-d/render/index.d.ts +4 -2
- package/dist/two-d/render/index.d.ts.map +1 -1
- package/dist/two-d/render/index.js +2 -1
- package/dist/two-d/render/index.js.map +1 -1
- package/dist/two-d/ui/Bar.d.ts +21 -2
- package/dist/two-d/ui/Bar.d.ts.map +1 -1
- package/dist/two-d/ui/Bar.js +27 -5
- package/dist/two-d/ui/Bar.js.map +1 -1
- package/dist/two-d/ui/FloatingText.d.ts +42 -1
- package/dist/two-d/ui/FloatingText.d.ts.map +1 -1
- package/dist/two-d/ui/FloatingText.js +52 -4
- package/dist/two-d/ui/FloatingText.js.map +1 -1
- package/dist/two-d/ui/FloatingTextStack.d.ts +77 -0
- package/dist/two-d/ui/FloatingTextStack.d.ts.map +1 -0
- package/dist/two-d/ui/FloatingTextStack.js +99 -0
- package/dist/two-d/ui/FloatingTextStack.js.map +1 -0
- package/dist/two-d/ui/index.d.ts +3 -1
- package/dist/two-d/ui/index.d.ts.map +1 -1
- package/dist/two-d/ui/index.js +2 -1
- package/dist/two-d/ui/index.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +5 -1
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { resolveAreaOnLevel } from './Targeting.js';
|
|
2
|
+
/**
|
|
3
|
+
* Advances a straight beam one cell per turn.
|
|
4
|
+
*
|
|
5
|
+
* The framework owns traversal and timing. A game supplies target lookup and damage
|
|
6
|
+
* application, so this stays useful for hit points, shields, status effects and any other
|
|
7
|
+
* combat model. The path is captured at construction time, while blockers and targets are
|
|
8
|
+
* checked when each cell is reached. `advance` is deterministic when those callbacks are.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* import { Level, FLOOR, WALL, MultiTurnBeam } from '@datamoc/mw_games/roguelike';
|
|
13
|
+
*
|
|
14
|
+
* const level = new Level(8, 1, [WALL, FLOOR], 1);
|
|
15
|
+
* const beam = new MultiTurnBeam({ level, from: { x: 0, y: 0 }, target: { x: 3, y: 0 }, damage: 4 });
|
|
16
|
+
* beam.start();
|
|
17
|
+
* beam.advance(); // reaches x=1; call again on the next turn
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export class MultiTurnBeam {
|
|
21
|
+
constructor(options) {
|
|
22
|
+
this.index = 0;
|
|
23
|
+
this.state = 'idle';
|
|
24
|
+
if (typeof options.damage !== 'function' && !Number.isFinite(options.damage)) {
|
|
25
|
+
throw new Error('beam damage must be a finite number or a function');
|
|
26
|
+
}
|
|
27
|
+
if (typeof options.damage === 'number' && options.damage < 0) {
|
|
28
|
+
throw new Error('beam damage must be non-negative');
|
|
29
|
+
}
|
|
30
|
+
this.options = options;
|
|
31
|
+
this.path = resolveAreaOnLevel(options.level, options.from, options.target, { kind: 'line' }).slice(1);
|
|
32
|
+
}
|
|
33
|
+
get active() {
|
|
34
|
+
return this.state === 'active';
|
|
35
|
+
}
|
|
36
|
+
get done() {
|
|
37
|
+
return this.state === 'done' || this.state === 'blocked' || this.state === 'cancelled';
|
|
38
|
+
}
|
|
39
|
+
get currentPath() {
|
|
40
|
+
return this.path;
|
|
41
|
+
}
|
|
42
|
+
start() {
|
|
43
|
+
if (this.state !== 'idle')
|
|
44
|
+
return false;
|
|
45
|
+
this.state = this.path.length === 0 ? 'done' : 'active';
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
/** Resolves and applies one beam cell. Call once per game turn. */
|
|
49
|
+
advance() {
|
|
50
|
+
if (this.state !== 'active') {
|
|
51
|
+
return {
|
|
52
|
+
status: this.state,
|
|
53
|
+
cell: null,
|
|
54
|
+
step: this.index,
|
|
55
|
+
remaining: Math.max(0, this.path.length - this.index),
|
|
56
|
+
targets: [],
|
|
57
|
+
damage: 0,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
const cell = this.path[this.index];
|
|
61
|
+
const context = {
|
|
62
|
+
cell: { ...cell },
|
|
63
|
+
step: this.index,
|
|
64
|
+
remaining: this.path.length - this.index - 1,
|
|
65
|
+
};
|
|
66
|
+
const blocked = !this.options.level.inside(cell.x, cell.y) ||
|
|
67
|
+
(this.options.stopAtOpaque !== false && !this.options.level.transparent(cell.x, cell.y)) ||
|
|
68
|
+
this.options.isBlocked?.(cell, context) === true;
|
|
69
|
+
if (blocked) {
|
|
70
|
+
this.state = 'blocked';
|
|
71
|
+
return {
|
|
72
|
+
status: 'blocked',
|
|
73
|
+
cell: { ...cell },
|
|
74
|
+
step: this.index,
|
|
75
|
+
remaining: context.remaining,
|
|
76
|
+
targets: [],
|
|
77
|
+
damage: 0,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
const targets = this.options.targetsAt?.(cell) ?? [];
|
|
81
|
+
let damage = 0;
|
|
82
|
+
for (const target of targets) {
|
|
83
|
+
const amount = typeof this.options.damage === 'function' ? this.options.damage(target, context) : this.options.damage;
|
|
84
|
+
if (!Number.isFinite(amount) || amount < 0)
|
|
85
|
+
throw new Error('beam damage callback must return a non-negative finite number');
|
|
86
|
+
damage += amount;
|
|
87
|
+
this.options.applyDamage?.(target, amount, context);
|
|
88
|
+
}
|
|
89
|
+
this.index++;
|
|
90
|
+
if (this.index >= this.path.length)
|
|
91
|
+
this.state = 'done';
|
|
92
|
+
return {
|
|
93
|
+
status: this.state === 'done' ? 'done' : 'active',
|
|
94
|
+
cell: { ...cell },
|
|
95
|
+
step: context.step,
|
|
96
|
+
remaining: context.remaining,
|
|
97
|
+
targets: [...targets],
|
|
98
|
+
damage,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
cancel() {
|
|
102
|
+
if (this.state === 'active' || this.state === 'idle')
|
|
103
|
+
this.state = 'cancelled';
|
|
104
|
+
}
|
|
105
|
+
toJSON() {
|
|
106
|
+
return { path: this.path.map((cell) => ({ ...cell })), index: this.index, state: this.state };
|
|
107
|
+
}
|
|
108
|
+
static fromJSON(options, data) {
|
|
109
|
+
const beam = Object.create(MultiTurnBeam.prototype);
|
|
110
|
+
beam.options = options;
|
|
111
|
+
beam.path = data.path.map((cell) => ({ ...cell }));
|
|
112
|
+
beam.index = data.index;
|
|
113
|
+
beam.state = data.state;
|
|
114
|
+
return beam;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=MultiTurnBeam.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultiTurnBeam.js","sourceRoot":"","sources":["../../src/roguelike/MultiTurnBeam.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAwCpD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,aAAa;IAMzB,YAAY,OAAgC;QAHpC,UAAK,GAAG,CAAC,CAAC;QACV,UAAK,GAA+B,MAAM,CAAC;QAGlD,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9E,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9D,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACxG,CAAC;IAED,IAAI,MAAM;QACT,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC;IAChC,CAAC;IAED,IAAI,IAAI;QACP,OAAO,IAAI,CAAC,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,CAAC;IACxF,CAAC;IAED,IAAI,WAAW;QACd,OAAO,IAAI,CAAC,IAAI,CAAC;IAClB,CAAC;IAED,KAAK;QACJ,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM;YAAE,OAAO,KAAK,CAAC;QACxC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;QACxD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,mEAAmE;IACnE,OAAO;QACN,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO;gBACN,MAAM,EAAE,IAAI,CAAC,KAAK;gBAClB,IAAI,EAAE,IAAI;gBACV,IAAI,EAAE,IAAI,CAAC,KAAK;gBAChB,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC;gBACrD,OAAO,EAAE,EAAE;gBACX,MAAM,EAAE,CAAC;aACT,CAAC;QACH,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,OAAO,GAAsB;YAClC,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE;YACjB,IAAI,EAAE,IAAI,CAAC,KAAK;YAChB,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC;SAC5C,CAAC;QACF,MAAM,OAAO,GACZ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;YAC1C,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;YACxF,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;QAClD,IAAI,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;YACvB,OAAO;gBACN,MAAM,EAAE,SAAS;gBACjB,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE;gBACjB,IAAI,EAAE,IAAI,CAAC,KAAK;gBAChB,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,OAAO,EAAE,EAAE;gBACX,MAAM,EAAE,CAAC;aACT,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACrD,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC9B,MAAM,MAAM,GACX,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACxG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC;gBACzC,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;YAClF,MAAM,IAAI,MAAM,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACrD,CAAC;QAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;QACxD,OAAO;YACN,MAAM,EAAE,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;YACjD,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE;YACjB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC;YACrB,MAAM;SACN,CAAC;IACH,CAAC;IAED,MAAM;QACL,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM;YAAE,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC;IAChF,CAAC;IAED,MAAM;QACL,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IAC/F,CAAC;IAED,MAAM,CAAC,QAAQ,CACd,OAAyD,EACzD,IAAuB;QAEvB,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAqB,CAAC;QACxE,IAAI,CAAC,OAAO,GAAG,OAAkC,CAAC;QAClD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,OAAO,IAAI,CAAC;IACb,CAAC;CACD"}
|
|
@@ -26,6 +26,8 @@
|
|
|
26
26
|
export interface Actor {
|
|
27
27
|
/** actions per unit of time; 2 acts twice as often as 1 */
|
|
28
28
|
speed?: number;
|
|
29
|
+
/** higher-priority actors resolve first when their scheduled times tie */
|
|
30
|
+
priority?: number;
|
|
29
31
|
}
|
|
30
32
|
/** A serialisable record of a scheduler's queue, keyed by caller-supplied actor ids. */
|
|
31
33
|
export interface SchedulerSnapshot {
|
|
@@ -35,6 +37,7 @@ export interface SchedulerSnapshot {
|
|
|
35
37
|
id: string;
|
|
36
38
|
time: number;
|
|
37
39
|
sequence: number;
|
|
40
|
+
priority?: number;
|
|
38
41
|
}>;
|
|
39
42
|
}
|
|
40
43
|
export declare class Scheduler<A extends Actor> {
|
|
@@ -50,8 +53,9 @@ export declare class Scheduler<A extends Actor> {
|
|
|
50
53
|
*
|
|
51
54
|
* @param delay time before its first turn. Spawning a monster with a small random delay
|
|
52
55
|
* stops a room full of them from acting in lockstep.
|
|
56
|
+
* @param priority higher-priority actors resolve first when scheduled at the same time.
|
|
53
57
|
*/
|
|
54
|
-
add(actor: A, delay?: number): void;
|
|
58
|
+
add(actor: A, delay?: number, priority?: number): void;
|
|
55
59
|
remove(actor: A): void;
|
|
56
60
|
clear(): void;
|
|
57
61
|
/** whoever acts next, without removing them; time advances to their turn */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Scheduler.d.ts","sourceRoot":"","sources":["../../src/roguelike/Scheduler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,MAAM,WAAW,KAAK;IACrB,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"Scheduler.d.ts","sourceRoot":"","sources":["../../src/roguelike/Scheduler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,MAAM,WAAW,KAAK;IACrB,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wFAAwF;AACxF,MAAM,WAAW,iBAAiB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClF;AAYD,qBAAa,SAAS,CAAC,CAAC,SAAS,KAAK;IACrC,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,QAAQ,CAAK;IAErB,qEAAqE;IACrE,GAAG,SAAK;IAER,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,MAAM,IAAI,CAAC,EAAE,CAEhB;IAED,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAErB;IAED;;;;;;OAMG;IACH,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,SAAI,EAAE,QAAQ,SAAsB,GAAG,IAAI,CAK7D;IAED,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAGrB;IAED,KAAK,IAAI,IAAI,CAIZ;IAED,4EAA4E;IAC5E,IAAI,IAAI,CAAC,GAAG,IAAI,CAOf;IAED;;;;;;OAMG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CASxB;IAED;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAOtC;IAED,6EAA6E;IAC7E,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM,GAAG,IAAI,CAE9B;IAED;;;;OAIG;IACH,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,GAAG,iBAAiB,CAWvD;IAED;;;;;;OAMG;IACH,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAYrG;IAED,OAAO,CAAC,IAAI;CAKZ"}
|
|
@@ -44,9 +44,14 @@ export class Scheduler {
|
|
|
44
44
|
*
|
|
45
45
|
* @param delay time before its first turn. Spawning a monster with a small random delay
|
|
46
46
|
* stops a room full of them from acting in lockstep.
|
|
47
|
+
* @param priority higher-priority actors resolve first when scheduled at the same time.
|
|
47
48
|
*/
|
|
48
|
-
add(actor, delay = 0) {
|
|
49
|
-
|
|
49
|
+
add(actor, delay = 0, priority = actor.priority ?? 0) {
|
|
50
|
+
if (!Number.isFinite(delay) || delay < 0)
|
|
51
|
+
throw new Error('scheduler delay must be finite and non-negative');
|
|
52
|
+
if (!Number.isFinite(priority))
|
|
53
|
+
throw new Error('scheduler priority must be finite');
|
|
54
|
+
this.entries.push({ actor, time: this.now + delay, sequence: this.sequence++, priority });
|
|
50
55
|
this.sort();
|
|
51
56
|
}
|
|
52
57
|
remove(actor) {
|
|
@@ -116,6 +121,7 @@ export class Scheduler {
|
|
|
116
121
|
id: actorId(entry.actor),
|
|
117
122
|
time: entry.time,
|
|
118
123
|
sequence: entry.sequence,
|
|
124
|
+
...(entry.priority === 0 ? {} : { priority: entry.priority }),
|
|
119
125
|
})),
|
|
120
126
|
};
|
|
121
127
|
}
|
|
@@ -134,6 +140,7 @@ export class Scheduler {
|
|
|
134
140
|
actor: actorOf(entry.id),
|
|
135
141
|
time: entry.time,
|
|
136
142
|
sequence: entry.sequence,
|
|
143
|
+
priority: entry.priority ?? 0,
|
|
137
144
|
}));
|
|
138
145
|
scheduler.sort();
|
|
139
146
|
return scheduler;
|
|
@@ -141,7 +148,7 @@ export class Scheduler {
|
|
|
141
148
|
sort() {
|
|
142
149
|
//few actors are ever queued, so a sort per action is cheaper than a heap and far
|
|
143
150
|
//easier to reason about; swap it out if a level ever holds thousands
|
|
144
|
-
this.entries.sort((a, b) => a.time - b.time || a.sequence - b.sequence);
|
|
151
|
+
this.entries.sort((a, b) => a.time - b.time || b.priority - a.priority || a.sequence - b.sequence);
|
|
145
152
|
}
|
|
146
153
|
}
|
|
147
154
|
//# sourceMappingURL=Scheduler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Scheduler.js","sourceRoot":"","sources":["../../src/roguelike/Scheduler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;
|
|
1
|
+
{"version":3,"file":"Scheduler.js","sourceRoot":"","sources":["../../src/roguelike/Scheduler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AA2BH,MAAM,OAAO,SAAS;IAAtB;QACS,YAAO,GAAe,EAAE,CAAC;QACzB,aAAQ,GAAG,CAAC,CAAC;QAErB,qEAAqE;QACrE,QAAG,GAAG,CAAC,CAAC;IAmIT,CAAC;IAjIA,IAAI,IAAI;QACP,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,IAAI,MAAM;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;IAED,GAAG,CAAC,KAAQ;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;IAC5D,CAAC;IAED;;;;;;OAMG;IACH,GAAG,CAAC,KAAQ,EAAE,KAAK,GAAG,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,CAAC;QACtD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QAC7G,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACrF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC1F,IAAI,CAAC,IAAI,EAAE,CAAC;IACb,CAAC;IAED,MAAM,CAAC,KAAQ;QACd,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;QACvE,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,KAAK;QACJ,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;QACb,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;IACnB,CAAC;IAED,4EAA4E;IAC5E,IAAI;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QAEvB,uEAAuE;QACvE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC,KAAK,CAAC;IACnB,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,IAAY;QACjB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;QACrC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,sFAAsF;QACtF,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QACjC,IAAI,CAAC,IAAI,EAAE,CAAC;IACb,CAAC;IAED;;;;;OAKG;IACH,QAAQ,CAAC,KAAQ,EAAE,KAAa;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;QAClE,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC;QACpB,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QACjC,IAAI,CAAC,IAAI,EAAE,CAAC;IACb,CAAC;IAED,6EAA6E;IAC7E,MAAM,CAAC,KAAQ;QACd,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC;IAC1E,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,OAA6B;QACnC,OAAO;YACN,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACrC,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;gBACxB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;aAC7D,CAAC,CAAC;SACH,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,OAAO,CAAkB,QAA2B,EAAE,OAA0B;QACtF,MAAM,SAAS,GAAG,IAAI,SAAS,EAAK,CAAC;QACrC,SAAS,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;QAC7B,SAAS,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;QACvC,SAAS,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACpD,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,CAAC;SAC7B,CAAC,CAAC,CAAC;QACJ,SAAS,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,SAAS,CAAC;IAClB,CAAC;IAEO,IAAI;QACX,iFAAiF;QACjF,qEAAqE;QACrE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IACpG,CAAC;CACD"}
|
|
@@ -55,12 +55,63 @@ export declare function chebyshevDistance(a: Step, b: Step): number;
|
|
|
55
55
|
* all", a different question with a different (and pricier) algorithm.
|
|
56
56
|
*/
|
|
57
57
|
export declare function traceLine(from: Step, to: Step): Step[];
|
|
58
|
+
export type BallisticaStop = 'opaque' | 'impassable' | 'outside' | 'none';
|
|
59
|
+
export interface BallisticaOptions {
|
|
60
|
+
/** what ends the path; the stopping cell is included in `cells` */
|
|
61
|
+
stop?: BallisticaStop;
|
|
62
|
+
}
|
|
63
|
+
export interface BallisticaResult {
|
|
64
|
+
/** cells from origin through the target or first stopping cell */
|
|
65
|
+
cells: Step[];
|
|
66
|
+
/** the first cell that satisfied `stop`, or null when the path reached its target */
|
|
67
|
+
stop: Step | null;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Traces a projectile-like path through a level and reports its first collision.
|
|
71
|
+
*
|
|
72
|
+
* Unlike `traceLine`, this understands the level topology and terrain. `opaque` is the
|
|
73
|
+
* default for beams and sight, `impassable` is useful for movement and projectiles that can
|
|
74
|
+
* cross transparent walls, and `outside` is useful when the requested target may be off-map.
|
|
75
|
+
* The collision cell is included in `cells`, so a caller can apply an impact there before
|
|
76
|
+
* deciding what the game should do with it.
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* ```ts
|
|
80
|
+
* import { ballistica, Level, WALL, FLOOR } from '@datamoc/mw_games/roguelike';
|
|
81
|
+
*
|
|
82
|
+
* const level = new Level(10, 1, [WALL, FLOOR], 1);
|
|
83
|
+
* const result = ballistica(level, { x: 0, y: 0 }, { x: 9, y: 0 }, { stop: 'opaque' });
|
|
84
|
+
* console.log(result.cells, result.stop); // path and first blocking cell, if any
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
export declare function ballistica(level: Level, from: Step, to: Step, options?: BallisticaOptions): BallisticaResult;
|
|
58
88
|
/** true when nothing between `from` and `to` (both cells themselves excepted) blocks sight */
|
|
59
89
|
export declare function hasLineOfSight(level: Level, from: Step, to: Step): boolean;
|
|
60
90
|
/** whether `target` is a legal aim point from `origin`: in range, and in sight unless waived */
|
|
61
91
|
export declare function canTarget(level: Level, origin: Step, target: Step, options: TargetingOptions): boolean;
|
|
62
92
|
/** the cells a shape actually affects, once aimed at `target` from `origin` */
|
|
63
93
|
export declare function resolveArea(origin: Step, target: Step, shape: AreaShape): Step[];
|
|
94
|
+
/**
|
|
95
|
+
* Resolves an area using the level's topology, including hex lines, cones and bursts.
|
|
96
|
+
*
|
|
97
|
+
* @example
|
|
98
|
+
* ```ts
|
|
99
|
+
* import { Level, FLOOR, resolveAreaOnLevel } from '@datamoc/mw_games/roguelike';
|
|
100
|
+
* const level = new Level(8, 8, [{ passable: true, transparent: true }, FLOOR], 1, 'hex');
|
|
101
|
+
* const cells = resolveAreaOnLevel(level, { x: 2, y: 2 }, { x: 4, y: 2 }, { kind: 'line' });
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
export declare function resolveAreaOnLevel(level: Level, origin: Step, target: Step, shape: AreaShape): Step[];
|
|
105
|
+
/**
|
|
106
|
+
* A widening hex-grid cone, with `width` extra cells on each side at its far end.
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```ts
|
|
110
|
+
* import { hexConeCells } from '@datamoc/mw_games/roguelike';
|
|
111
|
+
* const cells = hexConeCells({ x: 2, y: 2 }, { x: 5, y: 2 }, 2);
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
export declare function hexConeCells(origin: Step, target: Step, width: number): Step[];
|
|
64
115
|
/**
|
|
65
116
|
* Every cell in a widening spray from `origin` towards `target`: the aim snaps to the
|
|
66
117
|
* nearest of the 8 directions, the length is the distance aimed, and step `i` of `length`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Targeting.d.ts","sourceRoot":"","sources":["../../src/roguelike/Targeting.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"Targeting.d.ts","sourceRoot":"","sources":["../../src/roguelike/Targeting.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { hexDistance, hexLine, hexRange } from '../core/Hex.js';
|
|
1
2
|
/**
|
|
2
3
|
* The straight-line ruler distance a roguelike uses: diagonals cost the same as a step.
|
|
3
4
|
*
|
|
@@ -53,9 +54,46 @@ export function traceLine(from, to) {
|
|
|
53
54
|
}
|
|
54
55
|
return points;
|
|
55
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* Traces a projectile-like path through a level and reports its first collision.
|
|
59
|
+
*
|
|
60
|
+
* Unlike `traceLine`, this understands the level topology and terrain. `opaque` is the
|
|
61
|
+
* default for beams and sight, `impassable` is useful for movement and projectiles that can
|
|
62
|
+
* cross transparent walls, and `outside` is useful when the requested target may be off-map.
|
|
63
|
+
* The collision cell is included in `cells`, so a caller can apply an impact there before
|
|
64
|
+
* deciding what the game should do with it.
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```ts
|
|
68
|
+
* import { ballistica, Level, WALL, FLOOR } from '@datamoc/mw_games/roguelike';
|
|
69
|
+
*
|
|
70
|
+
* const level = new Level(10, 1, [WALL, FLOOR], 1);
|
|
71
|
+
* const result = ballistica(level, { x: 0, y: 0 }, { x: 9, y: 0 }, { stop: 'opaque' });
|
|
72
|
+
* console.log(result.cells, result.stop); // path and first blocking cell, if any
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
export function ballistica(level, from, to, options = {}) {
|
|
76
|
+
const line = level.shape === 'hex' ? hexLine(from, to) : traceLine(from, to);
|
|
77
|
+
const stopMode = options.stop ?? 'opaque';
|
|
78
|
+
const cells = [];
|
|
79
|
+
let stop = null;
|
|
80
|
+
for (const cell of line) {
|
|
81
|
+
cells.push(cell);
|
|
82
|
+
if (cells.length === 1 || stopMode === 'none')
|
|
83
|
+
continue;
|
|
84
|
+
const blocked = (stopMode === 'outside' && !level.inside(cell.x, cell.y)) ||
|
|
85
|
+
(stopMode === 'opaque' && level.inside(cell.x, cell.y) && !level.transparent(cell.x, cell.y)) ||
|
|
86
|
+
(stopMode === 'impassable' && level.inside(cell.x, cell.y) && !level.passable(cell.x, cell.y));
|
|
87
|
+
if (blocked) {
|
|
88
|
+
stop = cell;
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return { cells, stop };
|
|
93
|
+
}
|
|
56
94
|
/** true when nothing between `from` and `to` (both cells themselves excepted) blocks sight */
|
|
57
95
|
export function hasLineOfSight(level, from, to) {
|
|
58
|
-
const line = traceLine(from, to);
|
|
96
|
+
const line = level.shape === 'hex' ? hexLine(from, to) : traceLine(from, to);
|
|
59
97
|
for (let i = 1; i < line.length - 1; i++) {
|
|
60
98
|
if (!level.transparent(line[i].x, line[i].y))
|
|
61
99
|
return false;
|
|
@@ -64,7 +102,8 @@ export function hasLineOfSight(level, from, to) {
|
|
|
64
102
|
}
|
|
65
103
|
/** whether `target` is a legal aim point from `origin`: in range, and in sight unless waived */
|
|
66
104
|
export function canTarget(level, origin, target, options) {
|
|
67
|
-
|
|
105
|
+
const distance = level.shape === 'hex' ? hexDistance(origin, target) : chebyshevDistance(origin, target);
|
|
106
|
+
if (distance > options.range)
|
|
68
107
|
return false;
|
|
69
108
|
if ((options.requireLineOfSight ?? true) && !hasLineOfSight(level, origin, target))
|
|
70
109
|
return false;
|
|
@@ -93,6 +132,52 @@ export function resolveArea(origin, target, shape) {
|
|
|
93
132
|
}
|
|
94
133
|
}
|
|
95
134
|
}
|
|
135
|
+
/**
|
|
136
|
+
* Resolves an area using the level's topology, including hex lines, cones and bursts.
|
|
137
|
+
*
|
|
138
|
+
* @example
|
|
139
|
+
* ```ts
|
|
140
|
+
* import { Level, FLOOR, resolveAreaOnLevel } from '@datamoc/mw_games/roguelike';
|
|
141
|
+
* const level = new Level(8, 8, [{ passable: true, transparent: true }, FLOOR], 1, 'hex');
|
|
142
|
+
* const cells = resolveAreaOnLevel(level, { x: 2, y: 2 }, { x: 4, y: 2 }, { kind: 'line' });
|
|
143
|
+
* ```
|
|
144
|
+
*/
|
|
145
|
+
export function resolveAreaOnLevel(level, origin, target, shape) {
|
|
146
|
+
if (level.shape !== 'hex')
|
|
147
|
+
return resolveArea(origin, target, shape);
|
|
148
|
+
if (shape.kind === 'single')
|
|
149
|
+
return [{ ...target }];
|
|
150
|
+
if (shape.kind === 'line')
|
|
151
|
+
return hexLine(origin, target);
|
|
152
|
+
if (shape.kind === 'burst')
|
|
153
|
+
return hexRange(target, shape.radius);
|
|
154
|
+
return hexConeCells(origin, target, shape.width);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* A widening hex-grid cone, with `width` extra cells on each side at its far end.
|
|
158
|
+
*
|
|
159
|
+
* @example
|
|
160
|
+
* ```ts
|
|
161
|
+
* import { hexConeCells } from '@datamoc/mw_games/roguelike';
|
|
162
|
+
* const cells = hexConeCells({ x: 2, y: 2 }, { x: 5, y: 2 }, 2);
|
|
163
|
+
* ```
|
|
164
|
+
*/
|
|
165
|
+
export function hexConeCells(origin, target, width) {
|
|
166
|
+
const distance = hexDistance(origin, target);
|
|
167
|
+
if (distance === 0)
|
|
168
|
+
return [{ ...origin }];
|
|
169
|
+
const line = hexLine(origin, target);
|
|
170
|
+
const cells = [];
|
|
171
|
+
for (let i = 1; i <= distance; i++) {
|
|
172
|
+
const centre = line[i];
|
|
173
|
+
const radius = Math.round((i / distance) * width);
|
|
174
|
+
for (const cell of hexRange(centre, radius)) {
|
|
175
|
+
if (hexDistance(origin, cell) === i)
|
|
176
|
+
cells.push(cell);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return cells;
|
|
180
|
+
}
|
|
96
181
|
/**
|
|
97
182
|
* Every cell in a widening spray from `origin` towards `target`: the aim snaps to the
|
|
98
183
|
* nearest of the 8 directions, the length is the distance aimed, and step `i` of `length`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Targeting.js","sourceRoot":"","sources":["../../src/roguelike/Targeting.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Targeting.js","sourceRoot":"","sources":["../../src/roguelike/Targeting.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,8 +21,8 @@ export { decideMonsterAI } from './MonsterAI.ts';
|
|
|
21
21
|
export type { AIState, AIDecision, MonsterAIOptions, Disposition } from './MonsterAI.ts';
|
|
22
22
|
export { Secrets } from './Secrets.ts';
|
|
23
23
|
export { Doors } from './Doors.ts';
|
|
24
|
-
export { chebyshevDistance, traceLine, hasLineOfSight, canTarget, resolveArea } from './Targeting.ts';
|
|
25
|
-
export type { AreaShape, TargetingOptions } from './Targeting.ts';
|
|
24
|
+
export { chebyshevDistance, traceLine, ballistica, hasLineOfSight, canTarget, resolveArea, resolveAreaOnLevel, hexConeCells, } from './Targeting.ts';
|
|
25
|
+
export type { AreaShape, TargetingOptions, BallisticaStop, BallisticaOptions, BallisticaResult } from './Targeting.ts';
|
|
26
26
|
export { coneCells, chainTargets, knockbackPath, rangeMultiplier, areaFalloffMultiplier } from './Targeting.ts';
|
|
27
27
|
export type { RangeBand } from './Targeting.ts';
|
|
28
28
|
export { BossPhases, AbilityCycle } from './Boss.ts';
|
|
@@ -33,6 +33,8 @@ export type { StealthOptions } from './Stealth.ts';
|
|
|
33
33
|
export { TriggerTracker } from './TriggerTracker.ts';
|
|
34
34
|
export { MultiStageAbility } from './MultiStageAbility.ts';
|
|
35
35
|
export type { AbilityStage } from './MultiStageAbility.ts';
|
|
36
|
+
export { MultiTurnBeam } from './MultiTurnBeam.ts';
|
|
37
|
+
export type { BeamDamageContext, BeamStep, MultiTurnBeamOptions, MultiTurnBeamSave } from './MultiTurnBeam.ts';
|
|
36
38
|
export { candidateCells, cellsNear, selectDistinctCells } from './Placement.ts';
|
|
37
39
|
export type { PlacementFilter, PlacementResult, PlacementTraceEntry } from './Placement.ts';
|
|
38
40
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/roguelike/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1E,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEhE,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACjH,YAAY,EAAE,cAAc,EAAE,sBAAsB,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAErG,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC/E,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE/G,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEhG,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC/D,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAE/D,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAEzF,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/roguelike/index.ts"],"names":[],"mappings":"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"}
|
package/dist/roguelike/index.js
CHANGED
|
@@ -11,12 +11,13 @@ export { Scheduler } from './Scheduler.js';
|
|
|
11
11
|
export { decideMonsterAI } from './MonsterAI.js';
|
|
12
12
|
export { Secrets } from './Secrets.js';
|
|
13
13
|
export { Doors } from './Doors.js';
|
|
14
|
-
export { chebyshevDistance, traceLine, hasLineOfSight, canTarget, resolveArea } from './Targeting.js';
|
|
14
|
+
export { chebyshevDistance, traceLine, ballistica, hasLineOfSight, canTarget, resolveArea, resolveAreaOnLevel, hexConeCells, } from './Targeting.js';
|
|
15
15
|
export { coneCells, chainTargets, knockbackPath, rangeMultiplier, areaFalloffMultiplier } from './Targeting.js';
|
|
16
16
|
export { BossPhases, AbilityCycle } from './Boss.js';
|
|
17
17
|
export { CombatHooks } from './Combat.js';
|
|
18
18
|
export { Stealth } from './Stealth.js';
|
|
19
19
|
export { TriggerTracker } from './TriggerTracker.js';
|
|
20
20
|
export { MultiStageAbility } from './MultiStageAbility.js';
|
|
21
|
+
export { MultiTurnBeam } from './MultiTurnBeam.js';
|
|
21
22
|
export { candidateCells, cellsNear, selectDistinctCells } from './Placement.js';
|
|
22
23
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/roguelike/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1E,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGjH,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAG/E,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG/E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAG/D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/roguelike/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1E,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGjH,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAG/E,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG/E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAG/D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,EACN,iBAAiB,EACjB,SAAS,EACT,UAAU,EACV,cAAc,EACd,SAAS,EACT,WAAW,EACX,kBAAkB,EAClB,YAAY,GACZ,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAGhH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAErD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/rpg/automap.d.ts
CHANGED
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
export interface AutomapTarget {
|
|
10
10
|
readonly widthInTiles: number;
|
|
11
11
|
readonly heightInTiles: number;
|
|
12
|
+
/** optional topology, used to reject a rule authored for the other map shape */
|
|
13
|
+
readonly shape?: 'square' | 'hex' | 'isometric' | 'staggered';
|
|
12
14
|
getTile(layer: string | number, x: number, y: number): number;
|
|
13
15
|
setTile(layer: string | number, x: number, y: number, value: number): void;
|
|
14
16
|
}
|
|
@@ -48,6 +50,8 @@ export declare const EMPTY = -1;
|
|
|
48
50
|
export interface AutomapRule {
|
|
49
51
|
/** only used to name the rule in errors */
|
|
50
52
|
name?: string;
|
|
53
|
+
/** defaults to the target's topology; hex patterns use the same odd-q x/y addresses as Level */
|
|
54
|
+
topology?: 'square' | 'hex';
|
|
51
55
|
/** the pattern size, in cells; every input and output grid must hold exactly this many */
|
|
52
56
|
width: number;
|
|
53
57
|
height: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"automap.d.ts","sourceRoot":"","sources":["../../src/rpg/automap.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9D,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3E;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,KAAK,KAAK,CAAC;AAGxB;;;;;;;;GAQG;AACH,MAAM,WAAW,WAAW;IAC3B,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0FAA0F;IAC1F,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,mGAAmG;IACnG,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IACzC;;;;OAIG;IACH,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,cAAc;IAC9B,mFAAmF;IACnF,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;CACpC;AAED;;;;;;;;GAQG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,WAAW,EAAE,EAAE,OAAO,GAAE,cAAmB,GAAG,MAAM,CAwB/G"}
|
|
1
|
+
{"version":3,"file":"automap.d.ts","sourceRoot":"","sources":["../../src/rpg/automap.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,gFAAgF;IAChF,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,WAAW,GAAG,WAAW,CAAC;IAC9D,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9D,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3E;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,KAAK,KAAK,CAAC;AAGxB;;;;;;;;GAQG;AACH,MAAM,WAAW,WAAW;IAC3B,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gGAAgG;IAChG,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;IAC5B,0FAA0F;IAC1F,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,mGAAmG;IACnG,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IACzC;;;;OAIG;IACH,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,cAAc;IAC9B,mFAAmF;IACnF,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;CACpC;AAED;;;;;;;;GAQG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,WAAW,EAAE,EAAE,OAAO,GAAE,cAAmB,GAAG,MAAM,CAwB/G"}
|
package/dist/rpg/automap.js
CHANGED
|
@@ -37,7 +37,7 @@ export function automap(map, rules, options = {}) {
|
|
|
37
37
|
let matches = 0;
|
|
38
38
|
rules.forEach((rule, index) => {
|
|
39
39
|
const label = rule.name ?? `#${index + 1}`;
|
|
40
|
-
checkRule(rule, label);
|
|
40
|
+
checkRule(rule, label, map.shape);
|
|
41
41
|
const origins = findMatches(map, rule);
|
|
42
42
|
matches += origins.length;
|
|
43
43
|
if (origins.length === 0)
|
|
@@ -57,7 +57,10 @@ export function automap(map, rules, options = {}) {
|
|
|
57
57
|
});
|
|
58
58
|
return matches;
|
|
59
59
|
}
|
|
60
|
-
function checkRule(rule, label) {
|
|
60
|
+
function checkRule(rule, label, mapShape) {
|
|
61
|
+
if (rule.topology && (mapShape === 'square' || mapShape === 'hex') && rule.topology !== mapShape) {
|
|
62
|
+
throw new Error(`automap rule "${label}" targets ${rule.topology} cells, but the map is ${mapShape}`);
|
|
63
|
+
}
|
|
61
64
|
if (!Number.isInteger(rule.width) || rule.width <= 0 || !Number.isInteger(rule.height) || rule.height <= 0) {
|
|
62
65
|
throw new Error(`automap rule "${label}" needs a positive width and height`);
|
|
63
66
|
}
|
package/dist/rpg/automap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"automap.js","sourceRoot":"","sources":["../../src/rpg/automap.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"automap.js","sourceRoot":"","sources":["../../src/rpg/automap.ts"],"names":[],"mappings":"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"}
|