@alife-sdk/ai 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 (395) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +385 -0
  3. package/dist/animation/AnimationController.d.ts +60 -0
  4. package/dist/animation/AnimationController.d.ts.map +1 -0
  5. package/dist/animation/AnimationController.js +71 -0
  6. package/dist/animation/AnimationController.js.map +1 -0
  7. package/dist/animation/AnimationSelector.d.ts +108 -0
  8. package/dist/animation/AnimationSelector.d.ts.map +1 -0
  9. package/dist/animation/AnimationSelector.js +194 -0
  10. package/dist/animation/AnimationSelector.js.map +1 -0
  11. package/dist/animation/index.d.ts +5 -0
  12. package/dist/animation/index.d.ts.map +1 -0
  13. package/dist/animation/index.js +4 -0
  14. package/dist/animation/index.js.map +1 -0
  15. package/dist/combat/CombatTransitionChain.d.ts +95 -0
  16. package/dist/combat/CombatTransitionChain.d.ts.map +1 -0
  17. package/dist/combat/CombatTransitionChain.js +117 -0
  18. package/dist/combat/CombatTransitionChain.js.map +1 -0
  19. package/dist/combat/LoadoutBuilder.d.ts +83 -0
  20. package/dist/combat/LoadoutBuilder.d.ts.map +1 -0
  21. package/dist/combat/LoadoutBuilder.js +213 -0
  22. package/dist/combat/LoadoutBuilder.js.map +1 -0
  23. package/dist/combat/MonsterAbilityData.d.ts +97 -0
  24. package/dist/combat/MonsterAbilityData.d.ts.map +1 -0
  25. package/dist/combat/MonsterAbilityData.js +94 -0
  26. package/dist/combat/MonsterAbilityData.js.map +1 -0
  27. package/dist/combat/WeaponSelector.d.ts +47 -0
  28. package/dist/combat/WeaponSelector.d.ts.map +1 -0
  29. package/dist/combat/WeaponSelector.js +180 -0
  30. package/dist/combat/WeaponSelector.js.map +1 -0
  31. package/dist/combat/index.d.ts +9 -0
  32. package/dist/combat/index.d.ts.map +1 -0
  33. package/dist/combat/index.js +6 -0
  34. package/dist/combat/index.js.map +1 -0
  35. package/dist/conditions/ConditionBank.d.ts +179 -0
  36. package/dist/conditions/ConditionBank.d.ts.map +1 -0
  37. package/dist/conditions/ConditionBank.js +220 -0
  38. package/dist/conditions/ConditionBank.js.map +1 -0
  39. package/dist/conditions/index.d.ts +3 -0
  40. package/dist/conditions/index.d.ts.map +1 -0
  41. package/dist/conditions/index.js +3 -0
  42. package/dist/conditions/index.js.map +1 -0
  43. package/dist/config/createDefaultAIConfig.d.ts +25 -0
  44. package/dist/config/createDefaultAIConfig.d.ts.map +1 -0
  45. package/dist/config/createDefaultAIConfig.js +147 -0
  46. package/dist/config/createDefaultAIConfig.js.map +1 -0
  47. package/dist/config/index.d.ts +2 -0
  48. package/dist/config/index.d.ts.map +1 -0
  49. package/dist/config/index.js +3 -0
  50. package/dist/config/index.js.map +1 -0
  51. package/dist/cover/CoverAccessAdapter.d.ts +61 -0
  52. package/dist/cover/CoverAccessAdapter.d.ts.map +1 -0
  53. package/dist/cover/CoverAccessAdapter.js +74 -0
  54. package/dist/cover/CoverAccessAdapter.js.map +1 -0
  55. package/dist/cover/CoverEvaluators.d.ts +43 -0
  56. package/dist/cover/CoverEvaluators.d.ts.map +1 -0
  57. package/dist/cover/CoverEvaluators.js +193 -0
  58. package/dist/cover/CoverEvaluators.js.map +1 -0
  59. package/dist/cover/CoverLockRegistry.d.ts +50 -0
  60. package/dist/cover/CoverLockRegistry.d.ts.map +1 -0
  61. package/dist/cover/CoverLockRegistry.js +164 -0
  62. package/dist/cover/CoverLockRegistry.js.map +1 -0
  63. package/dist/cover/CoverRecommender.d.ts +32 -0
  64. package/dist/cover/CoverRecommender.d.ts.map +1 -0
  65. package/dist/cover/CoverRecommender.js +45 -0
  66. package/dist/cover/CoverRecommender.js.map +1 -0
  67. package/dist/cover/CoverRegistry.d.ts +97 -0
  68. package/dist/cover/CoverRegistry.d.ts.map +1 -0
  69. package/dist/cover/CoverRegistry.js +223 -0
  70. package/dist/cover/CoverRegistry.js.map +1 -0
  71. package/dist/cover/ICoverEvaluator.d.ts +15 -0
  72. package/dist/cover/ICoverEvaluator.d.ts.map +1 -0
  73. package/dist/cover/ICoverEvaluator.js +4 -0
  74. package/dist/cover/ICoverEvaluator.js.map +1 -0
  75. package/dist/cover/ICoverLockConfig.d.ts +83 -0
  76. package/dist/cover/ICoverLockConfig.d.ts.map +1 -0
  77. package/dist/cover/ICoverLockConfig.js +21 -0
  78. package/dist/cover/ICoverLockConfig.js.map +1 -0
  79. package/dist/cover/LoopholeGenerator.d.ts +44 -0
  80. package/dist/cover/LoopholeGenerator.d.ts.map +1 -0
  81. package/dist/cover/LoopholeGenerator.js +96 -0
  82. package/dist/cover/LoopholeGenerator.js.map +1 -0
  83. package/dist/cover/index.d.ts +11 -0
  84. package/dist/cover/index.d.ts.map +1 -0
  85. package/dist/cover/index.js +8 -0
  86. package/dist/cover/index.js.map +1 -0
  87. package/dist/goap/EvadeHazardAction.d.ts +34 -0
  88. package/dist/goap/EvadeHazardAction.d.ts.map +1 -0
  89. package/dist/goap/EvadeHazardAction.js +48 -0
  90. package/dist/goap/EvadeHazardAction.js.map +1 -0
  91. package/dist/goap/GOAPController.d.ts +114 -0
  92. package/dist/goap/GOAPController.d.ts.map +1 -0
  93. package/dist/goap/GOAPController.js +191 -0
  94. package/dist/goap/GOAPController.js.map +1 -0
  95. package/dist/goap/GoalSelector.d.ts +40 -0
  96. package/dist/goap/GoalSelector.d.ts.map +1 -0
  97. package/dist/goap/GoalSelector.js +115 -0
  98. package/dist/goap/GoalSelector.js.map +1 -0
  99. package/dist/goap/IHazardZoneAccess.d.ts +16 -0
  100. package/dist/goap/IHazardZoneAccess.d.ts.map +1 -0
  101. package/dist/goap/IHazardZoneAccess.js +2 -0
  102. package/dist/goap/IHazardZoneAccess.js.map +1 -0
  103. package/dist/goap/WorldStateBuilder.d.ts +27 -0
  104. package/dist/goap/WorldStateBuilder.d.ts.map +1 -0
  105. package/dist/goap/WorldStateBuilder.js +51 -0
  106. package/dist/goap/WorldStateBuilder.js.map +1 -0
  107. package/dist/goap/index.d.ts +9 -0
  108. package/dist/goap/index.d.ts.map +1 -0
  109. package/dist/goap/index.js +6 -0
  110. package/dist/goap/index.js.map +1 -0
  111. package/dist/index.d.ts +16 -0
  112. package/dist/index.d.ts.map +1 -0
  113. package/dist/index.js +18 -0
  114. package/dist/index.js.map +1 -0
  115. package/dist/navigation/PathSmoother.d.ts +29 -0
  116. package/dist/navigation/PathSmoother.d.ts.map +1 -0
  117. package/dist/navigation/PathSmoother.js +172 -0
  118. package/dist/navigation/PathSmoother.js.map +1 -0
  119. package/dist/navigation/RestrictedZoneManager.d.ts +83 -0
  120. package/dist/navigation/RestrictedZoneManager.d.ts.map +1 -0
  121. package/dist/navigation/RestrictedZoneManager.js +179 -0
  122. package/dist/navigation/RestrictedZoneManager.js.map +1 -0
  123. package/dist/navigation/SmoothPathFollower.d.ts +55 -0
  124. package/dist/navigation/SmoothPathFollower.d.ts.map +1 -0
  125. package/dist/navigation/SmoothPathFollower.js +132 -0
  126. package/dist/navigation/SmoothPathFollower.js.map +1 -0
  127. package/dist/navigation/SteeringBehaviors.d.ts +123 -0
  128. package/dist/navigation/SteeringBehaviors.d.ts.map +1 -0
  129. package/dist/navigation/SteeringBehaviors.js +211 -0
  130. package/dist/navigation/SteeringBehaviors.js.map +1 -0
  131. package/dist/navigation/index.d.ts +7 -0
  132. package/dist/navigation/index.d.ts.map +1 -0
  133. package/dist/navigation/index.js +6 -0
  134. package/dist/navigation/index.js.map +1 -0
  135. package/dist/perception/NPCSensors.d.ts +129 -0
  136. package/dist/perception/NPCSensors.d.ts.map +1 -0
  137. package/dist/perception/NPCSensors.js +147 -0
  138. package/dist/perception/NPCSensors.js.map +1 -0
  139. package/dist/perception/PerceptionQuery.d.ts +65 -0
  140. package/dist/perception/PerceptionQuery.d.ts.map +1 -0
  141. package/dist/perception/PerceptionQuery.js +199 -0
  142. package/dist/perception/PerceptionQuery.js.map +1 -0
  143. package/dist/perception/index.d.ts +4 -0
  144. package/dist/perception/index.d.ts.map +1 -0
  145. package/dist/perception/index.js +4 -0
  146. package/dist/perception/index.js.map +1 -0
  147. package/dist/plugin/AIPlugin.d.ts +71 -0
  148. package/dist/plugin/AIPlugin.d.ts.map +1 -0
  149. package/dist/plugin/AIPlugin.js +134 -0
  150. package/dist/plugin/AIPlugin.js.map +1 -0
  151. package/dist/plugin/index.d.ts +3 -0
  152. package/dist/plugin/index.d.ts.map +1 -0
  153. package/dist/plugin/index.js +3 -0
  154. package/dist/plugin/index.js.map +1 -0
  155. package/dist/ports/AIPorts.d.ts +13 -0
  156. package/dist/ports/AIPorts.d.ts.map +1 -0
  157. package/dist/ports/AIPorts.js +14 -0
  158. package/dist/ports/AIPorts.js.map +1 -0
  159. package/dist/ports/ICoverPointSource.d.ts +27 -0
  160. package/dist/ports/ICoverPointSource.d.ts.map +1 -0
  161. package/dist/ports/ICoverPointSource.js +4 -0
  162. package/dist/ports/ICoverPointSource.js.map +1 -0
  163. package/dist/ports/IPerceptionProvider.d.ts +42 -0
  164. package/dist/ports/IPerceptionProvider.d.ts.map +1 -0
  165. package/dist/ports/IPerceptionProvider.js +4 -0
  166. package/dist/ports/IPerceptionProvider.js.map +1 -0
  167. package/dist/ports/index.d.ts +4 -0
  168. package/dist/ports/index.d.ts.map +1 -0
  169. package/dist/ports/index.js +3 -0
  170. package/dist/ports/index.js.map +1 -0
  171. package/dist/sound/VocalizationTypes.d.ts +57 -0
  172. package/dist/sound/VocalizationTypes.d.ts.map +1 -0
  173. package/dist/sound/VocalizationTypes.js +87 -0
  174. package/dist/sound/VocalizationTypes.js.map +1 -0
  175. package/dist/sound/index.d.ts +3 -0
  176. package/dist/sound/index.d.ts.map +1 -0
  177. package/dist/sound/index.js +3 -0
  178. package/dist/sound/index.js.map +1 -0
  179. package/dist/squad/SquadSharedTarget.d.ts +137 -0
  180. package/dist/squad/SquadSharedTarget.d.ts.map +1 -0
  181. package/dist/squad/SquadSharedTarget.js +145 -0
  182. package/dist/squad/SquadSharedTarget.js.map +1 -0
  183. package/dist/squad/SquadTactics.d.ts +63 -0
  184. package/dist/squad/SquadTactics.d.ts.map +1 -0
  185. package/dist/squad/SquadTactics.js +76 -0
  186. package/dist/squad/SquadTactics.js.map +1 -0
  187. package/dist/squad/index.d.ts +5 -0
  188. package/dist/squad/index.d.ts.map +1 -0
  189. package/dist/squad/index.js +4 -0
  190. package/dist/squad/index.js.map +1 -0
  191. package/dist/states/INPCContext.d.ts +550 -0
  192. package/dist/states/INPCContext.d.ts.map +1 -0
  193. package/dist/states/INPCContext.js +17 -0
  194. package/dist/states/INPCContext.js.map +1 -0
  195. package/dist/states/INPCOnlineState.d.ts +202 -0
  196. package/dist/states/INPCOnlineState.d.ts.map +1 -0
  197. package/dist/states/INPCOnlineState.js +9 -0
  198. package/dist/states/INPCOnlineState.js.map +1 -0
  199. package/dist/states/IOnlineStateHandler.d.ts +58 -0
  200. package/dist/states/IOnlineStateHandler.d.ts.map +1 -0
  201. package/dist/states/IOnlineStateHandler.js +13 -0
  202. package/dist/states/IOnlineStateHandler.js.map +1 -0
  203. package/dist/states/IStateConfig.d.ts +272 -0
  204. package/dist/states/IStateConfig.d.ts.map +1 -0
  205. package/dist/states/IStateConfig.js +100 -0
  206. package/dist/states/IStateConfig.js.map +1 -0
  207. package/dist/states/IStateTransitionMap.d.ts +89 -0
  208. package/dist/states/IStateTransitionMap.d.ts.map +1 -0
  209. package/dist/states/IStateTransitionMap.js +75 -0
  210. package/dist/states/IStateTransitionMap.js.map +1 -0
  211. package/dist/states/NPCOnlineState.d.ts +19 -0
  212. package/dist/states/NPCOnlineState.d.ts.map +1 -0
  213. package/dist/states/NPCOnlineState.js +75 -0
  214. package/dist/states/NPCOnlineState.js.map +1 -0
  215. package/dist/states/NPCPerception.d.ts +108 -0
  216. package/dist/states/NPCPerception.d.ts.map +1 -0
  217. package/dist/states/NPCPerception.js +122 -0
  218. package/dist/states/NPCPerception.js.map +1 -0
  219. package/dist/states/OnlineAIDriver.d.ts +64 -0
  220. package/dist/states/OnlineAIDriver.d.ts.map +1 -0
  221. package/dist/states/OnlineAIDriver.js +171 -0
  222. package/dist/states/OnlineAIDriver.js.map +1 -0
  223. package/dist/states/OnlineStateRegistryBuilder.d.ts +115 -0
  224. package/dist/states/OnlineStateRegistryBuilder.d.ts.map +1 -0
  225. package/dist/states/OnlineStateRegistryBuilder.js +184 -0
  226. package/dist/states/OnlineStateRegistryBuilder.js.map +1 -0
  227. package/dist/states/StateHandlerMap.d.ts +52 -0
  228. package/dist/states/StateHandlerMap.d.ts.map +1 -0
  229. package/dist/states/StateHandlerMap.js +88 -0
  230. package/dist/states/StateHandlerMap.js.map +1 -0
  231. package/dist/states/eat-corpse/EatCorpseState.d.ts +32 -0
  232. package/dist/states/eat-corpse/EatCorpseState.d.ts.map +1 -0
  233. package/dist/states/eat-corpse/EatCorpseState.js +126 -0
  234. package/dist/states/eat-corpse/EatCorpseState.js.map +1 -0
  235. package/dist/states/eat-corpse/EatCorpseTransitionGuard.d.ts +34 -0
  236. package/dist/states/eat-corpse/EatCorpseTransitionGuard.d.ts.map +1 -0
  237. package/dist/states/eat-corpse/EatCorpseTransitionGuard.js +82 -0
  238. package/dist/states/eat-corpse/EatCorpseTransitionGuard.js.map +1 -0
  239. package/dist/states/eat-corpse/ICorpseSource.d.ts +87 -0
  240. package/dist/states/eat-corpse/ICorpseSource.d.ts.map +1 -0
  241. package/dist/states/eat-corpse/ICorpseSource.js +5 -0
  242. package/dist/states/eat-corpse/ICorpseSource.js.map +1 -0
  243. package/dist/states/eat-corpse/IEatCorpseConfig.d.ts +75 -0
  244. package/dist/states/eat-corpse/IEatCorpseConfig.d.ts.map +1 -0
  245. package/dist/states/eat-corpse/IEatCorpseConfig.js +23 -0
  246. package/dist/states/eat-corpse/IEatCorpseConfig.js.map +1 -0
  247. package/dist/states/eat-corpse/IEatCorpsePhase.d.ts +23 -0
  248. package/dist/states/eat-corpse/IEatCorpsePhase.d.ts.map +1 -0
  249. package/dist/states/eat-corpse/IEatCorpsePhase.js +5 -0
  250. package/dist/states/eat-corpse/IEatCorpsePhase.js.map +1 -0
  251. package/dist/states/eat-corpse/index.d.ts +7 -0
  252. package/dist/states/eat-corpse/index.d.ts.map +1 -0
  253. package/dist/states/eat-corpse/index.js +11 -0
  254. package/dist/states/eat-corpse/index.js.map +1 -0
  255. package/dist/states/handlers/AlertState.d.ts +18 -0
  256. package/dist/states/handlers/AlertState.d.ts.map +1 -0
  257. package/dist/states/handlers/AlertState.js +104 -0
  258. package/dist/states/handlers/AlertState.js.map +1 -0
  259. package/dist/states/handlers/CampState.d.ts +18 -0
  260. package/dist/states/handlers/CampState.d.ts.map +1 -0
  261. package/dist/states/handlers/CampState.js +94 -0
  262. package/dist/states/handlers/CampState.js.map +1 -0
  263. package/dist/states/handlers/ChargeState.d.ts +18 -0
  264. package/dist/states/handlers/ChargeState.d.ts.map +1 -0
  265. package/dist/states/handlers/ChargeState.js +103 -0
  266. package/dist/states/handlers/ChargeState.js.map +1 -0
  267. package/dist/states/handlers/CombatState.d.ts +19 -0
  268. package/dist/states/handlers/CombatState.d.ts.map +1 -0
  269. package/dist/states/handlers/CombatState.js +137 -0
  270. package/dist/states/handlers/CombatState.js.map +1 -0
  271. package/dist/states/handlers/CombatTransitionHandler.d.ts +34 -0
  272. package/dist/states/handlers/CombatTransitionHandler.d.ts.map +1 -0
  273. package/dist/states/handlers/CombatTransitionHandler.js +137 -0
  274. package/dist/states/handlers/CombatTransitionHandler.js.map +1 -0
  275. package/dist/states/handlers/DeadState.d.ts +16 -0
  276. package/dist/states/handlers/DeadState.d.ts.map +1 -0
  277. package/dist/states/handlers/DeadState.js +35 -0
  278. package/dist/states/handlers/DeadState.js.map +1 -0
  279. package/dist/states/handlers/EvadeGrenadeState.d.ts +23 -0
  280. package/dist/states/handlers/EvadeGrenadeState.d.ts.map +1 -0
  281. package/dist/states/handlers/EvadeGrenadeState.js +93 -0
  282. package/dist/states/handlers/EvadeGrenadeState.js.map +1 -0
  283. package/dist/states/handlers/FleeState.d.ts +18 -0
  284. package/dist/states/handlers/FleeState.d.ts.map +1 -0
  285. package/dist/states/handlers/FleeState.js +61 -0
  286. package/dist/states/handlers/FleeState.js.map +1 -0
  287. package/dist/states/handlers/GrenadeState.d.ts +18 -0
  288. package/dist/states/handlers/GrenadeState.d.ts.map +1 -0
  289. package/dist/states/handlers/GrenadeState.js +61 -0
  290. package/dist/states/handlers/GrenadeState.js.map +1 -0
  291. package/dist/states/handlers/HelpWoundedState.d.ts +27 -0
  292. package/dist/states/handlers/HelpWoundedState.d.ts.map +1 -0
  293. package/dist/states/handlers/HelpWoundedState.js +131 -0
  294. package/dist/states/handlers/HelpWoundedState.js.map +1 -0
  295. package/dist/states/handlers/IdleState.d.ts +18 -0
  296. package/dist/states/handlers/IdleState.d.ts.map +1 -0
  297. package/dist/states/handlers/IdleState.js +127 -0
  298. package/dist/states/handlers/IdleState.js.map +1 -0
  299. package/dist/states/handlers/InvestigateState.d.ts +27 -0
  300. package/dist/states/handlers/InvestigateState.d.ts.map +1 -0
  301. package/dist/states/handlers/InvestigateState.js +145 -0
  302. package/dist/states/handlers/InvestigateState.js.map +1 -0
  303. package/dist/states/handlers/KillWoundedState.d.ts +27 -0
  304. package/dist/states/handlers/KillWoundedState.d.ts.map +1 -0
  305. package/dist/states/handlers/KillWoundedState.js +147 -0
  306. package/dist/states/handlers/KillWoundedState.js.map +1 -0
  307. package/dist/states/handlers/LeapState.d.ts +18 -0
  308. package/dist/states/handlers/LeapState.d.ts.map +1 -0
  309. package/dist/states/handlers/LeapState.js +115 -0
  310. package/dist/states/handlers/LeapState.js.map +1 -0
  311. package/dist/states/handlers/MonsterCombatController.d.ts +55 -0
  312. package/dist/states/handlers/MonsterCombatController.d.ts.map +1 -0
  313. package/dist/states/handlers/MonsterCombatController.js +152 -0
  314. package/dist/states/handlers/MonsterCombatController.js.map +1 -0
  315. package/dist/states/handlers/PatrolState.d.ts +18 -0
  316. package/dist/states/handlers/PatrolState.d.ts.map +1 -0
  317. package/dist/states/handlers/PatrolState.js +137 -0
  318. package/dist/states/handlers/PatrolState.js.map +1 -0
  319. package/dist/states/handlers/PsiAttackState.d.ts +18 -0
  320. package/dist/states/handlers/PsiAttackState.d.ts.map +1 -0
  321. package/dist/states/handlers/PsiAttackState.js +101 -0
  322. package/dist/states/handlers/PsiAttackState.js.map +1 -0
  323. package/dist/states/handlers/RetreatState.d.ts +18 -0
  324. package/dist/states/handlers/RetreatState.d.ts.map +1 -0
  325. package/dist/states/handlers/RetreatState.js +131 -0
  326. package/dist/states/handlers/RetreatState.js.map +1 -0
  327. package/dist/states/handlers/SearchState.d.ts +18 -0
  328. package/dist/states/handlers/SearchState.d.ts.map +1 -0
  329. package/dist/states/handlers/SearchState.js +64 -0
  330. package/dist/states/handlers/SearchState.js.map +1 -0
  331. package/dist/states/handlers/SleepState.d.ts +18 -0
  332. package/dist/states/handlers/SleepState.d.ts.map +1 -0
  333. package/dist/states/handlers/SleepState.js +94 -0
  334. package/dist/states/handlers/SleepState.js.map +1 -0
  335. package/dist/states/handlers/StalkState.d.ts +18 -0
  336. package/dist/states/handlers/StalkState.d.ts.map +1 -0
  337. package/dist/states/handlers/StalkState.js +82 -0
  338. package/dist/states/handlers/StalkState.js.map +1 -0
  339. package/dist/states/handlers/TakeCoverState.d.ts +18 -0
  340. package/dist/states/handlers/TakeCoverState.d.ts.map +1 -0
  341. package/dist/states/handlers/TakeCoverState.js +208 -0
  342. package/dist/states/handlers/TakeCoverState.js.map +1 -0
  343. package/dist/states/handlers/WoundedState.d.ts +18 -0
  344. package/dist/states/handlers/WoundedState.d.ts.map +1 -0
  345. package/dist/states/handlers/WoundedState.js +71 -0
  346. package/dist/states/handlers/WoundedState.js.map +1 -0
  347. package/dist/states/handlers/_utils.d.ts +55 -0
  348. package/dist/states/handlers/_utils.d.ts.map +1 -0
  349. package/dist/states/handlers/_utils.js +88 -0
  350. package/dist/states/handlers/_utils.js.map +1 -0
  351. package/dist/states/handlers/index.d.ts +25 -0
  352. package/dist/states/handlers/index.d.ts.map +1 -0
  353. package/dist/states/handlers/index.js +28 -0
  354. package/dist/states/handlers/index.js.map +1 -0
  355. package/dist/states/index.d.ts +17 -0
  356. package/dist/states/index.d.ts.map +1 -0
  357. package/dist/states/index.js +12 -0
  358. package/dist/states/index.js.map +1 -0
  359. package/dist/states/pack/IPackAccess.d.ts +46 -0
  360. package/dist/states/pack/IPackAccess.d.ts.map +1 -0
  361. package/dist/states/pack/IPackAccess.js +8 -0
  362. package/dist/states/pack/IPackAccess.js.map +1 -0
  363. package/dist/suspicion/SuspicionAccumulator.d.ts +166 -0
  364. package/dist/suspicion/SuspicionAccumulator.d.ts.map +1 -0
  365. package/dist/suspicion/SuspicionAccumulator.js +191 -0
  366. package/dist/suspicion/SuspicionAccumulator.js.map +1 -0
  367. package/dist/suspicion/index.d.ts +3 -0
  368. package/dist/suspicion/index.d.ts.map +1 -0
  369. package/dist/suspicion/index.js +2 -0
  370. package/dist/suspicion/index.js.map +1 -0
  371. package/dist/types/IAnimationTypes.d.ts +28 -0
  372. package/dist/types/IAnimationTypes.d.ts.map +1 -0
  373. package/dist/types/IAnimationTypes.js +17 -0
  374. package/dist/types/IAnimationTypes.js.map +1 -0
  375. package/dist/types/ICoverPoint.d.ts +76 -0
  376. package/dist/types/ICoverPoint.d.ts.map +1 -0
  377. package/dist/types/ICoverPoint.js +21 -0
  378. package/dist/types/ICoverPoint.js.map +1 -0
  379. package/dist/types/IOnlineAIConfig.d.ts +150 -0
  380. package/dist/types/IOnlineAIConfig.d.ts.map +1 -0
  381. package/dist/types/IOnlineAIConfig.js +5 -0
  382. package/dist/types/IOnlineAIConfig.js.map +1 -0
  383. package/dist/types/IPerceptionTypes.d.ts +94 -0
  384. package/dist/types/IPerceptionTypes.d.ts.map +1 -0
  385. package/dist/types/IPerceptionTypes.js +37 -0
  386. package/dist/types/IPerceptionTypes.js.map +1 -0
  387. package/dist/types/IWeaponTypes.d.ts +56 -0
  388. package/dist/types/IWeaponTypes.d.ts.map +1 -0
  389. package/dist/types/IWeaponTypes.js +15 -0
  390. package/dist/types/IWeaponTypes.js.map +1 -0
  391. package/dist/types/index.d.ts +10 -0
  392. package/dist/types/index.d.ts.map +1 -0
  393. package/dist/types/index.js +5 -0
  394. package/dist/types/index.js.map +1 -0
  395. package/package.json +123 -0
@@ -0,0 +1,96 @@
1
+ // cover/LoopholeGenerator.ts
2
+ // Generates peek-fire positions (loopholes) around cover points.
3
+ // Pure geometry — no framework dependencies.
4
+ /**
5
+ * Generates and caches loophole positions for cover points.
6
+ *
7
+ * Loopholes are evenly distributed around the cover center at a fixed
8
+ * offset distance, each with a firing arc of configurable width.
9
+ * A seeded random source ensures deterministic generation.
10
+ */
11
+ export class LoopholeGenerator {
12
+ constructor(config, random) {
13
+ this.cache = new Map();
14
+ this.offsetDistance = config.loopholeOffsetDistance;
15
+ this.fireArc = config.loopholeFireArc;
16
+ this.maxPerCover = config.loopholeMaxPerCover;
17
+ this.random = random;
18
+ }
19
+ /**
20
+ * Get loopholes for a cover point, generating them on first access.
21
+ * Results are cached by cover point ID for the lifetime of this generator.
22
+ */
23
+ getLoopholes(cover) {
24
+ const cached = this.cache.get(cover.id);
25
+ if (cached)
26
+ return cached;
27
+ const loopholes = this.generate(cover);
28
+ this.cache.set(cover.id, loopholes);
29
+ return loopholes;
30
+ }
31
+ /** Clear the generation cache. Call on scene reset. */
32
+ clearCache() {
33
+ this.cache.clear();
34
+ }
35
+ /**
36
+ * Generate loopholes for a single cover point.
37
+ *
38
+ * Count is randomized in [1, maxPerCover]. Loopholes are distributed
39
+ * evenly around the cover center with angular jitter for natural feel.
40
+ */
41
+ generate(_cover) {
42
+ const count = 1 + Math.floor(this.random.next() * this.maxPerCover);
43
+ const baseAngleStep = (2 * Math.PI) / count;
44
+ const startAngle = this.random.next() * 2 * Math.PI;
45
+ const loopholes = [];
46
+ for (let i = 0; i < count; i++) {
47
+ // Base angle with small random jitter.
48
+ const jitter = (this.random.next() - 0.5) * baseAngleStep * 0.3;
49
+ const angle = startAngle + i * baseAngleStep + jitter;
50
+ const offsetX = Math.cos(angle) * this.offsetDistance;
51
+ const offsetY = Math.sin(angle) * this.offsetDistance;
52
+ const halfArc = this.fireArc / 2;
53
+ loopholes.push({
54
+ offsetX,
55
+ offsetY,
56
+ angleMin: angle - halfArc,
57
+ angleMax: angle + halfArc,
58
+ });
59
+ }
60
+ return loopholes;
61
+ }
62
+ }
63
+ /**
64
+ * Find the loophole whose firing arc best covers the angle to an enemy.
65
+ *
66
+ * @param loopholes - Available loopholes on the cover point.
67
+ * @param coverX - Cover point world X.
68
+ * @param coverY - Cover point world Y.
69
+ * @param enemyX - Enemy world X.
70
+ * @param enemyY - Enemy world Y.
71
+ * @returns The best matching loophole, or null if none covers the angle.
72
+ */
73
+ export function findBestLoophole(loopholes, coverX, coverY, enemyX, enemyY) {
74
+ if (loopholes.length === 0)
75
+ return null;
76
+ const enemyAngle = Math.atan2(enemyY - coverY, enemyX - coverX);
77
+ let best = null;
78
+ let bestDelta = Infinity;
79
+ for (const lh of loopholes) {
80
+ const arcCenter = (lh.angleMin + lh.angleMax) / 2;
81
+ let delta = enemyAngle - arcCenter;
82
+ // Normalize to [-PI, PI] for wrap-around.
83
+ while (delta > Math.PI)
84
+ delta -= 2 * Math.PI;
85
+ while (delta < -Math.PI)
86
+ delta += 2 * Math.PI;
87
+ const absDelta = Math.abs(delta);
88
+ const halfArc = (lh.angleMax - lh.angleMin) / 2;
89
+ if (absDelta <= halfArc && absDelta < bestDelta) {
90
+ bestDelta = absDelta;
91
+ best = lh;
92
+ }
93
+ }
94
+ return best;
95
+ }
96
+ //# sourceMappingURL=LoopholeGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoopholeGenerator.js","sourceRoot":"","sources":["../../src/cover/LoopholeGenerator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export type { ICoverEvaluator } from './ICoverEvaluator';
2
+ export { CloseCoverEvaluator, FarCoverEvaluator, BalancedCoverEvaluator, BestCoverEvaluator, AmbushCoverEvaluator, SafeCoverEvaluator, createCoverEvaluators, } from './CoverEvaluators';
3
+ export { recommendCoverType } from './CoverRecommender';
4
+ export type { ICoverSituation } from './CoverRecommender';
5
+ export { LoopholeGenerator, findBestLoophole } from './LoopholeGenerator';
6
+ export { CoverRegistry } from './CoverRegistry';
7
+ export { CoverLockRegistry } from './CoverLockRegistry';
8
+ export { CoverAccessAdapter } from './CoverAccessAdapter';
9
+ export type { ICoverLockConfig, ICoverLockRegistry } from './ICoverLockConfig';
10
+ export { createDefaultCoverLockConfig } from './ICoverLockConfig';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cover/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,8 @@
1
+ export { CloseCoverEvaluator, FarCoverEvaluator, BalancedCoverEvaluator, BestCoverEvaluator, AmbushCoverEvaluator, SafeCoverEvaluator, createCoverEvaluators, } from './CoverEvaluators';
2
+ export { recommendCoverType } from './CoverRecommender';
3
+ export { LoopholeGenerator, findBestLoophole } from './LoopholeGenerator';
4
+ export { CoverRegistry } from './CoverRegistry';
5
+ export { CoverLockRegistry } from './CoverLockRegistry';
6
+ export { CoverAccessAdapter } from './CoverAccessAdapter';
7
+ export { createDefaultCoverLockConfig } from './ICoverLockConfig';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cover/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { GOAPAction, ActionStatus, WorldState } from '@alife-sdk/core';
2
+ import type { IEntity } from '@alife-sdk/core';
3
+ import type { IHazardZoneAccess } from './IHazardZoneAccess';
4
+ /**
5
+ * Generic GOAP action for hazard zone evasion.
6
+ *
7
+ * Moves the entity away from any hazard zone that implements IHazardZoneAccess.
8
+ * The caller supplies the GOAP property key and action id, making this reusable
9
+ * for anomalies, fire zones, radiation fields, or any spatial hazard.
10
+ *
11
+ * Direct setPosition() is used intentionally — emergency evasion bypasses
12
+ * pathfinding to ensure immediate response to life-threatening zones.
13
+ */
14
+ export declare class EvadeHazardAction extends GOAPAction {
15
+ private readonly hazard;
16
+ private readonly speed;
17
+ readonly id: string;
18
+ readonly cost: number;
19
+ private readonly _preconditions;
20
+ private readonly _effects;
21
+ /**
22
+ * @param hazard - Hazard zone access port (host-side adapter)
23
+ * @param id - Unique action id for plan logging (e.g. 'evade_anomaly')
24
+ * @param propertyKey - WorldProperty key this action satisfies (e.g. WorldProperty.ANOMALY_NEAR)
25
+ * @param speed - Movement speed in px/s (default 120)
26
+ * @param cost - GOAP planner cost (default 1)
27
+ */
28
+ constructor(hazard: IHazardZoneAccess, id: string, propertyKey: string, speed?: number, cost?: number);
29
+ getPreconditions(): WorldState;
30
+ getEffects(): WorldState;
31
+ isValid(entity: IEntity): boolean;
32
+ execute(entity: IEntity, deltaMs: number): ActionStatus;
33
+ }
34
+ //# sourceMappingURL=EvadeHazardAction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EvadeHazardAction.d.ts","sourceRoot":"","sources":["../../src/goap/EvadeHazardAction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D;;;;;;;;;GASG;AACH,qBAAa,iBAAkB,SAAQ,UAAU;IAe7C,OAAO,CAAC,QAAQ,CAAC,MAAM;IAGvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAjBxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAa;IAC5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAa;IAEtC;;;;;;OAMG;gBAEgB,MAAM,EAAE,iBAAiB,EAC1C,EAAE,EAAE,MAAM,EACV,WAAW,EAAE,MAAM,EACF,KAAK,SAAM,EAC5B,IAAI,SAAI;IAaV,gBAAgB,IAAI,UAAU;IAC9B,UAAU,IAAI,UAAU;IAExB,OAAO,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO;IAIjC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY;CAexD"}
@@ -0,0 +1,48 @@
1
+ import { GOAPAction, ActionStatus, WorldState } from '@alife-sdk/core';
2
+ /**
3
+ * Generic GOAP action for hazard zone evasion.
4
+ *
5
+ * Moves the entity away from any hazard zone that implements IHazardZoneAccess.
6
+ * The caller supplies the GOAP property key and action id, making this reusable
7
+ * for anomalies, fire zones, radiation fields, or any spatial hazard.
8
+ *
9
+ * Direct setPosition() is used intentionally — emergency evasion bypasses
10
+ * pathfinding to ensure immediate response to life-threatening zones.
11
+ */
12
+ export class EvadeHazardAction extends GOAPAction {
13
+ /**
14
+ * @param hazard - Hazard zone access port (host-side adapter)
15
+ * @param id - Unique action id for plan logging (e.g. 'evade_anomaly')
16
+ * @param propertyKey - WorldProperty key this action satisfies (e.g. WorldProperty.ANOMALY_NEAR)
17
+ * @param speed - Movement speed in px/s (default 120)
18
+ * @param cost - GOAP planner cost (default 1)
19
+ */
20
+ constructor(hazard, id, propertyKey, speed = 120, cost = 1) {
21
+ super();
22
+ this.hazard = hazard;
23
+ this.speed = speed;
24
+ this.id = id;
25
+ this.cost = cost;
26
+ this._preconditions = new WorldState();
27
+ this._preconditions.set(propertyKey, true);
28
+ this._effects = new WorldState();
29
+ this._effects.set(propertyKey, false);
30
+ }
31
+ getPreconditions() { return this._preconditions; }
32
+ getEffects() { return this._effects; }
33
+ isValid(entity) {
34
+ return this.hazard.isNearHazard(entity.x, entity.y);
35
+ }
36
+ execute(entity, deltaMs) {
37
+ const escape = this.hazard.getEscapeDirection(entity.x, entity.y);
38
+ if (!escape)
39
+ return ActionStatus.SUCCESS;
40
+ const dt = deltaMs / 1000;
41
+ // Direct position update — emergency evasion bypasses pathfinding intentionally.
42
+ entity.setPosition(entity.x + escape.x * this.speed * dt, entity.y + escape.y * this.speed * dt);
43
+ return this.hazard.isNearHazard(entity.x, entity.y)
44
+ ? ActionStatus.RUNNING
45
+ : ActionStatus.SUCCESS;
46
+ }
47
+ }
48
+ //# sourceMappingURL=EvadeHazardAction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EvadeHazardAction.js","sourceRoot":"","sources":["../../src/goap/EvadeHazardAction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAIvE;;;;;;;;;GASG;AACH,MAAM,OAAO,iBAAkB,SAAQ,UAAU;IAO/C;;;;;;OAMG;IACH,YACmB,MAAyB,EAC1C,EAAU,EACV,WAAmB,EACF,QAAQ,GAAG,EAC5B,IAAI,GAAG,CAAC;QAER,KAAK,EAAE,CAAC;QANS,WAAM,GAAN,MAAM,CAAmB;QAGzB,UAAK,GAAL,KAAK,CAAM;QAI5B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAEjB,IAAI,CAAC,cAAc,GAAG,IAAI,UAAU,EAAE,CAAC;QACvC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAE3C,IAAI,CAAC,QAAQ,GAAG,IAAI,UAAU,EAAE,CAAC;QACjC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;IAED,gBAAgB,KAAiB,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;IAC9D,UAAU,KAAiB,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAElD,OAAO,CAAC,MAAe;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,CAAC,MAAe,EAAE,OAAe;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM;YAAE,OAAO,YAAY,CAAC,OAAO,CAAC;QAEzC,MAAM,EAAE,GAAG,OAAO,GAAG,IAAI,CAAC;QAC1B,iFAAiF;QACjF,MAAM,CAAC,WAAW,CAChB,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,EAAE,EACrC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,EAAE,CACtC,CAAC;QAEF,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;YACjD,CAAC,CAAC,YAAY,CAAC,OAAO;YACtB,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC;IAC3B,CAAC;CACF"}
@@ -0,0 +1,114 @@
1
+ import { GOAPPlanner, type IEntity } from '@alife-sdk/core';
2
+ import type { IGOAPConfig, INPCWorldSnapshot } from '../types/IPerceptionTypes';
3
+ import { type IGoalResult } from './GoalSelector';
4
+ /**
5
+ * Serialized state for save/load round-trips.
6
+ *
7
+ * The current plan is ephemeral — it is NOT serialized. On restore the
8
+ * controller forces a replan on the next `update()` call.
9
+ */
10
+ export interface IGOAPControllerState {
11
+ readonly replanTimer: number;
12
+ readonly currentIndex: number;
13
+ }
14
+ /**
15
+ * Result of a single update tick.
16
+ */
17
+ export interface IGOAPUpdateResult {
18
+ /** Whether GOAP handled behaviour this frame (true = suppress FSM). */
19
+ readonly handled: boolean;
20
+ /** Current action ID (null if no plan). */
21
+ readonly currentActionId: string | null;
22
+ /** Whether a replan occurred this frame. */
23
+ readonly replanned: boolean;
24
+ }
25
+ /**
26
+ * GOAP Controller — per-NPC mediator.
27
+ *
28
+ * Orchestrates the GOAP pipeline:
29
+ * 1. Build world state snapshot
30
+ * 2. Select goal (priority bands)
31
+ * 3. Plan (A* search via GOAPPlanner)
32
+ * 4. Execute current action
33
+ * 5. Handle success/failure/replan
34
+ *
35
+ * The controller does NOT own the planner's action pool — actions
36
+ * are registered externally via the planner.
37
+ *
38
+ * @example
39
+ * ```ts
40
+ * const planner = new GOAPPlanner();
41
+ * planner.registerAction(new IdleAction());
42
+ * planner.registerAction(new PatrolAction());
43
+ *
44
+ * const controller = new GOAPController(planner, goapConfig);
45
+ *
46
+ * // Each frame:
47
+ * const result = controller.update(deltaMs, entity, snapshot);
48
+ * if (!result.handled) {
49
+ * // Fall back to FSM
50
+ * }
51
+ * ```
52
+ */
53
+ export declare class GOAPController {
54
+ private readonly planner;
55
+ private readonly config;
56
+ private currentPlan;
57
+ private currentIndex;
58
+ private replanTimer;
59
+ private planInvalid;
60
+ private lastGoalResult;
61
+ constructor(planner: GOAPPlanner, config: IGOAPConfig);
62
+ /**
63
+ * Update the GOAP controller for one frame.
64
+ *
65
+ * @param deltaMs - Elapsed time since last frame (ms)
66
+ * @param entity - The entity being controlled
67
+ * @param snapshot - Pre-computed NPC world data
68
+ * @returns Whether GOAP handled this frame
69
+ */
70
+ update(deltaMs: number, entity: IEntity, snapshot: INPCWorldSnapshot): IGOAPUpdateResult;
71
+ /**
72
+ * Force a replan on the next update.
73
+ * Call this when significant world changes occur (damage taken, new enemy, etc.).
74
+ */
75
+ invalidatePlan(): void;
76
+ /**
77
+ * Get the last goal selection result (for debugging/logging).
78
+ */
79
+ getLastGoalResult(): IGoalResult | null;
80
+ /**
81
+ * Get the current plan action IDs (for debugging).
82
+ */
83
+ getCurrentPlanIds(): string[];
84
+ /**
85
+ * Get the current progress within the plan.
86
+ */
87
+ getCurrentIndex(): number;
88
+ /**
89
+ * Whether the controller has a valid plan.
90
+ */
91
+ hasPlan(): boolean;
92
+ /**
93
+ * Reset the controller — clears plan and forces replan.
94
+ */
95
+ reset(entity: IEntity): void;
96
+ /**
97
+ * Serialize controller state for save/load.
98
+ *
99
+ * The current plan is intentionally excluded — it is rebuilt on the next
100
+ * `update()` call after restore, which triggers an immediate replan.
101
+ */
102
+ serialize(): IGOAPControllerState;
103
+ /**
104
+ * Restore controller state from a serialized snapshot.
105
+ *
106
+ * The plan is cleared and `planInvalid` is set to `true` so that the
107
+ * controller replans on the very next `update()` call.
108
+ */
109
+ restore(state: IGOAPControllerState): void;
110
+ private needsReplan;
111
+ private replan;
112
+ private finalizeCurrent;
113
+ }
114
+ //# sourceMappingURL=GOAPController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GOAPController.d.ts","sourceRoot":"","sources":["../../src/goap/GOAPController.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAkD,KAAK,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC5G,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAEhF,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE9D;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,uEAAuE;IACvE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,2CAA2C;IAC3C,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,4CAA4C;IAC5C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,cAAc;IAQvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IARzB,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,cAAc,CAA4B;gBAG/B,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,WAAW;IAGtC;;;;;;;OAOG;IACH,MAAM,CACJ,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,iBAAiB,GAC1B,iBAAiB;IA8CpB;;;OAGG;IACH,cAAc,IAAI,IAAI;IAItB;;OAEG;IACH,iBAAiB,IAAI,WAAW,GAAG,IAAI;IAIvC;;OAEG;IACH,iBAAiB,IAAI,MAAM,EAAE;IAI7B;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;OAEG;IACH,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IAS5B;;;;;OAKG;IACH,SAAS,IAAI,oBAAoB;IAOjC;;;;;OAKG;IACH,OAAO,CAAC,KAAK,EAAE,oBAAoB,GAAG,IAAI;IAQ1C,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,MAAM;IA0Bd,OAAO,CAAC,eAAe;CAKxB"}
@@ -0,0 +1,191 @@
1
+ // goap/GOAPController.ts
2
+ // Mediator orchestrating WorldStateBuilder → GoalSelector → GOAPPlanner → Action execution.
3
+ // Per-NPC controller with periodic replanning and plan invalidation.
4
+ import { ActionStatus } from '@alife-sdk/core';
5
+ import { buildWorldState } from './WorldStateBuilder';
6
+ import { selectGoal } from './GoalSelector';
7
+ /**
8
+ * GOAP Controller — per-NPC mediator.
9
+ *
10
+ * Orchestrates the GOAP pipeline:
11
+ * 1. Build world state snapshot
12
+ * 2. Select goal (priority bands)
13
+ * 3. Plan (A* search via GOAPPlanner)
14
+ * 4. Execute current action
15
+ * 5. Handle success/failure/replan
16
+ *
17
+ * The controller does NOT own the planner's action pool — actions
18
+ * are registered externally via the planner.
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * const planner = new GOAPPlanner();
23
+ * planner.registerAction(new IdleAction());
24
+ * planner.registerAction(new PatrolAction());
25
+ *
26
+ * const controller = new GOAPController(planner, goapConfig);
27
+ *
28
+ * // Each frame:
29
+ * const result = controller.update(deltaMs, entity, snapshot);
30
+ * if (!result.handled) {
31
+ * // Fall back to FSM
32
+ * }
33
+ * ```
34
+ */
35
+ export class GOAPController {
36
+ constructor(planner, config) {
37
+ this.planner = planner;
38
+ this.config = config;
39
+ this.currentPlan = [];
40
+ this.currentIndex = 0;
41
+ this.replanTimer = 0;
42
+ this.planInvalid = true;
43
+ this.lastGoalResult = null;
44
+ }
45
+ /**
46
+ * Update the GOAP controller for one frame.
47
+ *
48
+ * @param deltaMs - Elapsed time since last frame (ms)
49
+ * @param entity - The entity being controlled
50
+ * @param snapshot - Pre-computed NPC world data
51
+ * @returns Whether GOAP handled this frame
52
+ */
53
+ update(deltaMs, entity, snapshot) {
54
+ this.replanTimer += deltaMs;
55
+ let replanned = false;
56
+ // Check if replan is needed — only build WorldState when replanning
57
+ if (this.needsReplan()) {
58
+ this.finalizeCurrent(entity);
59
+ const worldState = buildWorldState(snapshot);
60
+ replanned = this.replan(worldState, snapshot);
61
+ }
62
+ // Execute current action
63
+ if (this.currentPlan.length > 0 && this.currentIndex < this.currentPlan.length) {
64
+ const action = this.currentPlan[this.currentIndex];
65
+ if (!action.isValid(entity)) {
66
+ action.abort(entity);
67
+ this.planInvalid = true;
68
+ return { handled: false, currentActionId: action.id, replanned };
69
+ }
70
+ const status = action.execute(entity, deltaMs);
71
+ if (status === ActionStatus.SUCCESS) {
72
+ action.abort(entity);
73
+ this.currentIndex++;
74
+ if (this.currentIndex >= this.currentPlan.length) {
75
+ this.planInvalid = true;
76
+ }
77
+ return { handled: true, currentActionId: action.id, replanned };
78
+ }
79
+ if (status === ActionStatus.FAILURE) {
80
+ action.abort(entity);
81
+ this.planInvalid = true;
82
+ return { handled: false, currentActionId: action.id, replanned };
83
+ }
84
+ // RUNNING
85
+ return { handled: true, currentActionId: action.id, replanned };
86
+ }
87
+ return { handled: false, currentActionId: null, replanned };
88
+ }
89
+ /**
90
+ * Force a replan on the next update.
91
+ * Call this when significant world changes occur (damage taken, new enemy, etc.).
92
+ */
93
+ invalidatePlan() {
94
+ this.planInvalid = true;
95
+ }
96
+ /**
97
+ * Get the last goal selection result (for debugging/logging).
98
+ */
99
+ getLastGoalResult() {
100
+ return this.lastGoalResult;
101
+ }
102
+ /**
103
+ * Get the current plan action IDs (for debugging).
104
+ */
105
+ getCurrentPlanIds() {
106
+ return this.currentPlan.map((a) => a.id);
107
+ }
108
+ /**
109
+ * Get the current progress within the plan.
110
+ */
111
+ getCurrentIndex() {
112
+ return this.currentIndex;
113
+ }
114
+ /**
115
+ * Whether the controller has a valid plan.
116
+ */
117
+ hasPlan() {
118
+ return this.currentPlan.length > 0 && this.currentIndex < this.currentPlan.length;
119
+ }
120
+ /**
121
+ * Reset the controller — clears plan and forces replan.
122
+ */
123
+ reset(entity) {
124
+ this.finalizeCurrent(entity);
125
+ this.currentPlan = [];
126
+ this.currentIndex = 0;
127
+ this.replanTimer = 0;
128
+ this.planInvalid = true;
129
+ this.lastGoalResult = null;
130
+ }
131
+ /**
132
+ * Serialize controller state for save/load.
133
+ *
134
+ * The current plan is intentionally excluded — it is rebuilt on the next
135
+ * `update()` call after restore, which triggers an immediate replan.
136
+ */
137
+ serialize() {
138
+ return {
139
+ replanTimer: this.replanTimer,
140
+ currentIndex: this.currentIndex,
141
+ };
142
+ }
143
+ /**
144
+ * Restore controller state from a serialized snapshot.
145
+ *
146
+ * The plan is cleared and `planInvalid` is set to `true` so that the
147
+ * controller replans on the very next `update()` call.
148
+ */
149
+ restore(state) {
150
+ this.currentPlan = [];
151
+ this.currentIndex = state.currentIndex;
152
+ this.replanTimer = state.replanTimer;
153
+ this.planInvalid = true;
154
+ this.lastGoalResult = null;
155
+ }
156
+ needsReplan() {
157
+ if (this.planInvalid)
158
+ return true;
159
+ if (this.currentPlan.length === 0)
160
+ return true;
161
+ if (this.replanTimer >= this.config.replanIntervalMs)
162
+ return true;
163
+ return false;
164
+ }
165
+ replan(worldState, snapshot) {
166
+ this.replanTimer = 0;
167
+ this.planInvalid = false;
168
+ const goalResult = selectGoal(snapshot, this.config);
169
+ this.lastGoalResult = goalResult;
170
+ if (worldState.satisfies(goalResult.goal)) {
171
+ this.currentPlan = [];
172
+ this.currentIndex = 0;
173
+ return true;
174
+ }
175
+ const plan = this.planner.plan(worldState, goalResult.goal, this.config.maxPlanDepth);
176
+ if (plan && plan.length > 0) {
177
+ this.currentPlan = plan;
178
+ this.currentIndex = 0;
179
+ return true;
180
+ }
181
+ this.currentPlan = [];
182
+ this.currentIndex = 0;
183
+ return true;
184
+ }
185
+ finalizeCurrent(entity) {
186
+ if (this.currentPlan.length > 0 && this.currentIndex < this.currentPlan.length) {
187
+ this.currentPlan[this.currentIndex].abort(entity);
188
+ }
189
+ }
190
+ }
191
+ //# sourceMappingURL=GOAPController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GOAPController.js","sourceRoot":"","sources":["../../src/goap/GOAPController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { WorldState } from '@alife-sdk/core';
2
+ import { type GoalPriorityLevel, type IGOAPConfig, type INPCWorldSnapshot } from '../types/IPerceptionTypes';
3
+ /**
4
+ * Result of goal selection including the priority band that was chosen.
5
+ */
6
+ export interface IGoalResult {
7
+ readonly goal: WorldState;
8
+ readonly priority: GoalPriorityLevel;
9
+ readonly reason: string;
10
+ }
11
+ /**
12
+ * A single goal selection rule, evaluated in priority order.
13
+ * Lower priority number = higher importance.
14
+ */
15
+ export interface IGoalRule {
16
+ readonly priority: number;
17
+ readonly name: string;
18
+ evaluate(snapshot: INPCWorldSnapshot, config: IGOAPConfig): IGoalResult | null;
19
+ }
20
+ /**
21
+ * Default goal rules corresponding to the 5-band priority hierarchy.
22
+ * Sorted by priority ascending (highest importance first).
23
+ *
24
+ * WorldState objects are pre-allocated and reused across evaluations to
25
+ * eliminate per-tick allocations.
26
+ */
27
+ export declare const DEFAULT_GOAL_RULES: readonly IGoalRule[];
28
+ /**
29
+ * Select a GOAP goal based on the current NPC state.
30
+ *
31
+ * Rules are evaluated in order — first rule that returns a non-null result wins.
32
+ * DEFAULT_GOAL_RULES provides the original 4-band hierarchy.
33
+ *
34
+ * @param snapshot - Pre-computed NPC world data
35
+ * @param config - GOAP configuration (healHpThreshold)
36
+ * @param rules - Optional custom goal rules. Defaults to DEFAULT_GOAL_RULES.
37
+ * @returns Goal and priority band info
38
+ */
39
+ export declare function selectGoal(snapshot: INPCWorldSnapshot, config: IGOAPConfig, rules?: readonly IGoalRule[]): IGoalResult;
40
+ //# sourceMappingURL=GoalSelector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GoalSelector.d.ts","sourceRoot":"","sources":["../../src/goap/GoalSelector.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAA+B,KAAK,iBAAiB,EAAE,KAAK,WAAW,EAAE,KAAK,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE1I;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CACN,QAAQ,EAAE,iBAAiB,EAC3B,MAAM,EAAE,WAAW,GAClB,WAAW,GAAG,IAAI,CAAC;CACvB;AAuCD;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAS,SAAS,EA8ClD,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CACxB,QAAQ,EAAE,iBAAiB,EAC3B,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,SAAS,SAAS,EAAE,GAC3B,WAAW,CASb"}