@almadar/ui 5.82.0 → 5.84.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/avl/index.cjs +1706 -5785
  2. package/dist/avl/index.js +674 -4753
  3. package/dist/components/core/templates/index.d.ts +0 -10
  4. package/dist/components/game/2d/atoms/ChoiceButton.d.ts +3 -1
  5. package/dist/components/game/2d/molecules/Canvas2D.d.ts +6 -5
  6. package/dist/components/game/2d/molecules/ControlGrid.d.ts +6 -1
  7. package/dist/components/game/2d/molecules/index.d.ts +0 -34
  8. package/dist/components/index.cjs +8344 -12448
  9. package/dist/components/index.js +4662 -8732
  10. package/dist/providers/index.cjs +1573 -5652
  11. package/dist/providers/index.js +650 -4729
  12. package/dist/runtime/index.cjs +1567 -5646
  13. package/dist/runtime/index.js +654 -4733
  14. package/package.json +1 -1
  15. package/dist/components/game/2d/organisms/BattleBoard.d.ts +0 -132
  16. package/dist/components/game/2d/organisms/BoardgameBoard.d.ts +0 -37
  17. package/dist/components/game/2d/organisms/CastleBoard.d.ts +0 -107
  18. package/dist/components/game/2d/organisms/CityBuilderBoard.d.ts +0 -64
  19. package/dist/components/game/2d/organisms/FishingBoard.d.ts +0 -41
  20. package/dist/components/game/2d/organisms/HexStrategyBoard.d.ts +0 -44
  21. package/dist/components/game/2d/organisms/HolidayRunnerBoard.d.ts +0 -37
  22. package/dist/components/game/2d/organisms/MatchPuzzleBoard.d.ts +0 -37
  23. package/dist/components/game/2d/organisms/MinigolfBoard.d.ts +0 -37
  24. package/dist/components/game/2d/organisms/PinballBoard.d.ts +0 -43
  25. package/dist/components/game/2d/organisms/PirateBoard.d.ts +0 -44
  26. package/dist/components/game/2d/organisms/PlatformerBoard.d.ts +0 -48
  27. package/dist/components/game/2d/organisms/RacingBoard.d.ts +0 -44
  28. package/dist/components/game/2d/organisms/RoguelikeBoard.d.ts +0 -62
  29. package/dist/components/game/2d/organisms/SokobanBoard.d.ts +0 -37
  30. package/dist/components/game/2d/organisms/SpaceShmupBoard.d.ts +0 -44
  31. package/dist/components/game/2d/organisms/SpaceStationBoard.d.ts +0 -37
  32. package/dist/components/game/2d/organisms/SportsBoard.d.ts +0 -37
  33. package/dist/components/game/2d/organisms/TanksBoard.d.ts +0 -39
  34. package/dist/components/game/2d/organisms/TopDownShooterBoard.d.ts +0 -65
  35. package/dist/components/game/2d/organisms/TowerDefenseBoard.d.ts +0 -87
  36. package/dist/components/game/2d/organisms/UncontrolledBattleBoard.d.ts +0 -43
  37. package/dist/components/game/2d/organisms/WorldMapBoard.d.ts +0 -155
  38. package/dist/components/game/2d/templates/BattleTemplate.d.ts +0 -34
  39. package/dist/components/game/2d/templates/CardBattlerTemplate.d.ts +0 -35
  40. package/dist/components/game/2d/templates/CastleTemplate.d.ts +0 -32
  41. package/dist/components/game/2d/templates/CityBuilderTemplate.d.ts +0 -40
  42. package/dist/components/game/2d/templates/PlatformerTemplate.d.ts +0 -27
  43. package/dist/components/game/2d/templates/RoguelikeTemplate.d.ts +0 -23
  44. package/dist/components/game/2d/templates/TopDownShooterTemplate.d.ts +0 -42
  45. package/dist/components/game/2d/templates/TowerDefenseTemplate.d.ts +0 -43
  46. package/dist/components/game/2d/templates/VisualNovelTemplate.d.ts +0 -28
  47. package/dist/components/game/2d/templates/WorldMapTemplate.d.ts +0 -38
  48. package/dist/components/game/shared/hooks/useBattleState.d.ts +0 -47
@@ -1,155 +0,0 @@
1
- /**
2
- * WorldMapBoard
3
- *
4
- * Organism for the strategic world-map view. Renders an isometric hex/iso
5
- * map with hero selection, movement animation, and encounter callbacks.
6
- * Game-specific panels (hero detail, hero lists, resource bars) are injected
7
- * via render-prop slots.
8
- *
9
- * **State categories (closed-circuit compliant):**
10
- * - Game data (hexes, heroes, selectedHeroId, features) → received via
11
- * `entity` prop; the Orbital trait owns this state.
12
- * - Rendering state (hoveredTile, movingPositions animation) → local only.
13
- * - Events → emitted via `useEventBus()` for trait integration.
14
- *
15
- * This component is mostly prop-driven. The only internal state is hover
16
- * tracking and movement animation interpolation, both of which are
17
- * rendering-only concerns that cannot (and should not) be externalised.
18
- *
19
- * @packageDocumentation
20
- */
21
- import React from 'react';
22
- import type { Asset, AssetUrl, EventEmit, EntityRow } from '@almadar/core';
23
- import type { IsometricTile, IsometricUnit, IsometricFeature } from '../../shared/isometricTypes';
24
- import type { ResolvedFrame } from '../../shared/spriteAnimationTypes';
25
- import type { UiError } from '../../../core/atoms/types';
26
- /** Manifest of per-kind sprite maps (UI value DTO). */
27
- type WorldMapAssetManifest = {
28
- terrains?: Record<string, Asset>;
29
- units?: Record<string, Asset>;
30
- features?: Record<string, Asset>;
31
- ui?: Record<string, Asset>;
32
- };
33
- /** Context exposed to render-prop slots. Hex / hero rows are `EntityRow`. */
34
- export type WorldMapSlotContext = {
35
- /** Currently hovered tile */
36
- hoveredTile: {
37
- x: number;
38
- y: number;
39
- } | null;
40
- /** Hex row at the hovered tile */
41
- hoveredHex: EntityRow | null;
42
- /** Hero row at the hovered tile */
43
- hoveredHero: EntityRow | null;
44
- /** Currently selected hero row */
45
- selectedHero: EntityRow | null;
46
- /** Valid move tiles for selected hero */
47
- validMoves: Array<{
48
- x: number;
49
- y: number;
50
- }>;
51
- /** Selects a hero */
52
- selectHero: (id: string) => void;
53
- /** Resolve screen position of a tile for overlays */
54
- tileToScreen: (x: number, y: number) => {
55
- x: number;
56
- y: number;
57
- };
58
- /** Canvas scale */
59
- scale: number;
60
- };
61
- /** Event Contract:
62
- * Emits: UI:HERO_SELECT
63
- * Emits: UI:HERO_MOVE
64
- * Emits: UI:BATTLE_ENCOUNTER
65
- * Emits: UI:FEATURE_ENTER
66
- * Emits: UI:TILE_CLICK
67
- */
68
- export interface WorldMapBoardProps {
69
- /** Additional CSS classes */
70
- className?: string;
71
- /** Loading state indicator */
72
- isLoading?: boolean;
73
- /** Error state */
74
- error?: UiError | null;
75
- /** World-map board-state entity (single row or array). The board reads
76
- * `hexes` / `heroes` / `features` arrays + `selectedHeroId` off it. */
77
- entity?: EntityRow | readonly EntityRow[];
78
- /** Direct tile data — takes priority over entity-derived tiles. */
79
- tiles?: IsometricTile[];
80
- /** Direct unit data — takes priority over entity-derived units. */
81
- units?: IsometricUnit[];
82
- /** Direct feature data — takes priority over entity-derived features. */
83
- features?: IsometricFeature[];
84
- /** Direct asset manifest — takes priority over entity-derived manifest. */
85
- assetManifest?: WorldMapAssetManifest;
86
- /** Canvas render scale */
87
- scale?: number;
88
- /** Unit draw-size multiplier */
89
- unitScale?: number;
90
- /** Ratio of unit draw height to scaledFloorHeight. Default 1.5. */
91
- spriteHeightRatio?: number;
92
- /** Max unit draw width as a ratio of scaledTileWidth. Default 0.6. */
93
- spriteMaxWidthRatio?: number;
94
- /** Allow selecting / moving ALL heroes (including enemy). For testing. */
95
- allowMoveAllHeroes?: boolean;
96
- /** Custom movement range validator */
97
- isInRange?: (from: {
98
- x: number;
99
- y: number;
100
- }, to: {
101
- x: number;
102
- y: number;
103
- }, range: number) => boolean;
104
- /** Emits UI:{heroSelectEvent} with { heroId } */
105
- heroSelectEvent?: EventEmit<{
106
- heroId: string;
107
- }>;
108
- /** Emits UI:{heroMoveEvent} with { heroId, toX, toY } */
109
- heroMoveEvent?: EventEmit<{
110
- heroId: string;
111
- toX: number;
112
- toY: number;
113
- }>;
114
- /** Emits UI:{battleEncounterEvent} with { attackerId, defenderId } */
115
- battleEncounterEvent?: EventEmit<{
116
- attackerId: string;
117
- defenderId: string;
118
- }>;
119
- /** Emits UI:{featureEnterEvent} with { heroId, feature, hex } */
120
- featureEnterEvent?: EventEmit<{
121
- heroId: string;
122
- feature: string;
123
- hex: EntityRow;
124
- }>;
125
- /** Emits UI:{tileClickEvent} with { x, y } */
126
- tileClickEvent?: EventEmit<{
127
- x: number;
128
- y: number;
129
- }>;
130
- /** Header / top bar */
131
- header?: (ctx: WorldMapSlotContext) => React.ReactNode;
132
- /** Side panel (hero detail, hero lists, etc.) */
133
- sidePanel?: (ctx: WorldMapSlotContext) => React.ReactNode;
134
- /** Canvas overlay (tooltips, popups) */
135
- overlay?: (ctx: WorldMapSlotContext) => React.ReactNode;
136
- /** Footer */
137
- footer?: (ctx: WorldMapSlotContext) => React.ReactNode;
138
- onHeroSelect?: (heroId: string) => void;
139
- onHeroMove?: (heroId: string, toX: number, toY: number) => void;
140
- /** Called when hero clicks an enemy hero tile */
141
- onBattleEncounter?: (attackerId: string, defenderId: string) => void;
142
- /** Called when hero enters a feature hex (castle, resource, etc.) */
143
- onFeatureEnter?: (heroId: string, hex: EntityRow) => void;
144
- /** Override for the diamond-top Y offset within tile sprites (default: 374). */
145
- diamondTopY?: number;
146
- /** Disable pan/zoom camera (default: true). Set false for fixed maps where overlay labels need stable positions. */
147
- enableCamera?: boolean;
148
- effectSpriteUrls?: AssetUrl[];
149
- resolveUnitFrame?: (unitId: string) => ResolvedFrame | null;
150
- }
151
- export declare function WorldMapBoard({ entity, tiles: propTiles, units: propUnits, features: propFeatures, assetManifest: propAssetManifest, isLoading, scale, unitScale, spriteHeightRatio, spriteMaxWidthRatio, allowMoveAllHeroes, isInRange, heroSelectEvent, heroMoveEvent, battleEncounterEvent, featureEnterEvent, tileClickEvent, header, sidePanel, overlay, footer, onHeroSelect, onHeroMove, onBattleEncounter, onFeatureEnter, diamondTopY, enableCamera, effectSpriteUrls, resolveUnitFrame, className, }: WorldMapBoardProps): React.JSX.Element;
152
- export declare namespace WorldMapBoard {
153
- var displayName: string;
154
- }
155
- export default WorldMapBoard;
@@ -1,34 +0,0 @@
1
- /**
2
- * BattleTemplate
3
- *
4
- * Thin declarative wrapper around BattleBoard organism.
5
- * All game logic (turn phases, movement animation, combat, etc.) lives in BattleBoard.
6
- *
7
- * Compliant with Almadar_Templates.md: no hooks, no callbacks, entity-only data flow.
8
- *
9
- * @packageDocumentation
10
- */
11
- import React from 'react';
12
- import type { TemplateProps } from '../../../core/templates/types';
13
- import type { BattleBoardProps } from '../organisms/BattleBoard';
14
- import type { IsometricTile, IsometricUnit, IsometricFeature } from '../../shared/isometricTypes';
15
- export type { BattlePhase, BattleSlotContext, } from '../organisms/BattleBoard';
16
- export interface BattleTemplateProps extends TemplateProps {
17
- /** Canvas render scale */
18
- scale?: number;
19
- /** Unit draw-size multiplier */
20
- unitScale?: number;
21
- /** Direct tile data — forwarded to BattleBoard; takes priority over entity. */
22
- tiles?: IsometricTile[];
23
- /** Direct unit data — forwarded to BattleBoard; takes priority over entity. */
24
- units?: IsometricUnit[];
25
- /** Direct feature data — forwarded to BattleBoard; takes priority over entity. */
26
- features?: IsometricFeature[];
27
- /** Direct asset manifest — forwarded to BattleBoard; takes priority over entity. */
28
- assetManifest?: BattleBoardProps['assetManifest'];
29
- }
30
- export declare function BattleTemplate({ entity, scale, unitScale, tiles, units, features, assetManifest, className, }: BattleTemplateProps): React.JSX.Element | null;
31
- export declare namespace BattleTemplate {
32
- var displayName: string;
33
- }
34
- export default BattleTemplate;
@@ -1,35 +0,0 @@
1
- /**
2
- * CardBattlerTemplate
3
- *
4
- * Thin template wrapper: titled header + CardBattlerBoard.
5
- * All game state is driven by the entity prop (passed through from the orbital trait).
6
- */
7
- import React from 'react';
8
- import type { EventEmit } from '@almadar/core';
9
- import type { TemplateProps } from '../../../core/templates/types';
10
- import type { CardBattlerBoardProps, CardBattlerCard } from '../organisms/CardBattlerBoard';
11
- export interface CardBattlerTemplateProps extends TemplateProps {
12
- title?: string;
13
- deck?: CardBattlerCard[];
14
- hand?: CardBattlerCard[];
15
- board?: CardBattlerCard[];
16
- mana?: number;
17
- maxMana?: number;
18
- turn?: number;
19
- result?: 'none' | 'won' | 'lost';
20
- assetManifest?: CardBattlerBoardProps['assetManifest'];
21
- playCardEvent?: EventEmit<{
22
- cardId: string;
23
- }>;
24
- endTurnEvent?: EventEmit<Record<string, never>>;
25
- playAgainEvent?: EventEmit<Record<string, never>>;
26
- gameEndEvent?: EventEmit<{
27
- result: 'won' | 'lost';
28
- }>;
29
- className?: string;
30
- }
31
- export declare function CardBattlerTemplate({ entity, title, deck, hand, board, mana, maxMana, turn, result, assetManifest, playCardEvent, endTurnEvent, playAgainEvent, gameEndEvent, className, }: CardBattlerTemplateProps): React.JSX.Element;
32
- export declare namespace CardBattlerTemplate {
33
- var displayName: string;
34
- }
35
- export default CardBattlerTemplate;
@@ -1,32 +0,0 @@
1
- /**
2
- * CastleTemplate
3
- *
4
- * Thin declarative wrapper around CastleBoard organism.
5
- * All game logic (hover state, feature selection, etc.) lives in CastleBoard.
6
- *
7
- * Compliant with Almadar_Templates.md: no hooks, no callbacks, entity-only data flow.
8
- *
9
- * @packageDocumentation
10
- */
11
- import React from 'react';
12
- import type { TemplateProps } from '../../../core/templates/types';
13
- import type { CastleBoardProps } from '../organisms/CastleBoard';
14
- import type { IsometricTile, IsometricUnit, IsometricFeature } from '../../shared/isometricTypes';
15
- export type { CastleSlotContext } from '../organisms/CastleBoard';
16
- export interface CastleTemplateProps extends TemplateProps {
17
- /** Canvas render scale */
18
- scale?: number;
19
- /** Direct tile data — forwarded to CastleBoard; takes priority over entity. */
20
- tiles?: IsometricTile[];
21
- /** Direct unit data — forwarded to CastleBoard; takes priority over entity. */
22
- units?: IsometricUnit[];
23
- /** Direct feature data — forwarded to CastleBoard; takes priority over entity. */
24
- features?: IsometricFeature[];
25
- /** Direct asset manifest — forwarded to CastleBoard; takes priority over entity. */
26
- assetManifest?: CastleBoardProps['assetManifest'];
27
- }
28
- export declare function CastleTemplate({ entity, scale, tiles, units, features, assetManifest, className, }: CastleTemplateProps): React.JSX.Element | null;
29
- export declare namespace CastleTemplate {
30
- var displayName: string;
31
- }
32
- export default CastleTemplate;
@@ -1,40 +0,0 @@
1
- /**
2
- * CityBuilderTemplate
3
- *
4
- * Thin template wrapper: titled header + CityBuilderBoard.
5
- * All game state is driven by the entity prop (passed through from the orbital trait).
6
- */
7
- import React from 'react';
8
- import type { EventEmit } from '@almadar/core';
9
- import type { TemplateProps } from '../../../core/templates/types';
10
- import type { CityBuilderBoardProps, CityBuilderTile, CityBuilderBuilding, CityBuilderBuildType } from '../organisms/CityBuilderBoard';
11
- export interface CityBuilderTemplateProps extends TemplateProps {
12
- title?: string;
13
- tiles?: CityBuilderTile[];
14
- buildings?: CityBuilderBuilding[];
15
- buildTypes?: CityBuilderBuildType[];
16
- pendingBuildType?: string;
17
- assetManifest?: CityBuilderBoardProps['assetManifest'];
18
- gold?: number;
19
- wood?: number;
20
- population?: number;
21
- result?: 'none' | 'won' | 'lost';
22
- scale?: number;
23
- unitScale?: number;
24
- selectBuildTypeEvent?: EventEmit<{
25
- buildType: string;
26
- }>;
27
- placeBuildingEvent?: EventEmit<{
28
- x: number;
29
- y: number;
30
- }>;
31
- gameEndEvent?: EventEmit<{
32
- result: 'won' | 'lost';
33
- }>;
34
- className?: string;
35
- }
36
- export declare function CityBuilderTemplate({ entity, title, tiles, buildings, buildTypes, pendingBuildType, assetManifest, gold, wood, population, result, scale, unitScale, selectBuildTypeEvent, placeBuildingEvent, gameEndEvent, className, }: CityBuilderTemplateProps): React.JSX.Element;
37
- export declare namespace CityBuilderTemplate {
38
- var displayName: string;
39
- }
40
- export default CityBuilderTemplate;
@@ -1,27 +0,0 @@
1
- import React from 'react';
2
- import type { Asset } from '@almadar/core';
3
- import type { TemplateProps } from '../../../core/templates/types';
4
- import type { PlatformerBoardProps } from '../organisms/PlatformerBoard';
5
- export interface PlatformerTemplateProps extends TemplateProps {
6
- /** Level geometry forwarded to PlatformerBoard */
7
- platforms?: PlatformerBoardProps['platforms'];
8
- /** World dimensions */
9
- worldWidth?: number;
10
- worldHeight?: number;
11
- /** Canvas display size */
12
- canvasWidth?: number;
13
- canvasHeight?: number;
14
- /** Player sprite asset */
15
- playerSprite?: Asset;
16
- /** Map of platform type to tile sprite asset */
17
- tileSprites?: Record<string, Asset>;
18
- /** Canvas background color */
19
- bgColor?: string;
20
- /** Forwarded to PlatformerBoard to emit GAME_END into the FSM */
21
- gameEndEvent?: PlatformerBoardProps['gameEndEvent'];
22
- }
23
- export declare function PlatformerTemplate({ entity, platforms, worldWidth, worldHeight, canvasWidth, canvasHeight, playerSprite, tileSprites, bgColor, gameEndEvent, className, }: PlatformerTemplateProps): React.JSX.Element | null;
24
- export declare namespace PlatformerTemplate {
25
- var displayName: string;
26
- }
27
- export default PlatformerTemplate;
@@ -1,23 +0,0 @@
1
- import React from 'react';
2
- import type { EventEmit } from '@almadar/core';
3
- import type { TemplateProps } from '../../../core/templates/types';
4
- import type { RoguelikeBoardProps } from '../organisms/RoguelikeBoard';
5
- import type { IsometricTile } from '../../shared/isometricTypes';
6
- export interface RoguelikeTemplateProps extends TemplateProps {
7
- scale?: number;
8
- unitScale?: number;
9
- tiles?: IsometricTile[];
10
- enemies?: RoguelikeBoardProps['enemies'];
11
- items?: RoguelikeBoardProps['items'];
12
- stairsX?: number;
13
- stairsY?: number;
14
- assetManifest?: RoguelikeBoardProps['assetManifest'];
15
- gameEndEvent?: EventEmit<{
16
- result: string;
17
- }>;
18
- }
19
- export declare function RoguelikeTemplate({ entity, scale, unitScale, tiles, enemies, items, stairsX, stairsY, assetManifest, gameEndEvent, className, }: RoguelikeTemplateProps): React.JSX.Element | null;
20
- export declare namespace RoguelikeTemplate {
21
- var displayName: string;
22
- }
23
- export default RoguelikeTemplate;
@@ -1,42 +0,0 @@
1
- /**
2
- * TopDownShooterTemplate
3
- *
4
- * Thin template wrapper: titled header + TopDownShooterBoard.
5
- * All game state is driven by the entity prop (passed through from the orbital trait).
6
- */
7
- import React from 'react';
8
- import type { EventEmit } from '@almadar/core';
9
- import type { TemplateProps } from '../../../core/templates/types';
10
- import type { TopDownShooterBoardProps, ShooterPlayer, ShooterEnemy, ShooterProjectile } from '../organisms/TopDownShooterBoard';
11
- export interface TopDownShooterTemplateProps extends TemplateProps {
12
- title?: string;
13
- player?: ShooterPlayer;
14
- enemies?: ShooterEnemy[];
15
- projectiles?: ShooterProjectile[];
16
- score?: number;
17
- wave?: number;
18
- lives?: number;
19
- result?: 'none' | 'won' | 'lost';
20
- assetManifest?: TopDownShooterBoardProps['assetManifest'];
21
- width?: number;
22
- height?: number;
23
- spriteSize?: number;
24
- moveEvent?: EventEmit<{
25
- dx: number;
26
- dy: number;
27
- }>;
28
- fireEvent?: EventEmit<{
29
- tx: number;
30
- ty: number;
31
- }>;
32
- playAgainEvent?: EventEmit<Record<string, never>>;
33
- gameEndEvent?: EventEmit<{
34
- result: 'won' | 'lost';
35
- }>;
36
- className?: string;
37
- }
38
- export declare function TopDownShooterTemplate({ entity, title, player, enemies, projectiles, score, wave, lives, result, assetManifest, width, height, spriteSize, moveEvent, fireEvent, playAgainEvent, gameEndEvent, className, }: TopDownShooterTemplateProps): React.JSX.Element;
39
- export declare namespace TopDownShooterTemplate {
40
- var displayName: string;
41
- }
42
- export default TopDownShooterTemplate;
@@ -1,43 +0,0 @@
1
- /**
2
- * TowerDefenseTemplate
3
- *
4
- * Thin template wrapper: titled header + TowerDefenseBoard.
5
- * All game state is driven by the entity prop (passed through from the orbital trait).
6
- */
7
- import React from 'react';
8
- import type { TemplateProps } from '../../../core/templates/types';
9
- import type { TowerDefenseTile, TowerDefensePathPoint, TowerDefenseTower } from '../organisms/TowerDefenseBoard';
10
- import type { EventEmit } from '@almadar/core';
11
- export interface TowerDefenseTemplateProps extends TemplateProps {
12
- title?: string;
13
- tiles?: TowerDefenseTile[];
14
- path?: TowerDefensePathPoint[];
15
- towers?: TowerDefenseTower[];
16
- gold?: number;
17
- lives?: number;
18
- maxWaves?: number;
19
- towerCost?: number;
20
- towerRange?: number;
21
- towerDamage?: number;
22
- creepsPerWave?: number;
23
- creepBaseHp?: number;
24
- goldPerKill?: number;
25
- scale?: number;
26
- placeTowerEvent?: EventEmit<{
27
- x: number;
28
- y: number;
29
- }>;
30
- startWaveEvent?: EventEmit<{
31
- wave: number;
32
- }>;
33
- playAgainEvent?: EventEmit<Record<string, never>>;
34
- gameEndEvent?: EventEmit<{
35
- result: 'won' | 'lost';
36
- }>;
37
- className?: string;
38
- }
39
- export declare function TowerDefenseTemplate({ entity, title, tiles, path, towers, gold, lives, maxWaves, towerCost, scale, placeTowerEvent, startWaveEvent, playAgainEvent, gameEndEvent, className, }: TowerDefenseTemplateProps): React.JSX.Element;
40
- export declare namespace TowerDefenseTemplate {
41
- var displayName: string;
42
- }
43
- export default TowerDefenseTemplate;
@@ -1,28 +0,0 @@
1
- /**
2
- * VisualNovelTemplate
3
- *
4
- * Thin template wrapper: titled header + VisualNovelBoard.
5
- * All scene state is driven by the entity/props passed through from the orbital trait.
6
- */
7
- import React from 'react';
8
- import type { EventEmit } from '@almadar/core';
9
- import type { TemplateProps } from '../../../core/templates/types';
10
- import type { VisualNovelNode } from '../organisms/VisualNovelBoard';
11
- export interface VisualNovelTemplateProps extends TemplateProps {
12
- title?: string;
13
- nodes?: VisualNovelNode[];
14
- currentNodeId?: string;
15
- typewriterSpeed?: number;
16
- portraitScale?: number;
17
- chooseEvent?: EventEmit<{
18
- choiceIndex: number;
19
- }>;
20
- advanceEvent?: EventEmit<Record<string, never>>;
21
- restartEvent?: EventEmit<Record<string, never>>;
22
- className?: string;
23
- }
24
- export declare function VisualNovelTemplate({ entity, title, nodes, currentNodeId, typewriterSpeed, portraitScale, chooseEvent, advanceEvent, restartEvent, className, }: VisualNovelTemplateProps): React.JSX.Element;
25
- export declare namespace VisualNovelTemplate {
26
- var displayName: string;
27
- }
28
- export default VisualNovelTemplate;
@@ -1,38 +0,0 @@
1
- /**
2
- * WorldMapTemplate
3
- *
4
- * Thin declarative wrapper around WorldMapBoard organism.
5
- * All game logic (hero movement, encounters, hex conversion, etc.) lives in WorldMapBoard.
6
- *
7
- * Compliant with Almadar_Templates.md: no hooks, no callbacks, entity-only data flow.
8
- *
9
- * @packageDocumentation
10
- */
11
- import React from 'react';
12
- import type { WorldMapBoardProps } from '../organisms/WorldMapBoard';
13
- import type { TemplateProps } from '../../../core/templates/types';
14
- import type { IsometricTile, IsometricUnit, IsometricFeature } from '../../shared/isometricTypes';
15
- export type { WorldMapSlotContext } from '../organisms/WorldMapBoard';
16
- export interface WorldMapTemplateProps extends TemplateProps {
17
- /** Canvas render scale */
18
- scale?: number;
19
- /** Unit draw-size multiplier */
20
- unitScale?: number;
21
- /** Override for the diamond-top Y offset within tile sprites (default: 374). */
22
- diamondTopY?: number;
23
- /** Allow selecting / moving ALL heroes (including enemy). For testing. */
24
- allowMoveAllHeroes?: boolean;
25
- /** Direct tile data — forwarded to WorldMapBoard; takes priority over entity. */
26
- tiles?: IsometricTile[];
27
- /** Direct unit data — forwarded to WorldMapBoard; takes priority over entity. */
28
- units?: IsometricUnit[];
29
- /** Direct feature data — forwarded to WorldMapBoard; takes priority over entity. */
30
- features?: IsometricFeature[];
31
- /** Direct asset manifest — forwarded to WorldMapBoard; takes priority over entity. */
32
- assetManifest?: WorldMapBoardProps['assetManifest'];
33
- }
34
- export declare function WorldMapTemplate({ entity, scale, unitScale, diamondTopY, allowMoveAllHeroes, tiles, units, features, assetManifest, className, }: WorldMapTemplateProps): React.JSX.Element;
35
- export declare namespace WorldMapTemplate {
36
- var displayName: string;
37
- }
38
- export default WorldMapTemplate;
@@ -1,47 +0,0 @@
1
- import type { EventEmit, EntityRow } from '@almadar/core';
2
- import type { BattlePhase } from '../../2d/organisms/BattleBoard';
3
- export interface BattleStateEventConfig {
4
- tileClickEvent?: EventEmit<{
5
- x: number;
6
- y: number;
7
- }>;
8
- unitClickEvent?: EventEmit<{
9
- unitId: string;
10
- }>;
11
- endTurnEvent?: EventEmit<Record<string, never>>;
12
- cancelEvent?: EventEmit<Record<string, never>>;
13
- gameEndEvent?: EventEmit<{
14
- result: 'victory' | 'defeat';
15
- }>;
16
- playAgainEvent?: EventEmit<Record<string, never>>;
17
- attackEvent?: EventEmit<{
18
- attackerId: string;
19
- targetId: string;
20
- damage: number;
21
- }>;
22
- }
23
- export interface BattleStateCallbacks {
24
- /** Called when a unit attacks another */
25
- onAttack?: (attacker: EntityRow, target: EntityRow, damage: number) => void;
26
- /** Called when battle ends */
27
- onGameEnd?: (result: 'victory' | 'defeat') => void;
28
- /** Called after a unit moves */
29
- onUnitMove?: (unit: EntityRow, to: {
30
- x: number;
31
- y: number;
32
- }) => void;
33
- /** Custom combat damage calculator */
34
- calculateDamage?: (attacker: EntityRow, target: EntityRow) => number;
35
- }
36
- export interface BattleStateResult {
37
- units: EntityRow[];
38
- selectedUnitId: string | null;
39
- phase: BattlePhase;
40
- turn: number;
41
- gameResult: 'victory' | 'defeat' | null;
42
- handleTileClick: (x: number, y: number) => void;
43
- handleUnitClick: (unitId: string) => void;
44
- handleEndTurn: () => void;
45
- handleRestart: () => void;
46
- }
47
- export declare function useBattleState(initialUnits: EntityRow[], eventConfig?: BattleStateEventConfig, callbacks?: BattleStateCallbacks): BattleStateResult;