@datamoc/mw_games 0.4.1 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/assets/binary.d.ts +52 -0
- package/dist/assets/binary.d.ts.map +1 -0
- package/dist/assets/binary.js +57 -0
- package/dist/assets/binary.js.map +1 -0
- package/dist/assets/index.d.ts +10 -5
- package/dist/assets/index.d.ts.map +1 -1
- package/dist/assets/index.js +9 -5
- package/dist/assets/index.js.map +1 -1
- package/dist/board/Army.d.ts +75 -0
- package/dist/board/Army.d.ts.map +1 -1
- package/dist/board/Army.js +75 -0
- package/dist/board/Army.js.map +1 -1
- package/dist/board/Classics.d.ts +297 -1
- package/dist/board/Classics.d.ts.map +1 -1
- package/dist/board/Classics.js +297 -1
- package/dist/board/Classics.js.map +1 -1
- package/dist/board/Engine.d.ts +23 -0
- package/dist/board/Engine.d.ts.map +1 -1
- package/dist/board/Engine.js +23 -0
- package/dist/board/Engine.js.map +1 -1
- package/dist/board/FogOfWar.d.ts +20 -0
- package/dist/board/FogOfWar.d.ts.map +1 -1
- package/dist/board/FogOfWar.js +20 -0
- package/dist/board/FogOfWar.js.map +1 -1
- package/dist/board/Tactics.d.ts +158 -1
- package/dist/board/Tactics.d.ts.map +1 -1
- package/dist/board/Tactics.js +125 -1
- package/dist/board/Tactics.js.map +1 -1
- package/dist/board/chess.d.ts +87 -3
- package/dist/board/chess.d.ts.map +1 -1
- package/dist/board/chess.js +96 -4
- package/dist/board/chess.js.map +1 -1
- package/dist/i18n/Content.d.ts +151 -0
- package/dist/i18n/Content.d.ts.map +1 -0
- package/dist/i18n/Content.js +219 -0
- package/dist/i18n/Content.js.map +1 -0
- package/dist/i18n/index.d.ts +35 -3
- package/dist/i18n/index.d.ts.map +1 -1
- package/dist/i18n/index.js +88 -6
- package/dist/i18n/index.js.map +1 -1
- package/dist/mw_games.global.js +89 -89
- package/dist/roguelike/Placement.d.ts +62 -0
- package/dist/roguelike/Placement.d.ts.map +1 -0
- package/dist/roguelike/Placement.js +79 -0
- package/dist/roguelike/Placement.js.map +1 -0
- package/dist/roguelike/index.d.ts +2 -0
- package/dist/roguelike/index.d.ts.map +1 -1
- package/dist/roguelike/index.js +1 -0
- package/dist/roguelike/index.js.map +1 -1
- package/dist/three-d/Models.d.ts +38 -1
- package/dist/three-d/Models.d.ts.map +1 -1
- package/dist/three-d/Models.js +66 -3
- package/dist/three-d/Models.js.map +1 -1
- package/dist/two-d/render/ActorAnimator.d.ts +32 -0
- package/dist/two-d/render/ActorAnimator.d.ts.map +1 -1
- package/dist/two-d/render/ActorAnimator.js +21 -0
- package/dist/two-d/render/ActorAnimator.js.map +1 -1
- package/dist/two-d/render/AnimatedSprite.d.ts +24 -4
- package/dist/two-d/render/AnimatedSprite.d.ts.map +1 -1
- package/dist/two-d/render/AnimatedSprite.js +24 -4
- package/dist/two-d/render/AnimatedSprite.js.map +1 -1
- package/dist/two-d/render/Autotile.d.ts +33 -1
- package/dist/two-d/render/Autotile.d.ts.map +1 -1
- package/dist/two-d/render/Autotile.js +33 -1
- package/dist/two-d/render/Autotile.js.map +1 -1
- package/dist/two-d/render/Camera.d.ts +53 -1
- package/dist/two-d/render/Camera.d.ts.map +1 -1
- package/dist/two-d/render/Camera.js +36 -1
- package/dist/two-d/render/Camera.js.map +1 -1
- package/dist/two-d/render/Capabilities.d.ts +33 -0
- package/dist/two-d/render/Capabilities.d.ts.map +1 -1
- package/dist/two-d/render/Capabilities.js +33 -0
- package/dist/two-d/render/Capabilities.js.map +1 -1
- package/dist/two-d/render/ColorBlindness.d.ts +23 -0
- package/dist/two-d/render/ColorBlindness.d.ts.map +1 -1
- package/dist/two-d/render/ColorBlindness.js +23 -4
- package/dist/two-d/render/ColorBlindness.js.map +1 -1
- package/dist/two-d/render/ColorTransformBatcher.d.ts +67 -1
- package/dist/two-d/render/ColorTransformBatcher.d.ts.map +1 -1
- package/dist/two-d/render/ColorTransformBatcher.js +57 -1
- package/dist/two-d/render/ColorTransformBatcher.js.map +1 -1
- package/dist/two-d/render/LayeredSprite.d.ts +19 -0
- package/dist/two-d/render/LayeredSprite.d.ts.map +1 -1
- package/dist/two-d/render/LayeredSprite.js +19 -0
- package/dist/two-d/render/LayeredSprite.js.map +1 -1
- package/dist/two-d/render/Minimap.d.ts +25 -1
- package/dist/two-d/render/Minimap.d.ts.map +1 -1
- package/dist/two-d/render/Minimap.js +25 -1
- package/dist/two-d/render/Minimap.js.map +1 -1
- package/dist/two-d/render/Particles.d.ts +26 -2
- package/dist/two-d/render/Particles.d.ts.map +1 -1
- package/dist/two-d/render/Particles.js +23 -0
- package/dist/two-d/render/Particles.js.map +1 -1
- package/dist/two-d/render/Projectile.d.ts +14 -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 +15 -0
- package/dist/two-d/render/ScreenEffects.d.ts.map +1 -1
- package/dist/two-d/render/ScreenEffects.js +15 -0
- package/dist/two-d/render/ScreenEffects.js.map +1 -1
- package/dist/two-d/render/Shape2D.d.ts +58 -1
- package/dist/two-d/render/Shape2D.d.ts.map +1 -1
- package/dist/two-d/render/Shape2D.js +58 -1
- package/dist/two-d/render/Shape2D.js.map +1 -1
- package/dist/two-d/render/StatusVisuals.d.ts +22 -0
- package/dist/two-d/render/StatusVisuals.d.ts.map +1 -1
- package/dist/two-d/render/StatusVisuals.js +22 -0
- package/dist/two-d/render/StatusVisuals.js.map +1 -1
- package/dist/two-d/render/TileMap.d.ts +65 -3
- package/dist/two-d/render/TileMap.d.ts.map +1 -1
- package/dist/two-d/render/TileMap.js +65 -3
- package/dist/two-d/render/TileMap.js.map +1 -1
- package/dist/two-d/render/TiledMap.d.ts +9 -3
- package/dist/two-d/render/TiledMap.d.ts.map +1 -1
- package/dist/two-d/render/TiledMap.js +9 -3
- package/dist/two-d/render/TiledMap.js.map +1 -1
- package/dist/two-d/render/TintedSprite.d.ts +9 -2
- package/dist/two-d/render/TintedSprite.d.ts.map +1 -1
- package/dist/two-d/render/TintedSprite.js +9 -2
- package/dist/two-d/render/TintedSprite.js.map +1 -1
- package/dist/two-d/render/Types2D.d.ts +14 -2
- package/dist/two-d/render/Types2D.d.ts.map +1 -1
- package/dist/two-d/render/Types2D.js +14 -2
- package/dist/two-d/render/Types2D.js.map +1 -1
- package/dist/two-d/render/Viewport.d.ts +22 -0
- package/dist/two-d/render/Viewport.d.ts.map +1 -1
- package/dist/two-d/render/Viewport.js +22 -0
- package/dist/two-d/render/Viewport.js.map +1 -1
- package/dist/two-d/ui/Bar.d.ts +16 -3
- package/dist/two-d/ui/Bar.d.ts.map +1 -1
- package/dist/two-d/ui/Bar.js +16 -1
- package/dist/two-d/ui/Bar.js.map +1 -1
- package/dist/two-d/ui/BitmapLabel.d.ts +23 -1
- package/dist/two-d/ui/BitmapLabel.d.ts.map +1 -1
- package/dist/two-d/ui/BitmapLabel.js +23 -1
- package/dist/two-d/ui/BitmapLabel.js.map +1 -1
- package/dist/two-d/ui/Button.d.ts +15 -0
- package/dist/two-d/ui/Button.d.ts.map +1 -1
- package/dist/two-d/ui/Button.js +15 -0
- package/dist/two-d/ui/Button.js.map +1 -1
- package/dist/two-d/ui/FloatingText.d.ts +15 -0
- package/dist/two-d/ui/FloatingText.d.ts.map +1 -1
- package/dist/two-d/ui/FloatingText.js +15 -0
- package/dist/two-d/ui/FloatingText.js.map +1 -1
- package/dist/two-d/ui/HelpScreen.d.ts +16 -0
- package/dist/two-d/ui/HelpScreen.d.ts.map +1 -1
- package/dist/two-d/ui/HelpScreen.js +23 -3
- package/dist/two-d/ui/HelpScreen.js.map +1 -1
- package/dist/two-d/ui/IconGrid.d.ts +25 -0
- package/dist/two-d/ui/IconGrid.d.ts.map +1 -1
- package/dist/two-d/ui/IconGrid.js +37 -5
- package/dist/two-d/ui/IconGrid.js.map +1 -1
- package/dist/two-d/ui/Label.d.ts +10 -0
- package/dist/two-d/ui/Label.d.ts.map +1 -1
- package/dist/two-d/ui/Label.js +10 -0
- package/dist/two-d/ui/Label.js.map +1 -1
- package/dist/two-d/ui/ListView.d.ts +19 -0
- package/dist/two-d/ui/ListView.d.ts.map +1 -1
- package/dist/two-d/ui/ListView.js +19 -0
- package/dist/two-d/ui/ListView.js.map +1 -1
- package/dist/two-d/ui/LoadingScreen.d.ts +24 -1
- package/dist/two-d/ui/LoadingScreen.d.ts.map +1 -1
- package/dist/two-d/ui/LoadingScreen.js +24 -1
- package/dist/two-d/ui/LoadingScreen.js.map +1 -1
- package/dist/two-d/ui/MessageBox.d.ts +21 -2
- package/dist/two-d/ui/MessageBox.d.ts.map +1 -1
- package/dist/two-d/ui/MessageBox.js +19 -0
- package/dist/two-d/ui/MessageBox.js.map +1 -1
- package/dist/two-d/ui/NinePatch.d.ts +12 -0
- package/dist/two-d/ui/NinePatch.d.ts.map +1 -1
- package/dist/two-d/ui/NinePatch.js +12 -0
- package/dist/two-d/ui/NinePatch.js.map +1 -1
- package/dist/two-d/ui/RebindScreen.d.ts +15 -0
- package/dist/two-d/ui/RebindScreen.d.ts.map +1 -1
- package/dist/two-d/ui/RebindScreen.js +15 -0
- package/dist/two-d/ui/RebindScreen.js.map +1 -1
- package/dist/two-d/ui/StatsScreen.d.ts +15 -0
- package/dist/two-d/ui/StatsScreen.d.ts.map +1 -1
- package/dist/two-d/ui/StatsScreen.js +15 -0
- package/dist/two-d/ui/StatsScreen.js.map +1 -1
- package/dist/two-d/ui/Toast.d.ts +12 -0
- package/dist/two-d/ui/Toast.d.ts.map +1 -1
- package/dist/two-d/ui/Toast.js +12 -0
- package/dist/two-d/ui/Toast.js.map +1 -1
- package/dist/two-d/ui/Tooltip.d.ts +14 -0
- package/dist/two-d/ui/Tooltip.d.ts.map +1 -1
- package/dist/two-d/ui/Tooltip.js +14 -0
- package/dist/two-d/ui/Tooltip.js.map +1 -1
- package/dist/two-d/ui/VerticalLabel.d.ts +18 -0
- package/dist/two-d/ui/VerticalLabel.d.ts.map +1 -1
- package/dist/two-d/ui/VerticalLabel.js +18 -0
- package/dist/two-d/ui/VerticalLabel.js.map +1 -1
- package/dist/two-d/ui/Window.d.ts +12 -0
- package/dist/two-d/ui/Window.d.ts.map +1 -1
- package/dist/two-d/ui/Window.js +12 -0
- package/dist/two-d/ui/Window.js.map +1 -1
- package/dist/two-d/ui/theme.d.ts +45 -1
- package/dist/two-d/ui/theme.d.ts.map +1 -1
- package/dist/two-d/ui/theme.js +45 -1
- package/dist/two-d/ui/theme.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +8 -2
package/dist/board/FogOfWar.js
CHANGED
|
@@ -1,6 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Unions the visible cells of several units for each faction and retains explored memory.
|
|
3
3
|
* The caller supplies visibility because board games differ in terrain, range, and blockers.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```ts
|
|
7
|
+
* import { FactionFog } from '@datamoc/mw_games/board';
|
|
8
|
+
*
|
|
9
|
+
* const fog = new FactionFog(10, 10);
|
|
10
|
+
*
|
|
11
|
+
* const sources = [{ x: 2, y: 2 }];
|
|
12
|
+
* fog.sync('blue', sources, (source) => [
|
|
13
|
+
* source,
|
|
14
|
+
* { x: source.x + 1, y: source.y },
|
|
15
|
+
* ]);
|
|
16
|
+
*
|
|
17
|
+
* console.log(fog.isVisible('blue', 3, 2)); // true - lit by the scout right now
|
|
18
|
+
* console.log(fog.isVisible('blue', 5, 5)); // false - never seen
|
|
19
|
+
*
|
|
20
|
+
* fog.sync('blue', [], () => []); // the scout moved away, nothing visible this turn
|
|
21
|
+
* console.log(fog.isVisible('blue', 3, 2)); // false - no longer in sight
|
|
22
|
+
* console.log(fog.isExplored('blue', 3, 2)); // true - stays remembered after leaving
|
|
23
|
+
* ```
|
|
4
24
|
*/
|
|
5
25
|
export class FactionFog {
|
|
6
26
|
constructor(width, height) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FogOfWar.js","sourceRoot":"","sources":["../../src/board/FogOfWar.ts"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"FogOfWar.js","sourceRoot":"","sources":["../../src/board/FogOfWar.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,OAAO,UAAU;IAMtB,YAAY,KAAa,EAAE,MAAc;QAHjC,YAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;QACzC,aAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;QAGjD,IAAI,KAAK,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC9E,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACtB,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,OAA8B,EAAE,KAAmD;QACxG,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACxD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,KAAK,MAAM,MAAM,IAAI,OAAO;YAAE,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;gBAChE,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;oBAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACvE,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;QAC/D,KAAK,MAAM,IAAI,IAAI,IAAI;YAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IAED,SAAS,CAAC,OAAe,EAAE,CAAS,EAAE,CAAS;QAC9C,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;IAClE,CAAC;IAED,UAAU,CAAC,OAAe,EAAE,CAAS,EAAE,CAAS;QAC/C,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;IACnE,CAAC;IAED,YAAY,CAAC,OAAe,IAAuB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACnG,aAAa,CAAC,OAAe,IAAuB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7F,MAAM,CAAC,CAAS,EAAE,CAAS,IAAa,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACvG,KAAK,CAAC,CAAS,EAAE,CAAS,IAAY,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACnG"}
|
package/dist/board/Tactics.d.ts
CHANGED
|
@@ -1,3 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A tactical action-point battle layer: a grid or hex board where units spend action points to
|
|
3
|
+
* move and attack, with overwatch reactions and turn order rotating by owner. Distances and
|
|
4
|
+
* neighbours follow `shape`, reusing `core.Hex` for hex boards.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* import {
|
|
9
|
+
* startingTactics,
|
|
10
|
+
* addTacticalUnit,
|
|
11
|
+
* tacticalMoves,
|
|
12
|
+
* moveTacticalUnit,
|
|
13
|
+
* setTacticalOverwatch,
|
|
14
|
+
* triggerTacticalOverwatch,
|
|
15
|
+
* tacticalAttack,
|
|
16
|
+
* endTacticalTurn,
|
|
17
|
+
* } from '@datamoc/mw_games/board';
|
|
18
|
+
*
|
|
19
|
+
* const state = startingTactics(6, 6, 'square');
|
|
20
|
+
* addTacticalUnit(state, { id: 'ranger', owner: 'blue', x: 0, y: 0, hp: 10, maxHp: 10, actions: 2 });
|
|
21
|
+
* addTacticalUnit(state, { id: 'raider', owner: 'red', x: 3, y: 0, hp: 10, maxHp: 10, actions: 2 });
|
|
22
|
+
*
|
|
23
|
+
* const moves = tacticalMoves(state, 'ranger'); // reachable cells within 2 action points
|
|
24
|
+
* moveTacticalUnit(state, moves[0]);
|
|
25
|
+
*
|
|
26
|
+
* setTacticalOverwatch(state, 'ranger'); // spends the rest of blue's turn watching
|
|
27
|
+
* endTacticalTurn(state); // hands the turn to red
|
|
28
|
+
*
|
|
29
|
+
* const reactions = triggerTacticalOverwatch(state, 'raider', 4); // ranger fires if raider is in range
|
|
30
|
+
* const result = tacticalAttack(state, 'raider', 'ranger', 3); // red's own attack, 3 damage minus cover
|
|
31
|
+
* console.log(result.killed); // false - ranger has hp left
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
1
34
|
export type TacticalShape = 'square' | 'hex';
|
|
2
35
|
export interface TacticalCell {
|
|
3
36
|
passable: boolean;
|
|
@@ -35,14 +68,138 @@ export interface TacticalAttack {
|
|
|
35
68
|
cover: number;
|
|
36
69
|
killed: boolean;
|
|
37
70
|
}
|
|
71
|
+
/**
|
|
72
|
+
* @example
|
|
73
|
+
* ```ts
|
|
74
|
+
* import { startingTactics } from '@datamoc/mw_games/board';
|
|
75
|
+
*
|
|
76
|
+
* const state = startingTactics(6, 6, 'square');
|
|
77
|
+
* console.log(state.width, state.height, state.round); // 6 6 1
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
38
80
|
export declare function startingTactics(width: number, height: number, shape?: TacticalShape): TacticalState;
|
|
39
|
-
/** whether a unit could be placed at (x, y) right now - on the map, and not already occupied
|
|
81
|
+
/** whether a unit could be placed at (x, y) right now - on the map, and not already occupied
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* ```ts
|
|
85
|
+
* import { startingTactics, addTacticalUnit, canPlaceTacticalUnit } from '@datamoc/mw_games/board';
|
|
86
|
+
*
|
|
87
|
+
* const state = startingTactics(6, 6, 'square');
|
|
88
|
+
* addTacticalUnit(state, { id: 'ranger', owner: 'blue', x: 0, y: 0, hp: 10, maxHp: 10, actions: 2 });
|
|
89
|
+
*
|
|
90
|
+
* console.log(canPlaceTacticalUnit(state, 1, 1)); // true
|
|
91
|
+
* console.log(canPlaceTacticalUnit(state, 0, 0)); // false - ranger is already there
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
40
94
|
export declare function canPlaceTacticalUnit(state: TacticalState, x: number, y: number): boolean;
|
|
95
|
+
/**
|
|
96
|
+
* Places a unit; the first unit added decides whose turn it is.
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* ```ts
|
|
100
|
+
* import { startingTactics, addTacticalUnit } from '@datamoc/mw_games/board';
|
|
101
|
+
*
|
|
102
|
+
* const state = startingTactics(6, 6, 'square');
|
|
103
|
+
* addTacticalUnit(state, { id: 'ranger', owner: 'blue', x: 0, y: 0, hp: 10, maxHp: 10, actions: 2 });
|
|
104
|
+
* console.log(state.turn); // 'blue'
|
|
105
|
+
* ```
|
|
106
|
+
*/
|
|
41
107
|
export declare function addTacticalUnit(state: TacticalState, unit: TacticalUnit): void;
|
|
108
|
+
/**
|
|
109
|
+
* Every cell a unit can reach with its remaining action points, respecting terrain,
|
|
110
|
+
* occupancy, and enemy zones of control.
|
|
111
|
+
*
|
|
112
|
+
* @example
|
|
113
|
+
* ```ts
|
|
114
|
+
* import { startingTactics, addTacticalUnit, tacticalMoves } from '@datamoc/mw_games/board';
|
|
115
|
+
*
|
|
116
|
+
* const state = startingTactics(6, 6, 'square');
|
|
117
|
+
* addTacticalUnit(state, { id: 'ranger', owner: 'blue', x: 0, y: 0, hp: 10, maxHp: 10, actions: 2 });
|
|
118
|
+
* addTacticalUnit(state, { id: 'raider', owner: 'red', x: 3, y: 0, hp: 10, maxHp: 10, actions: 2 });
|
|
119
|
+
*
|
|
120
|
+
* const moves = tacticalMoves(state, 'ranger');
|
|
121
|
+
* console.log(moves.length, moves[0]); // 5 { unit: 'ranger', x: 1, y: 0, cost: 1 }
|
|
122
|
+
* ```
|
|
123
|
+
*/
|
|
42
124
|
export declare function tacticalMoves(state: TacticalState, unitId: string): TacticalMove[];
|
|
125
|
+
/**
|
|
126
|
+
* @example
|
|
127
|
+
* ```ts
|
|
128
|
+
* import { startingTactics, addTacticalUnit, tacticalMoves, moveTacticalUnit } from '@datamoc/mw_games/board';
|
|
129
|
+
*
|
|
130
|
+
* const state = startingTactics(6, 6, 'square');
|
|
131
|
+
* addTacticalUnit(state, { id: 'ranger', owner: 'blue', x: 0, y: 0, hp: 10, maxHp: 10, actions: 2 });
|
|
132
|
+
* addTacticalUnit(state, { id: 'raider', owner: 'red', x: 3, y: 0, hp: 10, maxHp: 10, actions: 2 });
|
|
133
|
+
*
|
|
134
|
+
* moveTacticalUnit(state, tacticalMoves(state, 'ranger')[0]);
|
|
135
|
+
* console.log(state.units.find((unit) => unit.id === 'ranger')); // { ..., x: 1, y: 0, actions: 1 }
|
|
136
|
+
* ```
|
|
137
|
+
*/
|
|
43
138
|
export declare function moveTacticalUnit(state: TacticalState, move: TacticalMove): void;
|
|
139
|
+
/**
|
|
140
|
+
* Spends the rest of a unit's turn watching, so it can react through
|
|
141
|
+
* `triggerTacticalOverwatch` when an enemy moves nearby.
|
|
142
|
+
*
|
|
143
|
+
* @example
|
|
144
|
+
* ```ts
|
|
145
|
+
* import { startingTactics, addTacticalUnit, setTacticalOverwatch } from '@datamoc/mw_games/board';
|
|
146
|
+
*
|
|
147
|
+
* const state = startingTactics(6, 6, 'square');
|
|
148
|
+
* addTacticalUnit(state, { id: 'ranger', owner: 'blue', x: 0, y: 0, hp: 10, maxHp: 10, actions: 2 });
|
|
149
|
+
*
|
|
150
|
+
* setTacticalOverwatch(state, 'ranger');
|
|
151
|
+
* console.log(state.units[0].overwatch); // true
|
|
152
|
+
* ```
|
|
153
|
+
*/
|
|
44
154
|
export declare function setTacticalOverwatch(state: TacticalState, unitId: string): void;
|
|
155
|
+
/**
|
|
156
|
+
* Fires every enemy overwatch reaction in range of the moving unit.
|
|
157
|
+
*
|
|
158
|
+
* @example
|
|
159
|
+
* ```ts
|
|
160
|
+
* import { startingTactics, addTacticalUnit, setTacticalOverwatch, endTacticalTurn, triggerTacticalOverwatch } from '@datamoc/mw_games/board';
|
|
161
|
+
*
|
|
162
|
+
* const state = startingTactics(6, 6, 'square');
|
|
163
|
+
* addTacticalUnit(state, { id: 'ranger', owner: 'blue', x: 1, y: 0, hp: 10, maxHp: 10, actions: 2 });
|
|
164
|
+
* addTacticalUnit(state, { id: 'raider', owner: 'red', x: 3, y: 0, hp: 10, maxHp: 10, actions: 2 });
|
|
165
|
+
* setTacticalOverwatch(state, 'ranger');
|
|
166
|
+
* endTacticalTurn(state);
|
|
167
|
+
*
|
|
168
|
+
* const reactions = triggerTacticalOverwatch(state, 'raider', 4); // raider steps into range
|
|
169
|
+
* console.log(reactions); // [{ attacker: 'ranger', defender: 'raider', damage: 4, cover: 0, killed: false }]
|
|
170
|
+
* ```
|
|
171
|
+
*/
|
|
45
172
|
export declare function triggerTacticalOverwatch(state: TacticalState, movingUnitId: string, damage: number): TacticalAttack[];
|
|
173
|
+
/**
|
|
174
|
+
* @example
|
|
175
|
+
* ```ts
|
|
176
|
+
* import { startingTactics, addTacticalUnit, endTacticalTurn, tacticalAttack } from '@datamoc/mw_games/board';
|
|
177
|
+
*
|
|
178
|
+
* const state = startingTactics(6, 6, 'square');
|
|
179
|
+
* addTacticalUnit(state, { id: 'ranger', owner: 'blue', x: 0, y: 0, hp: 10, maxHp: 10, actions: 2 });
|
|
180
|
+
* addTacticalUnit(state, { id: 'raider', owner: 'red', x: 1, y: 0, hp: 10, maxHp: 10, actions: 2 });
|
|
181
|
+
* endTacticalTurn(state); // it's blue's turn until someone ends it
|
|
182
|
+
*
|
|
183
|
+
* const result = tacticalAttack(state, 'raider', 'ranger', 3);
|
|
184
|
+
* console.log(result); // { attacker: 'raider', defender: 'ranger', damage: 3, cover: 0, killed: false }
|
|
185
|
+
* ```
|
|
186
|
+
*/
|
|
46
187
|
export declare function tacticalAttack(state: TacticalState, attackerId: string, defenderId: string, damage: number): TacticalAttack;
|
|
188
|
+
/**
|
|
189
|
+
* Hands the turn to the next owner with units on the board, refreshing their action points
|
|
190
|
+
* and clearing overwatch.
|
|
191
|
+
*
|
|
192
|
+
* @example
|
|
193
|
+
* ```ts
|
|
194
|
+
* import { startingTactics, addTacticalUnit, endTacticalTurn } from '@datamoc/mw_games/board';
|
|
195
|
+
*
|
|
196
|
+
* const state = startingTactics(6, 6, 'square');
|
|
197
|
+
* addTacticalUnit(state, { id: 'ranger', owner: 'blue', x: 0, y: 0, hp: 10, maxHp: 10, actions: 2 });
|
|
198
|
+
* addTacticalUnit(state, { id: 'raider', owner: 'red', x: 3, y: 0, hp: 10, maxHp: 10, actions: 2 });
|
|
199
|
+
*
|
|
200
|
+
* endTacticalTurn(state);
|
|
201
|
+
* console.log(state.turn, state.round); // 'red' 1
|
|
202
|
+
* ```
|
|
203
|
+
*/
|
|
47
204
|
export declare function endTacticalTurn(state: TacticalState): void;
|
|
48
205
|
//# sourceMappingURL=Tactics.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tactics.d.ts","sourceRoot":"","sources":["../../src/board/Tactics.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,KAAK,CAAC;AAC7C,MAAM,WAAW,YAAY;IAAG,QAAQ,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CAAE;AACpE,MAAM,WAAW,YAAY;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAAE;AACnJ,MAAM,WAAW,aAAa;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,YAAY,EAAE,CAAC;IAAC,KAAK,EAAE,YAAY,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;CAAE;AAClK,MAAM,WAAW,YAAY;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;CAAE;AACnF,MAAM,WAAW,cAAc;IAAG,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;CAAE;AAEvH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,aAAqB,GAAG,aAAa,CAG1G;AAED
|
|
1
|
+
{"version":3,"file":"Tactics.d.ts","sourceRoot":"","sources":["../../src/board/Tactics.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,KAAK,CAAC;AAC7C,MAAM,WAAW,YAAY;IAAG,QAAQ,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CAAE;AACpE,MAAM,WAAW,YAAY;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAAE;AACnJ,MAAM,WAAW,aAAa;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,YAAY,EAAE,CAAC;IAAC,KAAK,EAAE,YAAY,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;CAAE;AAClK,MAAM,WAAW,YAAY;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;CAAE;AACnF,MAAM,WAAW,cAAc;IAAG,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;CAAE;AAEvH;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,aAAqB,GAAG,aAAa,CAG1G;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,aAAa,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAExF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAI9E;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,EAAE,CAelF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAO/E;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAK/E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,cAAc,EAAE,CAarH;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,cAAc,CAW3H;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAO1D"}
|
package/dist/board/Tactics.js
CHANGED
|
@@ -1,13 +1,46 @@
|
|
|
1
1
|
import { hexDistance, hexNeighbors } from '../core/Hex.js';
|
|
2
|
+
/**
|
|
3
|
+
* @example
|
|
4
|
+
* ```ts
|
|
5
|
+
* import { startingTactics } from '@datamoc/mw_games/board';
|
|
6
|
+
*
|
|
7
|
+
* const state = startingTactics(6, 6, 'square');
|
|
8
|
+
* console.log(state.width, state.height, state.round); // 6 6 1
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
2
11
|
export function startingTactics(width, height, shape = 'hex') {
|
|
3
12
|
if (width < 1 || height < 1)
|
|
4
13
|
throw new Error('a tactical map needs positive dimensions');
|
|
5
14
|
return { width, height, shape, cells: Array.from({ length: width * height }, () => ({ passable: true, cover: 0 })), units: [], turn: '', round: 1 };
|
|
6
15
|
}
|
|
7
|
-
/** whether a unit could be placed at (x, y) right now - on the map, and not already occupied
|
|
16
|
+
/** whether a unit could be placed at (x, y) right now - on the map, and not already occupied
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* import { startingTactics, addTacticalUnit, canPlaceTacticalUnit } from '@datamoc/mw_games/board';
|
|
21
|
+
*
|
|
22
|
+
* const state = startingTactics(6, 6, 'square');
|
|
23
|
+
* addTacticalUnit(state, { id: 'ranger', owner: 'blue', x: 0, y: 0, hp: 10, maxHp: 10, actions: 2 });
|
|
24
|
+
*
|
|
25
|
+
* console.log(canPlaceTacticalUnit(state, 1, 1)); // true
|
|
26
|
+
* console.log(canPlaceTacticalUnit(state, 0, 0)); // false - ranger is already there
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
8
29
|
export function canPlaceTacticalUnit(state, x, y) {
|
|
9
30
|
return tacticalInside(state, x, y) && !occupied(state, x, y);
|
|
10
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* Places a unit; the first unit added decides whose turn it is.
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```ts
|
|
37
|
+
* import { startingTactics, addTacticalUnit } from '@datamoc/mw_games/board';
|
|
38
|
+
*
|
|
39
|
+
* const state = startingTactics(6, 6, 'square');
|
|
40
|
+
* addTacticalUnit(state, { id: 'ranger', owner: 'blue', x: 0, y: 0, hp: 10, maxHp: 10, actions: 2 });
|
|
41
|
+
* console.log(state.turn); // 'blue'
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
11
44
|
export function addTacticalUnit(state, unit) {
|
|
12
45
|
if (!canPlaceTacticalUnit(state, unit.x, unit.y))
|
|
13
46
|
throw new Error('tactical unit cannot be placed there');
|
|
@@ -15,6 +48,22 @@ export function addTacticalUnit(state, unit) {
|
|
|
15
48
|
if (!state.turn)
|
|
16
49
|
state.turn = unit.owner;
|
|
17
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* Every cell a unit can reach with its remaining action points, respecting terrain,
|
|
53
|
+
* occupancy, and enemy zones of control.
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```ts
|
|
57
|
+
* import { startingTactics, addTacticalUnit, tacticalMoves } from '@datamoc/mw_games/board';
|
|
58
|
+
*
|
|
59
|
+
* const state = startingTactics(6, 6, 'square');
|
|
60
|
+
* addTacticalUnit(state, { id: 'ranger', owner: 'blue', x: 0, y: 0, hp: 10, maxHp: 10, actions: 2 });
|
|
61
|
+
* addTacticalUnit(state, { id: 'raider', owner: 'red', x: 3, y: 0, hp: 10, maxHp: 10, actions: 2 });
|
|
62
|
+
*
|
|
63
|
+
* const moves = tacticalMoves(state, 'ranger');
|
|
64
|
+
* console.log(moves.length, moves[0]); // 5 { unit: 'ranger', x: 1, y: 0, cost: 1 }
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
18
67
|
export function tacticalMoves(state, unitId) {
|
|
19
68
|
const unit = getUnit(state, unitId);
|
|
20
69
|
if (unit.owner !== state.turn || unit.actions <= 0)
|
|
@@ -35,6 +84,19 @@ export function tacticalMoves(state, unitId) {
|
|
|
35
84
|
}
|
|
36
85
|
return out;
|
|
37
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* @example
|
|
89
|
+
* ```ts
|
|
90
|
+
* import { startingTactics, addTacticalUnit, tacticalMoves, moveTacticalUnit } from '@datamoc/mw_games/board';
|
|
91
|
+
*
|
|
92
|
+
* const state = startingTactics(6, 6, 'square');
|
|
93
|
+
* addTacticalUnit(state, { id: 'ranger', owner: 'blue', x: 0, y: 0, hp: 10, maxHp: 10, actions: 2 });
|
|
94
|
+
* addTacticalUnit(state, { id: 'raider', owner: 'red', x: 3, y: 0, hp: 10, maxHp: 10, actions: 2 });
|
|
95
|
+
*
|
|
96
|
+
* moveTacticalUnit(state, tacticalMoves(state, 'ranger')[0]);
|
|
97
|
+
* console.log(state.units.find((unit) => unit.id === 'ranger')); // { ..., x: 1, y: 0, actions: 1 }
|
|
98
|
+
* ```
|
|
99
|
+
*/
|
|
38
100
|
export function moveTacticalUnit(state, move) {
|
|
39
101
|
const legal = tacticalMoves(state, move.unit).find((candidate) => candidate.x === move.x && candidate.y === move.y);
|
|
40
102
|
if (!legal)
|
|
@@ -44,6 +106,21 @@ export function moveTacticalUnit(state, move) {
|
|
|
44
106
|
unit.y = move.y;
|
|
45
107
|
unit.actions -= legal.cost;
|
|
46
108
|
}
|
|
109
|
+
/**
|
|
110
|
+
* Spends the rest of a unit's turn watching, so it can react through
|
|
111
|
+
* `triggerTacticalOverwatch` when an enemy moves nearby.
|
|
112
|
+
*
|
|
113
|
+
* @example
|
|
114
|
+
* ```ts
|
|
115
|
+
* import { startingTactics, addTacticalUnit, setTacticalOverwatch } from '@datamoc/mw_games/board';
|
|
116
|
+
*
|
|
117
|
+
* const state = startingTactics(6, 6, 'square');
|
|
118
|
+
* addTacticalUnit(state, { id: 'ranger', owner: 'blue', x: 0, y: 0, hp: 10, maxHp: 10, actions: 2 });
|
|
119
|
+
*
|
|
120
|
+
* setTacticalOverwatch(state, 'ranger');
|
|
121
|
+
* console.log(state.units[0].overwatch); // true
|
|
122
|
+
* ```
|
|
123
|
+
*/
|
|
47
124
|
export function setTacticalOverwatch(state, unitId) {
|
|
48
125
|
const unit = getUnit(state, unitId);
|
|
49
126
|
if (unit.owner !== state.turn || unit.actions <= 0)
|
|
@@ -51,6 +128,23 @@ export function setTacticalOverwatch(state, unitId) {
|
|
|
51
128
|
unit.actions = 0;
|
|
52
129
|
unit.overwatch = true;
|
|
53
130
|
}
|
|
131
|
+
/**
|
|
132
|
+
* Fires every enemy overwatch reaction in range of the moving unit.
|
|
133
|
+
*
|
|
134
|
+
* @example
|
|
135
|
+
* ```ts
|
|
136
|
+
* import { startingTactics, addTacticalUnit, setTacticalOverwatch, endTacticalTurn, triggerTacticalOverwatch } from '@datamoc/mw_games/board';
|
|
137
|
+
*
|
|
138
|
+
* const state = startingTactics(6, 6, 'square');
|
|
139
|
+
* addTacticalUnit(state, { id: 'ranger', owner: 'blue', x: 1, y: 0, hp: 10, maxHp: 10, actions: 2 });
|
|
140
|
+
* addTacticalUnit(state, { id: 'raider', owner: 'red', x: 3, y: 0, hp: 10, maxHp: 10, actions: 2 });
|
|
141
|
+
* setTacticalOverwatch(state, 'ranger');
|
|
142
|
+
* endTacticalTurn(state);
|
|
143
|
+
*
|
|
144
|
+
* const reactions = triggerTacticalOverwatch(state, 'raider', 4); // raider steps into range
|
|
145
|
+
* console.log(reactions); // [{ attacker: 'ranger', defender: 'raider', damage: 4, cover: 0, killed: false }]
|
|
146
|
+
* ```
|
|
147
|
+
*/
|
|
54
148
|
export function triggerTacticalOverwatch(state, movingUnitId, damage) {
|
|
55
149
|
const moving = getUnit(state, movingUnitId);
|
|
56
150
|
const reactions = [];
|
|
@@ -69,6 +163,20 @@ export function triggerTacticalOverwatch(state, movingUnitId, damage) {
|
|
|
69
163
|
}
|
|
70
164
|
return reactions;
|
|
71
165
|
}
|
|
166
|
+
/**
|
|
167
|
+
* @example
|
|
168
|
+
* ```ts
|
|
169
|
+
* import { startingTactics, addTacticalUnit, endTacticalTurn, tacticalAttack } from '@datamoc/mw_games/board';
|
|
170
|
+
*
|
|
171
|
+
* const state = startingTactics(6, 6, 'square');
|
|
172
|
+
* addTacticalUnit(state, { id: 'ranger', owner: 'blue', x: 0, y: 0, hp: 10, maxHp: 10, actions: 2 });
|
|
173
|
+
* addTacticalUnit(state, { id: 'raider', owner: 'red', x: 1, y: 0, hp: 10, maxHp: 10, actions: 2 });
|
|
174
|
+
* endTacticalTurn(state); // it's blue's turn until someone ends it
|
|
175
|
+
*
|
|
176
|
+
* const result = tacticalAttack(state, 'raider', 'ranger', 3);
|
|
177
|
+
* console.log(result); // { attacker: 'raider', defender: 'ranger', damage: 3, cover: 0, killed: false }
|
|
178
|
+
* ```
|
|
179
|
+
*/
|
|
72
180
|
export function tacticalAttack(state, attackerId, defenderId, damage) {
|
|
73
181
|
const attacker = getUnit(state, attackerId);
|
|
74
182
|
const defender = getUnit(state, defenderId);
|
|
@@ -84,6 +192,22 @@ export function tacticalAttack(state, attackerId, defenderId, damage) {
|
|
|
84
192
|
state.units = state.units.filter((unit) => unit !== defender);
|
|
85
193
|
return { attacker: attackerId, defender: defenderId, damage: dealt, cover, killed };
|
|
86
194
|
}
|
|
195
|
+
/**
|
|
196
|
+
* Hands the turn to the next owner with units on the board, refreshing their action points
|
|
197
|
+
* and clearing overwatch.
|
|
198
|
+
*
|
|
199
|
+
* @example
|
|
200
|
+
* ```ts
|
|
201
|
+
* import { startingTactics, addTacticalUnit, endTacticalTurn } from '@datamoc/mw_games/board';
|
|
202
|
+
*
|
|
203
|
+
* const state = startingTactics(6, 6, 'square');
|
|
204
|
+
* addTacticalUnit(state, { id: 'ranger', owner: 'blue', x: 0, y: 0, hp: 10, maxHp: 10, actions: 2 });
|
|
205
|
+
* addTacticalUnit(state, { id: 'raider', owner: 'red', x: 3, y: 0, hp: 10, maxHp: 10, actions: 2 });
|
|
206
|
+
*
|
|
207
|
+
* endTacticalTurn(state);
|
|
208
|
+
* console.log(state.turn, state.round); // 'red' 1
|
|
209
|
+
* ```
|
|
210
|
+
*/
|
|
87
211
|
export function endTacticalTurn(state) {
|
|
88
212
|
const owners = [...new Set(state.units.map((unit) => unit.owner))];
|
|
89
213
|
if (owners.length === 0)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tactics.js","sourceRoot":"","sources":["../../src/board/Tactics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"Tactics.js","sourceRoot":"","sources":["../../src/board/Tactics.ts"],"names":[],"mappings":"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"}
|
package/dist/board/chess.d.ts
CHANGED
|
@@ -35,8 +35,31 @@ export interface ChessState {
|
|
|
35
35
|
enPassant: ChessSquare | null;
|
|
36
36
|
}
|
|
37
37
|
export type ChessResult = 'ongoing' | 'white-wins' | 'black-wins' | 'stalemate';
|
|
38
|
-
/**
|
|
38
|
+
/**
|
|
39
|
+
* 'e4' to 28 and back - tests read `sq('e4')` rather than bare numbers.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```ts
|
|
43
|
+
* import { sq } from '@datamoc/mw_games/board';
|
|
44
|
+
*
|
|
45
|
+
* console.log(sq('a1')); // 0
|
|
46
|
+
* console.log(sq('e4')); // 28
|
|
47
|
+
* console.log(sq('h8')); // 63
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
39
50
|
export declare function sq(name: string): ChessSquare;
|
|
51
|
+
/**
|
|
52
|
+
* The inverse of `sq`: an index 0-63 back to its algebraic name.
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```ts
|
|
56
|
+
* import { squareName } from '@datamoc/mw_games/board';
|
|
57
|
+
*
|
|
58
|
+
* console.log(squareName(0)); // 'a1'
|
|
59
|
+
* console.log(squareName(28)); // 'e4'
|
|
60
|
+
* console.log(squareName(63)); // 'h8'
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
40
63
|
export declare function squareName(sq: ChessSquare): string;
|
|
41
64
|
/**
|
|
42
65
|
* Reads a position in Forsyth-Edwards Notation - the shape puzzles come in.
|
|
@@ -44,12 +67,55 @@ export declare function squareName(sq: ChessSquare): string;
|
|
|
44
67
|
* Placement, side to move, castling rights and the en passant square are read;
|
|
45
68
|
* the halfmove clock and move number are not (draw claims are out of scope),
|
|
46
69
|
* and both kings must be present or there is nothing to judge.
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```ts
|
|
73
|
+
* import { parseFen, sq } from '@datamoc/mw_games/board';
|
|
74
|
+
*
|
|
75
|
+
* // Scholar's mate position, black to move, every castling right still on the books
|
|
76
|
+
* const state = parseFen('r1bqkbnr/pppp1Qpp/2n5/4p3/2B1P3/8/PPPP1PPP/RNB1K1NR b KQkq - 0 4');
|
|
77
|
+
*
|
|
78
|
+
* console.log(state.turn); // 'black'
|
|
79
|
+
* console.log(state.board[sq('f7')]?.side); // 'white' - the queen that just gave check
|
|
80
|
+
* ```
|
|
47
81
|
*/
|
|
48
82
|
export declare function parseFen(fen: string): ChessState;
|
|
49
|
-
/**
|
|
83
|
+
/**
|
|
84
|
+
* The standard opening array, white to move with every right intact.
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* ```ts
|
|
88
|
+
* import { startingChess, legalMoves } from '@datamoc/mw_games/board';
|
|
89
|
+
*
|
|
90
|
+
* const state = startingChess();
|
|
91
|
+
* console.log(state.turn); // 'white'
|
|
92
|
+
* console.log(legalMoves(state).length); // 20 - 16 pawn moves, 4 knight moves
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
50
95
|
export declare function startingChess(): ChessState;
|
|
51
96
|
/** an independent copy, for searching a move without playing it */
|
|
97
|
+
/**
|
|
98
|
+
* A deep copy, safe to mutate (via `applyMove`) without touching the original - what
|
|
99
|
+
* `legalMoves` uses to try a move and check it does not leave the mover in check.
|
|
100
|
+
*
|
|
101
|
+
* @example
|
|
102
|
+
* ```ts
|
|
103
|
+
* import { startingChess, cloneChess } from '@datamoc/mw_games/board';
|
|
104
|
+
*
|
|
105
|
+
* const state = startingChess();
|
|
106
|
+
* const trial = cloneChess(state);
|
|
107
|
+
* console.log(trial !== state, trial.turn); // true 'white'
|
|
108
|
+
* ```
|
|
109
|
+
*/
|
|
52
110
|
export declare function cloneChess(state: ChessState): ChessState;
|
|
111
|
+
/**
|
|
112
|
+
* @example
|
|
113
|
+
* ```ts
|
|
114
|
+
* import { startingChess, inCheck } from '@datamoc/mw_games/board';
|
|
115
|
+
*
|
|
116
|
+
* console.log(inCheck(startingChess(), 'white')); // false - nobody is in check at the start
|
|
117
|
+
* ```
|
|
118
|
+
*/
|
|
53
119
|
export declare function inCheck(state: ChessState, side: ChessSide): boolean;
|
|
54
120
|
/**
|
|
55
121
|
* Every legal move for the side to play: pseudo-moves that leave their own king
|
|
@@ -60,8 +126,26 @@ export declare function legalMoves(state: ChessState): ChessMove[];
|
|
|
60
126
|
/**
|
|
61
127
|
* Plays a move, mutating the position. Refuses anything `legalMoves` would not
|
|
62
128
|
* list - a silent illegal move is how a minigame corrupts its own board.
|
|
129
|
+
*
|
|
130
|
+
* @example
|
|
131
|
+
* ```ts
|
|
132
|
+
* import { startingChess, sq, applyMove } from '@datamoc/mw_games/board';
|
|
133
|
+
*
|
|
134
|
+
* const state = startingChess();
|
|
135
|
+
* applyMove(state, { from: sq('e2'), to: sq('e4') });
|
|
136
|
+
* console.log(state.turn); // 'black'
|
|
137
|
+
* console.log(state.board[sq('e4')]); // { side: 'white', kind: 'pawn' }
|
|
138
|
+
* ```
|
|
63
139
|
*/
|
|
64
140
|
export declare function applyMove(state: ChessState, move: ChessMove): void;
|
|
65
|
-
/** mate, stalemate, or more game: whoever just moved is judged through the side to play
|
|
141
|
+
/** mate, stalemate, or more game: whoever just moved is judged through the side to play
|
|
142
|
+
*
|
|
143
|
+
* @example
|
|
144
|
+
* ```ts
|
|
145
|
+
* import { startingChess, gameResult } from '@datamoc/mw_games/board';
|
|
146
|
+
*
|
|
147
|
+
* console.log(gameResult(startingChess())); // 'ongoing'
|
|
148
|
+
* ```
|
|
149
|
+
*/
|
|
66
150
|
export declare function gameResult(state: ChessState): ChessResult;
|
|
67
151
|
//# sourceMappingURL=chess.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chess.d.ts","sourceRoot":"","sources":["../../src/board/chess.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAC1C,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAEjF,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,SAAS,CAAC;CAChB;AAED,0DAA0D;AAC1D,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC;AAEjC,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAEnE,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,WAAW,CAAC;IAClB,EAAE,EAAE,WAAW,CAAC;IAChB,SAAS,CAAC,EAAE,aAAa,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC7B,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IAC1B,KAAK,EAAE,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAChC,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,aAAa,CAAC;IACxB,uEAAuE;IACvE,SAAS,EAAE,WAAW,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,YAAY,GAAG,YAAY,GAAG,WAAW,CAAC;AAEhF
|
|
1
|
+
{"version":3,"file":"chess.d.ts","sourceRoot":"","sources":["../../src/board/chess.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAC1C,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAEjF,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,SAAS,CAAC;CAChB;AAED,0DAA0D;AAC1D,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC;AAEjC,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAEnE,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,WAAW,CAAC;IAClB,EAAE,EAAE,WAAW,CAAC;IAChB,SAAS,CAAC,EAAE,aAAa,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC7B,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IAC1B,KAAK,EAAE,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAChC,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,aAAa,CAAC;IACxB,uEAAuE;IACvE,SAAS,EAAE,WAAW,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,YAAY,GAAG,YAAY,GAAG,WAAW,CAAC;AAEhF;;;;;;;;;;;GAWG;AACH,wBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAO5C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,WAAW,GAAG,MAAM,CAElD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAgDhD;AAkBD;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,IAAI,UAAU,CAe1C;AAED,mEAAmE;AACnE;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAOxD;AA6FD;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAEnE;AAgMD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,EAAE,CAYzD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI,CAelE;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CAIzD"}
|