@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,11 @@
1
+ // states/eat-corpse — opt-in corpse-eating behavior module.
2
+ //
3
+ // Import explicitly to opt in:
4
+ // import { EatCorpseState, withEatCorpseGuard } from '@alife-sdk/ai/states/eat-corpse';
5
+ //
6
+ // Never imported by buildDefaultHandlerMap or buildMonsterHandlerMap.
7
+ // Zero bundle cost for projects that do not use this module.
8
+ export { createDefaultEatCorpseConfig, createDefaultEatCorpseGuardConfig } from './IEatCorpseConfig';
9
+ export { EatCorpseState } from './EatCorpseState';
10
+ export { withEatCorpseGuard } from './EatCorpseTransitionGuard';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/states/eat-corpse/index.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,EAAE;AACF,+BAA+B;AAC/B,0FAA0F;AAC1F,EAAE;AACF,sEAAsE;AACtE,6DAA6D;AAK7D,OAAO,EAAE,4BAA4B,EAAE,iCAAiC,EAAE,MAAM,oBAAoB,CAAC;AACrG,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { IOnlineStateHandler } from '../IOnlineStateHandler';
2
+ import type { INPCContext } from '../INPCContext';
3
+ import type { IStateConfig } from '../IStateConfig';
4
+ import type { IStateTransitionMap } from '../IStateTransitionMap';
5
+ /**
6
+ * Stateless alert-state handler.
7
+ *
8
+ * A single instance can be shared across all NPC entities.
9
+ */
10
+ export declare class AlertState implements IOnlineStateHandler {
11
+ private readonly cfg;
12
+ private readonly tr;
13
+ constructor(cfg: IStateConfig, tr?: Partial<IStateTransitionMap>);
14
+ enter(ctx: INPCContext): void;
15
+ update(ctx: INPCContext, _deltaMs: number): void;
16
+ exit(_ctx: INPCContext): void;
17
+ }
18
+ //# sourceMappingURL=AlertState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AlertState.d.ts","sourceRoot":"","sources":["../../../src/states/handlers/AlertState.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAGlE;;;;GAIG;AACH,qBAAa,UAAW,YAAW,mBAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAsB;gBAE7B,GAAG,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC;IAKhE,KAAK,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAc7B,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAyEhD,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;CAG9B"}
@@ -0,0 +1,104 @@
1
+ // states/handlers/AlertState.ts
2
+ // NPC heard something (gunshot, sound) and investigates the source.
3
+ // Upgrades to COMBAT when the enemy is directly spotted; reverts to PATROL
4
+ // if the alert timer expires without finding anyone.
5
+ //
6
+ // Morale-aware:
7
+ // - PANICKED NPC → skip investigation, flee immediately (FLEE).
8
+ //
9
+ // Transitions out of ALERT:
10
+ // - morale is PANICKED → FLEE
11
+ // - visible enemy spotted → COMBAT
12
+ // - alert timer (cfg.alertDuration) expired → PATROL
13
+ // - arrived at last known position → wait in place until timer
14
+ import { createDefaultTransitionMap } from '../IStateTransitionMap';
15
+ import { moveToward } from './_utils';
16
+ /**
17
+ * Stateless alert-state handler.
18
+ *
19
+ * A single instance can be shared across all NPC entities.
20
+ */
21
+ export class AlertState {
22
+ constructor(cfg, tr) {
23
+ this.cfg = cfg;
24
+ this.tr = createDefaultTransitionMap(tr);
25
+ }
26
+ enter(ctx) {
27
+ ctx.state.alertStartMs = ctx.now();
28
+ ctx.halt();
29
+ // Pack alert broadcast (opt-in)
30
+ if (ctx.state.lastKnownEnemyX !== 0 || ctx.state.lastKnownEnemyY !== 0) {
31
+ ctx.pack?.broadcastTarget(ctx.state.targetId, ctx.state.lastKnownEnemyX, ctx.state.lastKnownEnemyY);
32
+ ctx.pack?.broadcastAlertLevel('ALERTED');
33
+ }
34
+ }
35
+ update(ctx, _deltaMs) {
36
+ // --- Morale check: panicked NPC flees immediately ---
37
+ if (ctx.state.moraleState === 'PANICKED') {
38
+ ctx.transition(this.tr.alertOnPanic);
39
+ return;
40
+ }
41
+ // --- Perception: visible enemy → COMBAT (or KILL_WOUNDED if wounded, opt-in) ---
42
+ if (ctx.perception?.hasVisibleEnemy()) {
43
+ const enemies = ctx.perception.getVisibleEnemies();
44
+ const target = enemies[0];
45
+ ctx.state.lastKnownEnemyX = target.x;
46
+ ctx.state.lastKnownEnemyY = target.y;
47
+ // Kill-wounded seam (opt-in) — only when morale is STABLE
48
+ if (ctx.state.moraleState === 'STABLE') {
49
+ const woundedEnemies = ctx.perception?.getWoundedEnemies?.() ?? [];
50
+ if (woundedEnemies.length > 0) {
51
+ const we = woundedEnemies[0];
52
+ ctx.state.killWoundedTargetId = we.id;
53
+ ctx.state.killWoundedTargetX = we.x;
54
+ ctx.state.killWoundedTargetY = we.y;
55
+ ctx.transition(this.tr.alertOnKillWounded);
56
+ return;
57
+ }
58
+ }
59
+ ctx.transition(this.tr.alertOnEnemy);
60
+ return;
61
+ }
62
+ // --- Pack combat fast-path (opt-in): skip alert timer when pack is already fighting ---
63
+ if (ctx.pack?.getPackAlertLevel() === 'COMBAT') {
64
+ const pt = ctx.pack.getPackTarget();
65
+ if (pt) {
66
+ ctx.state.lastKnownEnemyX = pt.x;
67
+ ctx.state.lastKnownEnemyY = pt.y;
68
+ ctx.state.targetId = pt.id;
69
+ }
70
+ ctx.transition(this.tr.alertOnPackCombat);
71
+ return;
72
+ }
73
+ // --- Timer countdown ---
74
+ const elapsed = ctx.now() - ctx.state.alertStartMs;
75
+ if (elapsed >= this.cfg.alertDuration) {
76
+ ctx.halt();
77
+ ctx.transition(this.tr.alertOnTimeout);
78
+ return;
79
+ }
80
+ // --- Move toward last known position ---
81
+ const targetX = ctx.state.lastKnownEnemyX;
82
+ const targetY = ctx.state.lastKnownEnemyY;
83
+ const dx = targetX - ctx.x;
84
+ const dy = targetY - ctx.y;
85
+ const distSq = dx * dx + dy * dy;
86
+ const thresh = this.cfg.arriveThreshold;
87
+ if (distSq <= thresh * thresh) {
88
+ // Reached the sound source; nothing found — wait for timer.
89
+ ctx.halt();
90
+ // Face the direction we were heading (last known angle).
91
+ if (targetX !== ctx.x || targetY !== ctx.y) {
92
+ ctx.setRotation(Math.atan2(targetY - ctx.y, targetX - ctx.x));
93
+ }
94
+ }
95
+ else {
96
+ moveToward(ctx, targetX, targetY, this.cfg.approachSpeed);
97
+ }
98
+ }
99
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
100
+ exit(_ctx) {
101
+ // Nothing to clean up.
102
+ }
103
+ }
104
+ //# sourceMappingURL=AlertState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AlertState.js","sourceRoot":"","sources":["../../../src/states/handlers/AlertState.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { IOnlineStateHandler } from '../IOnlineStateHandler';
2
+ import type { INPCContext } from '../INPCContext';
3
+ import type { IStateConfig } from '../IStateConfig';
4
+ import type { IStateTransitionMap } from '../IStateTransitionMap';
5
+ /**
6
+ * Stateless camp-state handler.
7
+ *
8
+ * A single instance can be shared across all NPC entities.
9
+ */
10
+ export declare class CampState implements IOnlineStateHandler {
11
+ private readonly cfg;
12
+ private readonly tr;
13
+ constructor(cfg: IStateConfig, tr?: Partial<IStateTransitionMap>);
14
+ enter(ctx: INPCContext): void;
15
+ update(ctx: INPCContext, _deltaMs: number): void;
16
+ exit(ctx: INPCContext): void;
17
+ }
18
+ //# sourceMappingURL=CampState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CampState.d.ts","sourceRoot":"","sources":["../../../src/states/handlers/CampState.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAOlE;;;;GAIG;AACH,qBAAa,SAAU,YAAW,mBAAmB;IACnD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAsB;gBAE7B,GAAG,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC;IAKhE,KAAK,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAa7B,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAqDhD,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;CAM7B"}
@@ -0,0 +1,94 @@
1
+ // states/handlers/CampState.ts
2
+ // NPC sits at a rest point with reduced vigilance (camp/guard post behavior).
3
+ //
4
+ // Behavior:
5
+ // - NPC stays stationary at the camp spot.
6
+ // - Reactions to visible enemies are delayed by cfg.schemeReactionDelayMs
7
+ // (simulates lower alertness while at rest).
8
+ // - No delay for danger-zone reactions (immediate relocation).
9
+ //
10
+ // Transitions out of CAMP:
11
+ // - visible enemy (after schemeReactionDelayMs delay) → COMBAT
12
+ // - NPC inside an inaccessible/restricted zone → ALERT (walk away first)
13
+ import { createDefaultTransitionMap } from '../IStateTransitionMap';
14
+ import { moveToward } from './_utils';
15
+ // Internal flag stored in ctx.state.psiPhaseStartMs repurposed as the
16
+ // reaction-pending timer timestamp. We use a sentinel value of 0 for "none".
17
+ const NO_PENDING_REACTION = 0;
18
+ /**
19
+ * Stateless camp-state handler.
20
+ *
21
+ * A single instance can be shared across all NPC entities.
22
+ */
23
+ export class CampState {
24
+ constructor(cfg, tr) {
25
+ this.cfg = cfg;
26
+ this.tr = createDefaultTransitionMap(tr);
27
+ }
28
+ enter(ctx) {
29
+ ctx.halt();
30
+ // Reset the reaction timer (no pending delayed reaction on entry).
31
+ // We repurpose evadeStartMs as a scheme-reaction start timestamp.
32
+ ctx.state.evadeStartMs = NO_PENDING_REACTION;
33
+ // Emit a camp vocalization if a vocalization cooldown allows.
34
+ const now = ctx.now();
35
+ if (now - ctx.state.lastVocalizationMs >= this.cfg.meleeCooldownMs * 3) {
36
+ ctx.emitVocalization('CAMP_IDLE');
37
+ ctx.state.lastVocalizationMs = now;
38
+ }
39
+ }
40
+ update(ctx, _deltaMs) {
41
+ const now = ctx.now();
42
+ // --- Pending delayed-reaction processing ---
43
+ const reactionStart = ctx.state.evadeStartMs;
44
+ if (reactionStart !== NO_PENDING_REACTION) {
45
+ if (now - reactionStart >= this.cfg.schemeReactionDelayMs) {
46
+ // Delay elapsed — execute the queued transition.
47
+ // The target state is encoded in ctx.state.isAlert:
48
+ // true → COMBAT
49
+ // false → ALERT
50
+ ctx.state.evadeStartMs = NO_PENDING_REACTION;
51
+ ctx.transition(ctx.state.isAlert ? this.tr.campOnEnemy : this.tr.campOnDanger);
52
+ return;
53
+ }
54
+ // Still waiting for delay — do nothing else this frame.
55
+ return;
56
+ }
57
+ // --- Visible enemy → queue delayed COMBAT reaction ---
58
+ if (ctx.perception?.hasVisibleEnemy()) {
59
+ const enemies = ctx.perception.getVisibleEnemies();
60
+ const target = enemies[0];
61
+ ctx.state.lastKnownEnemyX = target.x;
62
+ ctx.state.lastKnownEnemyY = target.y;
63
+ ctx.state.isAlert = true;
64
+ ctx.state.evadeStartMs = now;
65
+ return;
66
+ }
67
+ // --- Restricted zone check (immediate — no delay for danger zones) ---
68
+ if (ctx.restrictedZones !== null && !ctx.restrictedZones.isAccessible(ctx.x, ctx.y)) {
69
+ const step = this.cfg.approachSpeed * 2;
70
+ const candidates = [
71
+ { x: ctx.x + step, y: ctx.y },
72
+ { x: ctx.x - step, y: ctx.y },
73
+ { x: ctx.x, y: ctx.y + step },
74
+ { x: ctx.x, y: ctx.y - step },
75
+ ];
76
+ const safe = ctx.restrictedZones.filterAccessible(candidates);
77
+ if (safe.length > 0) {
78
+ const dest = safe[0];
79
+ ctx.state.lastKnownEnemyX = dest.x;
80
+ ctx.state.lastKnownEnemyY = dest.y;
81
+ moveToward(ctx, dest.x, dest.y, this.cfg.approachSpeed);
82
+ }
83
+ ctx.transition(this.tr.campOnDanger);
84
+ return;
85
+ }
86
+ }
87
+ exit(ctx) {
88
+ // Clear any pending delayed reaction so it doesn't leak into the next
89
+ // activation of this state.
90
+ ctx.state.evadeStartMs = NO_PENDING_REACTION;
91
+ ctx.state.isAlert = false;
92
+ }
93
+ }
94
+ //# sourceMappingURL=CampState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CampState.js","sourceRoot":"","sources":["../../../src/states/handlers/CampState.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { IOnlineStateHandler } from '../IOnlineStateHandler';
2
+ import type { INPCContext } from '../INPCContext';
3
+ import type { IStateConfig } from '../IStateConfig';
4
+ import type { IStateTransitionMap } from '../IStateTransitionMap';
5
+ /**
6
+ * Stateless boar charge-attack handler.
7
+ *
8
+ * A single instance can be shared across all NPC entities.
9
+ */
10
+ export declare class ChargeState implements IOnlineStateHandler {
11
+ private readonly cfg;
12
+ private readonly tr;
13
+ constructor(cfg: IStateConfig, tr?: Partial<IStateTransitionMap>);
14
+ enter(ctx: INPCContext): void;
15
+ update(ctx: INPCContext, _deltaMs: number): void;
16
+ exit(ctx: INPCContext): void;
17
+ }
18
+ //# sourceMappingURL=ChargeState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChargeState.d.ts","sourceRoot":"","sources":["../../../src/states/handlers/ChargeState.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAIlE;;;;GAIG;AACH,qBAAa,WAAY,YAAW,mBAAmB;IAInD,OAAO,CAAC,QAAQ,CAAC,GAAG;IAHtB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAsB;gBAGtB,GAAG,EAAE,YAAY,EAClC,EAAE,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC;IAKnC,KAAK,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IA2B7B,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAsDhD,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;CAK7B"}
@@ -0,0 +1,103 @@
1
+ // states/handlers/ChargeState.ts
2
+ // Boar exclusive straight-line charge attack state.
3
+ //
4
+ // Phase pipeline (stored in ctx.state.chargePhase):
5
+ // WINDUP — entity stops during telegraph pause; counts down chargeWindupMs.
6
+ // Target position is locked at enter() time.
7
+ // CHARGE — entity moves toward stored target at approachSpeed × chargeSpeedMultiplier.
8
+ // Impact: dist <= meleeRange → emitMeleeHit(chargeDamageMultiplier), then COMBAT.
9
+ // Exit — resets active flag; host caller may also halt movement.
10
+ //
11
+ // Early abort:
12
+ // - Windup phase with no visible enemy → transition to IDLE (tr.chargeOnAbort).
13
+ //
14
+ // All mutable state lives in INPCOnlineState.chargePhase so this handler is
15
+ // stateless and safe to share across all NPC entities.
16
+ import { createDefaultTransitionMap } from '../IStateTransitionMap';
17
+ import { moveToward, distanceTo } from './_utils';
18
+ /**
19
+ * Stateless boar charge-attack handler.
20
+ *
21
+ * A single instance can be shared across all NPC entities.
22
+ */
23
+ export class ChargeState {
24
+ constructor(cfg, tr) {
25
+ this.cfg = cfg;
26
+ this.tr = createDefaultTransitionMap(tr);
27
+ }
28
+ enter(ctx) {
29
+ var _a;
30
+ const now = ctx.now();
31
+ // Lock the target position from the first visible enemy or last known pos.
32
+ const enemies = ctx.perception?.getVisibleEnemies() ?? [];
33
+ const targetX = enemies.length > 0 ? enemies[0].x : ctx.state.lastKnownEnemyX;
34
+ const targetY = enemies.length > 0 ? enemies[0].y : ctx.state.lastKnownEnemyY;
35
+ // Lazy-initialise charge phase data if not yet present.
36
+ (_a = ctx.state).chargePhase ?? (_a.chargePhase = { active: false, windupStartMs: 0, charging: false, targetX: 0, targetY: 0 });
37
+ ctx.state.chargePhase.active = true;
38
+ ctx.state.chargePhase.charging = false;
39
+ ctx.state.chargePhase.windupStartMs = now;
40
+ ctx.state.chargePhase.targetX = targetX;
41
+ ctx.state.chargePhase.targetY = targetY;
42
+ // Stop completely during the windup telegraph.
43
+ ctx.halt();
44
+ // Face the target while winding up.
45
+ const dx = targetX - ctx.x;
46
+ const dy = targetY - ctx.y;
47
+ if (dx !== 0 || dy !== 0) {
48
+ ctx.setRotation(Math.atan2(dy, dx));
49
+ }
50
+ }
51
+ update(ctx, _deltaMs) {
52
+ const now = ctx.now();
53
+ const phase = ctx.state.chargePhase;
54
+ const elapsed = now - phase.windupStartMs;
55
+ if (!phase.charging) {
56
+ // -----------------------------------------------------------------------
57
+ // WINDUP phase — wait for chargeWindupMs before launching charge
58
+ // -----------------------------------------------------------------------
59
+ // Safety: if no visible enemy and not yet charging, abort.
60
+ const hasEnemy = ctx.perception?.hasVisibleEnemy() ?? false;
61
+ if (!hasEnemy) {
62
+ ctx.transition(this.tr.chargeOnAbort);
63
+ return;
64
+ }
65
+ if (elapsed < this.cfg.chargeWindupMs) {
66
+ // Still winding up — face target but don't move.
67
+ const dx = phase.targetX - ctx.x;
68
+ const dy = phase.targetY - ctx.y;
69
+ if (dx !== 0 || dy !== 0) {
70
+ ctx.setRotation(Math.atan2(dy, dx));
71
+ }
72
+ return;
73
+ }
74
+ // Windup complete — transition to charging phase.
75
+ phase.charging = true;
76
+ }
77
+ // -----------------------------------------------------------------------
78
+ // CHARGING phase — move toward locked target at charge speed
79
+ // -----------------------------------------------------------------------
80
+ const chargeSpeed = this.cfg.approachSpeed * this.cfg.chargeSpeedMultiplier;
81
+ const dist = distanceTo(ctx.x, ctx.y, phase.targetX, phase.targetY);
82
+ if (dist <= this.cfg.meleeRange) {
83
+ // Impact — apply charge damage and return to COMBAT.
84
+ ctx.state.lastMeleeMs = now;
85
+ ctx.emitMeleeHit({
86
+ npcId: ctx.npcId,
87
+ targetId: ctx.state.targetId ?? '',
88
+ damage: this.cfg.meleeDamage * this.cfg.chargeDamageMultiplier,
89
+ });
90
+ ctx.halt();
91
+ ctx.transition(this.tr.chargeOnComplete);
92
+ return;
93
+ }
94
+ // Continue charging toward the locked target.
95
+ moveToward(ctx, phase.targetX, phase.targetY, chargeSpeed);
96
+ }
97
+ exit(ctx) {
98
+ if (ctx.state.chargePhase) {
99
+ ctx.state.chargePhase.active = false;
100
+ }
101
+ }
102
+ }
103
+ //# sourceMappingURL=ChargeState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChargeState.js","sourceRoot":"","sources":["../../../src/states/handlers/ChargeState.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { IOnlineStateHandler } from '../IOnlineStateHandler';
2
+ import type { INPCContext } from '../INPCContext';
3
+ import type { IStateConfig } from '../IStateConfig';
4
+ import type { IStateTransitionMap } from '../IStateTransitionMap';
5
+ /**
6
+ * Stateless combat state handler for human NPCs.
7
+ *
8
+ * Monsters use a separate controller (MonsterCombatController from Slice 14).
9
+ * A single instance can be shared across all NPC entities.
10
+ */
11
+ export declare class CombatState implements IOnlineStateHandler {
12
+ private readonly cfg;
13
+ private readonly tr;
14
+ constructor(cfg: IStateConfig, tr?: Partial<IStateTransitionMap>);
15
+ enter(_ctx: INPCContext): void;
16
+ update(ctx: INPCContext, _deltaMs: number): void;
17
+ exit(_ctx: INPCContext): void;
18
+ }
19
+ //# sourceMappingURL=CombatState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CombatState.d.ts","sourceRoot":"","sources":["../../../src/states/handlers/CombatState.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAGlE;;;;;GAKG;AACH,qBAAa,WAAY,YAAW,mBAAmB;IACrD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAsB;gBAE7B,GAAG,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC;IAKhE,KAAK,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAI9B,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAiHhD,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;CAG9B"}
@@ -0,0 +1,137 @@
1
+ // states/handlers/CombatState.ts
2
+ // Human NPC actively engages a visible enemy.
3
+ //
4
+ // Logic:
5
+ // enter — nothing special (vocalization handled by caller if needed)
6
+ // update —
7
+ // 1. No visible enemy → SEARCH (if lastKnown known) or IDLE
8
+ // 2. Morale PANICKED → FLEE
9
+ // 3. Morale SHAKEN → RETREAT
10
+ // 4. HP below woundedHpThreshold → WOUNDED
11
+ // 5. Visible enemy wounded (STABLE morale, opt-in) → KILL_WOUNDED
12
+ // 6. Move toward enemy when dist > combatRange, otherwise halt + check cover
13
+ // 7. Fire when cooldown elapsed
14
+ // 8. Share target with squad if available
15
+ // exit — nothing
16
+ import { createDefaultTransitionMap } from '../IStateTransitionMap';
17
+ import { moveToward } from './_utils';
18
+ /**
19
+ * Stateless combat state handler for human NPCs.
20
+ *
21
+ * Monsters use a separate controller (MonsterCombatController from Slice 14).
22
+ * A single instance can be shared across all NPC entities.
23
+ */
24
+ export class CombatState {
25
+ constructor(cfg, tr) {
26
+ this.cfg = cfg;
27
+ this.tr = createDefaultTransitionMap(tr);
28
+ }
29
+ enter(_ctx) {
30
+ // No special enter action — caller may emit vocalization if desired.
31
+ }
32
+ update(ctx, _deltaMs) {
33
+ const now = ctx.now();
34
+ // -------------------------------------------------------------------------
35
+ // 1. Perception: resolve visible enemy
36
+ // -------------------------------------------------------------------------
37
+ const enemies = ctx.perception?.getVisibleEnemies() ?? [];
38
+ const hasEnemy = enemies.length > 0;
39
+ if (!hasEnemy) {
40
+ // No visual contact — transition based on whether a last position is known.
41
+ if (ctx.state.lastKnownEnemyX !== 0 || ctx.state.lastKnownEnemyY !== 0) {
42
+ ctx.transition(this.tr.combatOnLastKnown);
43
+ }
44
+ else {
45
+ ctx.transition(this.tr.combatOnNoEnemy);
46
+ }
47
+ return;
48
+ }
49
+ // Update last known enemy position from the closest visible enemy.
50
+ const enemy = enemies[0];
51
+ ctx.state.lastKnownEnemyX = enemy.x;
52
+ ctx.state.lastKnownEnemyY = enemy.y;
53
+ // -------------------------------------------------------------------------
54
+ // 2. Morale checks (highest priority after target acquisition)
55
+ // -------------------------------------------------------------------------
56
+ if (ctx.state.moraleState === 'PANICKED') {
57
+ ctx.transition(this.tr.combatOnPanicked);
58
+ return;
59
+ }
60
+ if (ctx.state.moraleState === 'SHAKEN') {
61
+ ctx.transition(this.tr.combatOnShaken);
62
+ return;
63
+ }
64
+ // -------------------------------------------------------------------------
65
+ // 3. HP threshold — wounded
66
+ // -------------------------------------------------------------------------
67
+ if (ctx.health !== null) {
68
+ if (ctx.health.hpPercent < this.cfg.woundedHpThreshold) {
69
+ ctx.transition(this.tr.combatOnWounded);
70
+ return;
71
+ }
72
+ }
73
+ // -------------------------------------------------------------------------
74
+ // 4. Kill-wounded seam (opt-in) — only when morale is STABLE
75
+ // -------------------------------------------------------------------------
76
+ const woundedEnemies = ctx.perception?.getWoundedEnemies?.() ?? [];
77
+ if (woundedEnemies.length > 0) {
78
+ const we = woundedEnemies[0];
79
+ ctx.state.killWoundedTargetId = we.id;
80
+ ctx.state.killWoundedTargetX = we.x;
81
+ ctx.state.killWoundedTargetY = we.y;
82
+ ctx.state.lastKnownEnemyX = we.x;
83
+ ctx.state.lastKnownEnemyY = we.y;
84
+ ctx.halt();
85
+ ctx.transition(this.tr.combatOnKillWounded);
86
+ return;
87
+ }
88
+ // -------------------------------------------------------------------------
89
+ // 5. Movement — approach or halt
90
+ // -------------------------------------------------------------------------
91
+ const dx = enemy.x - ctx.x;
92
+ const dy = enemy.y - ctx.y;
93
+ const dist = Math.sqrt(dx * dx + dy * dy);
94
+ if (dist > this.cfg.combatRange) {
95
+ moveToward(ctx, enemy.x, enemy.y, this.cfg.approachSpeed);
96
+ }
97
+ else {
98
+ ctx.halt();
99
+ ctx.setRotation(Math.atan2(dy, dx));
100
+ // Check cover transition when already in combat range.
101
+ if (ctx.cover !== null) {
102
+ const coverPt = ctx.cover.findCover(ctx.x, ctx.y, enemy.x, enemy.y, 'CLOSE');
103
+ if (coverPt !== null) {
104
+ ctx.state.coverPointX = coverPt.x;
105
+ ctx.state.coverPointY = coverPt.y;
106
+ ctx.transition(this.tr.combatOnCover);
107
+ return;
108
+ }
109
+ }
110
+ }
111
+ // -------------------------------------------------------------------------
112
+ // 7. Fire when cooldown elapsed
113
+ // -------------------------------------------------------------------------
114
+ if (now - ctx.state.lastShootMs >= this.cfg.fireRateMs) {
115
+ ctx.state.lastShootMs = now;
116
+ const weaponType = ctx.state.primaryWeapon ?? 'rifle';
117
+ ctx.emitShoot({
118
+ npcId: ctx.npcId,
119
+ x: ctx.x,
120
+ y: ctx.y,
121
+ targetX: enemy.x,
122
+ targetY: enemy.y,
123
+ weaponType,
124
+ });
125
+ }
126
+ // -------------------------------------------------------------------------
127
+ // 8. Share target with squad
128
+ // -------------------------------------------------------------------------
129
+ if (ctx.squad !== null) {
130
+ ctx.squad.shareTarget(enemy.id, enemy.x, enemy.y);
131
+ }
132
+ }
133
+ exit(_ctx) {
134
+ // Nothing to clean up.
135
+ }
136
+ }
137
+ //# sourceMappingURL=CombatState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CombatState.js","sourceRoot":"","sources":["../../../src/states/handlers/CombatState.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { IOnlineStateHandler } from '../IOnlineStateHandler';
2
+ import type { INPCContext } from '../INPCContext';
3
+ import type { IStateConfig } from '../IStateConfig';
4
+ import type { IStateTransitionMap } from '../IStateTransitionMap';
5
+ import type { ICombatTransitionConfig, ITransitionRule } from '../../combat/CombatTransitionChain';
6
+ /**
7
+ * Stateless combat-transition coordinator handler.
8
+ *
9
+ * Consumes the pure-function CombatTransitionChain and bridges it to the
10
+ * INPCContext facade so any state handler can delegate complex transition
11
+ * evaluation without duplicating rule logic.
12
+ *
13
+ * A single instance can be shared across all NPC entities.
14
+ */
15
+ export declare class CombatTransitionHandler implements IOnlineStateHandler {
16
+ private readonly cfg;
17
+ private readonly transitionCfg;
18
+ private readonly rules;
19
+ constructor(cfg: IStateConfig, transitionCfgOverrides?: Partial<ICombatTransitionConfig>, rules?: readonly ITransitionRule[], _tr?: Partial<IStateTransitionMap>);
20
+ enter(_ctx: INPCContext): void;
21
+ update(ctx: INPCContext, _deltaMs: number): void;
22
+ exit(_ctx: INPCContext): void;
23
+ /**
24
+ * Build a framework-agnostic ICombatContext snapshot from INPCContext.
25
+ */
26
+ private _buildSnapshot;
27
+ /**
28
+ * Build a minimal INPCLoadout from the NPC's state bag.
29
+ * Returns a loadout with no weapons when the state has no weapon info,
30
+ * which signals the chain to fall back to default behaviour.
31
+ */
32
+ private _buildLoadout;
33
+ }
34
+ //# sourceMappingURL=CombatTransitionHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CombatTransitionHandler.d.ts","sourceRoot":"","sources":["../../../src/states/handlers/CombatTransitionHandler.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAMlE,OAAO,KAAK,EAEV,uBAAuB,EACvB,eAAe,EAChB,MAAM,oCAAoC,CAAC;AAI5C;;;;;;;;GAQG;AACH,qBAAa,uBAAwB,YAAW,mBAAmB;IAK/D,OAAO,CAAC,QAAQ,CAAC,GAAG;IAJtB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA0B;IACxD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6B;gBAGhC,GAAG,EAAE,YAAY,EAClC,sBAAsB,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,EACzD,KAAK,CAAC,EAAE,SAAS,eAAe,EAAE,EAElC,GAAG,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC;IAUpC,KAAK,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAI9B,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQhD,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAQ7B;;OAEG;IACH,OAAO,CAAC,cAAc;IAiEtB;;;;OAIG;IACH,OAAO,CAAC,aAAa;CAkCtB"}