@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 @@
|
|
|
1
|
+
{"version":3,"file":"ALifeEvents.d.ts","sourceRoot":"","sources":["../../src/events/ALifeEvents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export const ALifeEvents = {
|
|
2
|
+
// A-Life core
|
|
3
|
+
TICK: 'alife:tick',
|
|
4
|
+
NPC_MOVED: 'alife:npc_moved',
|
|
5
|
+
FACTION_CONFLICT: 'alife:faction_conflict',
|
|
6
|
+
NPC_ONLINE: 'alife:npc_online',
|
|
7
|
+
NPC_OFFLINE: 'alife:npc_offline',
|
|
8
|
+
TASK_ASSIGNED: 'alife:task_assigned',
|
|
9
|
+
NPC_DIED: 'alife:npc_died',
|
|
10
|
+
SPAWN_REQUESTED: 'alife:spawn_requested',
|
|
11
|
+
NPC_RELEASED: 'alife:npc_released',
|
|
12
|
+
TERRAIN_STATE_CHANGED: 'alife:terrain_state_changed',
|
|
13
|
+
MORALE_CHANGED: 'alife:morale_changed',
|
|
14
|
+
NPC_PANICKED: 'ai:npc_panicked',
|
|
15
|
+
// AI perception
|
|
16
|
+
SPOTTED_ENEMY: 'ai:spotted_enemy',
|
|
17
|
+
HEARD_SOUND: 'ai:heard_sound',
|
|
18
|
+
LOST_TARGET: 'ai:lost_target',
|
|
19
|
+
STATE_CHANGED: 'ai:state_changed',
|
|
20
|
+
NPC_SHOOT: 'ai:npc_shoot',
|
|
21
|
+
NPC_VOCALIZATION: 'ai:npc_vocalization',
|
|
22
|
+
NPC_ATTACKED: 'ai:npc_attacked',
|
|
23
|
+
// Surge
|
|
24
|
+
SURGE_WARNING: 'surge:warning',
|
|
25
|
+
SURGE_STARTED: 'surge:started',
|
|
26
|
+
SURGE_ENDED: 'surge:ended',
|
|
27
|
+
SURGE_DAMAGE: 'surge:damage',
|
|
28
|
+
// Anomaly
|
|
29
|
+
ANOMALY_DAMAGE: 'anomaly:damage',
|
|
30
|
+
ARTEFACT_SPAWNED: 'anomaly:artefact_spawned',
|
|
31
|
+
ARTEFACT_COLLECTED: 'anomaly:artefact_collected',
|
|
32
|
+
// Squad
|
|
33
|
+
SQUAD_FORMED: 'squad:formed',
|
|
34
|
+
SQUAD_MEMBER_ADDED: 'squad:member_added',
|
|
35
|
+
SQUAD_MEMBER_REMOVED: 'squad:member_removed',
|
|
36
|
+
SQUAD_DISBANDED: 'squad:disbanded',
|
|
37
|
+
SQUAD_COMMAND_ISSUED: 'squad:command_issued',
|
|
38
|
+
SQUAD_GOAL_SET: 'squad:goal_set',
|
|
39
|
+
SQUAD_GOAL_CLEARED: 'squad:goal_cleared',
|
|
40
|
+
// Faction
|
|
41
|
+
FACTION_RELATION_CHANGED: 'faction:relation_changed',
|
|
42
|
+
// Time
|
|
43
|
+
HOUR_CHANGED: 'time:hour_changed',
|
|
44
|
+
DAY_NIGHT_CHANGED: 'time:day_night_changed',
|
|
45
|
+
// Social
|
|
46
|
+
NPC_SOCIAL_BUBBLE: 'social:npc_bubble',
|
|
47
|
+
NPC_MEET_PLAYER: 'social:npc_meet_player',
|
|
48
|
+
KAMP_STATE_CHANGED: 'social:kamp_state_changed',
|
|
49
|
+
// Monster
|
|
50
|
+
MONSTER_MELEE_HIT: 'monster:melee_hit',
|
|
51
|
+
PSI_ATTACK_START: 'monster:psi_attack_start',
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=ALifeEvents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ALifeEvents.js","sourceRoot":"","sources":["../../src/events/ALifeEvents.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,cAAc;IACd,IAAI,EAAE,YAAY;IAClB,SAAS,EAAE,iBAAiB;IAC5B,gBAAgB,EAAE,wBAAwB;IAC1C,UAAU,EAAE,kBAAkB;IAC9B,WAAW,EAAE,mBAAmB;IAChC,aAAa,EAAE,qBAAqB;IACpC,QAAQ,EAAE,gBAAgB;IAC1B,eAAe,EAAE,uBAAuB;IACxC,YAAY,EAAE,oBAAoB;IAClC,qBAAqB,EAAE,6BAA6B;IACpD,cAAc,EAAE,sBAAsB;IACtC,YAAY,EAAE,iBAAiB;IAE/B,gBAAgB;IAChB,aAAa,EAAE,kBAAkB;IACjC,WAAW,EAAE,gBAAgB;IAC7B,WAAW,EAAE,gBAAgB;IAC7B,aAAa,EAAE,kBAAkB;IACjC,SAAS,EAAE,cAAc;IACzB,gBAAgB,EAAE,qBAAqB;IACvC,YAAY,EAAE,iBAAiB;IAE/B,QAAQ;IACR,aAAa,EAAE,eAAe;IAC9B,aAAa,EAAE,eAAe;IAC9B,WAAW,EAAE,aAAa;IAC1B,YAAY,EAAE,cAAc;IAE5B,UAAU;IACV,cAAc,EAAE,gBAAgB;IAChC,gBAAgB,EAAE,0BAA0B;IAC5C,kBAAkB,EAAE,4BAA4B;IAEhD,QAAQ;IACR,YAAY,EAAE,cAAc;IAC5B,kBAAkB,EAAE,oBAAoB;IACxC,oBAAoB,EAAE,sBAAsB;IAC5C,eAAe,EAAE,iBAAiB;IAClC,oBAAoB,EAAE,sBAAsB;IAC5C,cAAc,EAAE,gBAAgB;IAChC,kBAAkB,EAAE,oBAAoB;IAExC,UAAU;IACV,wBAAwB,EAAE,0BAA0B;IAEpD,OAAO;IACP,YAAY,EAAE,mBAAmB;IACjC,iBAAiB,EAAE,wBAAwB;IAE3C,SAAS;IACT,iBAAiB,EAAE,mBAAmB;IACtC,eAAe,EAAE,wBAAwB;IACzC,kBAAkB,EAAE,2BAA2B;IAE/C,UAAU;IACV,iBAAiB,EAAE,mBAAmB;IACtC,gBAAgB,EAAE,0BAA0B;CACpC,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { ILogger } from '../ports/ILogger';
|
|
2
|
+
/**
|
|
3
|
+
* Type-safe event emitter parameterised by a payload map.
|
|
4
|
+
*
|
|
5
|
+
* `TPayloads` maps event name strings to their payload types, giving full
|
|
6
|
+
* IntelliSense for both emitting and subscribing — wrong event names or
|
|
7
|
+
* payload shapes are caught at compile time.
|
|
8
|
+
*
|
|
9
|
+
* @typeParam TPayloads - Record mapping event name → payload type.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* interface MyEvents {
|
|
14
|
+
* 'player:hit': { damage: number };
|
|
15
|
+
* 'player:died': undefined;
|
|
16
|
+
* }
|
|
17
|
+
* const bus = new EventBus<MyEvents>();
|
|
18
|
+
* bus.on('player:hit', (p) => console.log(p.damage)); // p is typed
|
|
19
|
+
* bus.emit('player:hit', { damage: 10 });
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export declare class EventBus<TPayloads = Record<string, unknown>> {
|
|
23
|
+
private listeners;
|
|
24
|
+
private _frontQueue;
|
|
25
|
+
private _backQueue;
|
|
26
|
+
private readonly _onceEntries;
|
|
27
|
+
private readonly _logger;
|
|
28
|
+
/**
|
|
29
|
+
* @param logger - Optional logger for reporting listener errors. Defaults to
|
|
30
|
+
* `console` when not provided, preserving backward-compatibility.
|
|
31
|
+
*/
|
|
32
|
+
constructor(logger?: ILogger);
|
|
33
|
+
/** Queue an event for deferred dispatch. Call flush() to deliver. */
|
|
34
|
+
emit<K extends keyof TPayloads & string>(event: K, payload?: TPayloads[K]): void;
|
|
35
|
+
/**
|
|
36
|
+
* Process all queued events, dispatching to registered listeners.
|
|
37
|
+
* Handles re-entrant emit safely: events emitted during flush are
|
|
38
|
+
* appended to the queue and processed within the same flush cycle.
|
|
39
|
+
*/
|
|
40
|
+
flush(): void;
|
|
41
|
+
/** Number of events waiting in the queue. */
|
|
42
|
+
get pendingCount(): number;
|
|
43
|
+
/** Subscribe to an event. Returns an unsubscribe function. */
|
|
44
|
+
on<K extends keyof TPayloads & string>(event: K, fn: (payload: TPayloads[K]) => void, context?: unknown): () => void;
|
|
45
|
+
/** Subscribe to an event for a single invocation. Returns an unsubscribe function. */
|
|
46
|
+
once<K extends keyof TPayloads & string>(event: K, fn: (payload: TPayloads[K]) => void): () => void;
|
|
47
|
+
/** Unsubscribe a specific listener. Both `fn` and `context` must match the original on() call. */
|
|
48
|
+
off<K extends keyof TPayloads & string>(event: K, fn: (payload: TPayloads[K]) => void, context?: unknown): void;
|
|
49
|
+
/** Remove all listeners for all events and clear the pending queue. */
|
|
50
|
+
destroy(): void;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=EventBus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventBus.d.ts","sourceRoot":"","sources":["../../src/events/EventBus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAShD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,QAAQ,CACnB,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAEnC,OAAO,CAAC,SAAS,CAAyC;IAC1D,OAAO,CAAC,WAAW,CAAkD;IACrE,OAAO,CAAC,UAAU,CAAkD;IACpE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuB;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAE9C;;;OAGG;gBACS,MAAM,CAAC,EAAE,OAAO;IAI5B,qEAAqE;IACrE,IAAI,CAAC,CAAC,SAAS,MAAM,SAAS,GAAG,MAAM,EACrC,KAAK,EAAE,CAAC,EACR,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,GACrB,IAAI;IAIP;;;;OAIG;IACH,KAAK,IAAI,IAAI;IAkCb,6CAA6C;IAC7C,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,8DAA8D;IAC9D,EAAE,CAAC,CAAC,SAAS,MAAM,SAAS,GAAG,MAAM,EACnC,KAAK,EAAE,CAAC,EACR,EAAE,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,EACnC,OAAO,CAAC,EAAE,OAAO,GAChB,MAAM,IAAI;IAeb,sFAAsF;IACtF,IAAI,CAAC,CAAC,SAAS,MAAM,SAAS,GAAG,MAAM,EACrC,KAAK,EAAE,CAAC,EACR,EAAE,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,GAClC,MAAM,IAAI;IAeb,kGAAkG;IAClG,GAAG,CAAC,CAAC,SAAS,MAAM,SAAS,GAAG,MAAM,EACpC,KAAK,EAAE,CAAC,EACR,EAAE,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,EACnC,OAAO,CAAC,EAAE,OAAO,GAChB,IAAI;IAYP,uEAAuE;IACvE,OAAO,IAAI,IAAI;CAKhB"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type-safe event emitter parameterised by a payload map.
|
|
3
|
+
*
|
|
4
|
+
* `TPayloads` maps event name strings to their payload types, giving full
|
|
5
|
+
* IntelliSense for both emitting and subscribing — wrong event names or
|
|
6
|
+
* payload shapes are caught at compile time.
|
|
7
|
+
*
|
|
8
|
+
* @typeParam TPayloads - Record mapping event name → payload type.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* interface MyEvents {
|
|
13
|
+
* 'player:hit': { damage: number };
|
|
14
|
+
* 'player:died': undefined;
|
|
15
|
+
* }
|
|
16
|
+
* const bus = new EventBus<MyEvents>();
|
|
17
|
+
* bus.on('player:hit', (p) => console.log(p.damage)); // p is typed
|
|
18
|
+
* bus.emit('player:hit', { damage: 10 });
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export class EventBus {
|
|
22
|
+
/**
|
|
23
|
+
* @param logger - Optional logger for reporting listener errors. Defaults to
|
|
24
|
+
* `console` when not provided, preserving backward-compatibility.
|
|
25
|
+
*/
|
|
26
|
+
constructor(logger) {
|
|
27
|
+
this.listeners = new Map();
|
|
28
|
+
this._frontQueue = [];
|
|
29
|
+
this._backQueue = [];
|
|
30
|
+
this._onceEntries = [];
|
|
31
|
+
this._logger = logger;
|
|
32
|
+
}
|
|
33
|
+
/** Queue an event for deferred dispatch. Call flush() to deliver. */
|
|
34
|
+
emit(event, payload) {
|
|
35
|
+
this._frontQueue.push({ event: event, payload });
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Process all queued events, dispatching to registered listeners.
|
|
39
|
+
* Handles re-entrant emit safely: events emitted during flush are
|
|
40
|
+
* appended to the queue and processed within the same flush cycle.
|
|
41
|
+
*/
|
|
42
|
+
flush() {
|
|
43
|
+
try {
|
|
44
|
+
while (this._frontQueue.length > 0) {
|
|
45
|
+
// Swap: new emits during dispatch go to the fresh front buffer
|
|
46
|
+
const batch = this._frontQueue;
|
|
47
|
+
this._frontQueue = this._backQueue;
|
|
48
|
+
this._backQueue = batch;
|
|
49
|
+
this._frontQueue.length = 0;
|
|
50
|
+
for (const { event, payload } of this._backQueue) {
|
|
51
|
+
const set = this.listeners.get(event);
|
|
52
|
+
if (!set)
|
|
53
|
+
continue;
|
|
54
|
+
this._onceEntries.length = 0;
|
|
55
|
+
for (const entry of set) {
|
|
56
|
+
try {
|
|
57
|
+
entry.fn.call(entry.context, payload);
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
if (this._logger) {
|
|
61
|
+
this._logger.error('EventBus', `listener for "${event}" threw`, err);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
console.error(`[EventBus] listener for "${event}" threw:`, err);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (entry.once)
|
|
68
|
+
this._onceEntries.push(entry);
|
|
69
|
+
}
|
|
70
|
+
for (const entry of this._onceEntries)
|
|
71
|
+
set.delete(entry);
|
|
72
|
+
}
|
|
73
|
+
this._backQueue.length = 0;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
// flush complete
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/** Number of events waiting in the queue. */
|
|
81
|
+
get pendingCount() {
|
|
82
|
+
return this._frontQueue.length;
|
|
83
|
+
}
|
|
84
|
+
/** Subscribe to an event. Returns an unsubscribe function. */
|
|
85
|
+
on(event, fn, context) {
|
|
86
|
+
let set = this.listeners.get(event);
|
|
87
|
+
if (!set) {
|
|
88
|
+
set = new Set();
|
|
89
|
+
this.listeners.set(event, set);
|
|
90
|
+
}
|
|
91
|
+
const entry = { fn, context, once: false };
|
|
92
|
+
set.add(entry);
|
|
93
|
+
return () => {
|
|
94
|
+
set.delete(entry);
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/** Subscribe to an event for a single invocation. Returns an unsubscribe function. */
|
|
98
|
+
once(event, fn) {
|
|
99
|
+
let set = this.listeners.get(event);
|
|
100
|
+
if (!set) {
|
|
101
|
+
set = new Set();
|
|
102
|
+
this.listeners.set(event, set);
|
|
103
|
+
}
|
|
104
|
+
const entry = { fn, context: undefined, once: true };
|
|
105
|
+
set.add(entry);
|
|
106
|
+
return () => {
|
|
107
|
+
set.delete(entry);
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/** Unsubscribe a specific listener. Both `fn` and `context` must match the original on() call. */
|
|
111
|
+
off(event, fn, context) {
|
|
112
|
+
const set = this.listeners.get(event);
|
|
113
|
+
if (!set)
|
|
114
|
+
return;
|
|
115
|
+
for (const entry of set) {
|
|
116
|
+
if (entry.fn === fn && entry.context === context) {
|
|
117
|
+
set.delete(entry);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/** Remove all listeners for all events and clear the pending queue. */
|
|
123
|
+
destroy() {
|
|
124
|
+
this.listeners.clear();
|
|
125
|
+
this._frontQueue.length = 0;
|
|
126
|
+
this._backQueue.length = 0;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=EventBus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventBus.js","sourceRoot":"","sources":["../../src/events/EventBus.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Faction — two-layer relation model.
|
|
3
|
+
*
|
|
4
|
+
* Base relations come from the config (IFactionDefinition) and are immutable.
|
|
5
|
+
* Dynamic goodwill is mutable at runtime and decays toward 0 each tick.
|
|
6
|
+
* The effective relation is the sum of both layers, clamped to [-100, 100].
|
|
7
|
+
*/
|
|
8
|
+
import type { IFactionDefinition } from '../registry/FactionRegistry';
|
|
9
|
+
/** Configurable thresholds for faction diplomacy classification. */
|
|
10
|
+
export interface IFactionThresholds {
|
|
11
|
+
/** Relation below this value is considered hostile. Default: -50. */
|
|
12
|
+
readonly hostile: number;
|
|
13
|
+
/** Relation above this value is considered allied. Default: 50. */
|
|
14
|
+
readonly ally: number;
|
|
15
|
+
}
|
|
16
|
+
export declare class Faction {
|
|
17
|
+
readonly id: string;
|
|
18
|
+
readonly name: string;
|
|
19
|
+
readonly metadata: ReadonlyMap<string, unknown>;
|
|
20
|
+
private readonly baseRelations;
|
|
21
|
+
private readonly dynamicGoodwill;
|
|
22
|
+
private readonly thresholds;
|
|
23
|
+
private readonly _keysToRemove;
|
|
24
|
+
constructor(id: string, definition: IFactionDefinition, thresholds?: Partial<IFactionThresholds>);
|
|
25
|
+
/**
|
|
26
|
+
* Combined relation = base + dynamic, clamped to [-100, 100].
|
|
27
|
+
* Returns 0 when no relation data exists for the other faction.
|
|
28
|
+
*/
|
|
29
|
+
getRelation(otherFactionId: string): number;
|
|
30
|
+
/**
|
|
31
|
+
* Modify dynamic goodwill (not base). The stored value is clamped to [-100, 100].
|
|
32
|
+
*/
|
|
33
|
+
adjustGoodwill(otherFactionId: string, delta: number): void;
|
|
34
|
+
/** Relation is hostile when the combined score drops below the hostile threshold. */
|
|
35
|
+
isHostile(otherFactionId: string): boolean;
|
|
36
|
+
/** Relation is allied when the combined score exceeds the ally threshold. */
|
|
37
|
+
isAlly(otherFactionId: string): boolean;
|
|
38
|
+
/** Relation is neutral when it falls between hostile and ally thresholds inclusive. */
|
|
39
|
+
isNeutral(otherFactionId: string): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Decay every dynamic goodwill entry toward 0 by the given rate.
|
|
42
|
+
* Entries that reach 0 are removed to keep the map clean.
|
|
43
|
+
*/
|
|
44
|
+
decayGoodwill(rate: number): void;
|
|
45
|
+
/** Reset all dynamic goodwill to zero. */
|
|
46
|
+
resetGoodwill(): void;
|
|
47
|
+
serialize(): IFactionState;
|
|
48
|
+
restore(state: IFactionState): void;
|
|
49
|
+
}
|
|
50
|
+
export interface IFactionState {
|
|
51
|
+
readonly dynamicGoodwill: Readonly<Record<string, number>>;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=Faction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Faction.d.ts","sourceRoot":"","sources":["../../src/faction/Faction.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAQtE,oEAAoE;AACpE,MAAM,WAAW,kBAAkB;IACjC,qEAAqE;IACrE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,mEAAmE;IACnE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,OAAO;IAClB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEhD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA8B;IAC5D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA6B;IAC7D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;gBAG5C,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,kBAAkB,EAC9B,UAAU,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC;IAY1C;;;OAGG;IACH,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM;IAM3C;;OAEG;IACH,cAAc,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAW3D,qFAAqF;IACrF,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO;IAI1C,6EAA6E;IAC7E,MAAM,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO;IAIvC,uFAAuF;IACvF,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO;IAK1C;;;OAGG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAoBjC,0CAA0C;IAC1C,aAAa,IAAI,IAAI;IAQrB,SAAS,IAAI,aAAa;IAM1B,OAAO,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;CAMpC;AAMD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC5D"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Faction — two-layer relation model.
|
|
3
|
+
*
|
|
4
|
+
* Base relations come from the config (IFactionDefinition) and are immutable.
|
|
5
|
+
* Dynamic goodwill is mutable at runtime and decays toward 0 each tick.
|
|
6
|
+
* The effective relation is the sum of both layers, clamped to [-100, 100].
|
|
7
|
+
*/
|
|
8
|
+
import { clamp, moveTowardZero } from '../core/math/utils';
|
|
9
|
+
const RELATION_MIN = -100;
|
|
10
|
+
const RELATION_MAX = 100;
|
|
11
|
+
const DEFAULT_HOSTILE_THRESHOLD = -50;
|
|
12
|
+
const DEFAULT_ALLY_THRESHOLD = 50;
|
|
13
|
+
export class Faction {
|
|
14
|
+
constructor(id, definition, thresholds) {
|
|
15
|
+
this.dynamicGoodwill = new Map();
|
|
16
|
+
this._keysToRemove = [];
|
|
17
|
+
this.id = id;
|
|
18
|
+
this.name = definition.name;
|
|
19
|
+
this.baseRelations = new Map(Object.entries(definition.baseRelations));
|
|
20
|
+
this.metadata = new Map(Object.entries(definition.metadata ?? {}));
|
|
21
|
+
this.thresholds = {
|
|
22
|
+
hostile: thresholds?.hostile ?? DEFAULT_HOSTILE_THRESHOLD,
|
|
23
|
+
ally: thresholds?.ally ?? DEFAULT_ALLY_THRESHOLD,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Combined relation = base + dynamic, clamped to [-100, 100].
|
|
28
|
+
* Returns 0 when no relation data exists for the other faction.
|
|
29
|
+
*/
|
|
30
|
+
getRelation(otherFactionId) {
|
|
31
|
+
const base = this.baseRelations.get(otherFactionId) ?? 0;
|
|
32
|
+
const dynamic = this.dynamicGoodwill.get(otherFactionId) ?? 0;
|
|
33
|
+
return clamp(base + dynamic, RELATION_MIN, RELATION_MAX);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Modify dynamic goodwill (not base). The stored value is clamped to [-100, 100].
|
|
37
|
+
*/
|
|
38
|
+
adjustGoodwill(otherFactionId, delta) {
|
|
39
|
+
const current = this.dynamicGoodwill.get(otherFactionId) ?? 0;
|
|
40
|
+
const next = clamp(current + delta, RELATION_MIN, RELATION_MAX);
|
|
41
|
+
if (next === 0) {
|
|
42
|
+
this.dynamicGoodwill.delete(otherFactionId);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
this.dynamicGoodwill.set(otherFactionId, next);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/** Relation is hostile when the combined score drops below the hostile threshold. */
|
|
49
|
+
isHostile(otherFactionId) {
|
|
50
|
+
return this.getRelation(otherFactionId) < this.thresholds.hostile;
|
|
51
|
+
}
|
|
52
|
+
/** Relation is allied when the combined score exceeds the ally threshold. */
|
|
53
|
+
isAlly(otherFactionId) {
|
|
54
|
+
return this.getRelation(otherFactionId) > this.thresholds.ally;
|
|
55
|
+
}
|
|
56
|
+
/** Relation is neutral when it falls between hostile and ally thresholds inclusive. */
|
|
57
|
+
isNeutral(otherFactionId) {
|
|
58
|
+
const relation = this.getRelation(otherFactionId);
|
|
59
|
+
return relation >= this.thresholds.hostile && relation <= this.thresholds.ally;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Decay every dynamic goodwill entry toward 0 by the given rate.
|
|
63
|
+
* Entries that reach 0 are removed to keep the map clean.
|
|
64
|
+
*/
|
|
65
|
+
decayGoodwill(rate) {
|
|
66
|
+
if (rate <= 0)
|
|
67
|
+
return;
|
|
68
|
+
this._keysToRemove.length = 0;
|
|
69
|
+
for (const [factionId, value] of this.dynamicGoodwill) {
|
|
70
|
+
const decayed = moveTowardZero(value, rate);
|
|
71
|
+
if (decayed === 0) {
|
|
72
|
+
this._keysToRemove.push(factionId);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
this.dynamicGoodwill.set(factionId, decayed);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
for (let i = 0; i < this._keysToRemove.length; i++) {
|
|
79
|
+
this.dynamicGoodwill.delete(this._keysToRemove[i]);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/** Reset all dynamic goodwill to zero. */
|
|
83
|
+
resetGoodwill() {
|
|
84
|
+
this.dynamicGoodwill.clear();
|
|
85
|
+
}
|
|
86
|
+
// -----------------------------------------------------------------------
|
|
87
|
+
// Serialisation
|
|
88
|
+
// -----------------------------------------------------------------------
|
|
89
|
+
serialize() {
|
|
90
|
+
return {
|
|
91
|
+
dynamicGoodwill: Object.fromEntries(this.dynamicGoodwill),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
restore(state) {
|
|
95
|
+
this.dynamicGoodwill.clear();
|
|
96
|
+
for (const [id, value] of Object.entries(state.dynamicGoodwill)) {
|
|
97
|
+
this.dynamicGoodwill.set(id, value);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=Faction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Faction.js","sourceRoot":"","sources":["../../src/faction/Faction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fluent builder for creating IFactionDefinition objects.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* const def = new FactionBuilder('stalkers')
|
|
6
|
+
* .displayName('Stalkers')
|
|
7
|
+
* .relation('bandits', -60)
|
|
8
|
+
* .immunity('radiation', 0.2)
|
|
9
|
+
* .equipmentPreference({ aggressiveness: 0.5 })
|
|
10
|
+
* .spawn({ targetRatio: 0.25, balanceTolerance: 0.1 })
|
|
11
|
+
* .build();
|
|
12
|
+
*/
|
|
13
|
+
import type { IFactionDefinition, IEquipmentPreference, IFactionSpawnRules } from '../registry/FactionRegistry';
|
|
14
|
+
export declare class FactionBuilder {
|
|
15
|
+
private readonly id;
|
|
16
|
+
private name;
|
|
17
|
+
private readonly relations;
|
|
18
|
+
private readonly immunities;
|
|
19
|
+
private equipment;
|
|
20
|
+
private spawnRules;
|
|
21
|
+
private metadataEntries;
|
|
22
|
+
constructor(id: string);
|
|
23
|
+
displayName(name: string): this;
|
|
24
|
+
relation(factionId: string, score: number): this;
|
|
25
|
+
immunity(damageTypeId: string, factor: number): this;
|
|
26
|
+
equipmentPreference(prefs: Partial<IEquipmentPreference>): this;
|
|
27
|
+
spawn(rules: Partial<IFactionSpawnRules>): this;
|
|
28
|
+
withMetadata(key: string, value: unknown): this;
|
|
29
|
+
/** Validate required fields and return a frozen IFactionDefinition. */
|
|
30
|
+
build(): IFactionDefinition;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=FactionBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FactionBuilder.d.ts","sourceRoot":"","sources":["../../src/faction/FactionBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,6BAA6B,CAAC;AAOrC,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAS;IAC5B,OAAO,CAAC,IAAI,CAAM;IAClB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;IACxD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA8B;IACzD,OAAO,CAAC,SAAS,CAAqC;IACtD,OAAO,CAAC,UAAU,CAA2C;IAC7D,OAAO,CAAC,eAAe,CAA+B;gBAE1C,EAAE,EAAE,MAAM;IAOtB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK/B,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAehD,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAUpD,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,IAAI;IAK/D,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,IAAI;IAK/C,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAK/C,uEAAuE;IACvE,KAAK,IAAI,kBAAkB;CAkB5B"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fluent builder for creating IFactionDefinition objects.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* const def = new FactionBuilder('stalkers')
|
|
6
|
+
* .displayName('Stalkers')
|
|
7
|
+
* .relation('bandits', -60)
|
|
8
|
+
* .immunity('radiation', 0.2)
|
|
9
|
+
* .equipmentPreference({ aggressiveness: 0.5 })
|
|
10
|
+
* .spawn({ targetRatio: 0.25, balanceTolerance: 0.1 })
|
|
11
|
+
* .build();
|
|
12
|
+
*/
|
|
13
|
+
const DEFAULT_SPAWN_RULES = {
|
|
14
|
+
targetRatio: 0,
|
|
15
|
+
balanceTolerance: 0,
|
|
16
|
+
};
|
|
17
|
+
export class FactionBuilder {
|
|
18
|
+
constructor(id) {
|
|
19
|
+
this.name = '';
|
|
20
|
+
this.relations = {};
|
|
21
|
+
this.immunities = {};
|
|
22
|
+
this.equipment = {};
|
|
23
|
+
this.spawnRules = DEFAULT_SPAWN_RULES;
|
|
24
|
+
this.metadataEntries = {};
|
|
25
|
+
if (!id) {
|
|
26
|
+
throw new Error('[FactionBuilder] id must not be empty');
|
|
27
|
+
}
|
|
28
|
+
this.id = id;
|
|
29
|
+
}
|
|
30
|
+
displayName(name) {
|
|
31
|
+
this.name = name;
|
|
32
|
+
return this;
|
|
33
|
+
}
|
|
34
|
+
relation(factionId, score) {
|
|
35
|
+
if (factionId === this.id) {
|
|
36
|
+
throw new Error(`[FactionBuilder] Faction "${this.id}" cannot define a relation to itself`);
|
|
37
|
+
}
|
|
38
|
+
if (score < -100 || score > 100) {
|
|
39
|
+
throw new Error(`[FactionBuilder] Relation score for "${factionId}" must be in [-100, 100], got ${score}`);
|
|
40
|
+
}
|
|
41
|
+
this.relations[factionId] = score;
|
|
42
|
+
return this;
|
|
43
|
+
}
|
|
44
|
+
immunity(damageTypeId, factor) {
|
|
45
|
+
if (factor < 0 || factor > 1) {
|
|
46
|
+
throw new Error(`[FactionBuilder] Immunity factor for "${damageTypeId}" must be in [0, 1], got ${factor}`);
|
|
47
|
+
}
|
|
48
|
+
this.immunities[damageTypeId] = factor;
|
|
49
|
+
return this;
|
|
50
|
+
}
|
|
51
|
+
equipmentPreference(prefs) {
|
|
52
|
+
this.equipment = { ...this.equipment, ...prefs };
|
|
53
|
+
return this;
|
|
54
|
+
}
|
|
55
|
+
spawn(rules) {
|
|
56
|
+
this.spawnRules = { ...this.spawnRules, ...rules };
|
|
57
|
+
return this;
|
|
58
|
+
}
|
|
59
|
+
withMetadata(key, value) {
|
|
60
|
+
this.metadataEntries[key] = value;
|
|
61
|
+
return this;
|
|
62
|
+
}
|
|
63
|
+
/** Validate required fields and return a frozen IFactionDefinition. */
|
|
64
|
+
build() {
|
|
65
|
+
if (!this.name) {
|
|
66
|
+
throw new Error(`[FactionBuilder] Faction "${this.id}" requires a display name`);
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
name: this.name,
|
|
70
|
+
baseRelations: { ...this.relations },
|
|
71
|
+
immunities: { ...this.immunities },
|
|
72
|
+
defaultEquipment: { ...this.equipment },
|
|
73
|
+
spawnRules: { ...this.spawnRules },
|
|
74
|
+
metadata: Object.keys(this.metadataEntries).length > 0
|
|
75
|
+
? { ...this.metadataEntries }
|
|
76
|
+
: undefined,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=FactionBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FactionBuilder.js","sourceRoot":"","sources":["../../src/faction/FactionBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extensible immunity profile based on Map<string, number>.
|
|
3
|
+
*
|
|
4
|
+
* Each entry maps a damage type ID to a resistance factor in [0, 1],
|
|
5
|
+
* where 0 = no resistance and 1 = full immunity.
|
|
6
|
+
* Missing entries default to 0 (no resistance).
|
|
7
|
+
*/
|
|
8
|
+
export type ImmunityProfile = ReadonlyMap<string, number>;
|
|
9
|
+
/**
|
|
10
|
+
* Create an ImmunityProfile from an optional record of damage-type-to-resistance pairs.
|
|
11
|
+
* Values are clamped to [0, 1].
|
|
12
|
+
*/
|
|
13
|
+
export declare function createImmunityProfile(entries?: Record<string, number>): ImmunityProfile;
|
|
14
|
+
/**
|
|
15
|
+
* Return the resistance factor for a given damage type.
|
|
16
|
+
* Returns 0 when the profile has no entry for that type.
|
|
17
|
+
*/
|
|
18
|
+
export declare function getResistance(profile: ImmunityProfile, damageTypeId: string): number;
|
|
19
|
+
/**
|
|
20
|
+
* Reduce base damage by the profile's resistance to the given type.
|
|
21
|
+
* Formula: baseDamage * (1 - resistance).
|
|
22
|
+
*/
|
|
23
|
+
export declare function applyDamageReduction(baseDamage: number, profile: ImmunityProfile, damageTypeId: string): number;
|
|
24
|
+
//# sourceMappingURL=ImmunityProfile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImmunityProfile.d.ts","sourceRoot":"","sources":["../../src/faction/ImmunityProfile.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,eAAe,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE1D;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,eAAe,CAWjB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,eAAe,EACxB,YAAY,EAAE,MAAM,GACnB,MAAM,CAER;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,eAAe,EACxB,YAAY,EAAE,MAAM,GACnB,MAAM,CAGR"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extensible immunity profile based on Map<string, number>.
|
|
3
|
+
*
|
|
4
|
+
* Each entry maps a damage type ID to a resistance factor in [0, 1],
|
|
5
|
+
* where 0 = no resistance and 1 = full immunity.
|
|
6
|
+
* Missing entries default to 0 (no resistance).
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Create an ImmunityProfile from an optional record of damage-type-to-resistance pairs.
|
|
10
|
+
* Values are clamped to [0, 1].
|
|
11
|
+
*/
|
|
12
|
+
export function createImmunityProfile(entries) {
|
|
13
|
+
const map = new Map();
|
|
14
|
+
if (entries) {
|
|
15
|
+
for (const [damageTypeId, rawFactor] of Object.entries(entries)) {
|
|
16
|
+
const factor = clampResistance(rawFactor);
|
|
17
|
+
map.set(damageTypeId, factor);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return map;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Return the resistance factor for a given damage type.
|
|
24
|
+
* Returns 0 when the profile has no entry for that type.
|
|
25
|
+
*/
|
|
26
|
+
export function getResistance(profile, damageTypeId) {
|
|
27
|
+
return profile.get(damageTypeId) ?? 0;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Reduce base damage by the profile's resistance to the given type.
|
|
31
|
+
* Formula: baseDamage * (1 - resistance).
|
|
32
|
+
*/
|
|
33
|
+
export function applyDamageReduction(baseDamage, profile, damageTypeId) {
|
|
34
|
+
const resistance = getResistance(profile, damageTypeId);
|
|
35
|
+
return baseDamage * (1 - resistance);
|
|
36
|
+
}
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// Helpers
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
function clampResistance(value) {
|
|
41
|
+
return Math.max(0, Math.min(1, value));
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=ImmunityProfile.js.map
|