@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,52 @@
1
+ /** Frozen origin vector `{ x: 0, y: 0 }`. Safe to use as a default or sentinel. */
2
+ export const ZERO = Object.freeze({ x: 0, y: 0 });
3
+ /** Squared Euclidean distance. Prefer over distance() in hot loops to avoid sqrt. */
4
+ export function distanceSq(a, b) {
5
+ const dx = a.x - b.x;
6
+ const dy = a.y - b.y;
7
+ return dx * dx + dy * dy;
8
+ }
9
+ /** Euclidean distance between two points. */
10
+ export function distance(a, b) {
11
+ return Math.sqrt(distanceSq(a, b));
12
+ }
13
+ /** Linear interpolation. t = 0 returns `a`, t = 1 returns `b`. */
14
+ export function lerp(a, b, t) {
15
+ return { x: a.x + (b.x - a.x) * t, y: a.y + (b.y - a.y) * t };
16
+ }
17
+ /** Component-wise subtraction (a − b). */
18
+ export function subtract(a, b) {
19
+ return { x: a.x - b.x, y: a.y - b.y };
20
+ }
21
+ /** Length of the vector (distance from origin). */
22
+ export function magnitude(v) {
23
+ return Math.sqrt(v.x * v.x + v.y * v.y);
24
+ }
25
+ /** Unit vector in the same direction. Returns ZERO for zero-length input. */
26
+ export function normalize(v) {
27
+ const mag = magnitude(v);
28
+ if (mag === 0)
29
+ return ZERO;
30
+ return { x: v.x / mag, y: v.y / mag };
31
+ }
32
+ /** Component-wise addition. Returns a new Vec2. */
33
+ export function add(a, b) {
34
+ return { x: a.x + b.x, y: a.y + b.y };
35
+ }
36
+ /** Scalar multiplication. Returns a new Vec2. */
37
+ export function scale(v, s) {
38
+ return { x: v.x * s, y: v.y * s };
39
+ }
40
+ /** Dot product of two vectors. */
41
+ export function dot(a, b) {
42
+ return a.x * b.x + a.y * b.y;
43
+ }
44
+ /**
45
+ * Angle of vector from +X axis in radians (-π, +π].
46
+ * Returns 0 for the zero vector.
47
+ * Replaces `Math.atan2(dy, dx)` pattern in state handlers.
48
+ */
49
+ export function angle(v) {
50
+ return Math.atan2(v.y, v.x);
51
+ }
52
+ //# sourceMappingURL=Vec2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Vec2.js","sourceRoot":"","sources":["../../src/core/Vec2.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Evaluate a Catmull-Rom spline at normalised parameter `t`.
3
+ *
4
+ * Pure replacement for `Phaser.Math.Interpolation.CatmullRom`.
5
+ * Uses identical cubic basis coefficients — numerically compatible.
6
+ *
7
+ * @param values 1-D control points (call separately for X and Y).
8
+ * @param t Position along the spline, normalised to [0, 1].
9
+ * @returns Interpolated value at `t`.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * const xs = waypoints.map(p => p.x);
14
+ * const ys = waypoints.map(p => p.y);
15
+ * const smoothX = catmullRom(xs, 0.5);
16
+ * const smoothY = catmullRom(ys, 0.5);
17
+ * ```
18
+ */
19
+ export declare function catmullRom(values: readonly number[], t: number): number;
20
+ //# sourceMappingURL=CatmullRom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CatmullRom.d.ts","sourceRoot":"","sources":["../../../src/core/math/CatmullRom.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAqBvE"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Evaluate a Catmull-Rom spline at normalised parameter `t`.
3
+ *
4
+ * Pure replacement for `Phaser.Math.Interpolation.CatmullRom`.
5
+ * Uses identical cubic basis coefficients — numerically compatible.
6
+ *
7
+ * @param values 1-D control points (call separately for X and Y).
8
+ * @param t Position along the spline, normalised to [0, 1].
9
+ * @returns Interpolated value at `t`.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * const xs = waypoints.map(p => p.x);
14
+ * const ys = waypoints.map(p => p.y);
15
+ * const smoothX = catmullRom(xs, 0.5);
16
+ * const smoothY = catmullRom(ys, 0.5);
17
+ * ```
18
+ */
19
+ export function catmullRom(values, t) {
20
+ const n = values.length;
21
+ if (n === 0)
22
+ return 0;
23
+ if (n === 1)
24
+ return values[0];
25
+ const last = n - 1;
26
+ const k = Math.floor(t >= 1 ? last - 1 : t * last);
27
+ const p0 = values[Math.max(0, k - 1)];
28
+ const p1 = values[k];
29
+ const p2 = values[Math.min(last, k + 1)];
30
+ const p3 = values[Math.min(last, k + 2)];
31
+ const u = t * last - k;
32
+ return 0.5 * ((2 * p1) +
33
+ (-p0 + p2) * u +
34
+ (2 * p0 - 5 * p1 + 4 * p2 - p3) * u * u +
35
+ (-p0 + 3 * p1 - 3 * p2 + p3) * u * u * u);
36
+ }
37
+ //# sourceMappingURL=CatmullRom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CatmullRom.js","sourceRoot":"","sources":["../../../src/core/math/CatmullRom.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,UAAU,CAAC,MAAyB,EAAE,CAAS;IAC7D,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACxB,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtB,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IAE9B,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACnB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAEnD,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACrB,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACzC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAEzC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;IAEvB,OAAO,GAAG,GAAG,CACX,CAAC,CAAC,GAAG,EAAE,CAAC;QACR,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC;QACd,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;QACvC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CACzC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ export type { Vec2 } from '../Vec2';
2
+ export { distance, distanceSq, lerp, subtract, normalize, magnitude, ZERO, add, scale, dot, angle } from '../Vec2';
3
+ export { catmullRom } from './CatmullRom';
4
+ export { clamp, moveTowardZero } from './utils';
5
+ export { segmentIntersectsRect, segmentIntersectsCircle } from './intersects';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/math/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACnH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { distance, distanceSq, lerp, subtract, normalize, magnitude, ZERO, add, scale, dot, angle } from '../Vec2';
2
+ export { catmullRom } from './CatmullRom';
3
+ export { clamp, moveTowardZero } from './utils';
4
+ export { segmentIntersectsRect, segmentIntersectsCircle } from './intersects';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/math/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACnH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { Vec2 } from '../Vec2';
2
+ /**
3
+ * Returns true if the segment from `p1` to `p2` intersects or touches the
4
+ * axis-aligned rectangle defined by its top-left corner `(rx, ry)` and size
5
+ * `(rw, rh)`.
6
+ *
7
+ * Uses the 2-D parametric slab method — O(1), no sqrt, no allocations.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * // Wall at (100, 200) sized 50×10
12
+ * segmentIntersectsRect({ x: 0, y: 205 }, { x: 200, y: 205 }, 100, 200, 50, 10); // true
13
+ * segmentIntersectsRect({ x: 0, y: 220 }, { x: 200, y: 220 }, 100, 200, 50, 10); // false
14
+ * ```
15
+ */
16
+ export declare function segmentIntersectsRect(p1: Vec2, p2: Vec2, rx: number, ry: number, rw: number, rh: number): boolean;
17
+ /**
18
+ * Returns true if the segment from `p1` to `p2` intersects or touches the
19
+ * circle at `center` with the given `radius`.
20
+ *
21
+ * Projects the center onto the segment (clamped to [0, 1]) and checks the
22
+ * squared distance — no sqrt needed for the intersection test.
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * // Circular pillar at (150, 150) radius 30
27
+ * segmentIntersectsCircle({ x: 0, y: 150 }, { x: 300, y: 150 }, { x: 150, y: 150 }, 30); // true
28
+ * segmentIntersectsCircle({ x: 0, y: 190 }, { x: 300, y: 190 }, { x: 150, y: 150 }, 30); // false
29
+ * ```
30
+ */
31
+ export declare function segmentIntersectsCircle(p1: Vec2, p2: Vec2, center: Vec2, radius: number): boolean;
32
+ //# sourceMappingURL=intersects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intersects.d.ts","sourceRoot":"","sources":["../../../src/core/math/intersects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAEpC;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,IAAI,EACR,EAAE,EAAE,IAAI,EACR,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GACT,OAAO,CAmCT;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CACrC,EAAE,EAAE,IAAI,EACR,EAAE,EAAE,IAAI,EACR,MAAM,EAAE,IAAI,EACZ,MAAM,EAAE,MAAM,GACb,OAAO,CAsBT"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Returns true if the segment from `p1` to `p2` intersects or touches the
3
+ * axis-aligned rectangle defined by its top-left corner `(rx, ry)` and size
4
+ * `(rw, rh)`.
5
+ *
6
+ * Uses the 2-D parametric slab method — O(1), no sqrt, no allocations.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * // Wall at (100, 200) sized 50×10
11
+ * segmentIntersectsRect({ x: 0, y: 205 }, { x: 200, y: 205 }, 100, 200, 50, 10); // true
12
+ * segmentIntersectsRect({ x: 0, y: 220 }, { x: 200, y: 220 }, 100, 200, 50, 10); // false
13
+ * ```
14
+ */
15
+ export function segmentIntersectsRect(p1, p2, rx, ry, rw, rh) {
16
+ const dx = p2.x - p1.x;
17
+ const dy = p2.y - p1.y;
18
+ let tmin = 0;
19
+ let tmax = 1;
20
+ // ── X slab ──────────────────────────────────────────────────────────────────
21
+ if (Math.abs(dx) < 1e-10) {
22
+ const xmin = rx < rx + rw ? rx : rx + rw;
23
+ const xmax = rx < rx + rw ? rx + rw : rx;
24
+ if (p1.x < xmin || p1.x > xmax)
25
+ return false;
26
+ }
27
+ else {
28
+ const inv = 1 / dx;
29
+ const t1 = (rx - p1.x) * inv;
30
+ const t2 = (rx + rw - p1.x) * inv;
31
+ tmin = Math.max(tmin, Math.min(t1, t2));
32
+ tmax = Math.min(tmax, Math.max(t1, t2));
33
+ if (tmin > tmax)
34
+ return false;
35
+ }
36
+ // ── Y slab ──────────────────────────────────────────────────────────────────
37
+ if (Math.abs(dy) < 1e-10) {
38
+ const ymin = ry < ry + rh ? ry : ry + rh;
39
+ const ymax = ry < ry + rh ? ry + rh : ry;
40
+ if (p1.y < ymin || p1.y > ymax)
41
+ return false;
42
+ }
43
+ else {
44
+ const inv = 1 / dy;
45
+ const t1 = (ry - p1.y) * inv;
46
+ const t2 = (ry + rh - p1.y) * inv;
47
+ tmin = Math.max(tmin, Math.min(t1, t2));
48
+ tmax = Math.min(tmax, Math.max(t1, t2));
49
+ if (tmin > tmax)
50
+ return false;
51
+ }
52
+ return true;
53
+ }
54
+ /**
55
+ * Returns true if the segment from `p1` to `p2` intersects or touches the
56
+ * circle at `center` with the given `radius`.
57
+ *
58
+ * Projects the center onto the segment (clamped to [0, 1]) and checks the
59
+ * squared distance — no sqrt needed for the intersection test.
60
+ *
61
+ * @example
62
+ * ```ts
63
+ * // Circular pillar at (150, 150) radius 30
64
+ * segmentIntersectsCircle({ x: 0, y: 150 }, { x: 300, y: 150 }, { x: 150, y: 150 }, 30); // true
65
+ * segmentIntersectsCircle({ x: 0, y: 190 }, { x: 300, y: 190 }, { x: 150, y: 150 }, 30); // false
66
+ * ```
67
+ */
68
+ export function segmentIntersectsCircle(p1, p2, center, radius) {
69
+ if (radius <= 0)
70
+ return false;
71
+ const dx = p2.x - p1.x;
72
+ const dy = p2.y - p1.y;
73
+ const lenSq = dx * dx + dy * dy;
74
+ let t;
75
+ if (lenSq < 1e-10) {
76
+ // Degenerate segment — treat as a point
77
+ t = 0;
78
+ }
79
+ else {
80
+ t = ((center.x - p1.x) * dx + (center.y - p1.y) * dy) / lenSq;
81
+ if (t < 0)
82
+ t = 0;
83
+ else if (t > 1)
84
+ t = 1;
85
+ }
86
+ const closestX = p1.x + t * dx;
87
+ const closestY = p1.y + t * dy;
88
+ const ex = center.x - closestX;
89
+ const ey = center.y - closestY;
90
+ return ex * ex + ey * ey <= radius * radius;
91
+ }
92
+ //# sourceMappingURL=intersects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intersects.js","sourceRoot":"","sources":["../../../src/core/math/intersects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** Clamp value to [min, max] range. */
2
+ export declare function clamp(value: number, min: number, max: number): number;
3
+ /** Move value toward zero by `amount`. Never overshoots past zero. */
4
+ export declare function moveTowardZero(value: number, amount: number): number;
5
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/core/math/utils.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAErE;AAED,sEAAsE;AACtE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAIpE"}
@@ -0,0 +1,13 @@
1
+ /** Clamp value to [min, max] range. */
2
+ export function clamp(value, min, max) {
3
+ return Math.max(min, Math.min(max, value));
4
+ }
5
+ /** Move value toward zero by `amount`. Never overshoots past zero. */
6
+ export function moveTowardZero(value, amount) {
7
+ if (value > 0)
8
+ return Math.max(0, value - amount);
9
+ if (value < 0)
10
+ return Math.min(0, value + amount);
11
+ return 0;
12
+ }
13
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/core/math/utils.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,MAAM,UAAU,KAAK,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW;IAC3D,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,MAAc;IAC1D,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;IAClD,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;IAClD,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Lifecycle contract for an entity component.
3
+ *
4
+ * Components encapsulate a single concern (health, movement, combat, AI)
5
+ * and are attached to entities by name.
6
+ */
7
+ export interface IComponent {
8
+ /** Unique component identifier used in hasComponent() / getComponent(). */
9
+ readonly name: string;
10
+ /** Called once when the component is first attached to an entity. */
11
+ init(): void;
12
+ /** Called every frame. `delta` is seconds since the last frame. */
13
+ update(delta: number): void;
14
+ /** Called when the component or its owner entity is destroyed. Release resources here. */
15
+ destroy(): void;
16
+ }
17
+ //# sourceMappingURL=IComponent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IComponent.d.ts","sourceRoot":"","sources":["../../src/entity/IComponent.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,2EAA2E;IAC3E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,IAAI,IAAI,IAAI,CAAC;IACb,mEAAmE;IACnE,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,0FAA0F;IAC1F,OAAO,IAAI,IAAI,CAAC;CACjB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=IComponent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IComponent.js","sourceRoot":"","sources":["../../src/entity/IComponent.ts"],"names":[],"mappings":""}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Minimal entity contract used by AI states, GOAP actions, and the state machine.
3
+ *
4
+ * This is the simulation's view of an entity — not the full game object.
5
+ * Host engines provide a richer object; the kernel only consumes this slice.
6
+ */
7
+ export interface IEntity {
8
+ /** Globally unique identifier. */
9
+ readonly id: string;
10
+ /** Type discriminator (e.g. 'npc', 'monster', 'player'). */
11
+ readonly entityType: string;
12
+ /** True while the entity has not been killed or destroyed. */
13
+ readonly isAlive: boolean;
14
+ /** Arbitrary key-value store for cross-system data. */
15
+ readonly metadata?: ReadonlyMap<string, unknown>;
16
+ /** Current X world position (px). Mutable — updated by the simulation. */
17
+ x: number;
18
+ /** Current Y world position (px). Mutable — updated by the simulation. */
19
+ y: number;
20
+ /** Whether the entity participates in physics and AI updates. */
21
+ active: boolean;
22
+ /** Move the entity to a new world position. */
23
+ setPosition(x: number, y: number): void;
24
+ /** Enable/disable the entity. Returns `this` for chaining. */
25
+ setActive(value: boolean): this;
26
+ /** Show/hide the entity. Returns `this` for chaining. */
27
+ setVisible(value: boolean): this;
28
+ /** Check if a named component is attached. */
29
+ hasComponent(name: string): boolean;
30
+ /** Retrieve a component by name. Throws if not found. */
31
+ getComponent<T>(name: string): T;
32
+ }
33
+ //# sourceMappingURL=IEntity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IEntity.d.ts","sourceRoot":"","sources":["../../src/entity/IEntity.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,WAAW,OAAO;IACtB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,uDAAuD;IACvD,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjD,0EAA0E;IAC1E,CAAC,EAAE,MAAM,CAAC;IACV,0EAA0E;IAC1E,CAAC,EAAE,MAAM,CAAC;IACV,iEAAiE;IACjE,MAAM,EAAE,OAAO,CAAC;IAChB,+CAA+C;IAC/C,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,8DAA8D;IAC9D,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,yDAAyD;IACzD,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,8CAA8C;IAC9C,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACpC,yDAAyD;IACzD,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC;CAClC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=IEntity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IEntity.js","sourceRoot":"","sources":["../../src/entity/IEntity.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export type { IEntity } from './IEntity';
2
+ export type { IComponent } from './IComponent';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/entity/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/entity/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,241 @@
1
+ import type { Vec2 } from '../core/Vec2';
2
+ export declare const ALifeEvents: {
3
+ readonly TICK: "alife:tick";
4
+ readonly NPC_MOVED: "alife:npc_moved";
5
+ readonly FACTION_CONFLICT: "alife:faction_conflict";
6
+ readonly NPC_ONLINE: "alife:npc_online";
7
+ readonly NPC_OFFLINE: "alife:npc_offline";
8
+ readonly TASK_ASSIGNED: "alife:task_assigned";
9
+ readonly NPC_DIED: "alife:npc_died";
10
+ readonly SPAWN_REQUESTED: "alife:spawn_requested";
11
+ readonly NPC_RELEASED: "alife:npc_released";
12
+ readonly TERRAIN_STATE_CHANGED: "alife:terrain_state_changed";
13
+ readonly MORALE_CHANGED: "alife:morale_changed";
14
+ readonly NPC_PANICKED: "ai:npc_panicked";
15
+ readonly SPOTTED_ENEMY: "ai:spotted_enemy";
16
+ readonly HEARD_SOUND: "ai:heard_sound";
17
+ readonly LOST_TARGET: "ai:lost_target";
18
+ readonly STATE_CHANGED: "ai:state_changed";
19
+ readonly NPC_SHOOT: "ai:npc_shoot";
20
+ readonly NPC_VOCALIZATION: "ai:npc_vocalization";
21
+ readonly NPC_ATTACKED: "ai:npc_attacked";
22
+ readonly SURGE_WARNING: "surge:warning";
23
+ readonly SURGE_STARTED: "surge:started";
24
+ readonly SURGE_ENDED: "surge:ended";
25
+ readonly SURGE_DAMAGE: "surge:damage";
26
+ readonly ANOMALY_DAMAGE: "anomaly:damage";
27
+ readonly ARTEFACT_SPAWNED: "anomaly:artefact_spawned";
28
+ readonly ARTEFACT_COLLECTED: "anomaly:artefact_collected";
29
+ readonly SQUAD_FORMED: "squad:formed";
30
+ readonly SQUAD_MEMBER_ADDED: "squad:member_added";
31
+ readonly SQUAD_MEMBER_REMOVED: "squad:member_removed";
32
+ readonly SQUAD_DISBANDED: "squad:disbanded";
33
+ readonly SQUAD_COMMAND_ISSUED: "squad:command_issued";
34
+ readonly SQUAD_GOAL_SET: "squad:goal_set";
35
+ readonly SQUAD_GOAL_CLEARED: "squad:goal_cleared";
36
+ readonly FACTION_RELATION_CHANGED: "faction:relation_changed";
37
+ readonly HOUR_CHANGED: "time:hour_changed";
38
+ readonly DAY_NIGHT_CHANGED: "time:day_night_changed";
39
+ readonly NPC_SOCIAL_BUBBLE: "social:npc_bubble";
40
+ readonly NPC_MEET_PLAYER: "social:npc_meet_player";
41
+ readonly KAMP_STATE_CHANGED: "social:kamp_state_changed";
42
+ readonly MONSTER_MELEE_HIT: "monster:melee_hit";
43
+ readonly PSI_ATTACK_START: "monster:psi_attack_start";
44
+ };
45
+ export type ALifeEvents = (typeof ALifeEvents)[keyof typeof ALifeEvents];
46
+ export interface ALifeEventPayloads {
47
+ [ALifeEvents.TICK]: {
48
+ tick: number;
49
+ delta: number;
50
+ };
51
+ [ALifeEvents.NPC_MOVED]: {
52
+ npcId: string;
53
+ fromZone: string;
54
+ toZone: string;
55
+ };
56
+ [ALifeEvents.FACTION_CONFLICT]: {
57
+ factionA: string;
58
+ factionB: string;
59
+ zoneId: string;
60
+ };
61
+ [ALifeEvents.NPC_ONLINE]: {
62
+ npcId: string;
63
+ position: Vec2;
64
+ };
65
+ [ALifeEvents.NPC_OFFLINE]: {
66
+ npcId: string;
67
+ zoneId: string;
68
+ };
69
+ [ALifeEvents.TASK_ASSIGNED]: {
70
+ npcId: string;
71
+ terrainId: string;
72
+ taskType: string;
73
+ };
74
+ [ALifeEvents.NPC_DIED]: {
75
+ npcId: string;
76
+ killedBy: string;
77
+ zoneId: string;
78
+ };
79
+ [ALifeEvents.SPAWN_REQUESTED]: {
80
+ spawnPointId: string;
81
+ terrainId: string;
82
+ position: Vec2;
83
+ factionId: string;
84
+ enemyType: string;
85
+ };
86
+ [ALifeEvents.NPC_RELEASED]: {
87
+ npcId: string;
88
+ terrainId: string;
89
+ };
90
+ [ALifeEvents.TERRAIN_STATE_CHANGED]: {
91
+ terrainId: string;
92
+ oldState: number;
93
+ newState: number;
94
+ };
95
+ [ALifeEvents.MORALE_CHANGED]: {
96
+ npcId: string;
97
+ morale: number;
98
+ previousMorale: number;
99
+ moraleState: string;
100
+ };
101
+ [ALifeEvents.NPC_PANICKED]: {
102
+ npcId: string;
103
+ squadId: string | null;
104
+ };
105
+ [ALifeEvents.SPOTTED_ENEMY]: {
106
+ npcId: string;
107
+ enemyId: string;
108
+ position: Vec2;
109
+ };
110
+ [ALifeEvents.HEARD_SOUND]: {
111
+ npcId: string;
112
+ sourceId: string;
113
+ position: Vec2;
114
+ };
115
+ [ALifeEvents.LOST_TARGET]: {
116
+ npcId: string;
117
+ lastKnown: Vec2;
118
+ };
119
+ [ALifeEvents.STATE_CHANGED]: {
120
+ npcId: string;
121
+ oldState: string;
122
+ newState: string;
123
+ };
124
+ [ALifeEvents.NPC_SHOOT]: {
125
+ npcId: string;
126
+ from: Vec2;
127
+ target: Vec2;
128
+ damage: number;
129
+ };
130
+ [ALifeEvents.NPC_VOCALIZATION]: {
131
+ npcId: string;
132
+ soundType: string;
133
+ position: Vec2;
134
+ factionId: string;
135
+ };
136
+ [ALifeEvents.NPC_ATTACKED]: {
137
+ attackerId: string;
138
+ targetId: string;
139
+ damage: number;
140
+ attackerFaction: string;
141
+ targetFaction: string;
142
+ };
143
+ [ALifeEvents.SURGE_WARNING]: {
144
+ timeUntilSurge: number;
145
+ };
146
+ [ALifeEvents.SURGE_STARTED]: {
147
+ surgeNumber: number;
148
+ };
149
+ [ALifeEvents.SURGE_ENDED]: {
150
+ surgeNumber: number;
151
+ };
152
+ [ALifeEvents.SURGE_DAMAGE]: {
153
+ npcId: string;
154
+ damage: number;
155
+ };
156
+ [ALifeEvents.ANOMALY_DAMAGE]: {
157
+ entityId: string;
158
+ anomalyId: string;
159
+ damage: number;
160
+ damageType: string;
161
+ };
162
+ [ALifeEvents.ARTEFACT_SPAWNED]: {
163
+ artefactId: string;
164
+ anomalyId: string;
165
+ position: Vec2;
166
+ };
167
+ [ALifeEvents.ARTEFACT_COLLECTED]: {
168
+ artefactId: string;
169
+ collectorId: string;
170
+ };
171
+ [ALifeEvents.SQUAD_FORMED]: {
172
+ squadId: string;
173
+ factionId: string;
174
+ memberIds: string[];
175
+ };
176
+ [ALifeEvents.SQUAD_MEMBER_ADDED]: {
177
+ squadId: string;
178
+ npcId: string;
179
+ };
180
+ [ALifeEvents.SQUAD_MEMBER_REMOVED]: {
181
+ squadId: string;
182
+ npcId: string;
183
+ };
184
+ [ALifeEvents.SQUAD_DISBANDED]: {
185
+ squadId: string;
186
+ };
187
+ [ALifeEvents.SQUAD_COMMAND_ISSUED]: {
188
+ squadId: string;
189
+ command: string;
190
+ };
191
+ [ALifeEvents.SQUAD_GOAL_SET]: {
192
+ squadId: string;
193
+ goalType: string;
194
+ terrainId: string | null;
195
+ priority: number;
196
+ };
197
+ [ALifeEvents.SQUAD_GOAL_CLEARED]: {
198
+ squadId: string;
199
+ previousGoalType: string;
200
+ };
201
+ [ALifeEvents.FACTION_RELATION_CHANGED]: {
202
+ factionId: string;
203
+ targetFactionId: string;
204
+ oldRelation: number;
205
+ newRelation: number;
206
+ };
207
+ [ALifeEvents.HOUR_CHANGED]: {
208
+ hour: number;
209
+ day: number;
210
+ isDay: boolean;
211
+ };
212
+ [ALifeEvents.DAY_NIGHT_CHANGED]: {
213
+ isDay: boolean;
214
+ };
215
+ [ALifeEvents.NPC_SOCIAL_BUBBLE]: {
216
+ npcId: string;
217
+ text: string;
218
+ category: string;
219
+ };
220
+ [ALifeEvents.NPC_MEET_PLAYER]: {
221
+ npcId: string;
222
+ factionId: string;
223
+ greetingType: string;
224
+ };
225
+ [ALifeEvents.KAMP_STATE_CHANGED]: {
226
+ terrainId: string;
227
+ directorId: string | null;
228
+ state: string;
229
+ };
230
+ [ALifeEvents.MONSTER_MELEE_HIT]: {
231
+ attackerId: string;
232
+ position: Vec2;
233
+ damage: number;
234
+ range: number;
235
+ };
236
+ [ALifeEvents.PSI_ATTACK_START]: {
237
+ npcId: string;
238
+ position: Vec2;
239
+ };
240
+ }
241
+ //# sourceMappingURL=ALifeEvents.d.ts.map