@datamoc/mw_games 0.7.7 → 0.7.9
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 +183 -3
- package/README.md +28 -7
- package/dist/actors/Shop.d.ts.map +1 -1
- package/dist/actors/Shop.js +4 -1
- package/dist/actors/Shop.js.map +1 -1
- package/dist/ai/Heuristics.d.ts +8 -0
- package/dist/ai/Heuristics.d.ts.map +1 -1
- package/dist/ai/Heuristics.js.map +1 -1
- package/dist/ai/index.d.ts +2 -2
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +1 -1
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/lua.d.ts +21 -0
- package/dist/ai/lua.d.ts.map +1 -1
- package/dist/ai/lua.js +21 -0
- package/dist/ai/lua.js.map +1 -1
- package/dist/ai/score.d.ts +36 -0
- package/dist/ai/score.d.ts.map +1 -1
- package/dist/ai/score.js +26 -0
- package/dist/ai/score.js.map +1 -1
- package/dist/assets/index.d.ts +1 -1
- package/dist/assets/index.d.ts.map +1 -1
- package/dist/assets/index.js +1 -1
- package/dist/assets/index.js.map +1 -1
- package/dist/assets/loader.d.ts.map +1 -1
- package/dist/assets/loader.js +10 -1
- package/dist/assets/loader.js.map +1 -1
- package/dist/assets/paths.d.ts +23 -0
- package/dist/assets/paths.d.ts.map +1 -1
- package/dist/assets/paths.js +29 -0
- package/dist/assets/paths.js.map +1 -1
- package/dist/battle/BattleStats.d.ts.map +1 -1
- package/dist/battle/BattleStats.js.map +1 -1
- package/dist/board/Classics.d.ts.map +1 -1
- package/dist/board/Classics.js +51 -39
- package/dist/board/Classics.js.map +1 -1
- package/dist/board/HexSkirmish.d.ts.map +1 -1
- package/dist/board/HexSkirmish.js +69 -20
- package/dist/board/HexSkirmish.js.map +1 -1
- package/dist/board/Tactics.d.ts +7 -0
- package/dist/board/Tactics.d.ts.map +1 -1
- package/dist/board/Tactics.js +2 -2
- package/dist/board/Tactics.js.map +1 -1
- package/dist/core/Achievements.d.ts.map +1 -1
- package/dist/core/Achievements.js +3 -1
- package/dist/core/Achievements.js.map +1 -1
- package/dist/core/Math.d.ts +14 -0
- package/dist/core/Math.d.ts.map +1 -0
- package/dist/core/Math.js +16 -0
- package/dist/core/Math.js.map +1 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -0
- package/dist/core/index.js.map +1 -1
- package/dist/mw_games.global.js +102 -102
- package/dist/mwl/actors.d.ts +46 -2
- package/dist/mwl/actors.d.ts.map +1 -1
- package/dist/mwl/actors.js +46 -2
- package/dist/mwl/actors.js.map +1 -1
- package/dist/mwl/carryover.d.ts +7 -0
- package/dist/mwl/carryover.d.ts.map +1 -1
- package/dist/mwl/carryover.js +7 -0
- package/dist/mwl/carryover.js.map +1 -1
- package/dist/mwl/catalog.d.ts +21 -1
- package/dist/mwl/catalog.d.ts.map +1 -1
- package/dist/mwl/catalog.js +0 -0
- package/dist/mwl/catalog.js.map +1 -1
- package/dist/mwl/compiler.d.ts +70 -3
- package/dist/mwl/compiler.d.ts.map +1 -1
- package/dist/mwl/compiler.js +70 -3
- package/dist/mwl/compiler.js.map +1 -1
- package/dist/mwl/conditions.d.ts +10 -1
- package/dist/mwl/conditions.d.ts.map +1 -1
- package/dist/mwl/conditions.js +10 -1
- package/dist/mwl/conditions.js.map +1 -1
- package/dist/mwl/content.d.ts +15 -0
- package/dist/mwl/content.d.ts.map +1 -1
- package/dist/mwl/content.js +13 -0
- package/dist/mwl/content.js.map +1 -1
- package/dist/mwl/expression.d.ts +21 -0
- package/dist/mwl/expression.d.ts.map +1 -1
- package/dist/mwl/expression.js +21 -0
- package/dist/mwl/expression.js.map +1 -1
- package/dist/mwl/fengari.d.ts +12 -1
- package/dist/mwl/fengari.d.ts.map +1 -1
- package/dist/mwl/fengari.js +12 -1
- package/dist/mwl/fengari.js.map +1 -1
- package/dist/mwl/grammar.d.ts +45 -1
- package/dist/mwl/grammar.d.ts.map +1 -1
- package/dist/mwl/grammar.js +45 -1
- package/dist/mwl/grammar.js.map +1 -1
- package/dist/mwl/hooks.d.ts +45 -1
- package/dist/mwl/hooks.d.ts.map +1 -1
- package/dist/mwl/hooks.js +45 -1
- package/dist/mwl/hooks.js.map +1 -1
- package/dist/mwl/index.d.ts +1 -1
- 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/persistence.d.ts +32 -0
- package/dist/mwl/persistence.d.ts.map +1 -1
- package/dist/mwl/persistence.js +32 -0
- package/dist/mwl/persistence.js.map +1 -1
- package/dist/mwl/readers.d.ts +24 -2
- package/dist/mwl/readers.d.ts.map +1 -1
- package/dist/mwl/readers.js +27 -4
- package/dist/mwl/readers.js.map +1 -1
- package/dist/mwl/report.d.ts +21 -2
- package/dist/mwl/report.d.ts.map +1 -1
- package/dist/mwl/report.js +21 -2
- package/dist/mwl/report.js.map +1 -1
- package/dist/mwl/runtime.d.ts +72 -0
- package/dist/mwl/runtime.d.ts.map +1 -1
- package/dist/mwl/runtime.js +274 -70
- package/dist/mwl/runtime.js.map +1 -1
- package/dist/mwl/schema.d.ts +57 -1
- package/dist/mwl/schema.d.ts.map +1 -1
- package/dist/mwl/schema.js +99 -9
- package/dist/mwl/schema.js.map +1 -1
- package/dist/mwl/scripts.d.ts +12 -1
- package/dist/mwl/scripts.d.ts.map +1 -1
- package/dist/mwl/scripts.js +12 -1
- package/dist/mwl/scripts.js.map +1 -1
- package/dist/mwl/utils.d.ts +2 -0
- package/dist/mwl/utils.d.ts.map +1 -1
- package/dist/mwl/utils.js +4 -1
- package/dist/mwl/utils.js.map +1 -1
- package/dist/rpg/Collision.d.ts.map +1 -1
- package/dist/rpg/Collision.js +1 -3
- package/dist/rpg/Collision.js.map +1 -1
- package/dist/rpg/GameState.d.ts +2 -2
- package/dist/rpg/GameState.js +2 -2
- package/dist/two-d/pixi-interop.d.ts +28 -10
- package/dist/two-d/pixi-interop.d.ts.map +1 -1
- package/dist/two-d/pixi-interop.js +36 -10
- package/dist/two-d/pixi-interop.js.map +1 -1
- package/dist/two-d/render/Camera.d.ts +11 -0
- package/dist/two-d/render/Camera.d.ts.map +1 -1
- package/dist/two-d/render/Camera.js +14 -3
- package/dist/two-d/render/Camera.js.map +1 -1
- package/dist/two-d/render/ColorTransformBatcher.d.ts +7 -1
- package/dist/two-d/render/ColorTransformBatcher.d.ts.map +1 -1
- package/dist/two-d/render/ColorTransformBatcher.js +10 -1
- package/dist/two-d/render/ColorTransformBatcher.js.map +1 -1
- package/dist/two-d/render/ImageModifiers.d.ts +40 -0
- package/dist/two-d/render/ImageModifiers.d.ts.map +1 -1
- package/dist/two-d/render/ImageModifiers.js +67 -4
- package/dist/two-d/render/ImageModifiers.js.map +1 -1
- package/dist/two-d/render/PaletteRemap.d.ts.map +1 -1
- package/dist/two-d/render/PaletteRemap.js +12 -1
- package/dist/two-d/render/PaletteRemap.js.map +1 -1
- package/dist/two-d/render/Projectile.d.ts +16 -0
- package/dist/two-d/render/Projectile.d.ts.map +1 -1
- package/dist/two-d/render/Projectile.js +14 -0
- package/dist/two-d/render/Projectile.js.map +1 -1
- package/dist/two-d/render/ScreenEffects.d.ts +42 -4
- package/dist/two-d/render/ScreenEffects.d.ts.map +1 -1
- package/dist/two-d/render/ScreenEffects.js +64 -9
- package/dist/two-d/render/ScreenEffects.js.map +1 -1
- package/dist/two-d/render/Shape2D.d.ts +22 -2
- package/dist/two-d/render/Shape2D.d.ts.map +1 -1
- package/dist/two-d/render/Shape2D.js +31 -2
- package/dist/two-d/render/Shape2D.js.map +1 -1
- package/dist/two-d/render/StatusVisuals.d.ts +41 -23
- package/dist/two-d/render/StatusVisuals.d.ts.map +1 -1
- package/dist/two-d/render/StatusVisuals.js +65 -26
- package/dist/two-d/render/StatusVisuals.js.map +1 -1
- package/dist/two-d/render/TerrainGraphics.d.ts.map +1 -1
- package/dist/two-d/render/TerrainGraphics.js.map +1 -1
- package/dist/two-d/render/TerrainGraphicsLayer.d.ts +55 -0
- package/dist/two-d/render/TerrainGraphicsLayer.d.ts.map +1 -0
- package/dist/two-d/render/TerrainGraphicsLayer.js +54 -0
- package/dist/two-d/render/TerrainGraphicsLayer.js.map +1 -0
- package/dist/two-d/render/TintedSprite.js +2 -2
- package/dist/two-d/render/TintedSprite.js.map +1 -1
- package/dist/two-d/render/index.d.ts +5 -3
- package/dist/two-d/render/index.d.ts.map +1 -1
- package/dist/two-d/render/index.js +3 -2
- package/dist/two-d/render/index.js.map +1 -1
- package/dist/two-d/ui/ListView.d.ts +9 -0
- package/dist/two-d/ui/ListView.d.ts.map +1 -1
- package/dist/two-d/ui/ListView.js +16 -6
- package/dist/two-d/ui/ListView.js.map +1 -1
- package/dist/two-d/ui/MarkupText.d.ts +66 -0
- package/dist/two-d/ui/MarkupText.d.ts.map +1 -0
- package/dist/two-d/ui/MarkupText.js +156 -0
- package/dist/two-d/ui/MarkupText.js.map +1 -0
- package/dist/two-d/ui/RichLabel.d.ts +7 -1
- package/dist/two-d/ui/RichLabel.d.ts.map +1 -1
- package/dist/two-d/ui/RichLabel.js +20 -9
- package/dist/two-d/ui/RichLabel.js.map +1 -1
- package/dist/two-d/ui/index.d.ts +4 -2
- 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/two-d/ui/markup.d.ts +63 -1
- package/dist/two-d/ui/markup.d.ts.map +1 -1
- package/dist/two-d/ui/markup.js +69 -4
- package/dist/two-d/ui/markup.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +5 -1
- package/tools/classic-html.d.mts +6 -0
- package/tools/classic-html.mjs +61 -0
- package/tools/mwl.mjs +12 -0
|
@@ -29,6 +29,20 @@ import { reducedMotion } from '../../core/Motion.js';
|
|
|
29
29
|
*
|
|
30
30
|
* effects.setTint(0x336633, 0.3); // held green cast while poisoned
|
|
31
31
|
* ```
|
|
32
|
+
*
|
|
33
|
+
* `sequence` chains steps end to end, driven by the same `update(dt)` - `isBusy` stays true
|
|
34
|
+
* and `update` keeps returning false across every step boundary, only returning true once the
|
|
35
|
+
* whole sequence finishes, so a caller still needs no `await` for the genre-standard
|
|
36
|
+
* hold-then-fade-back transition `fadeOut`/`fadeIn`/`flash` alone cannot express:
|
|
37
|
+
*
|
|
38
|
+
* ```ts
|
|
39
|
+
* effects.sequence([
|
|
40
|
+
* { kind: 'fadeOut', duration: 0.3 },
|
|
41
|
+
* { kind: 'hold', duration: 0.5 }, // the new area loads while the screen is covered
|
|
42
|
+
* { kind: 'fadeIn', duration: 0.3 },
|
|
43
|
+
* ]);
|
|
44
|
+
* while (!effects.update(1 / 60)) continue; // drives every step, one frame at a time
|
|
45
|
+
* ```
|
|
32
46
|
*/
|
|
33
47
|
export class ScreenEffects extends Container {
|
|
34
48
|
constructor(options = {}) {
|
|
@@ -40,6 +54,8 @@ export class ScreenEffects extends Container {
|
|
|
40
54
|
/** alpha the current phase starts from and drives towards */
|
|
41
55
|
this.fromAlpha = 0;
|
|
42
56
|
this.toAlpha = 0;
|
|
57
|
+
/** steps still to run once the current one finishes, for `sequence` */
|
|
58
|
+
this.queue = [];
|
|
43
59
|
this.defaultColor = options.color ?? 0x000000;
|
|
44
60
|
this.viewWidth = options.width ?? 0;
|
|
45
61
|
this.viewHeight = options.height ?? 0;
|
|
@@ -91,23 +107,64 @@ export class ScreenEffects extends Container {
|
|
|
91
107
|
flash(duration, color, peak = 1) {
|
|
92
108
|
this.begin('flash', duration, 0, peak, color);
|
|
93
109
|
}
|
|
110
|
+
/**
|
|
111
|
+
* Runs `steps` end to end - fade, hold, flash, in any order and count - driven by the
|
|
112
|
+
* same `update(dt)` as a single call: `isBusy` stays true and `update` keeps returning
|
|
113
|
+
* false at every step boundary, only returning true once the last step finishes. See this
|
|
114
|
+
* class's own doc comment for the hold-then-fade-back example this exists for. Replaces
|
|
115
|
+
* anything currently running or queued, the same as any other call here.
|
|
116
|
+
*/
|
|
117
|
+
sequence(steps) {
|
|
118
|
+
this.queue = steps.slice(1);
|
|
119
|
+
if (steps.length === 0) {
|
|
120
|
+
this.phase = 'idle';
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
this.beginStep(steps[0]);
|
|
124
|
+
}
|
|
94
125
|
/**
|
|
95
126
|
* Holds a colour at a fixed opacity until changed - a poisoned green cast, an underwater
|
|
96
|
-
* blue. Cancels any running fade or
|
|
127
|
+
* blue. Cancels any running fade, flash or sequence, since those drive the same one overlay.
|
|
97
128
|
*/
|
|
98
129
|
setTint(color, alpha) {
|
|
130
|
+
this.queue = [];
|
|
99
131
|
this.phase = 'idle';
|
|
100
132
|
this.elapsed = 0;
|
|
101
133
|
this.overlay.tint = color;
|
|
102
134
|
this.overlay.alpha = Math.max(0, Math.min(1, alpha));
|
|
103
135
|
}
|
|
104
|
-
/** clears the overlay outright, running effect and held tint alike */
|
|
136
|
+
/** clears the overlay outright, running effect, sequence and held tint alike */
|
|
105
137
|
clear() {
|
|
138
|
+
this.queue = [];
|
|
106
139
|
this.phase = 'idle';
|
|
107
140
|
this.elapsed = 0;
|
|
108
141
|
this.overlay.alpha = 0;
|
|
109
142
|
this.overlay.tint = this.defaultColor;
|
|
110
143
|
}
|
|
144
|
+
/** @returns true if this step completed instantly (a non-positive duration) and the next one, if any, already started */
|
|
145
|
+
beginStep(step) {
|
|
146
|
+
switch (step.kind) {
|
|
147
|
+
case 'fadeOut':
|
|
148
|
+
return this.begin('fadeOut', step.duration, this.overlay.alpha, 1, step.color);
|
|
149
|
+
case 'fadeIn':
|
|
150
|
+
return this.begin('fadeIn', step.duration, this.overlay.alpha, 0, step.color);
|
|
151
|
+
case 'flash':
|
|
152
|
+
return this.begin('flash', step.duration, 0, step.peak ?? 1, step.color);
|
|
153
|
+
case 'hold':
|
|
154
|
+
//no explicit colour keeps whatever tint the previous step left, rather than
|
|
155
|
+
//begin()'s usual fall back to the default colour
|
|
156
|
+
return this.begin('hold', step.duration, this.overlay.alpha, this.overlay.alpha, step.color ?? this.overlay.tint);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/** starts the next queued step, or goes idle when the queue is empty; @returns true once idle */
|
|
160
|
+
advance() {
|
|
161
|
+
const next = this.queue.shift();
|
|
162
|
+
if (next)
|
|
163
|
+
return this.beginStep(next);
|
|
164
|
+
this.phase = 'idle';
|
|
165
|
+
return true;
|
|
166
|
+
}
|
|
167
|
+
/** @returns true if `phase` is idle once this call returns (an instant cut may cascade through several queued steps) */
|
|
111
168
|
begin(phase, duration, from, to, color) {
|
|
112
169
|
//reduced motion turns a fade or flash into the instant cut a non-positive duration is
|
|
113
170
|
if (reducedMotion())
|
|
@@ -120,13 +177,13 @@ export class ScreenEffects extends Container {
|
|
|
120
177
|
//a non-positive duration is an instant cut, applied now rather than a frame later
|
|
121
178
|
if (!(duration > 0)) {
|
|
122
179
|
this.overlay.alpha = phase === 'flash' ? 0 : to;
|
|
123
|
-
this.
|
|
124
|
-
return;
|
|
180
|
+
return this.advance();
|
|
125
181
|
}
|
|
126
182
|
this.phase = phase;
|
|
127
183
|
this.overlay.alpha = phase === 'flash' ? 0 : from;
|
|
184
|
+
return false;
|
|
128
185
|
}
|
|
129
|
-
/** @returns true on the single frame the running effect completes */
|
|
186
|
+
/** @returns true on the single frame the running effect (or the whole `sequence`) completes */
|
|
130
187
|
update(dt) {
|
|
131
188
|
if (this.phase === 'idle')
|
|
132
189
|
return false;
|
|
@@ -134,8 +191,7 @@ export class ScreenEffects extends Container {
|
|
|
134
191
|
//trigger, so finish it at once rather than letting the running one play out
|
|
135
192
|
if (reducedMotion()) {
|
|
136
193
|
this.overlay.alpha = this.phase === 'flash' ? 0 : this.toAlpha;
|
|
137
|
-
this.
|
|
138
|
-
return true;
|
|
194
|
+
return this.advance();
|
|
139
195
|
}
|
|
140
196
|
this.elapsed += dt;
|
|
141
197
|
const t = Math.min(1, this.elapsed / this.duration);
|
|
@@ -150,8 +206,7 @@ export class ScreenEffects extends Container {
|
|
|
150
206
|
}
|
|
151
207
|
if (t >= 1) {
|
|
152
208
|
this.overlay.alpha = this.phase === 'flash' ? 0 : this.toAlpha;
|
|
153
|
-
this.
|
|
154
|
-
return true;
|
|
209
|
+
return this.advance();
|
|
155
210
|
}
|
|
156
211
|
return false;
|
|
157
212
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScreenEffects.js","sourceRoot":"","sources":["../../../src/two-d/render/ScreenEffects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"ScreenEffects.js","sourceRoot":"","sources":["../../../src/two-d/render/ScreenEffects.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,8 +2,10 @@ import { Container, Graphics, Text, TilingSprite, FillGradient, Sprite } from 'p
|
|
|
2
2
|
/**
|
|
3
3
|
* A plain grouping container under an MWG-owned name, for the common "just group some
|
|
4
4
|
* children" need `Scene2D.stage` itself covers for the whole scene - a sub-layer inside it
|
|
5
|
-
* (a HUD strip, a creature layer, a popup stack) still needs its own constructible class
|
|
6
|
-
*
|
|
5
|
+
* (a HUD strip, a creature layer, a popup stack) still needs its own constructible class.
|
|
6
|
+
* `Container2D` (`Types2D.ts`) is itself a value re-export of the same underlying class, so
|
|
7
|
+
* `new Container2D()` also works; `Node2D` exists as the name this module and its own doc
|
|
8
|
+
* comments actually use, so a game reads one name rather than two for the same thing.
|
|
7
9
|
*
|
|
8
10
|
* A bare re-export under this name, deliberately: Pixi's own `Container` already does
|
|
9
11
|
* everything this needs, so the point is not to add behaviour but to give a game a name it
|
|
@@ -21,6 +23,24 @@ import { Container, Graphics, Text, TilingSprite, FillGradient, Sprite } from 'p
|
|
|
21
23
|
*/
|
|
22
24
|
export declare class Node2D extends Container {
|
|
23
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Creates one labeled `Node2D` per name, attached to `parent` in the order given, and returns
|
|
28
|
+
* them keyed by name. A game with a dozen conventionally-ordered layers (terrain, units, effects,
|
|
29
|
+
* UI, ...) otherwise hand-wires each one and adds them in the right order everywhere; this is that
|
|
30
|
+
* boilerplate once. The names and their order stay the caller's own convention - nothing here
|
|
31
|
+
* decides what a layer is called or which should draw on top.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```ts
|
|
35
|
+
* import { Node2D, createLayers, Sprite2D } from '@datamoc/mw_games/two-d/render';
|
|
36
|
+
*
|
|
37
|
+
* const stage = new Node2D();
|
|
38
|
+
* const layers = createLayers(stage, ['terrain', 'units', 'effects', 'ui']);
|
|
39
|
+
* layers.units.addChild(new Sprite2D());
|
|
40
|
+
* console.log(layers.effects.label); // 'effects'
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export declare function createLayers(parent: Container, names: readonly string[]): Record<string, Node2D>;
|
|
24
44
|
/**
|
|
25
45
|
* Vector drawing - rectangles, circles, polygons, lines - under an MWG-owned name.
|
|
26
46
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Shape2D.d.ts","sourceRoot":"","sources":["../../../src/two-d/render/Shape2D.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAExF
|
|
1
|
+
{"version":3,"file":"Shape2D.d.ts","sourceRoot":"","sources":["../../../src/two-d/render/Shape2D.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAExF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,MAAO,SAAQ,SAAS;CAAG;AAExC;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAShG;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,OAAQ,SAAQ,QAAQ;CAAG;AAExC;;;;;;;;;;;;;GAaG;AACH,qBAAa,MAAO,SAAQ,IAAI;CAAG;AAEnC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,QAAS,SAAQ,MAAM;CAAG;AAEvC;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,WAAY,SAAQ,YAAY;CAAG;AAEhD;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,QAAQ,qBAAe,CAAC"}
|
|
@@ -2,8 +2,10 @@ import { Container, Graphics, Text, TilingSprite, FillGradient, Sprite } from 'p
|
|
|
2
2
|
/**
|
|
3
3
|
* A plain grouping container under an MWG-owned name, for the common "just group some
|
|
4
4
|
* children" need `Scene2D.stage` itself covers for the whole scene - a sub-layer inside it
|
|
5
|
-
* (a HUD strip, a creature layer, a popup stack) still needs its own constructible class
|
|
6
|
-
*
|
|
5
|
+
* (a HUD strip, a creature layer, a popup stack) still needs its own constructible class.
|
|
6
|
+
* `Container2D` (`Types2D.ts`) is itself a value re-export of the same underlying class, so
|
|
7
|
+
* `new Container2D()` also works; `Node2D` exists as the name this module and its own doc
|
|
8
|
+
* comments actually use, so a game reads one name rather than two for the same thing.
|
|
7
9
|
*
|
|
8
10
|
* A bare re-export under this name, deliberately: Pixi's own `Container` already does
|
|
9
11
|
* everything this needs, so the point is not to add behaviour but to give a game a name it
|
|
@@ -21,6 +23,33 @@ import { Container, Graphics, Text, TilingSprite, FillGradient, Sprite } from 'p
|
|
|
21
23
|
*/
|
|
22
24
|
export class Node2D extends Container {
|
|
23
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Creates one labeled `Node2D` per name, attached to `parent` in the order given, and returns
|
|
28
|
+
* them keyed by name. A game with a dozen conventionally-ordered layers (terrain, units, effects,
|
|
29
|
+
* UI, ...) otherwise hand-wires each one and adds them in the right order everywhere; this is that
|
|
30
|
+
* boilerplate once. The names and their order stay the caller's own convention - nothing here
|
|
31
|
+
* decides what a layer is called or which should draw on top.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```ts
|
|
35
|
+
* import { Node2D, createLayers, Sprite2D } from '@datamoc/mw_games/two-d/render';
|
|
36
|
+
*
|
|
37
|
+
* const stage = new Node2D();
|
|
38
|
+
* const layers = createLayers(stage, ['terrain', 'units', 'effects', 'ui']);
|
|
39
|
+
* layers.units.addChild(new Sprite2D());
|
|
40
|
+
* console.log(layers.effects.label); // 'effects'
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export function createLayers(parent, names) {
|
|
44
|
+
const layers = {};
|
|
45
|
+
for (const name of names) {
|
|
46
|
+
const layer = new Node2D();
|
|
47
|
+
layer.label = name;
|
|
48
|
+
parent.addChild(layer);
|
|
49
|
+
layers[name] = layer;
|
|
50
|
+
}
|
|
51
|
+
return layers;
|
|
52
|
+
}
|
|
24
53
|
/**
|
|
25
54
|
* Vector drawing - rectangles, circles, polygons, lines - under an MWG-owned name.
|
|
26
55
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Shape2D.js","sourceRoot":"","sources":["../../../src/two-d/render/Shape2D.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAExF
|
|
1
|
+
{"version":3,"file":"Shape2D.js","sourceRoot":"","sources":["../../../src/two-d/render/Shape2D.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAExF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,MAAO,SAAQ,SAAS;CAAG;AAExC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,YAAY,CAAC,MAAiB,EAAE,KAAwB;IACvE,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;QACnB,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IACtB,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,OAAQ,SAAQ,QAAQ;CAAG;AAExC;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,MAAO,SAAQ,IAAI;CAAG;AAEnC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,QAAS,SAAQ,MAAM;CAAG;AAEvC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAO,WAAY,SAAQ,YAAY;CAAG;AAEhD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,YAAY,CAAC"}
|
|
@@ -1,33 +1,37 @@
|
|
|
1
1
|
export interface TintTarget {
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
/** the packed additive colour, the same field `TintedSprite.colorAdd` is */
|
|
3
|
+
colorAdd: number;
|
|
4
4
|
}
|
|
5
5
|
export interface StatusVisualStyle {
|
|
6
|
-
/** colour
|
|
6
|
+
/** colour this status contributes on top of every other active one */
|
|
7
7
|
color: number;
|
|
8
|
-
/** 0..1, how
|
|
8
|
+
/** 0..1, how strongly this status's colour contributes at full intensity; defaults to 0.5 */
|
|
9
9
|
strength?: number;
|
|
10
|
-
/** cycles per second the strength oscillates between 0 and `strength`; omit for a steady
|
|
10
|
+
/** cycles per second the strength oscillates between 0 and `strength`; omit for a steady contribution */
|
|
11
11
|
pulseRate?: number;
|
|
12
12
|
}
|
|
13
13
|
export interface StatusVisualsOptions {
|
|
14
|
-
/**
|
|
14
|
+
/** each active status's own contribution; no ordering meaning, since every active one composes */
|
|
15
15
|
styles: Record<string, StatusVisualStyle>;
|
|
16
16
|
}
|
|
17
17
|
/**
|
|
18
|
-
* Turns a set of active status-effect names into one
|
|
19
|
-
* `actors.applyStatusEffect` handles - which know nothing about rendering - can drive what
|
|
20
|
-
* character looks like without either side importing the other.
|
|
21
|
-
* priority: with both `poisoned` and `burning` active, whichever is declared first wins, the
|
|
22
|
-
* same "declaration order decides" rule `rpg.activePage` uses for map events.
|
|
18
|
+
* Turns a set of active status-effect names into one additive colour on a sprite, so a game's
|
|
19
|
+
* own `actors.applyStatusEffect` handles - which know nothing about rendering - can drive what
|
|
20
|
+
* a character looks like without either side importing the other.
|
|
23
21
|
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
22
|
+
* Every active status composes over the additive channel (`TintedSprite.colorAdd`) rather than
|
|
23
|
+
* one winning by declaration order: poisoned-and-burning sums both colours (each channel
|
|
24
|
+
* clamped to 1, so an oversaturated combination clips rather than wrapping), instead of only
|
|
25
|
+
* the first-declared style showing. This class never touches the multiply `tint`, so a
|
|
26
|
+
* sprite's own identity tint (a team colour, say) rides underneath untouched - the composition
|
|
27
|
+
* this class's own earlier version could not do, because writing both halves of `lerpTint` per
|
|
28
|
+
* update meant the last status checked always overwrote whatever tint a caller had set. A
|
|
29
|
+
* one-shot `flash` (a damage hit, a heal glow) layers its own decaying contribution on top of
|
|
30
|
+
* whatever statuses are active, rather than needing a caller to juggle a separate colour write.
|
|
31
|
+
*
|
|
32
|
+
* `target` is any object shaped like `TintedSprite`'s own `colorAdd` field - duck-typed the way
|
|
33
|
+
* `Projectile` takes a plain `{x, y}` rather than a real Pixi `Sprite`, so this is fully
|
|
34
|
+
* testable without Pixi and works on any sprite subclass that exposes the same field.
|
|
31
35
|
*
|
|
32
36
|
* @example
|
|
33
37
|
* ```ts
|
|
@@ -35,6 +39,7 @@ export interface StatusVisualsOptions {
|
|
|
35
39
|
*
|
|
36
40
|
* declare const ratTexture: Texture2D;
|
|
37
41
|
* const rat = new TintedSprite(ratTexture);
|
|
42
|
+
* rat.tint = 0x8080ff; // a team colour, untouched by anything below
|
|
38
43
|
*
|
|
39
44
|
* const visuals = new StatusVisuals(rat, {
|
|
40
45
|
* styles: {
|
|
@@ -44,25 +49,38 @@ export interface StatusVisualsOptions {
|
|
|
44
49
|
* });
|
|
45
50
|
*
|
|
46
51
|
* visuals.set('poisoned', true);
|
|
47
|
-
* visuals.
|
|
52
|
+
* visuals.set('burning', true);
|
|
53
|
+
* visuals.update(1 / 60); // both colours composed into rat.colorAdd; rat.tint is untouched
|
|
48
54
|
* console.log(visuals.has('poisoned')); // true
|
|
49
55
|
*
|
|
56
|
+
* visuals.flash(0xffffff, 0.8, 0.2); // a bright hit-flash, decaying over 0.2s
|
|
57
|
+
* visuals.update(1 / 60);
|
|
58
|
+
*
|
|
50
59
|
* visuals.set('poisoned', false);
|
|
51
|
-
* visuals.
|
|
60
|
+
* visuals.set('burning', false);
|
|
61
|
+
* visuals.update(1 / 60); // no status or flash left active: colorAdd back to 0
|
|
52
62
|
* ```
|
|
53
63
|
*/
|
|
54
64
|
export declare class StatusVisuals {
|
|
55
65
|
private target;
|
|
56
66
|
private styles;
|
|
57
|
-
/** `styles`' own key order, computed once rather than every `update()` - a per-frame call */
|
|
58
|
-
private priority;
|
|
59
67
|
private active;
|
|
60
68
|
private elapsed;
|
|
69
|
+
private flashColor;
|
|
70
|
+
private flashStrength;
|
|
71
|
+
private flashDuration;
|
|
72
|
+
private flashRemaining;
|
|
61
73
|
constructor(target: TintTarget, options: StatusVisualsOptions);
|
|
62
74
|
/** marks `kind` active or inactive; a `kind` with no matching style is tracked but never shown */
|
|
63
75
|
set(kind: string, active: boolean): void;
|
|
64
76
|
has(kind: string): boolean;
|
|
65
|
-
/**
|
|
77
|
+
/**
|
|
78
|
+
* Layers a transient additive pulse on top of whatever statuses are active, linearly
|
|
79
|
+
* decaying `strength` to zero over `duration` seconds - a damage hit or a heal glow that
|
|
80
|
+
* needs no status of its own and no caller-managed timer.
|
|
81
|
+
*/
|
|
82
|
+
flash(color: number, strength: number, duration: number): void;
|
|
83
|
+
/** advances any pulsing style and the flash decay, and repaints the sprite's additive channel */
|
|
66
84
|
update(dt: number): void;
|
|
67
85
|
}
|
|
68
86
|
//# sourceMappingURL=StatusVisuals.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatusVisuals.d.ts","sourceRoot":"","sources":["../../../src/two-d/render/StatusVisuals.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"StatusVisuals.d.ts","sourceRoot":"","sources":["../../../src/two-d/render/StatusVisuals.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IAC1B,4EAA4E;IAC5E,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IACjC,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;IACd,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yGAAyG;IACzG,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACpC,kGAAkG;IAClG,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;CAC1C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,qBAAa,aAAa;IACzB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,OAAO,CAAK;IAEpB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,cAAc,CAAK;IAE3B,YAAY,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,oBAAoB,EAG5D;IAED,kGAAkG;IAClG,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAGvC;IAED,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzB;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAK7D;IAED,iGAAiG;IACjG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CA6BvB;CACD"}
|
|
@@ -1,17 +1,22 @@
|
|
|
1
|
+
import { packColorAdd } from './ColorTransformBatcher.js';
|
|
1
2
|
/**
|
|
2
|
-
* Turns a set of active status-effect names into one
|
|
3
|
-
* `actors.applyStatusEffect` handles - which know nothing about rendering - can drive what
|
|
4
|
-
* character looks like without either side importing the other.
|
|
5
|
-
* priority: with both `poisoned` and `burning` active, whichever is declared first wins, the
|
|
6
|
-
* same "declaration order decides" rule `rpg.activePage` uses for map events.
|
|
3
|
+
* Turns a set of active status-effect names into one additive colour on a sprite, so a game's
|
|
4
|
+
* own `actors.applyStatusEffect` handles - which know nothing about rendering - can drive what
|
|
5
|
+
* a character looks like without either side importing the other.
|
|
7
6
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
7
|
+
* Every active status composes over the additive channel (`TintedSprite.colorAdd`) rather than
|
|
8
|
+
* one winning by declaration order: poisoned-and-burning sums both colours (each channel
|
|
9
|
+
* clamped to 1, so an oversaturated combination clips rather than wrapping), instead of only
|
|
10
|
+
* the first-declared style showing. This class never touches the multiply `tint`, so a
|
|
11
|
+
* sprite's own identity tint (a team colour, say) rides underneath untouched - the composition
|
|
12
|
+
* this class's own earlier version could not do, because writing both halves of `lerpTint` per
|
|
13
|
+
* update meant the last status checked always overwrote whatever tint a caller had set. A
|
|
14
|
+
* one-shot `flash` (a damage hit, a heal glow) layers its own decaying contribution on top of
|
|
15
|
+
* whatever statuses are active, rather than needing a caller to juggle a separate colour write.
|
|
16
|
+
*
|
|
17
|
+
* `target` is any object shaped like `TintedSprite`'s own `colorAdd` field - duck-typed the way
|
|
18
|
+
* `Projectile` takes a plain `{x, y}` rather than a real Pixi `Sprite`, so this is fully
|
|
19
|
+
* testable without Pixi and works on any sprite subclass that exposes the same field.
|
|
15
20
|
*
|
|
16
21
|
* @example
|
|
17
22
|
* ```ts
|
|
@@ -19,6 +24,7 @@
|
|
|
19
24
|
*
|
|
20
25
|
* declare const ratTexture: Texture2D;
|
|
21
26
|
* const rat = new TintedSprite(ratTexture);
|
|
27
|
+
* rat.tint = 0x8080ff; // a team colour, untouched by anything below
|
|
22
28
|
*
|
|
23
29
|
* const visuals = new StatusVisuals(rat, {
|
|
24
30
|
* styles: {
|
|
@@ -28,20 +34,28 @@
|
|
|
28
34
|
* });
|
|
29
35
|
*
|
|
30
36
|
* visuals.set('poisoned', true);
|
|
31
|
-
* visuals.
|
|
37
|
+
* visuals.set('burning', true);
|
|
38
|
+
* visuals.update(1 / 60); // both colours composed into rat.colorAdd; rat.tint is untouched
|
|
32
39
|
* console.log(visuals.has('poisoned')); // true
|
|
33
40
|
*
|
|
41
|
+
* visuals.flash(0xffffff, 0.8, 0.2); // a bright hit-flash, decaying over 0.2s
|
|
42
|
+
* visuals.update(1 / 60);
|
|
43
|
+
*
|
|
34
44
|
* visuals.set('poisoned', false);
|
|
35
|
-
* visuals.
|
|
45
|
+
* visuals.set('burning', false);
|
|
46
|
+
* visuals.update(1 / 60); // no status or flash left active: colorAdd back to 0
|
|
36
47
|
* ```
|
|
37
48
|
*/
|
|
38
49
|
export class StatusVisuals {
|
|
39
50
|
constructor(target, options) {
|
|
40
51
|
this.active = new Set();
|
|
41
52
|
this.elapsed = 0;
|
|
53
|
+
this.flashColor = 0;
|
|
54
|
+
this.flashStrength = 0;
|
|
55
|
+
this.flashDuration = 0;
|
|
56
|
+
this.flashRemaining = 0;
|
|
42
57
|
this.target = target;
|
|
43
58
|
this.styles = options.styles;
|
|
44
|
-
this.priority = Object.keys(options.styles);
|
|
45
59
|
}
|
|
46
60
|
/** marks `kind` active or inactive; a `kind` with no matching style is tracked but never shown */
|
|
47
61
|
set(kind, active) {
|
|
@@ -53,20 +67,45 @@ export class StatusVisuals {
|
|
|
53
67
|
has(kind) {
|
|
54
68
|
return this.active.has(kind);
|
|
55
69
|
}
|
|
56
|
-
/**
|
|
70
|
+
/**
|
|
71
|
+
* Layers a transient additive pulse on top of whatever statuses are active, linearly
|
|
72
|
+
* decaying `strength` to zero over `duration` seconds - a damage hit or a heal glow that
|
|
73
|
+
* needs no status of its own and no caller-managed timer.
|
|
74
|
+
*/
|
|
75
|
+
flash(color, strength, duration) {
|
|
76
|
+
this.flashColor = color;
|
|
77
|
+
this.flashStrength = strength;
|
|
78
|
+
this.flashDuration = Math.max(duration, 1e-6);
|
|
79
|
+
this.flashRemaining = this.flashDuration;
|
|
80
|
+
}
|
|
81
|
+
/** advances any pulsing style and the flash decay, and repaints the sprite's additive channel */
|
|
57
82
|
update(dt) {
|
|
58
83
|
this.elapsed += dt;
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
84
|
+
if (this.flashRemaining > 0)
|
|
85
|
+
this.flashRemaining = Math.max(0, this.flashRemaining - dt);
|
|
86
|
+
let r = 0;
|
|
87
|
+
let g = 0;
|
|
88
|
+
let b = 0;
|
|
89
|
+
for (const kind of this.active) {
|
|
90
|
+
const style = this.styles[kind];
|
|
91
|
+
if (!style)
|
|
92
|
+
continue;
|
|
93
|
+
const peak = style.strength ?? 0.5;
|
|
94
|
+
const strength = style.pulseRate
|
|
95
|
+
? peak * (0.5 + 0.5 * Math.sin(this.elapsed * style.pulseRate * Math.PI * 2))
|
|
96
|
+
: peak;
|
|
97
|
+
r += (((style.color >> 16) & 0xff) / 255) * strength;
|
|
98
|
+
g += (((style.color >> 8) & 0xff) / 255) * strength;
|
|
99
|
+
b += ((style.color & 0xff) / 255) * strength;
|
|
100
|
+
}
|
|
101
|
+
if (this.flashRemaining > 0) {
|
|
102
|
+
const flashT = this.flashRemaining / this.flashDuration;
|
|
103
|
+
const flashStrength = this.flashStrength * flashT;
|
|
104
|
+
r += (((this.flashColor >> 16) & 0xff) / 255) * flashStrength;
|
|
105
|
+
g += (((this.flashColor >> 8) & 0xff) / 255) * flashStrength;
|
|
106
|
+
b += ((this.flashColor & 0xff) / 255) * flashStrength;
|
|
63
107
|
}
|
|
64
|
-
|
|
65
|
-
const peak = style.strength ?? 0.5;
|
|
66
|
-
const strength = style.pulseRate
|
|
67
|
-
? peak * (0.5 + 0.5 * Math.sin(this.elapsed * style.pulseRate * Math.PI * 2))
|
|
68
|
-
: peak;
|
|
69
|
-
this.target.lerpTint(style.color, strength);
|
|
108
|
+
this.target.colorAdd = packColorAdd(Math.min(1, r), Math.min(1, g), Math.min(1, b));
|
|
70
109
|
}
|
|
71
110
|
}
|
|
72
111
|
//# sourceMappingURL=StatusVisuals.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatusVisuals.js","sourceRoot":"","sources":["../../../src/two-d/render/StatusVisuals.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"StatusVisuals.js","sourceRoot":"","sources":["../../../src/two-d/render/StatusVisuals.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TerrainGraphics.d.ts","sourceRoot":"","sources":["../../../src/two-d/render/TerrainGraphics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,qFAAqF;AACrF,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,qFAAqF;IACrF,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,+GAA+G;IAC/G,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,UAAU,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACjD,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;IACzC,8EAA8E;IAC9E,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,2FAA2F;AAC3F,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AAED,wGAAwG;AACxG,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,WAAW,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;AAEvF,wGAAwG;AACxG,MAAM,MAAM,aAAa,GAAG,
|
|
1
|
+
{"version":3,"file":"TerrainGraphics.d.ts","sourceRoot":"","sources":["../../../src/two-d/render/TerrainGraphics.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TerrainGraphics.js","sourceRoot":"","sources":["../../../src/two-d/render/TerrainGraphics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"TerrainGraphics.js","sourceRoot":"","sources":["../../../src/two-d/render/TerrainGraphics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Node2D } from './Shape2D.ts';
|
|
2
|
+
import type { Texture2D } from './Types2D.ts';
|
|
3
|
+
import type { TerrainPlacement } from './TerrainGraphics.ts';
|
|
4
|
+
export interface TerrainGraphicsLayerOptions {
|
|
5
|
+
/** the placements `resolveTerrainGraphics` produced, or any list of the same shape */
|
|
6
|
+
readonly placements: readonly TerrainPlacement[];
|
|
7
|
+
/**
|
|
8
|
+
* Where a placement lands, in pixels: its anchor cell (`x`, `y`) plus the rule image's own
|
|
9
|
+
* offset (`dx`, `dy`), both in the unit the rules were authored in. A square or isometric grid
|
|
10
|
+
* projects the sum of the two; a hex grid, whose offsets are axial, projects the cell and the
|
|
11
|
+
* offset separately - which is why the layer is handed the whole placement rather than only a
|
|
12
|
+
* cell, and why the projection belongs to the caller.
|
|
13
|
+
*/
|
|
14
|
+
readonly project: (x: number, y: number, dx: number, dy: number) => {
|
|
15
|
+
x: number;
|
|
16
|
+
y: number;
|
|
17
|
+
};
|
|
18
|
+
/** how an image path becomes a texture; defaults to the asset resolver with a `Texture.EMPTY` fallback */
|
|
19
|
+
readonly resolveImage?: (path: string) => Texture2D;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Draws the placements `resolveTerrainGraphics` resolves - the renderer half of `[terrain_graphics]`
|
|
23
|
+
* that the rule pass deliberately leaves to a caller.
|
|
24
|
+
*
|
|
25
|
+
* It is one `Sprite2D` per placement, added in `layer` order (a stable sort, so placements sharing a
|
|
26
|
+
* layer keep the order the rule pass emitted, which is its row-major walk). That is what makes a
|
|
27
|
+
* rule's multi-cell art *one rule's images at their own offsets* rather than something `TileMap`'s
|
|
28
|
+
* one-sprite-per-cell grid would have to hold, and what lets a rotated or probabilistic rule vary
|
|
29
|
+
* how a transition looks without the layer knowing any of that.
|
|
30
|
+
*
|
|
31
|
+
* Z-order between this layer and the rest of a scene is the caller's, as it is for `Halo`: add the
|
|
32
|
+
* layer before a unit to sit terrain under it, or after to overlay.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* import { TerrainGraphicsLayer, resolveTerrainGraphics } from '@datamoc/mw_games/two-d/render';
|
|
37
|
+
*
|
|
38
|
+
* const placements = resolveTerrainGraphics(2, 1, [], () => new Set(['land']));
|
|
39
|
+
* const layer = new TerrainGraphicsLayer({
|
|
40
|
+
* placements,
|
|
41
|
+
* project: (x, y, dx, dy) => ({ x: (x + dx) * 32, y: (y + dy) * 32 }),
|
|
42
|
+
* });
|
|
43
|
+
* layer.setPlacements(placements);
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export declare class TerrainGraphicsLayer extends Node2D {
|
|
47
|
+
private placements;
|
|
48
|
+
private readonly project;
|
|
49
|
+
private readonly resolveImage;
|
|
50
|
+
constructor(options: TerrainGraphicsLayerOptions);
|
|
51
|
+
/** replaces the resolved placements and redraws them in layer order */
|
|
52
|
+
setPlacements(placements: readonly TerrainPlacement[]): void;
|
|
53
|
+
private rebuild;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=TerrainGraphicsLayer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TerrainGraphicsLayer.d.ts","sourceRoot":"","sources":["../../../src/two-d/render/TerrainGraphicsLayer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAY,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAG7D,MAAM,WAAW,2BAA2B;IAC3C,sFAAsF;IACtF,QAAQ,CAAC,UAAU,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAEjD;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAE7F,0GAA0G;IAC1G,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC;CACpD;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,oBAAqB,SAAQ,MAAM;IAC/C,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyC;IACjE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA8B;IAE3D,YAAY,OAAO,EAAE,2BAA2B,EAM/C;IAED,uEAAuE;IACvE,aAAa,CAAC,UAAU,EAAE,SAAS,gBAAgB,EAAE,GAAG,IAAI,CAG3D;IAED,OAAO,CAAC,OAAO;CAWf"}
|