@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.
Files changed (367) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +283 -0
  3. package/dist/ai/DangerManager.d.ts +71 -0
  4. package/dist/ai/DangerManager.d.ts.map +1 -0
  5. package/dist/ai/DangerManager.js +176 -0
  6. package/dist/ai/DangerManager.js.map +1 -0
  7. package/dist/ai/GOAPAction.d.ts +45 -0
  8. package/dist/ai/GOAPAction.d.ts.map +1 -0
  9. package/dist/ai/GOAPAction.js +32 -0
  10. package/dist/ai/GOAPAction.js.map +1 -0
  11. package/dist/ai/GOAPPlanner.d.ts +80 -0
  12. package/dist/ai/GOAPPlanner.d.ts.map +1 -0
  13. package/dist/ai/GOAPPlanner.js +259 -0
  14. package/dist/ai/GOAPPlanner.js.map +1 -0
  15. package/dist/ai/IStateHandler.d.ts +8 -0
  16. package/dist/ai/IStateHandler.d.ts.map +1 -0
  17. package/dist/ai/IStateHandler.js +8 -0
  18. package/dist/ai/IStateHandler.js.map +1 -0
  19. package/dist/ai/MemorySystem.d.ts +94 -0
  20. package/dist/ai/MemorySystem.d.ts.map +1 -0
  21. package/dist/ai/MemorySystem.js +207 -0
  22. package/dist/ai/MemorySystem.js.map +1 -0
  23. package/dist/ai/StateMachine.d.ts +49 -0
  24. package/dist/ai/StateMachine.d.ts.map +1 -0
  25. package/dist/ai/StateMachine.js +83 -0
  26. package/dist/ai/StateMachine.js.map +1 -0
  27. package/dist/ai/WorldState.d.ts +48 -0
  28. package/dist/ai/WorldState.d.ts.map +1 -0
  29. package/dist/ai/WorldState.js +93 -0
  30. package/dist/ai/WorldState.js.map +1 -0
  31. package/dist/ai/index.d.ts +10 -0
  32. package/dist/ai/index.d.ts.map +1 -0
  33. package/dist/ai/index.js +8 -0
  34. package/dist/ai/index.js.map +1 -0
  35. package/dist/combat/DamageInstance.d.ts +26 -0
  36. package/dist/combat/DamageInstance.d.ts.map +1 -0
  37. package/dist/combat/DamageInstance.js +25 -0
  38. package/dist/combat/DamageInstance.js.map +1 -0
  39. package/dist/combat/MoraleStateMachine.d.ts +53 -0
  40. package/dist/combat/MoraleStateMachine.d.ts.map +1 -0
  41. package/dist/combat/MoraleStateMachine.js +84 -0
  42. package/dist/combat/MoraleStateMachine.js.map +1 -0
  43. package/dist/combat/index.d.ts +5 -0
  44. package/dist/combat/index.d.ts.map +1 -0
  45. package/dist/combat/index.js +3 -0
  46. package/dist/combat/index.js.map +1 -0
  47. package/dist/config/ALifeConfig.d.ts +131 -0
  48. package/dist/config/ALifeConfig.d.ts.map +1 -0
  49. package/dist/config/ALifeConfig.js +82 -0
  50. package/dist/config/ALifeConfig.js.map +1 -0
  51. package/dist/config/index.d.ts +3 -0
  52. package/dist/config/index.d.ts.map +1 -0
  53. package/dist/config/index.js +2 -0
  54. package/dist/config/index.js.map +1 -0
  55. package/dist/core/ALifeKernel.d.ts +163 -0
  56. package/dist/core/ALifeKernel.d.ts.map +1 -0
  57. package/dist/core/ALifeKernel.js +542 -0
  58. package/dist/core/ALifeKernel.js.map +1 -0
  59. package/dist/core/Clock.d.ts +123 -0
  60. package/dist/core/Clock.d.ts.map +1 -0
  61. package/dist/core/Clock.js +228 -0
  62. package/dist/core/Clock.js.map +1 -0
  63. package/dist/core/DevToolsInspector.d.ts +53 -0
  64. package/dist/core/DevToolsInspector.d.ts.map +1 -0
  65. package/dist/core/DevToolsInspector.js +8 -0
  66. package/dist/core/DevToolsInspector.js.map +1 -0
  67. package/dist/core/Diagnostics.d.ts +64 -0
  68. package/dist/core/Diagnostics.d.ts.map +1 -0
  69. package/dist/core/Diagnostics.js +107 -0
  70. package/dist/core/Diagnostics.js.map +1 -0
  71. package/dist/core/ISerializable.d.ts +12 -0
  72. package/dist/core/ISerializable.d.ts.map +1 -0
  73. package/dist/core/ISerializable.js +2 -0
  74. package/dist/core/ISerializable.js.map +1 -0
  75. package/dist/core/PortRegistry.d.ts +57 -0
  76. package/dist/core/PortRegistry.d.ts.map +1 -0
  77. package/dist/core/PortRegistry.js +72 -0
  78. package/dist/core/PortRegistry.js.map +1 -0
  79. package/dist/core/PortTokens.d.ts +39 -0
  80. package/dist/core/PortTokens.d.ts.map +1 -0
  81. package/dist/core/PortTokens.js +39 -0
  82. package/dist/core/PortTokens.js.map +1 -0
  83. package/dist/core/SpatialGrid.d.ts +114 -0
  84. package/dist/core/SpatialGrid.d.ts.map +1 -0
  85. package/dist/core/SpatialGrid.js +258 -0
  86. package/dist/core/SpatialGrid.js.map +1 -0
  87. package/dist/core/Vec2.d.ts +34 -0
  88. package/dist/core/Vec2.d.ts.map +1 -0
  89. package/dist/core/Vec2.js +52 -0
  90. package/dist/core/Vec2.js.map +1 -0
  91. package/dist/core/math/CatmullRom.d.ts +20 -0
  92. package/dist/core/math/CatmullRom.d.ts.map +1 -0
  93. package/dist/core/math/CatmullRom.js +37 -0
  94. package/dist/core/math/CatmullRom.js.map +1 -0
  95. package/dist/core/math/index.d.ts +6 -0
  96. package/dist/core/math/index.d.ts.map +1 -0
  97. package/dist/core/math/index.js +5 -0
  98. package/dist/core/math/index.js.map +1 -0
  99. package/dist/core/math/intersects.d.ts +32 -0
  100. package/dist/core/math/intersects.d.ts.map +1 -0
  101. package/dist/core/math/intersects.js +92 -0
  102. package/dist/core/math/intersects.js.map +1 -0
  103. package/dist/core/math/utils.d.ts +5 -0
  104. package/dist/core/math/utils.d.ts.map +1 -0
  105. package/dist/core/math/utils.js +13 -0
  106. package/dist/core/math/utils.js.map +1 -0
  107. package/dist/entity/IComponent.d.ts +17 -0
  108. package/dist/entity/IComponent.d.ts.map +1 -0
  109. package/dist/entity/IComponent.js +2 -0
  110. package/dist/entity/IComponent.js.map +1 -0
  111. package/dist/entity/IEntity.d.ts +33 -0
  112. package/dist/entity/IEntity.d.ts.map +1 -0
  113. package/dist/entity/IEntity.js +2 -0
  114. package/dist/entity/IEntity.js.map +1 -0
  115. package/dist/entity/index.d.ts +3 -0
  116. package/dist/entity/index.d.ts.map +1 -0
  117. package/dist/entity/index.js +2 -0
  118. package/dist/entity/index.js.map +1 -0
  119. package/dist/events/ALifeEvents.d.ts +241 -0
  120. package/dist/events/ALifeEvents.d.ts.map +1 -0
  121. package/dist/events/ALifeEvents.js +53 -0
  122. package/dist/events/ALifeEvents.js.map +1 -0
  123. package/dist/events/EventBus.d.ts +52 -0
  124. package/dist/events/EventBus.d.ts.map +1 -0
  125. package/dist/events/EventBus.js +129 -0
  126. package/dist/events/EventBus.js.map +1 -0
  127. package/dist/events/index.d.ts +4 -0
  128. package/dist/events/index.d.ts.map +1 -0
  129. package/dist/events/index.js +4 -0
  130. package/dist/events/index.js.map +1 -0
  131. package/dist/faction/Faction.d.ts +53 -0
  132. package/dist/faction/Faction.d.ts.map +1 -0
  133. package/dist/faction/Faction.js +101 -0
  134. package/dist/faction/Faction.js.map +1 -0
  135. package/dist/faction/FactionBuilder.d.ts +32 -0
  136. package/dist/faction/FactionBuilder.d.ts.map +1 -0
  137. package/dist/faction/FactionBuilder.js +80 -0
  138. package/dist/faction/FactionBuilder.js.map +1 -0
  139. package/dist/faction/ImmunityProfile.d.ts +24 -0
  140. package/dist/faction/ImmunityProfile.d.ts.map +1 -0
  141. package/dist/faction/ImmunityProfile.js +43 -0
  142. package/dist/faction/ImmunityProfile.js.map +1 -0
  143. package/dist/faction/index.d.ts +6 -0
  144. package/dist/faction/index.d.ts.map +1 -0
  145. package/dist/faction/index.js +5 -0
  146. package/dist/faction/index.js.map +1 -0
  147. package/dist/index.d.ts +32 -0
  148. package/dist/index.d.ts.map +1 -0
  149. package/dist/index.js +34 -0
  150. package/dist/index.js.map +1 -0
  151. package/dist/logger/ILogEntry.d.ts +16 -0
  152. package/dist/logger/ILogEntry.d.ts.map +1 -0
  153. package/dist/logger/ILogEntry.js +2 -0
  154. package/dist/logger/ILogEntry.js.map +1 -0
  155. package/dist/logger/LogChannel.d.ts +27 -0
  156. package/dist/logger/LogChannel.d.ts.map +1 -0
  157. package/dist/logger/LogChannel.js +26 -0
  158. package/dist/logger/LogChannel.js.map +1 -0
  159. package/dist/logger/LogLevel.d.ts +10 -0
  160. package/dist/logger/LogLevel.d.ts.map +1 -0
  161. package/dist/logger/LogLevel.js +9 -0
  162. package/dist/logger/LogLevel.js.map +1 -0
  163. package/dist/logger/Logger.d.ts +56 -0
  164. package/dist/logger/Logger.d.ts.map +1 -0
  165. package/dist/logger/Logger.js +106 -0
  166. package/dist/logger/Logger.js.map +1 -0
  167. package/dist/logger/index.d.ts +8 -0
  168. package/dist/logger/index.d.ts.map +1 -0
  169. package/dist/logger/index.js +5 -0
  170. package/dist/logger/index.js.map +1 -0
  171. package/dist/movement/MonsterHome.d.ts +49 -0
  172. package/dist/movement/MonsterHome.d.ts.map +1 -0
  173. package/dist/movement/MonsterHome.js +75 -0
  174. package/dist/movement/MonsterHome.js.map +1 -0
  175. package/dist/movement/PatrolRoute.d.ts +99 -0
  176. package/dist/movement/PatrolRoute.d.ts.map +1 -0
  177. package/dist/movement/PatrolRoute.js +141 -0
  178. package/dist/movement/PatrolRoute.js.map +1 -0
  179. package/dist/movement/index.d.ts +5 -0
  180. package/dist/movement/index.d.ts.map +1 -0
  181. package/dist/movement/index.js +4 -0
  182. package/dist/movement/index.js.map +1 -0
  183. package/dist/navigation/LevelGraph.d.ts +78 -0
  184. package/dist/navigation/LevelGraph.d.ts.map +1 -0
  185. package/dist/navigation/LevelGraph.js +268 -0
  186. package/dist/navigation/LevelGraph.js.map +1 -0
  187. package/dist/navigation/NPCGraphMover.d.ts +87 -0
  188. package/dist/navigation/NPCGraphMover.d.ts.map +1 -0
  189. package/dist/navigation/NPCGraphMover.js +193 -0
  190. package/dist/navigation/NPCGraphMover.js.map +1 -0
  191. package/dist/navigation/index.d.ts +5 -0
  192. package/dist/navigation/index.d.ts.map +1 -0
  193. package/dist/navigation/index.js +4 -0
  194. package/dist/navigation/index.js.map +1 -0
  195. package/dist/plugins/AnomaliesPlugin.d.ts +26 -0
  196. package/dist/plugins/AnomaliesPlugin.d.ts.map +1 -0
  197. package/dist/plugins/AnomaliesPlugin.js +30 -0
  198. package/dist/plugins/AnomaliesPlugin.js.map +1 -0
  199. package/dist/plugins/CombatSchemaPlugin.d.ts +35 -0
  200. package/dist/plugins/CombatSchemaPlugin.d.ts.map +1 -0
  201. package/dist/plugins/CombatSchemaPlugin.js +44 -0
  202. package/dist/plugins/CombatSchemaPlugin.js.map +1 -0
  203. package/dist/plugins/FactionsPlugin.d.ts +26 -0
  204. package/dist/plugins/FactionsPlugin.d.ts.map +1 -0
  205. package/dist/plugins/FactionsPlugin.js +30 -0
  206. package/dist/plugins/FactionsPlugin.js.map +1 -0
  207. package/dist/plugins/IALifePlugin.d.ts +91 -0
  208. package/dist/plugins/IALifePlugin.d.ts.map +1 -0
  209. package/dist/plugins/IALifePlugin.js +2 -0
  210. package/dist/plugins/IALifePlugin.js.map +1 -0
  211. package/dist/plugins/MonstersPlugin.d.ts +26 -0
  212. package/dist/plugins/MonstersPlugin.d.ts.map +1 -0
  213. package/dist/plugins/MonstersPlugin.js +30 -0
  214. package/dist/plugins/MonstersPlugin.js.map +1 -0
  215. package/dist/plugins/NPCTypesPlugin.d.ts +26 -0
  216. package/dist/plugins/NPCTypesPlugin.d.ts.map +1 -0
  217. package/dist/plugins/NPCTypesPlugin.js +30 -0
  218. package/dist/plugins/NPCTypesPlugin.js.map +1 -0
  219. package/dist/plugins/PluginToken.d.ts +26 -0
  220. package/dist/plugins/PluginToken.d.ts.map +1 -0
  221. package/dist/plugins/PluginToken.js +22 -0
  222. package/dist/plugins/PluginToken.js.map +1 -0
  223. package/dist/plugins/SocialPlugin.d.ts +14 -0
  224. package/dist/plugins/SocialPlugin.d.ts.map +1 -0
  225. package/dist/plugins/SocialPlugin.js +16 -0
  226. package/dist/plugins/SocialPlugin.js.map +1 -0
  227. package/dist/plugins/SpawnPlugin.d.ts +15 -0
  228. package/dist/plugins/SpawnPlugin.d.ts.map +1 -0
  229. package/dist/plugins/SpawnPlugin.js +26 -0
  230. package/dist/plugins/SpawnPlugin.js.map +1 -0
  231. package/dist/plugins/SquadPlugin.d.ts +14 -0
  232. package/dist/plugins/SquadPlugin.d.ts.map +1 -0
  233. package/dist/plugins/SquadPlugin.js +16 -0
  234. package/dist/plugins/SquadPlugin.js.map +1 -0
  235. package/dist/plugins/SurgePlugin.d.ts +20 -0
  236. package/dist/plugins/SurgePlugin.d.ts.map +1 -0
  237. package/dist/plugins/SurgePlugin.js +22 -0
  238. package/dist/plugins/SurgePlugin.js.map +1 -0
  239. package/dist/plugins/TradePlugin.d.ts +16 -0
  240. package/dist/plugins/TradePlugin.d.ts.map +1 -0
  241. package/dist/plugins/TradePlugin.js +18 -0
  242. package/dist/plugins/TradePlugin.js.map +1 -0
  243. package/dist/plugins/index.d.ts +11 -0
  244. package/dist/plugins/index.d.ts.map +1 -0
  245. package/dist/plugins/index.js +10 -0
  246. package/dist/plugins/index.js.map +1 -0
  247. package/dist/plugins/pluginNames.d.ts +37 -0
  248. package/dist/plugins/pluginNames.d.ts.map +1 -0
  249. package/dist/plugins/pluginNames.js +28 -0
  250. package/dist/plugins/pluginNames.js.map +1 -0
  251. package/dist/plugins/presets.d.ts +31 -0
  252. package/dist/plugins/presets.d.ts.map +1 -0
  253. package/dist/plugins/presets.js +50 -0
  254. package/dist/plugins/presets.js.map +1 -0
  255. package/dist/ports/IDataLoader.d.ts +38 -0
  256. package/dist/ports/IDataLoader.d.ts.map +1 -0
  257. package/dist/ports/IDataLoader.js +12 -0
  258. package/dist/ports/IDataLoader.js.map +1 -0
  259. package/dist/ports/IEntityAdapter.d.ts +73 -0
  260. package/dist/ports/IEntityAdapter.d.ts.map +1 -0
  261. package/dist/ports/IEntityAdapter.js +36 -0
  262. package/dist/ports/IEntityAdapter.js.map +1 -0
  263. package/dist/ports/IEntityFactory.d.ts +66 -0
  264. package/dist/ports/IEntityFactory.d.ts.map +1 -0
  265. package/dist/ports/IEntityFactory.js +21 -0
  266. package/dist/ports/IEntityFactory.js.map +1 -0
  267. package/dist/ports/ILogger.d.ts +29 -0
  268. package/dist/ports/ILogger.d.ts.map +1 -0
  269. package/dist/ports/ILogger.js +2 -0
  270. package/dist/ports/ILogger.js.map +1 -0
  271. package/dist/ports/IPlayerPositionProvider.d.ts +20 -0
  272. package/dist/ports/IPlayerPositionProvider.d.ts.map +1 -0
  273. package/dist/ports/IPlayerPositionProvider.js +11 -0
  274. package/dist/ports/IPlayerPositionProvider.js.map +1 -0
  275. package/dist/ports/IRandom.d.ts +25 -0
  276. package/dist/ports/IRandom.d.ts.map +1 -0
  277. package/dist/ports/IRandom.js +39 -0
  278. package/dist/ports/IRandom.js.map +1 -0
  279. package/dist/ports/IRuntimeClock.d.ts +18 -0
  280. package/dist/ports/IRuntimeClock.d.ts.map +1 -0
  281. package/dist/ports/IRuntimeClock.js +2 -0
  282. package/dist/ports/IRuntimeClock.js.map +1 -0
  283. package/dist/ports/index.d.ts +12 -0
  284. package/dist/ports/index.d.ts.map +1 -0
  285. package/dist/ports/index.js +5 -0
  286. package/dist/ports/index.js.map +1 -0
  287. package/dist/registry/AIStateRegistry.d.ts +42 -0
  288. package/dist/registry/AIStateRegistry.d.ts.map +1 -0
  289. package/dist/registry/AIStateRegistry.js +27 -0
  290. package/dist/registry/AIStateRegistry.js.map +1 -0
  291. package/dist/registry/AnomalyTypeRegistry.d.ts +21 -0
  292. package/dist/registry/AnomalyTypeRegistry.d.ts.map +1 -0
  293. package/dist/registry/AnomalyTypeRegistry.js +20 -0
  294. package/dist/registry/AnomalyTypeRegistry.js.map +1 -0
  295. package/dist/registry/BehaviorSchemeRegistry.d.ts +21 -0
  296. package/dist/registry/BehaviorSchemeRegistry.d.ts.map +1 -0
  297. package/dist/registry/BehaviorSchemeRegistry.js +24 -0
  298. package/dist/registry/BehaviorSchemeRegistry.js.map +1 -0
  299. package/dist/registry/DamageTypeRegistry.d.ts +17 -0
  300. package/dist/registry/DamageTypeRegistry.d.ts.map +1 -0
  301. package/dist/registry/DamageTypeRegistry.js +24 -0
  302. package/dist/registry/DamageTypeRegistry.js.map +1 -0
  303. package/dist/registry/FactionRegistry.d.ts +41 -0
  304. package/dist/registry/FactionRegistry.d.ts.map +1 -0
  305. package/dist/registry/FactionRegistry.js +29 -0
  306. package/dist/registry/FactionRegistry.js.map +1 -0
  307. package/dist/registry/MonsterRegistry.d.ts +44 -0
  308. package/dist/registry/MonsterRegistry.d.ts.map +1 -0
  309. package/dist/registry/MonsterRegistry.js +43 -0
  310. package/dist/registry/MonsterRegistry.js.map +1 -0
  311. package/dist/registry/NPCTypeRegistry.d.ts +34 -0
  312. package/dist/registry/NPCTypeRegistry.d.ts.map +1 -0
  313. package/dist/registry/NPCTypeRegistry.js +20 -0
  314. package/dist/registry/NPCTypeRegistry.js.map +1 -0
  315. package/dist/registry/Registry.d.ts +44 -0
  316. package/dist/registry/Registry.d.ts.map +1 -0
  317. package/dist/registry/Registry.js +80 -0
  318. package/dist/registry/Registry.js.map +1 -0
  319. package/dist/registry/TaskTypeRegistry.d.ts +17 -0
  320. package/dist/registry/TaskTypeRegistry.d.ts.map +1 -0
  321. package/dist/registry/TaskTypeRegistry.js +16 -0
  322. package/dist/registry/TaskTypeRegistry.js.map +1 -0
  323. package/dist/registry/index.d.ts +19 -0
  324. package/dist/registry/index.d.ts.map +1 -0
  325. package/dist/registry/index.js +11 -0
  326. package/dist/registry/index.js.map +1 -0
  327. package/dist/schema/index.d.ts +3 -0
  328. package/dist/schema/index.d.ts.map +1 -0
  329. package/dist/schema/index.js +3 -0
  330. package/dist/schema/index.js.map +1 -0
  331. package/dist/schema/validators.d.ts +32 -0
  332. package/dist/schema/validators.d.ts.map +1 -0
  333. package/dist/schema/validators.js +249 -0
  334. package/dist/schema/validators.js.map +1 -0
  335. package/dist/spawn/SpawnRegistry.d.ts +48 -0
  336. package/dist/spawn/SpawnRegistry.d.ts.map +1 -0
  337. package/dist/spawn/SpawnRegistry.js +141 -0
  338. package/dist/spawn/SpawnRegistry.js.map +1 -0
  339. package/dist/spawn/index.d.ts +3 -0
  340. package/dist/spawn/index.d.ts.map +1 -0
  341. package/dist/spawn/index.js +3 -0
  342. package/dist/spawn/index.js.map +1 -0
  343. package/dist/terrain/SmartTerrain.d.ts +119 -0
  344. package/dist/terrain/SmartTerrain.d.ts.map +1 -0
  345. package/dist/terrain/SmartTerrain.js +124 -0
  346. package/dist/terrain/SmartTerrain.js.map +1 -0
  347. package/dist/terrain/TerrainBuilder.d.ts +44 -0
  348. package/dist/terrain/TerrainBuilder.d.ts.map +1 -0
  349. package/dist/terrain/TerrainBuilder.js +112 -0
  350. package/dist/terrain/TerrainBuilder.js.map +1 -0
  351. package/dist/terrain/Zone.d.ts +25 -0
  352. package/dist/terrain/Zone.d.ts.map +1 -0
  353. package/dist/terrain/Zone.js +29 -0
  354. package/dist/terrain/Zone.js.map +1 -0
  355. package/dist/terrain/index.d.ts +6 -0
  356. package/dist/terrain/index.d.ts.map +1 -0
  357. package/dist/terrain/index.js +5 -0
  358. package/dist/terrain/index.js.map +1 -0
  359. package/dist/time/TimeManager.d.ts +21 -0
  360. package/dist/time/TimeManager.d.ts.map +1 -0
  361. package/dist/time/TimeManager.js +41 -0
  362. package/dist/time/TimeManager.js.map +1 -0
  363. package/dist/time/index.d.ts +3 -0
  364. package/dist/time/index.d.ts.map +1 -0
  365. package/dist/time/index.js +2 -0
  366. package/dist/time/index.js.map +1 -0
  367. package/package.json +119 -0
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Async-capable loader that supplies game data to the kernel at boot time.
3
+ *
4
+ * Each method may return data synchronously (from an in-memory object)
5
+ * or as a Promise (from a network/file request). The kernel awaits all
6
+ * results before populating registries.
7
+ *
8
+ * Returned objects are keyed by ID string. Each value should conform to
9
+ * the matching registry definition interface — see the `registry/` module.
10
+ */
11
+ import type { IFactionDefinition } from '../registry/FactionRegistry';
12
+ import type { INPCTypeDefinition } from '../registry/NPCTypeRegistry';
13
+ import type { IMonsterDefinition } from '../registry/MonsterRegistry';
14
+ import type { ISmartTerrainConfig } from '../terrain/SmartTerrain';
15
+ import type { IAnomalyTypeDefinition } from '../registry/AnomalyTypeRegistry';
16
+ /** Map of factionId → IFactionDefinition. */
17
+ export type IFactionDataFile = Record<string, IFactionDefinition>;
18
+ /** Map of npcTypeId → INPCTypeDefinition. */
19
+ export type INPCTypeDataFile = Record<string, INPCTypeDefinition>;
20
+ /** Map of monsterTypeId → IMonsterDefinition. */
21
+ export type IMonsterDataFile = Record<string, IMonsterDefinition>;
22
+ /** Map of terrainId → ISmartTerrainConfig. */
23
+ export type ITerrainDataFile = Record<string, ISmartTerrainConfig>;
24
+ /** Map of anomalyTypeId → IAnomalyTypeDefinition. */
25
+ export type IAnomalyDataFile = Record<string, IAnomalyTypeDefinition>;
26
+ export interface IDataLoader {
27
+ /** Load faction definitions. Keys = faction IDs, values = IFactionDefinition. */
28
+ loadFactions(): IFactionDataFile | Promise<IFactionDataFile>;
29
+ /** Load NPC type definitions. Keys = NPC type IDs, values = INPCTypeDefinition. */
30
+ loadNPCTypes(): INPCTypeDataFile | Promise<INPCTypeDataFile>;
31
+ /** Load monster definitions. Keys = monster type IDs, values = IMonsterDefinition. */
32
+ loadMonsters(): IMonsterDataFile | Promise<IMonsterDataFile>;
33
+ /** Load smart terrain configurations. Keys = terrain IDs, values = ISmartTerrainConfig. */
34
+ loadTerrains(): ITerrainDataFile | Promise<ITerrainDataFile>;
35
+ /** Load anomaly type definitions. Keys = anomaly type IDs, values = IAnomalyTypeDefinition. */
36
+ loadAnomalies(): IAnomalyDataFile | Promise<IAnomalyDataFile>;
37
+ }
38
+ //# sourceMappingURL=IDataLoader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IDataLoader.d.ts","sourceRoot":"","sources":["../../src/ports/IDataLoader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAE9E,6CAA6C;AAC7C,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;AAElE,6CAA6C;AAC7C,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;AAElE,iDAAiD;AACjD,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;AAElE,8CAA8C;AAC9C,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;AAEnE,qDAAqD;AACrD,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;AAEtE,MAAM,WAAW,WAAW;IAC1B,iFAAiF;IACjF,YAAY,IAAI,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAE7D,mFAAmF;IACnF,YAAY,IAAI,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAE7D,sFAAsF;IACtF,YAAY,IAAI,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAE7D,2FAA2F;IAC3F,YAAY,IAAI,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAE7D,+FAA+F;IAC/F,aAAa,IAAI,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAC/D"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Async-capable loader that supplies game data to the kernel at boot time.
3
+ *
4
+ * Each method may return data synchronously (from an in-memory object)
5
+ * or as a Promise (from a network/file request). The kernel awaits all
6
+ * results before populating registries.
7
+ *
8
+ * Returned objects are keyed by ID string. Each value should conform to
9
+ * the matching registry definition interface — see the `registry/` module.
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=IDataLoader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IDataLoader.js","sourceRoot":"","sources":["../../src/ports/IDataLoader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,73 @@
1
+ import type { Vec2 } from '../core/Vec2';
2
+ /** Read-only queries on entity state. No side effects. */
3
+ export interface IEntityQuery {
4
+ /** Return world position (px), or `null` if entity no longer exists. */
5
+ getPosition(entityId: string): Vec2 | null;
6
+ /** Return `true` if entity exists and is alive. */
7
+ isAlive(entityId: string): boolean;
8
+ /** Check if entity has the named component. */
9
+ hasComponent(entityId: string, componentName: string): boolean;
10
+ /** Read a component value. Returns `null` if missing. */
11
+ getComponentValue<T>(entityId: string, componentName: string): T | null;
12
+ /** Read arbitrary metadata. Optional — return `undefined` when unsupported. */
13
+ getMetadata?(entityId: string, key: string): unknown;
14
+ }
15
+ /** Mutate entity state: position, velocity, rotation, visibility, activity. */
16
+ export interface IEntityMutation {
17
+ /** Move entity to world coordinates (px). */
18
+ setPosition(entityId: string, position: Vec2): void;
19
+ /** Enable/disable entity. Inactive entities skip physics and rendering. */
20
+ setActive(entityId: string, active: boolean): void;
21
+ /** Show/hide entity. Separate from active (e.g. stealth = active + invisible). */
22
+ setVisible(entityId: string, visible: boolean): void;
23
+ /** Write arbitrary metadata. Optional — no-op when unsupported. */
24
+ setMetadata?(entityId: string, key: string, value: unknown): void;
25
+ /** Set physics velocity (px/s). FSM guarantees single-writer per entity/frame. */
26
+ setVelocity(entityId: string, velocity: Vec2): void;
27
+ /** Current physics velocity. Returns {x:0,y:0} for unknown IDs. */
28
+ getVelocity(entityId: string): Vec2;
29
+ /** Set facing rotation (radians, clockwise from +X). */
30
+ setRotation(entityId: string, radians: number): void;
31
+ /** Teleport entity instantly — bypasses physics interpolation. */
32
+ teleport(entityId: string, position: Vec2): void;
33
+ /** Disable physics body (corpses, death state). */
34
+ disablePhysics(entityId: string): void;
35
+ }
36
+ /** Rendering operations. Only needed by online AI, not by offline simulation. */
37
+ export interface IEntityRendering {
38
+ /** Set transparency (0=invisible, 1=opaque). For stealth mechanics. */
39
+ setAlpha(entityId: string, alpha: number): void;
40
+ /** Play a named animation. When `ignoreIfPlaying` is true (default), skip if already playing this key. */
41
+ playAnimation(entityId: string, key: string, ignoreIfPlaying?: boolean): void;
42
+ /** Check if animation key exists for this entity. */
43
+ hasAnimation(entityId: string, key: string): boolean;
44
+ }
45
+ /**
46
+ * Full bridge between SDK and host game engine.
47
+ *
48
+ * Consumers that only need read access can depend on {@link IEntityQuery}.
49
+ * Offline simulation needs {@link IEntityQuery} + {@link IEntityMutation}.
50
+ * Online AI needs all three.
51
+ */
52
+ export interface IEntityAdapter extends IEntityQuery, IEntityMutation, IEntityRendering {
53
+ }
54
+ /** @deprecated Use IEntityRendering instead. */
55
+ export type IEntityPresentation = IEntityRendering;
56
+ /**
57
+ * Create a no-op {@link IEntityAdapter} with safe default behaviour.
58
+ *
59
+ * Safe defaults:
60
+ * - `getPosition` returns `null` — no world position.
61
+ * - `isAlive` returns `true` — all entities considered alive.
62
+ * - `hasComponent` returns `false` — no components present.
63
+ * - `getComponentValue` returns `null` — no component values.
64
+ * - `getVelocity` returns `{x:0,y:0}` — zero velocity.
65
+ * - `hasAnimation` returns `false` — no animations available.
66
+ * - All mutation/rendering methods are no-ops.
67
+ *
68
+ * @example
69
+ * // Unit-testing kernel logic without a full game engine:
70
+ * kernel.provide(Ports.EntityAdapter, createNoOpEntityAdapter());
71
+ */
72
+ export declare function createNoOpEntityAdapter(): IEntityAdapter;
73
+ //# sourceMappingURL=IEntityAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IEntityAdapter.d.ts","sourceRoot":"","sources":["../../src/ports/IEntityAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAMzC,0DAA0D;AAC1D,MAAM,WAAW,YAAY;IAC3B,wEAAwE;IACxE,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IAC3C,mDAAmD;IACnD,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IACnC,+CAA+C;IAC/C,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;IAC/D,yDAAyD;IACzD,iBAAiB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC;IACxE,+EAA+E;IAC/E,WAAW,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACtD;AAMD,+EAA+E;AAC/E,MAAM,WAAW,eAAe;IAC9B,6CAA6C;IAC7C,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;IACpD,2EAA2E;IAC3E,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACnD,kFAAkF;IAClF,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACrD,mEAAmE;IACnE,WAAW,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAClE,kFAAkF;IAClF,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;IACpD,mEAAmE;IACnE,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,wDAAwD;IACxD,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACrD,kEAAkE;IAClE,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;IACjD,mDAAmD;IACnD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC;AAMD,iFAAiF;AACjF,MAAM,WAAW,gBAAgB;IAC/B,uEAAuE;IACvE,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAChD,0GAA0G;IAC1G,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9E,qDAAqD;IACrD,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACtD;AAMD;;;;;;GAMG;AACH,MAAM,WAAW,cAAe,SAAQ,YAAY,EAAE,eAAe,EAAE,gBAAgB;CAAG;AAE1F,gDAAgD;AAChD,MAAM,MAAM,mBAAmB,GAAG,gBAAgB,CAAC;AAEnD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,uBAAuB,IAAI,cAAc,CAkBxD"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Create a no-op {@link IEntityAdapter} with safe default behaviour.
3
+ *
4
+ * Safe defaults:
5
+ * - `getPosition` returns `null` — no world position.
6
+ * - `isAlive` returns `true` — all entities considered alive.
7
+ * - `hasComponent` returns `false` — no components present.
8
+ * - `getComponentValue` returns `null` — no component values.
9
+ * - `getVelocity` returns `{x:0,y:0}` — zero velocity.
10
+ * - `hasAnimation` returns `false` — no animations available.
11
+ * - All mutation/rendering methods are no-ops.
12
+ *
13
+ * @example
14
+ * // Unit-testing kernel logic without a full game engine:
15
+ * kernel.provide(Ports.EntityAdapter, createNoOpEntityAdapter());
16
+ */
17
+ export function createNoOpEntityAdapter() {
18
+ return {
19
+ getPosition: () => null,
20
+ isAlive: () => true,
21
+ hasComponent: () => false,
22
+ getComponentValue: () => null,
23
+ setPosition: () => { },
24
+ setActive: () => { },
25
+ setVisible: () => { },
26
+ setVelocity: () => { },
27
+ getVelocity: () => ({ x: 0, y: 0 }),
28
+ setRotation: () => { },
29
+ teleport: () => { },
30
+ disablePhysics: () => { },
31
+ setAlpha: () => { },
32
+ playAnimation: () => { },
33
+ hasAnimation: () => false,
34
+ };
35
+ }
36
+ //# sourceMappingURL=IEntityAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IEntityAdapter.js","sourceRoot":"","sources":["../../src/ports/IEntityAdapter.ts"],"names":[],"mappings":"AA4EA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO;QACL,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI;QACvB,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI;QACnB,YAAY,EAAE,GAAG,EAAE,CAAC,KAAK;QACzB,iBAAiB,EAAE,GAAG,EAAE,CAAC,IAAI;QAC7B,WAAW,EAAE,GAAG,EAAE,GAAE,CAAC;QACrB,SAAS,EAAE,GAAG,EAAE,GAAE,CAAC;QACnB,UAAU,EAAE,GAAG,EAAE,GAAE,CAAC;QACpB,WAAW,EAAE,GAAG,EAAE,GAAE,CAAC;QACrB,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QACnC,WAAW,EAAE,GAAG,EAAE,GAAE,CAAC;QACrB,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;QAClB,cAAc,EAAE,GAAG,EAAE,GAAE,CAAC;QACxB,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;QAClB,aAAa,EAAE,GAAG,EAAE,GAAE,CAAC;QACvB,YAAY,EAAE,GAAG,EAAE,CAAC,KAAK;KAC1B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Parameters for creating a humanoid NPC entity in the host game engine.
3
+ * Passed to {@link IEntityFactory.createNPC}.
4
+ */
5
+ export interface INPCSpawnRequest {
6
+ /** ID registered in NPCTypeRegistry. */
7
+ readonly npcTypeId: string;
8
+ /** Faction this NPC belongs to. Must be registered in FactionRegistry. */
9
+ readonly factionId: string;
10
+ /** Spawn X world coordinate (px). */
11
+ readonly x: number;
12
+ /** Spawn Y world coordinate (px). */
13
+ readonly y: number;
14
+ /** NPC power tier (1–5). Affects equipment and behavior. */
15
+ readonly rank: number;
16
+ /** Squad this NPC should join, if any. */
17
+ readonly squadId?: string;
18
+ /** Arbitrary data forwarded to the host engine (e.g. story flags). */
19
+ readonly metadata?: Record<string, unknown>;
20
+ }
21
+ /**
22
+ * Parameters for creating a monster entity in the host game engine.
23
+ * Passed to {@link IEntityFactory.createMonster}.
24
+ */
25
+ export interface IMonsterSpawnRequest {
26
+ /** ID registered in MonsterRegistry. */
27
+ readonly monsterTypeId: string;
28
+ /** Spawn X world coordinate (px). */
29
+ readonly x: number;
30
+ /** Spawn Y world coordinate (px). */
31
+ readonly y: number;
32
+ /** SmartTerrain that serves as this monster's home lair. */
33
+ readonly lairTerrainId?: string;
34
+ /** Index within the pack (0 = leader). */
35
+ readonly packIndex?: number;
36
+ /** Arbitrary data forwarded to the host engine. */
37
+ readonly metadata?: Record<string, unknown>;
38
+ }
39
+ /**
40
+ * Factory the A-Life kernel calls to create and destroy game entities.
41
+ *
42
+ * Implement this to bridge spawn/despawn requests to your engine's
43
+ * object creation system (e.g. Phaser's GameObjectFactory).
44
+ */
45
+ export interface IEntityFactory {
46
+ /** Create a humanoid NPC. Must return a unique entity ID string. */
47
+ createNPC(request: INPCSpawnRequest): string;
48
+ /** Create a monster entity. Must return a unique entity ID string. */
49
+ createMonster(request: IMonsterSpawnRequest): string;
50
+ /** Remove the entity from the game world and release its resources. */
51
+ destroyEntity(entityId: string): void;
52
+ }
53
+ /**
54
+ * Create a no-op {@link IEntityFactory} that returns deterministic stub IDs.
55
+ *
56
+ * Safe defaults:
57
+ * - `createNPC` returns `"noop-npc-<n>"` — unique per call, never null.
58
+ * - `createMonster` returns `"noop-monster-<n>"` — unique per call.
59
+ * - `destroyEntity` is a no-op.
60
+ *
61
+ * @example
62
+ * // Unit-testing kernel logic without a full game engine:
63
+ * kernel.provide(Ports.EntityFactory, createNoOpEntityFactory());
64
+ */
65
+ export declare function createNoOpEntityFactory(): IEntityFactory;
66
+ //# sourceMappingURL=IEntityFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IEntityFactory.d.ts","sourceRoot":"","sources":["../../src/ports/IEntityFactory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,0EAA0E;IAC1E,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,qCAAqC;IACrC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,0CAA0C;IAC1C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,sEAAsE;IACtE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7C;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,wCAAwC;IACxC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,qCAAqC;IACrC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,0CAA0C;IAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,mDAAmD;IACnD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7C;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,oEAAoE;IACpE,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAAC;IAE7C,sEAAsE;IACtE,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM,CAAC;IAErD,uEAAuE;IACvE,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC;AAID;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,IAAI,cAAc,CAMxD"}
@@ -0,0 +1,21 @@
1
+ let _noOpFactoryId = 0;
2
+ /**
3
+ * Create a no-op {@link IEntityFactory} that returns deterministic stub IDs.
4
+ *
5
+ * Safe defaults:
6
+ * - `createNPC` returns `"noop-npc-<n>"` — unique per call, never null.
7
+ * - `createMonster` returns `"noop-monster-<n>"` — unique per call.
8
+ * - `destroyEntity` is a no-op.
9
+ *
10
+ * @example
11
+ * // Unit-testing kernel logic without a full game engine:
12
+ * kernel.provide(Ports.EntityFactory, createNoOpEntityFactory());
13
+ */
14
+ export function createNoOpEntityFactory() {
15
+ return {
16
+ createNPC: () => `noop-npc-${++_noOpFactoryId}`,
17
+ createMonster: () => `noop-monster-${++_noOpFactoryId}`,
18
+ destroyEntity: () => { },
19
+ };
20
+ }
21
+ //# sourceMappingURL=IEntityFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IEntityFactory.js","sourceRoot":"","sources":["../../src/ports/IEntityFactory.ts"],"names":[],"mappings":"AAyDA,IAAI,cAAc,GAAG,CAAC,CAAC;AAEvB;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO;QACL,SAAS,EAAE,GAAG,EAAE,CAAC,YAAY,EAAE,cAAc,EAAE;QAC/C,aAAa,EAAE,GAAG,EAAE,CAAC,gBAAgB,EAAE,cAAc,EAAE;QACvD,aAAa,EAAE,GAAG,EAAE,GAAE,CAAC;KACxB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { ILogEntry } from '../logger/ILogEntry';
2
+ /**
3
+ * Sink that receives formatted log entries from the Logger.
4
+ *
5
+ * Implement to forward logs to the console, a file, a remote service,
6
+ * or an in-game debug overlay.
7
+ */
8
+ export interface ILogOutput {
9
+ /** Handle a single log entry. Called synchronously by the Logger. */
10
+ write(entry: ILogEntry): void;
11
+ }
12
+ /**
13
+ * Logging facade consumed by the kernel and plugins.
14
+ *
15
+ * The built-in {@link Logger} class implements this. You can substitute
16
+ * your own implementation via IALifeKernelConfig.logger if you have
17
+ * an existing logging pipeline.
18
+ */
19
+ export interface ILogger {
20
+ /** Log at DEBUG level. Use for high-volume diagnostic output. */
21
+ debug(channel: string, message: string, data?: unknown): void;
22
+ /** Log at INFO level. Use for lifecycle events (init, spawn, state change). */
23
+ info(channel: string, message: string, data?: unknown): void;
24
+ /** Log at WARN level. Use for recoverable problems (budget exceeded, missing data). */
25
+ warn(channel: string, message: string, data?: unknown): void;
26
+ /** Log at ERROR level. Use for unrecoverable errors. */
27
+ error(channel: string, message: string, data?: unknown): void;
28
+ }
29
+ //# sourceMappingURL=ILogger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ILogger.d.ts","sourceRoot":"","sources":["../../src/ports/ILogger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,qEAAqE;IACrE,KAAK,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;CAC/B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,OAAO;IACtB,iEAAiE;IACjE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAE9D,+EAA+E;IAC/E,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAE7D,uFAAuF;IACvF,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAE7D,wDAAwD;IACxD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC/D"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ILogger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ILogger.js","sourceRoot":"","sources":["../../src/ports/ILogger.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ import type { Vec2 } from '../core/Vec2';
2
+ /**
3
+ * Provides the player's current world position to the A-Life kernel.
4
+ *
5
+ * The kernel reads this every tick for online/offline radius checks.
6
+ * Implement with a live reference to your player entity's coordinates.
7
+ */
8
+ export interface IPlayerPositionProvider {
9
+ /** Return the player's current world position (px). Must never return null. */
10
+ getPlayerPosition(): Vec2;
11
+ }
12
+ /**
13
+ * Create a no-op {@link IPlayerPositionProvider} that always returns origin.
14
+ *
15
+ * @example
16
+ * // Unit-testing kernel logic without a game engine:
17
+ * kernel.provide(Ports.PlayerPosition, createNoOpPlayerPosition());
18
+ */
19
+ export declare function createNoOpPlayerPosition(): IPlayerPositionProvider;
20
+ //# sourceMappingURL=IPlayerPositionProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IPlayerPositionProvider.d.ts","sourceRoot":"","sources":["../../src/ports/IPlayerPositionProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,WAAW,uBAAuB;IACtC,+EAA+E;IAC/E,iBAAiB,IAAI,IAAI,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,IAAI,uBAAuB,CAElE"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Create a no-op {@link IPlayerPositionProvider} that always returns origin.
3
+ *
4
+ * @example
5
+ * // Unit-testing kernel logic without a game engine:
6
+ * kernel.provide(Ports.PlayerPosition, createNoOpPlayerPosition());
7
+ */
8
+ export function createNoOpPlayerPosition() {
9
+ return { getPlayerPosition: () => ({ x: 0, y: 0 }) };
10
+ }
11
+ //# sourceMappingURL=IPlayerPositionProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IPlayerPositionProvider.js","sourceRoot":"","sources":["../../src/ports/IPlayerPositionProvider.ts"],"names":[],"mappings":"AAaA;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB;IACtC,OAAO,EAAE,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACvD,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Injectable random number generator port.
3
+ * Allows deterministic testing via SeededRandom while using Math.random() in production.
4
+ */
5
+ export interface IRandom {
6
+ /** Return a pseudo-random float in [0, 1). */
7
+ next(): number;
8
+ /** Return a pseudo-random integer in [min, max] (inclusive). */
9
+ nextInt(min: number, max: number): number;
10
+ /** Return a pseudo-random float in [min, max). */
11
+ nextFloat(min: number, max: number): number;
12
+ }
13
+ export declare class DefaultRandom implements IRandom {
14
+ next(): number;
15
+ nextInt(min: number, max: number): number;
16
+ nextFloat(min: number, max: number): number;
17
+ }
18
+ export declare class SeededRandom implements IRandom {
19
+ private state;
20
+ constructor(seed: number);
21
+ next(): number;
22
+ nextInt(min: number, max: number): number;
23
+ nextFloat(min: number, max: number): number;
24
+ }
25
+ //# sourceMappingURL=IRandom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IRandom.d.ts","sourceRoot":"","sources":["../../src/ports/IRandom.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,OAAO;IACtB,8CAA8C;IAC9C,IAAI,IAAI,MAAM,CAAC;IAEf,gEAAgE;IAChE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IAE1C,kDAAkD;IAClD,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CAC7C;AAMD,qBAAa,aAAc,YAAW,OAAO;IAC3C,IAAI,IAAI,MAAM;IAId,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM;IAIzC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM;CAG5C;AAMD,qBAAa,YAAa,YAAW,OAAO;IAC1C,OAAO,CAAC,KAAK,CAAS;gBAEV,IAAI,EAAE,MAAM;IAIxB,IAAI,IAAI,MAAM;IAOd,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM;IAIzC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM;CAG5C"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Injectable random number generator port.
3
+ * Allows deterministic testing via SeededRandom while using Math.random() in production.
4
+ */
5
+ // ---------------------------------------------------------------------------
6
+ // DefaultRandom — delegates to Math.random()
7
+ // ---------------------------------------------------------------------------
8
+ export class DefaultRandom {
9
+ next() {
10
+ return Math.random();
11
+ }
12
+ nextInt(min, max) {
13
+ return Math.floor(this.next() * (max - min + 1)) + min;
14
+ }
15
+ nextFloat(min, max) {
16
+ return this.next() * (max - min) + min;
17
+ }
18
+ }
19
+ // ---------------------------------------------------------------------------
20
+ // SeededRandom — deterministic mulberry32 PRNG
21
+ // ---------------------------------------------------------------------------
22
+ export class SeededRandom {
23
+ constructor(seed) {
24
+ this.state = seed | 0;
25
+ }
26
+ next() {
27
+ let t = (this.state += 0x6D2B79F5) | 0;
28
+ t = Math.imul(t ^ (t >>> 15), t | 1);
29
+ t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
30
+ return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
31
+ }
32
+ nextInt(min, max) {
33
+ return Math.floor(this.next() * (max - min + 1)) + min;
34
+ }
35
+ nextFloat(min, max) {
36
+ return this.next() * (max - min) + min;
37
+ }
38
+ }
39
+ //# sourceMappingURL=IRandom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IRandom.js","sourceRoot":"","sources":["../../src/ports/IRandom.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiBH,8EAA8E;AAC9E,6CAA6C;AAC7C,8EAA8E;AAE9E,MAAM,OAAO,aAAa;IACxB,IAAI;QACF,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;IACvB,CAAC;IAED,OAAO,CAAC,GAAW,EAAE,GAAW;QAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IACzD,CAAC;IAED,SAAS,CAAC,GAAW,EAAE,GAAW;QAChC,OAAO,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IACzC,CAAC;CACF;AAED,8EAA8E;AAC9E,+CAA+C;AAC/C,8EAA8E;AAE9E,MAAM,OAAO,YAAY;IAGvB,YAAY,IAAY;QACtB,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC;IACxB,CAAC;IAED,IAAI;QACF,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;QACvC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACrC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,CAAC;IAC/C,CAAC;IAED,OAAO,CAAC,GAAW,EAAE,GAAW;QAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IACzD,CAAC;IAED,SAAS,CAAC,GAAW,EAAE,GAAW;QAChC,OAAO,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IACzC,CAAC;CACF"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Real-time clock for cooldown timers and memory aging.
3
+ *
4
+ * Distinct from {@link Clock} which provides accelerated game-time (timeFactor).
5
+ * IRuntimeClock returns monotonic real elapsed ms — maps to Phaser's scene.time.now.
6
+ *
7
+ * @example
8
+ * // Phaser adapter
9
+ * const runtimeClock: IRuntimeClock = { now: () => scene.time.now };
10
+ *
11
+ * // Test stub
12
+ * const runtimeClock: IRuntimeClock = { now: () => Date.now() };
13
+ */
14
+ export interface IRuntimeClock {
15
+ /** Monotonic real-time milliseconds since session start. */
16
+ now(): number;
17
+ }
18
+ //# sourceMappingURL=IRuntimeClock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IRuntimeClock.d.ts","sourceRoot":"","sources":["../../src/ports/IRuntimeClock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,aAAa;IAC5B,4DAA4D;IAC5D,GAAG,IAAI,MAAM,CAAC;CACf"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=IRuntimeClock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IRuntimeClock.js","sourceRoot":"","sources":["../../src/ports/IRuntimeClock.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ export type { IEntityAdapter, IEntityQuery, IEntityMutation, IEntityRendering, IEntityPresentation } from './IEntityAdapter';
2
+ export { createNoOpEntityAdapter } from './IEntityAdapter';
3
+ export type { IPlayerPositionProvider } from './IPlayerPositionProvider';
4
+ export { createNoOpPlayerPosition } from './IPlayerPositionProvider';
5
+ export type { IEntityFactory, INPCSpawnRequest, IMonsterSpawnRequest } from './IEntityFactory';
6
+ export { createNoOpEntityFactory } from './IEntityFactory';
7
+ export type { IDataLoader } from './IDataLoader';
8
+ export type { ILogger, ILogOutput } from './ILogger';
9
+ export type { IRandom } from './IRandom';
10
+ export type { IRuntimeClock } from './IRuntimeClock';
11
+ export { DefaultRandom, SeededRandom } from './IRandom';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ports/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC7H,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,YAAY,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC/F,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACrD,YAAY,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { createNoOpEntityAdapter } from './IEntityAdapter';
2
+ export { createNoOpPlayerPosition } from './IPlayerPositionProvider';
3
+ export { createNoOpEntityFactory } from './IEntityFactory';
4
+ export { DefaultRandom, SeededRandom } from './IRandom';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ports/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAErE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAK3D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { Registry } from './Registry';
2
+ import type { IEntity } from '../entity/IEntity';
3
+ /** Lifecycle hooks for a single AI FSM state. */
4
+ export interface IStateHandler {
5
+ /** Called once when the FSM transitions into this state. */
6
+ enter(entity: IEntity): void;
7
+ /** Called every frame while this state is active. `delta` is seconds since last frame. */
8
+ update(entity: IEntity, delta: number): void;
9
+ /** Called once when the FSM transitions out of this state. */
10
+ exit(entity: IEntity): void;
11
+ }
12
+ /** Rule that triggers an automatic state transition. Evaluated every frame. */
13
+ export interface ITransitionCondition {
14
+ /** AI state ID to transition to when the condition fires. */
15
+ readonly targetState: string;
16
+ /** Predicate evaluated every frame. Return `true` to trigger the transition. */
17
+ readonly condition: (entity: IEntity) => boolean;
18
+ /** Evaluation order (highest first). First matching condition wins. */
19
+ readonly priority: number;
20
+ }
21
+ /** Complete definition of an AI state for registration in AIStateRegistry. */
22
+ export interface IAIStateDefinition {
23
+ /** Lifecycle callbacks (enter/update/exit). */
24
+ readonly handler: IStateHandler;
25
+ /** Whitelist of state IDs this state can transition to. Unset = unrestricted. */
26
+ readonly allowedTransitions?: readonly string[];
27
+ /** Auto-evaluated rules checked every frame, sorted by priority (descending). */
28
+ readonly transitionConditions?: readonly ITransitionCondition[];
29
+ /** Guard: return `false` to veto entering this state from `fromState`. */
30
+ readonly canEnter?: (entity: IEntity, fromState: string) => boolean;
31
+ /** Guard: return `false` to prevent leaving this state for `toState`. */
32
+ readonly canExit?: (entity: IEntity, toState: string) => boolean;
33
+ }
34
+ /** Registry of AI FSM states with built-in transition evaluation. */
35
+ export declare class AIStateRegistry extends Registry<string, IAIStateDefinition> {
36
+ constructor();
37
+ /** @override Pre-sort transition conditions by priority (descending) at registration time. */
38
+ register(id: string, config: IAIStateDefinition): this;
39
+ /** Evaluate pre-sorted transition conditions for the current state. Returns the first matching target state ID, or `null`. */
40
+ evaluateTransitions(currentState: string, entity: IEntity): string | null;
41
+ }
42
+ //# sourceMappingURL=AIStateRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AIStateRegistry.d.ts","sourceRoot":"","sources":["../../src/registry/AIStateRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD,iDAAiD;AACjD,MAAM,WAAW,aAAa;IAC5B,4DAA4D;IAC5D,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7B,0FAA0F;IAC1F,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,8DAA8D;IAC9D,IAAI,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;CAC7B;AAED,+EAA+E;AAC/E,MAAM,WAAW,oBAAoB;IACnC,6DAA6D;IAC7D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,gFAAgF;IAChF,QAAQ,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC;IACjD,uEAAuE;IACvE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,8EAA8E;AAC9E,MAAM,WAAW,kBAAkB;IACjC,+CAA+C;IAC/C,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,iFAAiF;IACjF,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChD,iFAAiF;IACjF,QAAQ,CAAC,oBAAoB,CAAC,EAAE,SAAS,oBAAoB,EAAE,CAAC;IAChE,0EAA0E;IAC1E,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IACpE,yEAAyE;IACzE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;CAClE;AAED,qEAAqE;AACrE,qBAAa,eAAgB,SAAQ,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;;IAKvE,8FAA8F;IACrF,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,IAAI;IAQ/D,8HAA8H;IAC9H,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI;CAS1E"}
@@ -0,0 +1,27 @@
1
+ import { Registry } from './Registry';
2
+ /** Registry of AI FSM states with built-in transition evaluation. */
3
+ export class AIStateRegistry extends Registry {
4
+ constructor() {
5
+ super({ name: 'AIStateRegistry' });
6
+ }
7
+ /** @override Pre-sort transition conditions by priority (descending) at registration time. */
8
+ register(id, config) {
9
+ const sorted = config.transitionConditions
10
+ ? { ...config, transitionConditions: [...config.transitionConditions].sort((a, b) => b.priority - a.priority) }
11
+ : config;
12
+ super.register(id, sorted);
13
+ return this;
14
+ }
15
+ /** Evaluate pre-sorted transition conditions for the current state. Returns the first matching target state ID, or `null`. */
16
+ evaluateTransitions(currentState, entity) {
17
+ const state = this.tryGet(currentState);
18
+ if (!state?.transitionConditions)
19
+ return null;
20
+ for (const tc of state.transitionConditions) {
21
+ if (tc.condition(entity))
22
+ return tc.targetState;
23
+ }
24
+ return null;
25
+ }
26
+ }
27
+ //# sourceMappingURL=AIStateRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AIStateRegistry.js","sourceRoot":"","sources":["../../src/registry/AIStateRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAqCtC,qEAAqE;AACrE,MAAM,OAAO,eAAgB,SAAQ,QAAoC;IACvE;QACE,KAAK,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,8FAA8F;IACrF,QAAQ,CAAC,EAAU,EAAE,MAA0B;QACtD,MAAM,MAAM,GAAG,MAAM,CAAC,oBAAoB;YACxC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,oBAAoB,EAAE,CAAC,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE;YAC/G,CAAC,CAAC,MAAM,CAAC;QACX,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8HAA8H;IAC9H,mBAAmB,CAAC,YAAoB,EAAE,MAAe;QACvD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,EAAE,oBAAoB;YAAE,OAAO,IAAI,CAAC;QAE9C,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,oBAAoB,EAAE,CAAC;YAC5C,IAAI,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC;gBAAE,OAAO,EAAE,CAAC,WAAW,CAAC;QAClD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ import { Registry } from './Registry';
2
+ /** Definition of an anomaly zone type (e.g. 'fire_anomaly', 'psi_field'). */
3
+ export interface IAnomalyTypeDefinition {
4
+ /** Human-readable display name. */
5
+ readonly name: string;
6
+ /** ID of the damage type inflicted. Must be registered in DamageTypeRegistry. */
7
+ readonly damageTypeId: string;
8
+ /** Damage dealt per second to entities inside the zone (> 0). */
9
+ readonly damagePerSecond: number;
10
+ /** Anomaly zone radius (px, > 0). */
11
+ readonly radius: number;
12
+ /** Probability of spawning an artefact per cycle [0, 1]. */
13
+ readonly artefactChance: number;
14
+ /** Maximum artefacts the zone can hold simultaneously (≥ 0). */
15
+ readonly maxArtefacts: number;
16
+ }
17
+ /** Registry of anomaly zone types. Validates damagePerSecond > 0, radius > 0, artefactChance [0, 1]. */
18
+ export declare class AnomalyTypeRegistry extends Registry<string, IAnomalyTypeDefinition> {
19
+ constructor();
20
+ }
21
+ //# sourceMappingURL=AnomalyTypeRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnomalyTypeRegistry.d.ts","sourceRoot":"","sources":["../../src/registry/AnomalyTypeRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,6EAA6E;AAC7E,MAAM,WAAW,sBAAsB;IACrC,mCAAmC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iFAAiF;IACjF,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,iEAAiE;IACjE,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,qCAAqC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,4DAA4D;IAC5D,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,gEAAgE;IAChE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAWD,wGAAwG;AACxG,qBAAa,mBAAoB,SAAQ,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC;;CAIhF"}
@@ -0,0 +1,20 @@
1
+ import { Registry } from './Registry';
2
+ function validate(c) {
3
+ const errors = [];
4
+ if (c.damagePerSecond <= 0)
5
+ errors.push('damagePerSecond must be > 0');
6
+ if (c.radius <= 0)
7
+ errors.push('radius must be > 0');
8
+ if (c.artefactChance < 0 || c.artefactChance > 1)
9
+ errors.push('artefactChance must be in [0, 1]');
10
+ if (c.maxArtefacts < 0)
11
+ errors.push('maxArtefacts must be >= 0');
12
+ return errors;
13
+ }
14
+ /** Registry of anomaly zone types. Validates damagePerSecond > 0, radius > 0, artefactChance [0, 1]. */
15
+ export class AnomalyTypeRegistry extends Registry {
16
+ constructor() {
17
+ super({ name: 'AnomalyTypeRegistry', validate });
18
+ }
19
+ }
20
+ //# sourceMappingURL=AnomalyTypeRegistry.js.map