@alife-sdk/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +283 -0
- package/dist/ai/DangerManager.d.ts +71 -0
- package/dist/ai/DangerManager.d.ts.map +1 -0
- package/dist/ai/DangerManager.js +176 -0
- package/dist/ai/DangerManager.js.map +1 -0
- package/dist/ai/GOAPAction.d.ts +45 -0
- package/dist/ai/GOAPAction.d.ts.map +1 -0
- package/dist/ai/GOAPAction.js +32 -0
- package/dist/ai/GOAPAction.js.map +1 -0
- package/dist/ai/GOAPPlanner.d.ts +80 -0
- package/dist/ai/GOAPPlanner.d.ts.map +1 -0
- package/dist/ai/GOAPPlanner.js +259 -0
- package/dist/ai/GOAPPlanner.js.map +1 -0
- package/dist/ai/IStateHandler.d.ts +8 -0
- package/dist/ai/IStateHandler.d.ts.map +1 -0
- package/dist/ai/IStateHandler.js +8 -0
- package/dist/ai/IStateHandler.js.map +1 -0
- package/dist/ai/MemorySystem.d.ts +94 -0
- package/dist/ai/MemorySystem.d.ts.map +1 -0
- package/dist/ai/MemorySystem.js +207 -0
- package/dist/ai/MemorySystem.js.map +1 -0
- package/dist/ai/StateMachine.d.ts +49 -0
- package/dist/ai/StateMachine.d.ts.map +1 -0
- package/dist/ai/StateMachine.js +83 -0
- package/dist/ai/StateMachine.js.map +1 -0
- package/dist/ai/WorldState.d.ts +48 -0
- package/dist/ai/WorldState.d.ts.map +1 -0
- package/dist/ai/WorldState.js +93 -0
- package/dist/ai/WorldState.js.map +1 -0
- package/dist/ai/index.d.ts +10 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +8 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/combat/DamageInstance.d.ts +26 -0
- package/dist/combat/DamageInstance.d.ts.map +1 -0
- package/dist/combat/DamageInstance.js +25 -0
- package/dist/combat/DamageInstance.js.map +1 -0
- package/dist/combat/MoraleStateMachine.d.ts +53 -0
- package/dist/combat/MoraleStateMachine.d.ts.map +1 -0
- package/dist/combat/MoraleStateMachine.js +84 -0
- package/dist/combat/MoraleStateMachine.js.map +1 -0
- package/dist/combat/index.d.ts +5 -0
- package/dist/combat/index.d.ts.map +1 -0
- package/dist/combat/index.js +3 -0
- package/dist/combat/index.js.map +1 -0
- package/dist/config/ALifeConfig.d.ts +131 -0
- package/dist/config/ALifeConfig.d.ts.map +1 -0
- package/dist/config/ALifeConfig.js +82 -0
- package/dist/config/ALifeConfig.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +2 -0
- package/dist/config/index.js.map +1 -0
- package/dist/core/ALifeKernel.d.ts +163 -0
- package/dist/core/ALifeKernel.d.ts.map +1 -0
- package/dist/core/ALifeKernel.js +542 -0
- package/dist/core/ALifeKernel.js.map +1 -0
- package/dist/core/Clock.d.ts +123 -0
- package/dist/core/Clock.d.ts.map +1 -0
- package/dist/core/Clock.js +228 -0
- package/dist/core/Clock.js.map +1 -0
- package/dist/core/DevToolsInspector.d.ts +53 -0
- package/dist/core/DevToolsInspector.d.ts.map +1 -0
- package/dist/core/DevToolsInspector.js +8 -0
- package/dist/core/DevToolsInspector.js.map +1 -0
- package/dist/core/Diagnostics.d.ts +64 -0
- package/dist/core/Diagnostics.d.ts.map +1 -0
- package/dist/core/Diagnostics.js +107 -0
- package/dist/core/Diagnostics.js.map +1 -0
- package/dist/core/ISerializable.d.ts +12 -0
- package/dist/core/ISerializable.d.ts.map +1 -0
- package/dist/core/ISerializable.js +2 -0
- package/dist/core/ISerializable.js.map +1 -0
- package/dist/core/PortRegistry.d.ts +57 -0
- package/dist/core/PortRegistry.d.ts.map +1 -0
- package/dist/core/PortRegistry.js +72 -0
- package/dist/core/PortRegistry.js.map +1 -0
- package/dist/core/PortTokens.d.ts +39 -0
- package/dist/core/PortTokens.d.ts.map +1 -0
- package/dist/core/PortTokens.js +39 -0
- package/dist/core/PortTokens.js.map +1 -0
- package/dist/core/SpatialGrid.d.ts +114 -0
- package/dist/core/SpatialGrid.d.ts.map +1 -0
- package/dist/core/SpatialGrid.js +258 -0
- package/dist/core/SpatialGrid.js.map +1 -0
- package/dist/core/Vec2.d.ts +34 -0
- package/dist/core/Vec2.d.ts.map +1 -0
- package/dist/core/Vec2.js +52 -0
- package/dist/core/Vec2.js.map +1 -0
- package/dist/core/math/CatmullRom.d.ts +20 -0
- package/dist/core/math/CatmullRom.d.ts.map +1 -0
- package/dist/core/math/CatmullRom.js +37 -0
- package/dist/core/math/CatmullRom.js.map +1 -0
- package/dist/core/math/index.d.ts +6 -0
- package/dist/core/math/index.d.ts.map +1 -0
- package/dist/core/math/index.js +5 -0
- package/dist/core/math/index.js.map +1 -0
- package/dist/core/math/intersects.d.ts +32 -0
- package/dist/core/math/intersects.d.ts.map +1 -0
- package/dist/core/math/intersects.js +92 -0
- package/dist/core/math/intersects.js.map +1 -0
- package/dist/core/math/utils.d.ts +5 -0
- package/dist/core/math/utils.d.ts.map +1 -0
- package/dist/core/math/utils.js +13 -0
- package/dist/core/math/utils.js.map +1 -0
- package/dist/entity/IComponent.d.ts +17 -0
- package/dist/entity/IComponent.d.ts.map +1 -0
- package/dist/entity/IComponent.js +2 -0
- package/dist/entity/IComponent.js.map +1 -0
- package/dist/entity/IEntity.d.ts +33 -0
- package/dist/entity/IEntity.d.ts.map +1 -0
- package/dist/entity/IEntity.js +2 -0
- package/dist/entity/IEntity.js.map +1 -0
- package/dist/entity/index.d.ts +3 -0
- package/dist/entity/index.d.ts.map +1 -0
- package/dist/entity/index.js +2 -0
- package/dist/entity/index.js.map +1 -0
- package/dist/events/ALifeEvents.d.ts +241 -0
- package/dist/events/ALifeEvents.d.ts.map +1 -0
- package/dist/events/ALifeEvents.js +53 -0
- package/dist/events/ALifeEvents.js.map +1 -0
- package/dist/events/EventBus.d.ts +52 -0
- package/dist/events/EventBus.d.ts.map +1 -0
- package/dist/events/EventBus.js +129 -0
- package/dist/events/EventBus.js.map +1 -0
- package/dist/events/index.d.ts +4 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +4 -0
- package/dist/events/index.js.map +1 -0
- package/dist/faction/Faction.d.ts +53 -0
- package/dist/faction/Faction.d.ts.map +1 -0
- package/dist/faction/Faction.js +101 -0
- package/dist/faction/Faction.js.map +1 -0
- package/dist/faction/FactionBuilder.d.ts +32 -0
- package/dist/faction/FactionBuilder.d.ts.map +1 -0
- package/dist/faction/FactionBuilder.js +80 -0
- package/dist/faction/FactionBuilder.js.map +1 -0
- package/dist/faction/ImmunityProfile.d.ts +24 -0
- package/dist/faction/ImmunityProfile.d.ts.map +1 -0
- package/dist/faction/ImmunityProfile.js +43 -0
- package/dist/faction/ImmunityProfile.js.map +1 -0
- package/dist/faction/index.d.ts +6 -0
- package/dist/faction/index.d.ts.map +1 -0
- package/dist/faction/index.js +5 -0
- package/dist/faction/index.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/logger/ILogEntry.d.ts +16 -0
- package/dist/logger/ILogEntry.d.ts.map +1 -0
- package/dist/logger/ILogEntry.js +2 -0
- package/dist/logger/ILogEntry.js.map +1 -0
- package/dist/logger/LogChannel.d.ts +27 -0
- package/dist/logger/LogChannel.d.ts.map +1 -0
- package/dist/logger/LogChannel.js +26 -0
- package/dist/logger/LogChannel.js.map +1 -0
- package/dist/logger/LogLevel.d.ts +10 -0
- package/dist/logger/LogLevel.d.ts.map +1 -0
- package/dist/logger/LogLevel.js +9 -0
- package/dist/logger/LogLevel.js.map +1 -0
- package/dist/logger/Logger.d.ts +56 -0
- package/dist/logger/Logger.d.ts.map +1 -0
- package/dist/logger/Logger.js +106 -0
- package/dist/logger/Logger.js.map +1 -0
- package/dist/logger/index.d.ts +8 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +5 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/movement/MonsterHome.d.ts +49 -0
- package/dist/movement/MonsterHome.d.ts.map +1 -0
- package/dist/movement/MonsterHome.js +75 -0
- package/dist/movement/MonsterHome.js.map +1 -0
- package/dist/movement/PatrolRoute.d.ts +99 -0
- package/dist/movement/PatrolRoute.d.ts.map +1 -0
- package/dist/movement/PatrolRoute.js +141 -0
- package/dist/movement/PatrolRoute.js.map +1 -0
- package/dist/movement/index.d.ts +5 -0
- package/dist/movement/index.d.ts.map +1 -0
- package/dist/movement/index.js +4 -0
- package/dist/movement/index.js.map +1 -0
- package/dist/navigation/LevelGraph.d.ts +78 -0
- package/dist/navigation/LevelGraph.d.ts.map +1 -0
- package/dist/navigation/LevelGraph.js +268 -0
- package/dist/navigation/LevelGraph.js.map +1 -0
- package/dist/navigation/NPCGraphMover.d.ts +87 -0
- package/dist/navigation/NPCGraphMover.d.ts.map +1 -0
- package/dist/navigation/NPCGraphMover.js +193 -0
- package/dist/navigation/NPCGraphMover.js.map +1 -0
- package/dist/navigation/index.d.ts +5 -0
- package/dist/navigation/index.d.ts.map +1 -0
- package/dist/navigation/index.js +4 -0
- package/dist/navigation/index.js.map +1 -0
- package/dist/plugins/AnomaliesPlugin.d.ts +26 -0
- package/dist/plugins/AnomaliesPlugin.d.ts.map +1 -0
- package/dist/plugins/AnomaliesPlugin.js +30 -0
- package/dist/plugins/AnomaliesPlugin.js.map +1 -0
- package/dist/plugins/CombatSchemaPlugin.d.ts +35 -0
- package/dist/plugins/CombatSchemaPlugin.d.ts.map +1 -0
- package/dist/plugins/CombatSchemaPlugin.js +44 -0
- package/dist/plugins/CombatSchemaPlugin.js.map +1 -0
- package/dist/plugins/FactionsPlugin.d.ts +26 -0
- package/dist/plugins/FactionsPlugin.d.ts.map +1 -0
- package/dist/plugins/FactionsPlugin.js +30 -0
- package/dist/plugins/FactionsPlugin.js.map +1 -0
- package/dist/plugins/IALifePlugin.d.ts +91 -0
- package/dist/plugins/IALifePlugin.d.ts.map +1 -0
- package/dist/plugins/IALifePlugin.js +2 -0
- package/dist/plugins/IALifePlugin.js.map +1 -0
- package/dist/plugins/MonstersPlugin.d.ts +26 -0
- package/dist/plugins/MonstersPlugin.d.ts.map +1 -0
- package/dist/plugins/MonstersPlugin.js +30 -0
- package/dist/plugins/MonstersPlugin.js.map +1 -0
- package/dist/plugins/NPCTypesPlugin.d.ts +26 -0
- package/dist/plugins/NPCTypesPlugin.d.ts.map +1 -0
- package/dist/plugins/NPCTypesPlugin.js +30 -0
- package/dist/plugins/NPCTypesPlugin.js.map +1 -0
- package/dist/plugins/PluginToken.d.ts +26 -0
- package/dist/plugins/PluginToken.d.ts.map +1 -0
- package/dist/plugins/PluginToken.js +22 -0
- package/dist/plugins/PluginToken.js.map +1 -0
- package/dist/plugins/SocialPlugin.d.ts +14 -0
- package/dist/plugins/SocialPlugin.d.ts.map +1 -0
- package/dist/plugins/SocialPlugin.js +16 -0
- package/dist/plugins/SocialPlugin.js.map +1 -0
- package/dist/plugins/SpawnPlugin.d.ts +15 -0
- package/dist/plugins/SpawnPlugin.d.ts.map +1 -0
- package/dist/plugins/SpawnPlugin.js +26 -0
- package/dist/plugins/SpawnPlugin.js.map +1 -0
- package/dist/plugins/SquadPlugin.d.ts +14 -0
- package/dist/plugins/SquadPlugin.d.ts.map +1 -0
- package/dist/plugins/SquadPlugin.js +16 -0
- package/dist/plugins/SquadPlugin.js.map +1 -0
- package/dist/plugins/SurgePlugin.d.ts +20 -0
- package/dist/plugins/SurgePlugin.d.ts.map +1 -0
- package/dist/plugins/SurgePlugin.js +22 -0
- package/dist/plugins/SurgePlugin.js.map +1 -0
- package/dist/plugins/TradePlugin.d.ts +16 -0
- package/dist/plugins/TradePlugin.d.ts.map +1 -0
- package/dist/plugins/TradePlugin.js +18 -0
- package/dist/plugins/TradePlugin.js.map +1 -0
- package/dist/plugins/index.d.ts +11 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +10 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/pluginNames.d.ts +37 -0
- package/dist/plugins/pluginNames.d.ts.map +1 -0
- package/dist/plugins/pluginNames.js +28 -0
- package/dist/plugins/pluginNames.js.map +1 -0
- package/dist/plugins/presets.d.ts +31 -0
- package/dist/plugins/presets.d.ts.map +1 -0
- package/dist/plugins/presets.js +50 -0
- package/dist/plugins/presets.js.map +1 -0
- package/dist/ports/IDataLoader.d.ts +38 -0
- package/dist/ports/IDataLoader.d.ts.map +1 -0
- package/dist/ports/IDataLoader.js +12 -0
- package/dist/ports/IDataLoader.js.map +1 -0
- package/dist/ports/IEntityAdapter.d.ts +73 -0
- package/dist/ports/IEntityAdapter.d.ts.map +1 -0
- package/dist/ports/IEntityAdapter.js +36 -0
- package/dist/ports/IEntityAdapter.js.map +1 -0
- package/dist/ports/IEntityFactory.d.ts +66 -0
- package/dist/ports/IEntityFactory.d.ts.map +1 -0
- package/dist/ports/IEntityFactory.js +21 -0
- package/dist/ports/IEntityFactory.js.map +1 -0
- package/dist/ports/ILogger.d.ts +29 -0
- package/dist/ports/ILogger.d.ts.map +1 -0
- package/dist/ports/ILogger.js +2 -0
- package/dist/ports/ILogger.js.map +1 -0
- package/dist/ports/IPlayerPositionProvider.d.ts +20 -0
- package/dist/ports/IPlayerPositionProvider.d.ts.map +1 -0
- package/dist/ports/IPlayerPositionProvider.js +11 -0
- package/dist/ports/IPlayerPositionProvider.js.map +1 -0
- package/dist/ports/IRandom.d.ts +25 -0
- package/dist/ports/IRandom.d.ts.map +1 -0
- package/dist/ports/IRandom.js +39 -0
- package/dist/ports/IRandom.js.map +1 -0
- package/dist/ports/IRuntimeClock.d.ts +18 -0
- package/dist/ports/IRuntimeClock.d.ts.map +1 -0
- package/dist/ports/IRuntimeClock.js +2 -0
- package/dist/ports/IRuntimeClock.js.map +1 -0
- package/dist/ports/index.d.ts +12 -0
- package/dist/ports/index.d.ts.map +1 -0
- package/dist/ports/index.js +5 -0
- package/dist/ports/index.js.map +1 -0
- package/dist/registry/AIStateRegistry.d.ts +42 -0
- package/dist/registry/AIStateRegistry.d.ts.map +1 -0
- package/dist/registry/AIStateRegistry.js +27 -0
- package/dist/registry/AIStateRegistry.js.map +1 -0
- package/dist/registry/AnomalyTypeRegistry.d.ts +21 -0
- package/dist/registry/AnomalyTypeRegistry.d.ts.map +1 -0
- package/dist/registry/AnomalyTypeRegistry.js +20 -0
- package/dist/registry/AnomalyTypeRegistry.js.map +1 -0
- package/dist/registry/BehaviorSchemeRegistry.d.ts +21 -0
- package/dist/registry/BehaviorSchemeRegistry.d.ts.map +1 -0
- package/dist/registry/BehaviorSchemeRegistry.js +24 -0
- package/dist/registry/BehaviorSchemeRegistry.js.map +1 -0
- package/dist/registry/DamageTypeRegistry.d.ts +17 -0
- package/dist/registry/DamageTypeRegistry.d.ts.map +1 -0
- package/dist/registry/DamageTypeRegistry.js +24 -0
- package/dist/registry/DamageTypeRegistry.js.map +1 -0
- package/dist/registry/FactionRegistry.d.ts +41 -0
- package/dist/registry/FactionRegistry.d.ts.map +1 -0
- package/dist/registry/FactionRegistry.js +29 -0
- package/dist/registry/FactionRegistry.js.map +1 -0
- package/dist/registry/MonsterRegistry.d.ts +44 -0
- package/dist/registry/MonsterRegistry.d.ts.map +1 -0
- package/dist/registry/MonsterRegistry.js +43 -0
- package/dist/registry/MonsterRegistry.js.map +1 -0
- package/dist/registry/NPCTypeRegistry.d.ts +34 -0
- package/dist/registry/NPCTypeRegistry.d.ts.map +1 -0
- package/dist/registry/NPCTypeRegistry.js +20 -0
- package/dist/registry/NPCTypeRegistry.js.map +1 -0
- package/dist/registry/Registry.d.ts +44 -0
- package/dist/registry/Registry.d.ts.map +1 -0
- package/dist/registry/Registry.js +80 -0
- package/dist/registry/Registry.js.map +1 -0
- package/dist/registry/TaskTypeRegistry.d.ts +17 -0
- package/dist/registry/TaskTypeRegistry.d.ts.map +1 -0
- package/dist/registry/TaskTypeRegistry.js +16 -0
- package/dist/registry/TaskTypeRegistry.js.map +1 -0
- package/dist/registry/index.d.ts +19 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +11 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/schema/index.d.ts +3 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +3 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/validators.d.ts +32 -0
- package/dist/schema/validators.d.ts.map +1 -0
- package/dist/schema/validators.js +249 -0
- package/dist/schema/validators.js.map +1 -0
- package/dist/spawn/SpawnRegistry.d.ts +48 -0
- package/dist/spawn/SpawnRegistry.d.ts.map +1 -0
- package/dist/spawn/SpawnRegistry.js +141 -0
- package/dist/spawn/SpawnRegistry.js.map +1 -0
- package/dist/spawn/index.d.ts +3 -0
- package/dist/spawn/index.d.ts.map +1 -0
- package/dist/spawn/index.js +3 -0
- package/dist/spawn/index.js.map +1 -0
- package/dist/terrain/SmartTerrain.d.ts +119 -0
- package/dist/terrain/SmartTerrain.d.ts.map +1 -0
- package/dist/terrain/SmartTerrain.js +124 -0
- package/dist/terrain/SmartTerrain.js.map +1 -0
- package/dist/terrain/TerrainBuilder.d.ts +44 -0
- package/dist/terrain/TerrainBuilder.d.ts.map +1 -0
- package/dist/terrain/TerrainBuilder.js +112 -0
- package/dist/terrain/TerrainBuilder.js.map +1 -0
- package/dist/terrain/Zone.d.ts +25 -0
- package/dist/terrain/Zone.d.ts.map +1 -0
- package/dist/terrain/Zone.js +29 -0
- package/dist/terrain/Zone.js.map +1 -0
- package/dist/terrain/index.d.ts +6 -0
- package/dist/terrain/index.d.ts.map +1 -0
- package/dist/terrain/index.js +5 -0
- package/dist/terrain/index.js.map +1 -0
- package/dist/time/TimeManager.d.ts +21 -0
- package/dist/time/TimeManager.d.ts.map +1 -0
- package/dist/time/TimeManager.js +41 -0
- package/dist/time/TimeManager.js.map +1 -0
- package/dist/time/index.d.ts +3 -0
- package/dist/time/index.d.ts.map +1 -0
- package/dist/time/index.js +2 -0
- package/dist/time/index.js.map +1 -0
- package/package.json +119 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { LevelGraph } from './LevelGraph';
|
|
2
|
+
import type { TerrainFilter } from './LevelGraph';
|
|
3
|
+
import type { ISerializable } from '../core/ISerializable';
|
|
4
|
+
export type GraphMoverEvent = {
|
|
5
|
+
readonly type: 'arrived';
|
|
6
|
+
readonly vertexId: string;
|
|
7
|
+
} | {
|
|
8
|
+
readonly type: 'completed';
|
|
9
|
+
readonly vertexId: string;
|
|
10
|
+
} | {
|
|
11
|
+
readonly type: 'no_path';
|
|
12
|
+
readonly from: string;
|
|
13
|
+
readonly to: string;
|
|
14
|
+
};
|
|
15
|
+
export interface INPCGraphMoverState {
|
|
16
|
+
currentVertexId: string;
|
|
17
|
+
nextVertexId: string | null;
|
|
18
|
+
remainingPath: string[];
|
|
19
|
+
pathCursor: number;
|
|
20
|
+
walkedDistance: number;
|
|
21
|
+
speed: number;
|
|
22
|
+
timeFactor: number;
|
|
23
|
+
}
|
|
24
|
+
export declare class NPCGraphMover implements ISerializable<INPCGraphMoverState> {
|
|
25
|
+
private readonly _graph;
|
|
26
|
+
/** Current vertex the NPC is AT (or moving away from) */
|
|
27
|
+
private _currentVertexId;
|
|
28
|
+
/** Next vertex in current path segment (null = idle) */
|
|
29
|
+
private _nextVertexId;
|
|
30
|
+
/** Remaining path after _nextVertexId (from index 0 = next after next) */
|
|
31
|
+
private _remainingPath;
|
|
32
|
+
/** Cursor index into _remainingPath — avoids O(n) shift() */
|
|
33
|
+
private _pathCursor;
|
|
34
|
+
/** Distance walked along current edge [0, edgeWeight] */
|
|
35
|
+
private _walkedDistance;
|
|
36
|
+
/** Current edge total weight (cached) */
|
|
37
|
+
private _currentEdgeWeight;
|
|
38
|
+
/** Events emitted during last update() */
|
|
39
|
+
private _pendingEvents;
|
|
40
|
+
/** Movement speed in world units per second */
|
|
41
|
+
private _speed;
|
|
42
|
+
/** Time scale factor */
|
|
43
|
+
private _timeFactor;
|
|
44
|
+
/**
|
|
45
|
+
* @param graph - The level graph used for pathfinding.
|
|
46
|
+
* @param startVertexId - Initial vertex ID for this NPC.
|
|
47
|
+
* @param speed - Movement speed in world units per second.
|
|
48
|
+
* @param timeFactor - Optional time scale factor (default 1.0).
|
|
49
|
+
*/
|
|
50
|
+
constructor(graph: LevelGraph, startVertexId: string, speed: number, timeFactor?: number);
|
|
51
|
+
/** Change movement speed at runtime. */
|
|
52
|
+
setSpeed(speed: number): void;
|
|
53
|
+
/** Current movement speed in world units per second. */
|
|
54
|
+
get speed(): number;
|
|
55
|
+
/**
|
|
56
|
+
* Request movement to a destination vertex.
|
|
57
|
+
* Computes A* path immediately. Returns false if no path found.
|
|
58
|
+
*
|
|
59
|
+
* @param destinationId - Target vertex ID.
|
|
60
|
+
* @param filter - Optional terrain filter for path finding.
|
|
61
|
+
*/
|
|
62
|
+
moveTo(destinationId: string, filter?: TerrainFilter): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Advance movement by deltaMs milliseconds using stored speed and timeFactor.
|
|
65
|
+
*
|
|
66
|
+
* @param deltaMs - Time elapsed since last tick (milliseconds).
|
|
67
|
+
*/
|
|
68
|
+
update(deltaMs: number): void;
|
|
69
|
+
/** Current world position (interpolated along current edge). */
|
|
70
|
+
get worldPosition(): {
|
|
71
|
+
x: number;
|
|
72
|
+
y: number;
|
|
73
|
+
};
|
|
74
|
+
get currentVertexId(): string;
|
|
75
|
+
get nextVertexId(): string | null;
|
|
76
|
+
get isMoving(): boolean;
|
|
77
|
+
get walkedDistance(): number;
|
|
78
|
+
/** Events from the last update() call. */
|
|
79
|
+
get events(): ReadonlyArray<GraphMoverEvent>;
|
|
80
|
+
/** Teleport NPC to a vertex (e.g. on spawn/load). Clears all movement state. */
|
|
81
|
+
teleport(vertexId: string): void;
|
|
82
|
+
/** Serialize for save/load. */
|
|
83
|
+
serialize(): INPCGraphMoverState;
|
|
84
|
+
/** Restore from serialized state. */
|
|
85
|
+
restore(state: INPCGraphMoverState): void;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=NPCGraphMover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NPCGraphMover.d.ts","sourceRoot":"","sources":["../../src/navigation/NPCGraphMover.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,MAAM,eAAe,GACvB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAG,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAM/E,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD,qBAAa,aAAc,YAAW,aAAa,CAAC,mBAAmB,CAAC;IACtE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IAEpC,yDAAyD;IACzD,OAAO,CAAC,gBAAgB,CAAS;IACjC,wDAAwD;IACxD,OAAO,CAAC,aAAa,CAAuB;IAC5C,0EAA0E;IAC1E,OAAO,CAAC,cAAc,CAAgB;IACtC,6DAA6D;IAC7D,OAAO,CAAC,WAAW,CAAK;IACxB,yDAAyD;IACzD,OAAO,CAAC,eAAe,CAAK;IAC5B,yCAAyC;IACzC,OAAO,CAAC,kBAAkB,CAAK;IAC/B,0CAA0C;IAC1C,OAAO,CAAC,cAAc,CAAyB;IAC/C,+CAA+C;IAC/C,OAAO,CAAC,MAAM,CAAS;IACvB,wBAAwB;IACxB,OAAO,CAAC,WAAW,CAAS;IAE5B;;;;;OAKG;gBACS,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,SAAI;IAWnF,wCAAwC;IACxC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI7B,wDAAwD;IACxD,IAAI,KAAK,IAAI,MAAM,CAAwB;IAM3C;;;;;;OAMG;IACH,MAAM,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO;IA6B9D;;;;OAIG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IA+C7B,gEAAgE;IAChE,IAAI,aAAa,IAAI;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAO5C;IAMD,IAAI,eAAe,IAAI,MAAM,CAAkC;IAC/D,IAAI,YAAY,IAAI,MAAM,GAAG,IAAI,CAA+B;IAChE,IAAI,QAAQ,IAAI,OAAO,CAAwC;IAC/D,IAAI,cAAc,IAAI,MAAM,CAAiC;IAE7D,0CAA0C;IAC1C,IAAI,MAAM,IAAI,aAAa,CAAC,eAAe,CAAC,CAAgC;IAM5E,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAchC,+BAA+B;IAC/B,SAAS,IAAI,mBAAmB;IAYhC,qCAAqC;IACrC,OAAO,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI;CAgB1C"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
// navigation/NPCGraphMover.ts
|
|
2
|
+
// Per-NPC cursor for offline graph-based movement.
|
|
3
|
+
//
|
|
4
|
+
// Stores (currentVertexId, walkedDistance) and advances along edges each tick.
|
|
5
|
+
// worldPosition is linearly interpolated along the current edge.
|
|
6
|
+
//
|
|
7
|
+
// Usage:
|
|
8
|
+
// const mover = new NPCGraphMover(graph, 'spawn_point', 80);
|
|
9
|
+
// mover.moveTo('base_camp');
|
|
10
|
+
// mover.update(deltaMs);
|
|
11
|
+
// const { x, y } = mover.worldPosition;
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// NPCGraphMover
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
export class NPCGraphMover {
|
|
16
|
+
/**
|
|
17
|
+
* @param graph - The level graph used for pathfinding.
|
|
18
|
+
* @param startVertexId - Initial vertex ID for this NPC.
|
|
19
|
+
* @param speed - Movement speed in world units per second.
|
|
20
|
+
* @param timeFactor - Optional time scale factor (default 1.0).
|
|
21
|
+
*/
|
|
22
|
+
constructor(graph, startVertexId, speed, timeFactor = 1) {
|
|
23
|
+
/** Next vertex in current path segment (null = idle) */
|
|
24
|
+
this._nextVertexId = null;
|
|
25
|
+
/** Remaining path after _nextVertexId (from index 0 = next after next) */
|
|
26
|
+
this._remainingPath = [];
|
|
27
|
+
/** Cursor index into _remainingPath — avoids O(n) shift() */
|
|
28
|
+
this._pathCursor = 0;
|
|
29
|
+
/** Distance walked along current edge [0, edgeWeight] */
|
|
30
|
+
this._walkedDistance = 0;
|
|
31
|
+
/** Current edge total weight (cached) */
|
|
32
|
+
this._currentEdgeWeight = 0;
|
|
33
|
+
/** Events emitted during last update() */
|
|
34
|
+
this._pendingEvents = [];
|
|
35
|
+
this._graph = graph;
|
|
36
|
+
this._currentVertexId = startVertexId;
|
|
37
|
+
this._speed = speed;
|
|
38
|
+
this._timeFactor = timeFactor;
|
|
39
|
+
}
|
|
40
|
+
// -------------------------------------------------------------------------
|
|
41
|
+
// Speed control
|
|
42
|
+
// -------------------------------------------------------------------------
|
|
43
|
+
/** Change movement speed at runtime. */
|
|
44
|
+
setSpeed(speed) {
|
|
45
|
+
this._speed = speed;
|
|
46
|
+
}
|
|
47
|
+
/** Current movement speed in world units per second. */
|
|
48
|
+
get speed() { return this._speed; }
|
|
49
|
+
// -------------------------------------------------------------------------
|
|
50
|
+
// Path control
|
|
51
|
+
// -------------------------------------------------------------------------
|
|
52
|
+
/**
|
|
53
|
+
* Request movement to a destination vertex.
|
|
54
|
+
* Computes A* path immediately. Returns false if no path found.
|
|
55
|
+
*
|
|
56
|
+
* @param destinationId - Target vertex ID.
|
|
57
|
+
* @param filter - Optional terrain filter for path finding.
|
|
58
|
+
*/
|
|
59
|
+
moveTo(destinationId, filter) {
|
|
60
|
+
if (destinationId === this._currentVertexId) {
|
|
61
|
+
this._nextVertexId = null;
|
|
62
|
+
this._remainingPath = [];
|
|
63
|
+
this._pathCursor = 0;
|
|
64
|
+
this._walkedDistance = 0;
|
|
65
|
+
this._currentEdgeWeight = 0;
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
const path = this._graph.findPath(this._currentVertexId, destinationId, filter);
|
|
69
|
+
if (!path || path.length < 2) {
|
|
70
|
+
this._pendingEvents.push({ type: 'no_path', from: this._currentVertexId, to: destinationId });
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
// path[0] = current, path[1] = next, path[2..] = remaining
|
|
74
|
+
this._nextVertexId = path[1];
|
|
75
|
+
this._remainingPath = path.slice(2);
|
|
76
|
+
this._pathCursor = 0;
|
|
77
|
+
this._walkedDistance = 0;
|
|
78
|
+
this._currentEdgeWeight = this._graph.edgeWeight(this._currentVertexId, this._nextVertexId);
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
// -------------------------------------------------------------------------
|
|
82
|
+
// Simulation tick
|
|
83
|
+
// -------------------------------------------------------------------------
|
|
84
|
+
/**
|
|
85
|
+
* Advance movement by deltaMs milliseconds using stored speed and timeFactor.
|
|
86
|
+
*
|
|
87
|
+
* @param deltaMs - Time elapsed since last tick (milliseconds).
|
|
88
|
+
*/
|
|
89
|
+
update(deltaMs) {
|
|
90
|
+
this._pendingEvents = [];
|
|
91
|
+
if (this._nextVertexId === null)
|
|
92
|
+
return;
|
|
93
|
+
if (this._speed <= 0 || this._timeFactor <= 0)
|
|
94
|
+
return;
|
|
95
|
+
// Fix C2: timeFactor multiplies (not divides) — larger factor = more movement per real ms
|
|
96
|
+
let remaining = (deltaMs / 1000) * this._timeFactor * this._speed;
|
|
97
|
+
// Fix C1: bound iterations by number of path vertices to prevent infinite loop
|
|
98
|
+
// on consecutive zero-weight edges (distToNext=0, remaining never decreases).
|
|
99
|
+
const maxSteps = this._remainingPath.length - this._pathCursor + 2;
|
|
100
|
+
let steps = 0;
|
|
101
|
+
while (remaining > 0 && this._nextVertexId !== null && steps++ < maxSteps) {
|
|
102
|
+
const distToNext = this._currentEdgeWeight - this._walkedDistance;
|
|
103
|
+
if (remaining < distToNext) {
|
|
104
|
+
this._walkedDistance += remaining;
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
// Reached next vertex
|
|
108
|
+
remaining -= distToNext;
|
|
109
|
+
this._currentVertexId = this._nextVertexId;
|
|
110
|
+
this._walkedDistance = 0;
|
|
111
|
+
// Fix P4: use cursor index instead of shift() (O(1) vs O(n))
|
|
112
|
+
if (this._pathCursor >= this._remainingPath.length) {
|
|
113
|
+
// Arrived at final destination
|
|
114
|
+
this._nextVertexId = null;
|
|
115
|
+
this._currentEdgeWeight = 0;
|
|
116
|
+
this._pendingEvents.push({ type: 'completed', vertexId: this._currentVertexId });
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
// Advance to next segment
|
|
120
|
+
const nextInPath = this._remainingPath[this._pathCursor++];
|
|
121
|
+
this._pendingEvents.push({ type: 'arrived', vertexId: this._currentVertexId });
|
|
122
|
+
this._nextVertexId = nextInPath;
|
|
123
|
+
this._currentEdgeWeight = this._graph.edgeWeight(this._currentVertexId, this._nextVertexId);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// -------------------------------------------------------------------------
|
|
127
|
+
// World position
|
|
128
|
+
// -------------------------------------------------------------------------
|
|
129
|
+
/** Current world position (interpolated along current edge). */
|
|
130
|
+
get worldPosition() {
|
|
131
|
+
if (this._nextVertexId === null || this._currentEdgeWeight === 0) {
|
|
132
|
+
const v = this._graph.getVertex(this._currentVertexId);
|
|
133
|
+
return v ? { x: v.x, y: v.y } : { x: 0, y: 0 };
|
|
134
|
+
}
|
|
135
|
+
const t = this._walkedDistance / this._currentEdgeWeight;
|
|
136
|
+
return this._graph.interpolatePosition(this._currentVertexId, this._nextVertexId, t);
|
|
137
|
+
}
|
|
138
|
+
// -------------------------------------------------------------------------
|
|
139
|
+
// Accessors
|
|
140
|
+
// -------------------------------------------------------------------------
|
|
141
|
+
get currentVertexId() { return this._currentVertexId; }
|
|
142
|
+
get nextVertexId() { return this._nextVertexId; }
|
|
143
|
+
get isMoving() { return this._nextVertexId !== null; }
|
|
144
|
+
get walkedDistance() { return this._walkedDistance; }
|
|
145
|
+
/** Events from the last update() call. */
|
|
146
|
+
get events() { return this._pendingEvents; }
|
|
147
|
+
// -------------------------------------------------------------------------
|
|
148
|
+
// Teleport
|
|
149
|
+
// -------------------------------------------------------------------------
|
|
150
|
+
/** Teleport NPC to a vertex (e.g. on spawn/load). Clears all movement state. */
|
|
151
|
+
teleport(vertexId) {
|
|
152
|
+
this._currentVertexId = vertexId;
|
|
153
|
+
this._nextVertexId = null;
|
|
154
|
+
this._remainingPath = [];
|
|
155
|
+
this._pathCursor = 0;
|
|
156
|
+
this._walkedDistance = 0;
|
|
157
|
+
this._currentEdgeWeight = 0;
|
|
158
|
+
this._pendingEvents = [];
|
|
159
|
+
}
|
|
160
|
+
// -------------------------------------------------------------------------
|
|
161
|
+
// Serialization — implements ISerializable<INPCGraphMoverState>
|
|
162
|
+
// -------------------------------------------------------------------------
|
|
163
|
+
/** Serialize for save/load. */
|
|
164
|
+
serialize() {
|
|
165
|
+
return {
|
|
166
|
+
currentVertexId: this._currentVertexId,
|
|
167
|
+
nextVertexId: this._nextVertexId,
|
|
168
|
+
remainingPath: [...this._remainingPath],
|
|
169
|
+
pathCursor: this._pathCursor,
|
|
170
|
+
walkedDistance: this._walkedDistance,
|
|
171
|
+
speed: this._speed,
|
|
172
|
+
timeFactor: this._timeFactor,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/** Restore from serialized state. */
|
|
176
|
+
restore(state) {
|
|
177
|
+
this._currentVertexId = state.currentVertexId;
|
|
178
|
+
this._nextVertexId = state.nextVertexId;
|
|
179
|
+
this._remainingPath = [...state.remainingPath];
|
|
180
|
+
this._pathCursor = state.pathCursor;
|
|
181
|
+
this._walkedDistance = state.walkedDistance;
|
|
182
|
+
this._speed = state.speed;
|
|
183
|
+
this._timeFactor = state.timeFactor;
|
|
184
|
+
this._pendingEvents = [];
|
|
185
|
+
if (this._nextVertexId !== null) {
|
|
186
|
+
this._currentEdgeWeight = this._graph.edgeWeight(this._currentVertexId, this._nextVertexId);
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
this._currentEdgeWeight = 0;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=NPCGraphMover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NPCGraphMover.js","sourceRoot":"","sources":["../../src/navigation/NPCGraphMover.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { LevelGraph } from './LevelGraph';
|
|
2
|
+
export type { IGraphVertex, IGraphEdge, TerrainFilter, ILevelGraphState } from './LevelGraph';
|
|
3
|
+
export { NPCGraphMover } from './NPCGraphMover';
|
|
4
|
+
export type { GraphMoverEvent, INPCGraphMoverState } from './NPCGraphMover';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/navigation/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC9F,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/navigation/index.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { IALifePlugin } from './IALifePlugin';
|
|
2
|
+
import type { ALifeKernel } from '../core/ALifeKernel';
|
|
3
|
+
import { AnomalyTypeRegistry } from '../registry/AnomalyTypeRegistry';
|
|
4
|
+
/**
|
|
5
|
+
* Adds anomaly type registration to the A-Life kernel.
|
|
6
|
+
*
|
|
7
|
+
* Install this plugin when your game has environmental hazard zones
|
|
8
|
+
* (anomalies) that deal damage and spawn artefacts.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* const alife = new ALifeKernel(ports);
|
|
13
|
+
* alife.use(new AnomaliesPlugin());
|
|
14
|
+
*
|
|
15
|
+
* const ap = alife.getPlugin<AnomaliesPlugin>('anomalies');
|
|
16
|
+
* ap.anomalyTypes.register('fire_vortex', { name: 'Fire Vortex', ... });
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export declare class AnomaliesPlugin implements IALifePlugin {
|
|
20
|
+
readonly name = "anomalies";
|
|
21
|
+
readonly anomalyTypes: AnomalyTypeRegistry;
|
|
22
|
+
private kernel;
|
|
23
|
+
install(kernel: ALifeKernel): void;
|
|
24
|
+
init(): void;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=AnomaliesPlugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnomaliesPlugin.d.ts","sourceRoot":"","sources":["../../src/plugins/AnomaliesPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAEtE;;;;;;;;;;;;;;GAcG;AACH,qBAAa,eAAgB,YAAW,YAAY;IAClD,QAAQ,CAAC,IAAI,eAAe;IAC5B,QAAQ,CAAC,YAAY,sBAA6B;IAElD,OAAO,CAAC,MAAM,CAAe;IAE7B,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAIlC,IAAI,IAAI,IAAI;CAIb"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { AnomalyTypeRegistry } from '../registry/AnomalyTypeRegistry';
|
|
2
|
+
/**
|
|
3
|
+
* Adds anomaly type registration to the A-Life kernel.
|
|
4
|
+
*
|
|
5
|
+
* Install this plugin when your game has environmental hazard zones
|
|
6
|
+
* (anomalies) that deal damage and spawn artefacts.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* const alife = new ALifeKernel(ports);
|
|
11
|
+
* alife.use(new AnomaliesPlugin());
|
|
12
|
+
*
|
|
13
|
+
* const ap = alife.getPlugin<AnomaliesPlugin>('anomalies');
|
|
14
|
+
* ap.anomalyTypes.register('fire_vortex', { name: 'Fire Vortex', ... });
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export class AnomaliesPlugin {
|
|
18
|
+
constructor() {
|
|
19
|
+
this.name = 'anomalies';
|
|
20
|
+
this.anomalyTypes = new AnomalyTypeRegistry();
|
|
21
|
+
}
|
|
22
|
+
install(kernel) {
|
|
23
|
+
this.kernel = kernel;
|
|
24
|
+
}
|
|
25
|
+
init() {
|
|
26
|
+
this.anomalyTypes.freeze();
|
|
27
|
+
this.kernel.logger.info('plugin', `AnomaliesPlugin: ${this.anomalyTypes.size} types registered`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=AnomaliesPlugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnomaliesPlugin.js","sourceRoot":"","sources":["../../src/plugins/AnomaliesPlugin.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAEtE;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,eAAe;IAA5B;QACW,SAAI,GAAG,WAAW,CAAC;QACnB,iBAAY,GAAG,IAAI,mBAAmB,EAAE,CAAC;IAYpD,CAAC;IARC,OAAO,CAAC,MAAmB;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,IAAI;QACF,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,oBAAoB,IAAI,CAAC,YAAY,CAAC,IAAI,mBAAmB,CAAC,CAAC;IACnG,CAAC;CACF"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { IALifePlugin } from './IALifePlugin';
|
|
2
|
+
import type { ALifeKernel } from '../core/ALifeKernel';
|
|
3
|
+
import { DamageTypeRegistry } from '../registry/DamageTypeRegistry';
|
|
4
|
+
import { AIStateRegistry } from '../registry/AIStateRegistry';
|
|
5
|
+
import { BehaviorSchemeRegistry } from '../registry/BehaviorSchemeRegistry';
|
|
6
|
+
import { TaskTypeRegistry } from '../registry/TaskTypeRegistry';
|
|
7
|
+
/**
|
|
8
|
+
* Groups the four combat-related registries that change together:
|
|
9
|
+
* damage types, AI states, behavior schemes, and task types.
|
|
10
|
+
*
|
|
11
|
+
* These registries share the Common Closure Principle — a change in
|
|
12
|
+
* combat design (e.g. adding a new damage type) typically touches
|
|
13
|
+
* AI states and behavior schemes in the same commit.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* const alife = new ALifeKernel(ports);
|
|
18
|
+
* alife.use(new CombatSchemaPlugin());
|
|
19
|
+
*
|
|
20
|
+
* const cs = alife.getPlugin<CombatSchemaPlugin>('combatSchema');
|
|
21
|
+
* cs.damageTypes.register('fire', { name: 'Вогонь', ... });
|
|
22
|
+
* cs.aiStates.register('combat', { name: 'Бій', ... });
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export declare class CombatSchemaPlugin implements IALifePlugin {
|
|
26
|
+
readonly name = "combatSchema";
|
|
27
|
+
readonly damageTypes: DamageTypeRegistry;
|
|
28
|
+
readonly aiStates: AIStateRegistry;
|
|
29
|
+
readonly behaviorSchemes: BehaviorSchemeRegistry;
|
|
30
|
+
readonly taskTypes: TaskTypeRegistry;
|
|
31
|
+
private kernel;
|
|
32
|
+
install(kernel: ALifeKernel): void;
|
|
33
|
+
init(): void;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=CombatSchemaPlugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CombatSchemaPlugin.d.ts","sourceRoot":"","sources":["../../src/plugins/CombatSchemaPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,kBAAmB,YAAW,YAAY;IACrD,QAAQ,CAAC,IAAI,kBAAkB;IAC/B,QAAQ,CAAC,WAAW,qBAA4B;IAChD,QAAQ,CAAC,QAAQ,kBAAyB;IAC1C,QAAQ,CAAC,eAAe,yBAAgC;IACxD,QAAQ,CAAC,SAAS,mBAA0B;IAE5C,OAAO,CAAC,MAAM,CAAe;IAE7B,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAIlC,IAAI,IAAI,IAAI;CAUb"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { DamageTypeRegistry } from '../registry/DamageTypeRegistry';
|
|
2
|
+
import { AIStateRegistry } from '../registry/AIStateRegistry';
|
|
3
|
+
import { BehaviorSchemeRegistry } from '../registry/BehaviorSchemeRegistry';
|
|
4
|
+
import { TaskTypeRegistry } from '../registry/TaskTypeRegistry';
|
|
5
|
+
/**
|
|
6
|
+
* Groups the four combat-related registries that change together:
|
|
7
|
+
* damage types, AI states, behavior schemes, and task types.
|
|
8
|
+
*
|
|
9
|
+
* These registries share the Common Closure Principle — a change in
|
|
10
|
+
* combat design (e.g. adding a new damage type) typically touches
|
|
11
|
+
* AI states and behavior schemes in the same commit.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* const alife = new ALifeKernel(ports);
|
|
16
|
+
* alife.use(new CombatSchemaPlugin());
|
|
17
|
+
*
|
|
18
|
+
* const cs = alife.getPlugin<CombatSchemaPlugin>('combatSchema');
|
|
19
|
+
* cs.damageTypes.register('fire', { name: 'Вогонь', ... });
|
|
20
|
+
* cs.aiStates.register('combat', { name: 'Бій', ... });
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export class CombatSchemaPlugin {
|
|
24
|
+
constructor() {
|
|
25
|
+
this.name = 'combatSchema';
|
|
26
|
+
this.damageTypes = new DamageTypeRegistry();
|
|
27
|
+
this.aiStates = new AIStateRegistry();
|
|
28
|
+
this.behaviorSchemes = new BehaviorSchemeRegistry();
|
|
29
|
+
this.taskTypes = new TaskTypeRegistry();
|
|
30
|
+
}
|
|
31
|
+
install(kernel) {
|
|
32
|
+
this.kernel = kernel;
|
|
33
|
+
}
|
|
34
|
+
init() {
|
|
35
|
+
this.damageTypes.freeze();
|
|
36
|
+
this.aiStates.freeze();
|
|
37
|
+
this.behaviorSchemes.freeze();
|
|
38
|
+
this.taskTypes.freeze();
|
|
39
|
+
const total = this.damageTypes.size + this.aiStates.size
|
|
40
|
+
+ this.behaviorSchemes.size + this.taskTypes.size;
|
|
41
|
+
this.kernel.logger.info('plugin', `CombatSchemaPlugin: ${total} schema entries registered`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=CombatSchemaPlugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CombatSchemaPlugin.js","sourceRoot":"","sources":["../../src/plugins/CombatSchemaPlugin.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,kBAAkB;IAA/B;QACW,SAAI,GAAG,cAAc,CAAC;QACtB,gBAAW,GAAG,IAAI,kBAAkB,EAAE,CAAC;QACvC,aAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;QACjC,oBAAe,GAAG,IAAI,sBAAsB,EAAE,CAAC;QAC/C,cAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;IAkB9C,CAAC;IAdC,OAAO,CAAC,MAAmB;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,IAAI;QACF,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;QAC1B,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC;QAC9B,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;QAExB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI;cACpD,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,uBAAuB,KAAK,4BAA4B,CAAC,CAAC;IAC9F,CAAC;CACF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { IALifePlugin } from './IALifePlugin';
|
|
2
|
+
import type { ALifeKernel } from '../core/ALifeKernel';
|
|
3
|
+
import { FactionRegistry } from '../registry/FactionRegistry';
|
|
4
|
+
/**
|
|
5
|
+
* Owns faction definitions and inter-faction relations.
|
|
6
|
+
*
|
|
7
|
+
* Install this plugin when your game has multiple factions with
|
|
8
|
+
* configurable hostility / alliance relationships.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* const alife = new ALifeKernel(ports);
|
|
13
|
+
* alife.use(new FactionsPlugin());
|
|
14
|
+
*
|
|
15
|
+
* const fp = alife.getPlugin<FactionsPlugin>('factions');
|
|
16
|
+
* fp.factions.register('loners', { name: 'Одинаки', ... });
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export declare class FactionsPlugin implements IALifePlugin {
|
|
20
|
+
readonly name = "factions";
|
|
21
|
+
readonly factions: FactionRegistry;
|
|
22
|
+
private kernel;
|
|
23
|
+
install(kernel: ALifeKernel): void;
|
|
24
|
+
init(): void;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=FactionsPlugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FactionsPlugin.d.ts","sourceRoot":"","sources":["../../src/plugins/FactionsPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D;;;;;;;;;;;;;;GAcG;AACH,qBAAa,cAAe,YAAW,YAAY;IACjD,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,QAAQ,kBAAyB;IAE1C,OAAO,CAAC,MAAM,CAAe;IAE7B,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAIlC,IAAI,IAAI,IAAI;CAIb"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { FactionRegistry } from '../registry/FactionRegistry';
|
|
2
|
+
/**
|
|
3
|
+
* Owns faction definitions and inter-faction relations.
|
|
4
|
+
*
|
|
5
|
+
* Install this plugin when your game has multiple factions with
|
|
6
|
+
* configurable hostility / alliance relationships.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* const alife = new ALifeKernel(ports);
|
|
11
|
+
* alife.use(new FactionsPlugin());
|
|
12
|
+
*
|
|
13
|
+
* const fp = alife.getPlugin<FactionsPlugin>('factions');
|
|
14
|
+
* fp.factions.register('loners', { name: 'Одинаки', ... });
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export class FactionsPlugin {
|
|
18
|
+
constructor() {
|
|
19
|
+
this.name = 'factions';
|
|
20
|
+
this.factions = new FactionRegistry();
|
|
21
|
+
}
|
|
22
|
+
install(kernel) {
|
|
23
|
+
this.kernel = kernel;
|
|
24
|
+
}
|
|
25
|
+
init() {
|
|
26
|
+
this.factions.freeze();
|
|
27
|
+
this.kernel.logger.info('plugin', `FactionsPlugin: ${this.factions.size} factions registered`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=FactionsPlugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FactionsPlugin.js","sourceRoot":"","sources":["../../src/plugins/FactionsPlugin.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,cAAc;IAA3B;QACW,SAAI,GAAG,UAAU,CAAC;QAClB,aAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;IAY5C,CAAC;IARC,OAAO,CAAC,MAAmB;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,IAAI;QACF,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,mBAAmB,IAAI,CAAC,QAAQ,CAAC,IAAI,sBAAsB,CAAC,CAAC;IACjG,CAAC;CACF"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { ALifeKernel } from '../core/ALifeKernel';
|
|
2
|
+
import type { PortToken } from '../core/PortRegistry';
|
|
3
|
+
/**
|
|
4
|
+
* Lifecycle contract for A-Life kernel plugins.
|
|
5
|
+
*
|
|
6
|
+
* Plugins extend the kernel with domain-specific registries, event handlers,
|
|
7
|
+
* and per-frame logic. Each plugin has a unique string name used for typed
|
|
8
|
+
* retrieval via `kernel.getPlugin<T>(name)`.
|
|
9
|
+
*
|
|
10
|
+
* Lifecycle order:
|
|
11
|
+
* install() → init() → update() per frame → destroy()
|
|
12
|
+
*
|
|
13
|
+
* Only `name` and `install` are required. The remaining hooks are optional.
|
|
14
|
+
*/
|
|
15
|
+
export interface IALifePlugin {
|
|
16
|
+
/** Unique identifier. Convention: lowercase noun ('monsters', 'surge'). */
|
|
17
|
+
readonly name: string;
|
|
18
|
+
/**
|
|
19
|
+
* Hard dependencies — plugin names that must be installed before this one.
|
|
20
|
+
* Init fails with a diagnostic error if any hard dependency is missing.
|
|
21
|
+
*/
|
|
22
|
+
readonly dependencies?: readonly string[];
|
|
23
|
+
/**
|
|
24
|
+
* Soft dependencies — plugin names that this plugin can use but doesn't require.
|
|
25
|
+
* A warning is emitted if a soft dependency is missing, but init continues.
|
|
26
|
+
*/
|
|
27
|
+
readonly optionalDependencies?: readonly string[];
|
|
28
|
+
/**
|
|
29
|
+
* Port tokens that this plugin requires to function.
|
|
30
|
+
* Init fails with a diagnostic error if any required port is not provided.
|
|
31
|
+
*/
|
|
32
|
+
readonly requiredPorts?: readonly PortToken<unknown>[];
|
|
33
|
+
/**
|
|
34
|
+
* Called when `kernel.use(plugin)` is invoked.
|
|
35
|
+
*
|
|
36
|
+
* Registries are still mutable at this point — use this hook to store the
|
|
37
|
+
* kernel reference and perform any pre-init setup.
|
|
38
|
+
*/
|
|
39
|
+
install(kernel: ALifeKernel): void;
|
|
40
|
+
/**
|
|
41
|
+
* Called during `kernel.init()`, after all core registries are frozen.
|
|
42
|
+
*
|
|
43
|
+
* Use this to freeze plugin-owned registries and create internal
|
|
44
|
+
* subsystems that depend on frozen registry data.
|
|
45
|
+
*/
|
|
46
|
+
init?(): void;
|
|
47
|
+
/**
|
|
48
|
+
* Called every frame from `kernel.update(deltaMs)`, after core systems.
|
|
49
|
+
*
|
|
50
|
+
* Only implement when the plugin has per-frame simulation logic.
|
|
51
|
+
*/
|
|
52
|
+
update?(deltaMs: number): void;
|
|
53
|
+
/**
|
|
54
|
+
* Called during `kernel.destroy()`, in reverse installation order.
|
|
55
|
+
*
|
|
56
|
+
* Use this to release subscriptions, timers, and internal state.
|
|
57
|
+
*/
|
|
58
|
+
destroy?(): void;
|
|
59
|
+
/**
|
|
60
|
+
* Capture plugin-specific state for save/load.
|
|
61
|
+
*
|
|
62
|
+
* Return a plain JSON-serialisable object. Called by `kernel.serialize()`.
|
|
63
|
+
*/
|
|
64
|
+
serialize?(): Record<string, unknown>;
|
|
65
|
+
/**
|
|
66
|
+
* Restore plugin state from a previously serialised snapshot.
|
|
67
|
+
*
|
|
68
|
+
* Called by `kernel.restoreState()` with the object returned by `serialize()`.
|
|
69
|
+
*/
|
|
70
|
+
restore?(state: Record<string, unknown>): void;
|
|
71
|
+
/**
|
|
72
|
+
* Migrate plugin state from an older version.
|
|
73
|
+
*
|
|
74
|
+
* Called by `kernel.restoreState()` when the saved plugin state version
|
|
75
|
+
* is older than the current version. Implementations should return the
|
|
76
|
+
* migrated state object.
|
|
77
|
+
*
|
|
78
|
+
* @param state - The serialised plugin state from the save.
|
|
79
|
+
* @param fromVersion - The version the state was saved with.
|
|
80
|
+
* @returns The migrated state, compatible with the current version.
|
|
81
|
+
*/
|
|
82
|
+
migrateState?(state: Record<string, unknown>, fromVersion: number): Record<string, unknown>;
|
|
83
|
+
/**
|
|
84
|
+
* Return a snapshot of the plugin's internal state for developer tooling.
|
|
85
|
+
*
|
|
86
|
+
* Called by `kernel.inspect()`. Return a plain object with whatever
|
|
87
|
+
* diagnostic data is useful (entity counts, queue lengths, etc.).
|
|
88
|
+
*/
|
|
89
|
+
inspect?(): Record<string, unknown>;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=IALifePlugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IALifePlugin.d.ts","sourceRoot":"","sources":["../../src/plugins/IALifePlugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,YAAY;IAC3B,2EAA2E;IAC3E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAE1C;;;OAGG;IACH,QAAQ,CAAC,oBAAoB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAElD;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;IAEvD;;;;;OAKG;IACH,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAEnC;;;;;OAKG;IACH,IAAI,CAAC,IAAI,IAAI,CAAC;IAEd;;;;OAIG;IACH,MAAM,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAE/B;;;;OAIG;IACH,OAAO,CAAC,IAAI,IAAI,CAAC;IAEjB;;;;OAIG;IACH,SAAS,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEtC;;;;OAIG;IACH,OAAO,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAE/C;;;;;;;;;;OAUG;IACH,YAAY,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE5F;;;;;OAKG;IACH,OAAO,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IALifePlugin.js","sourceRoot":"","sources":["../../src/plugins/IALifePlugin.ts"],"names":[],"mappings":""}
|