@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,131 @@
1
+ // states/handlers/HelpWoundedState.ts
2
+ // NPC detected a wounded ally and moves toward them to provide assistance.
3
+ // Softer social response — not combat, no weapon use.
4
+ //
5
+ // Phase 1 — APPROACH: Move toward the wounded ally at approachSpeed.
6
+ // - Panicked morale (PANICKED) → helpWoundedOnPanic (FLEE)
7
+ // - Visible enemy detected via ctx.perception → helpWoundedOnEnemy (ALERT)
8
+ // - Overall timeout (helpWoundedMaxDurationMs) → helpWoundedOnComplete (PATROL)
9
+ // - Ally gone from getWoundedAllies() list → helpWoundedOnComplete (PATROL)
10
+ // - Arrived within arriveThreshold → begin Phase 2
11
+ //
12
+ // Phase 2 — ASSIST: Halt next to ally, hold position for helpWoundedAssistMs.
13
+ // - Panicked morale (PANICKED) → helpWoundedOnPanic (FLEE)
14
+ // - Visible enemy detected via ctx.perception → helpWoundedOnEnemy (ALERT)
15
+ // - Ally gone from getWoundedAllies() list → helpWoundedOnComplete (healed or dead)
16
+ // - Assist timer expires → helpWoundedOnComplete (PATROL)
17
+ //
18
+ // Pre-conditions set by calling state (PatrolState / IdleState):
19
+ // ctx.state.helpWoundedTargetId = ally.id
20
+ // ctx.state.helpWoundedX = ally.x
21
+ // ctx.state.helpWoundedY = ally.y
22
+ //
23
+ // Opt-in integration:
24
+ // Requires ctx.perception?.getWoundedAllies?.() to be implemented.
25
+ // Without it, Phase 1 immediately transitions to helpWoundedOnComplete.
26
+ //
27
+ // Stateless: a single instance can be shared across all NPC entities.
28
+ import { createDefaultTransitionMap } from '../IStateTransitionMap';
29
+ import { moveToward } from './_utils';
30
+ /**
31
+ * Stateless two-phase help-wounded handler (X-Ray 16 `xr_help_wounded` equivalent).
32
+ *
33
+ * A single instance can be shared across all NPC entities.
34
+ *
35
+ * Opt-in activation:
36
+ * ```ts
37
+ * const handlers = buildDefaultHandlerMap(cfg, {
38
+ * patrolOnWoundedAlly: 'HELP_WOUNDED',
39
+ * idleOnWoundedAlly: 'HELP_WOUNDED',
40
+ * });
41
+ * handlers.register('HELP_WOUNDED', new HelpWoundedState(cfg));
42
+ * ```
43
+ */
44
+ export class HelpWoundedState {
45
+ constructor(cfg, tr) {
46
+ this.cfg = cfg;
47
+ this.tr = createDefaultTransitionMap(tr);
48
+ }
49
+ enter(ctx) {
50
+ ctx.state.helpWoundedStartMs = ctx.now();
51
+ ctx.state.helpWoundedAssistStartMs = -1; // -1 = not yet arrived
52
+ ctx.halt();
53
+ ctx.emitVocalization('HELP_WOUNDED_MOVING');
54
+ }
55
+ update(ctx, _deltaMs) {
56
+ const now = ctx.now();
57
+ // ── Priority 1 — Panic → flee ───────────────────────────────────────────
58
+ if (ctx.state.moraleState === 'PANICKED') {
59
+ ctx.halt();
60
+ ctx.transition(this.tr.helpWoundedOnPanic);
61
+ return;
62
+ }
63
+ // ── Priority 2 — Visible enemy → abandon help, fight ────────────────────
64
+ if (ctx.perception?.hasVisibleEnemy()) {
65
+ const enemies = ctx.perception.getVisibleEnemies();
66
+ const target = enemies[0];
67
+ ctx.state.lastKnownEnemyX = target.x;
68
+ ctx.state.lastKnownEnemyY = target.y;
69
+ ctx.state.targetId = target.id;
70
+ ctx.halt();
71
+ ctx.transition(this.tr.helpWoundedOnEnemy);
72
+ return;
73
+ }
74
+ // ── Phase 2 — ASSIST (arrived, helpWoundedAssistStartMs >= 0) ────────────
75
+ if (ctx.state.helpWoundedAssistStartMs >= 0) {
76
+ ctx.halt();
77
+ // Re-check if ally is still wounded (opt-in)
78
+ const allies = ctx.perception?.getWoundedAllies?.() ?? [];
79
+ const stillWounded = allies.find(a => a.id === ctx.state.helpWoundedTargetId);
80
+ if (!stillWounded) {
81
+ ctx.transition(this.tr.helpWoundedOnComplete); // healed or died
82
+ return;
83
+ }
84
+ // Assist timer
85
+ if (now - ctx.state.helpWoundedAssistStartMs >= this.cfg.helpWoundedAssistMs) {
86
+ ctx.transition(this.tr.helpWoundedOnComplete);
87
+ }
88
+ return;
89
+ }
90
+ // ── Phase 1 — APPROACH ───────────────────────────────────────────────────
91
+ // Overall timeout — prevents infinite approach on unreachable ally
92
+ if (now - ctx.state.helpWoundedStartMs >= this.cfg.helpWoundedMaxDurationMs) {
93
+ ctx.halt();
94
+ ctx.transition(this.tr.helpWoundedOnComplete);
95
+ return;
96
+ }
97
+ // Update ally position from fresh perception each frame (ally may crawl)
98
+ const allies = ctx.perception?.getWoundedAllies?.() ?? [];
99
+ const target = allies.find(a => a.id === ctx.state.helpWoundedTargetId) ?? null;
100
+ if (!target) {
101
+ // Ally healed, died, or left perception range
102
+ ctx.halt();
103
+ ctx.transition(this.tr.helpWoundedOnComplete);
104
+ return;
105
+ }
106
+ // Keep destination current
107
+ ctx.state.helpWoundedX = target.x;
108
+ ctx.state.helpWoundedY = target.y;
109
+ const dx = target.x - ctx.x;
110
+ const dy = target.y - ctx.y;
111
+ const distSq = dx * dx + dy * dy;
112
+ const thresh = this.cfg.arriveThreshold;
113
+ if (distSq <= thresh * thresh) {
114
+ // Arrived — begin assist phase
115
+ ctx.state.helpWoundedAssistStartMs = now;
116
+ ctx.halt();
117
+ ctx.emitVocalization('HELP_WOUNDED_ASSIST');
118
+ return;
119
+ }
120
+ moveToward(ctx, target.x, target.y, this.cfg.approachSpeed);
121
+ }
122
+ exit(ctx) {
123
+ ctx.state.helpWoundedStartMs = 0;
124
+ ctx.state.helpWoundedAssistStartMs = -1;
125
+ ctx.state.helpWoundedTargetId = null;
126
+ ctx.state.helpWoundedX = 0;
127
+ ctx.state.helpWoundedY = 0;
128
+ ctx.halt();
129
+ }
130
+ }
131
+ //# sourceMappingURL=HelpWoundedState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HelpWoundedState.js","sourceRoot":"","sources":["../../../src/states/handlers/HelpWoundedState.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 idle-state handler.
7
+ *
8
+ * A single instance can be shared across all NPC entities.
9
+ */
10
+ export declare class IdleState 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=IdleState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IdleState.d.ts","sourceRoot":"","sources":["../../../src/states/handlers/IdleState.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;AAIlE;;;;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;IAM7B,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAwGhD,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;CAG9B"}
@@ -0,0 +1,127 @@
1
+ // states/handlers/IdleState.ts
2
+ // NPC stands still and waits. Lowest-activity state for non-sleeping NPCs.
3
+ //
4
+ // Transitions out of IDLE:
5
+ // - visible enemy detected via ctx.perception → ALERT
6
+ // - NPC standing inside a DANGER restricted zone → ALERT (walk away first)
7
+ // - accumulated suspicion exceeds threshold (opt-in) → ALERT (via idleOnSuspicious)
8
+ // - wounded ally detected (opt-in) → HELP_WOUNDED (via idleOnWoundedAlly)
9
+ // - friendly corpse seen (opt-in) → suspicion.add(BODY_FOUND) → cascades
10
+ // - condition channel above threshold (opt-in) → CAMP (via idleOnTired)
11
+ //
12
+ // Note: this is the "calm" default fallback. When the NPC has a patrol task
13
+ // assigned, the host should put it in PATROL instead.
14
+ import { createDefaultTransitionMap } from '../IStateTransitionMap';
15
+ import { moveToward } from './_utils';
16
+ import { SuspicionStimuli } from '../../suspicion/SuspicionAccumulator';
17
+ /**
18
+ * Stateless idle-state handler.
19
+ *
20
+ * A single instance can be shared across all NPC entities.
21
+ */
22
+ export class IdleState {
23
+ constructor(cfg, tr) {
24
+ this.cfg = cfg;
25
+ this.tr = createDefaultTransitionMap(tr);
26
+ }
27
+ enter(ctx) {
28
+ ctx.halt();
29
+ // Seed the zone check timer so the check fires on the first update tick.
30
+ ctx.state.lastIdleAnimChangeMs = ctx.now() - this.cfg.restrictedZoneCheckIntervalMs;
31
+ }
32
+ update(ctx, _deltaMs) {
33
+ // --- Perception: any visible enemy → go to ALERT ---
34
+ if (ctx.perception?.hasVisibleEnemy()) {
35
+ const enemies = ctx.perception.getVisibleEnemies();
36
+ const target = enemies[0];
37
+ ctx.state.lastKnownEnemyX = target.x;
38
+ ctx.state.lastKnownEnemyY = target.y;
39
+ ctx.transition(this.tr.idleOnEnemy);
40
+ return;
41
+ }
42
+ // --- Pack alert check (opt-in) ---
43
+ if (ctx.pack) {
44
+ const level = ctx.pack.getPackAlertLevel();
45
+ if (level !== 'NONE') {
46
+ const pt = ctx.pack.getPackTarget();
47
+ if (pt) {
48
+ ctx.state.lastKnownEnemyX = pt.x;
49
+ ctx.state.lastKnownEnemyY = pt.y;
50
+ }
51
+ ctx.transition(this.tr.idleOnPackAlert);
52
+ return;
53
+ }
54
+ }
55
+ // --- Restricted zone DANGER check (throttled) ---
56
+ // Use lastIdleAnimChangeMs as the zone-check timestamp to avoid adding a
57
+ // new field — the semantics ("last periodic check") are close enough.
58
+ const now = ctx.now();
59
+ const timeSinceCheck = now - ctx.state.lastIdleAnimChangeMs;
60
+ if (timeSinceCheck >= this.cfg.restrictedZoneCheckIntervalMs &&
61
+ ctx.restrictedZones !== null) {
62
+ ctx.state.lastIdleAnimChangeMs = now;
63
+ if (!ctx.restrictedZones.isAccessible(ctx.x, ctx.y)) {
64
+ // NPC is standing inside a restricted/dangerous zone.
65
+ // Escape direction: pick a safe nearby point by filtering a small set of
66
+ // cardinal candidate positions and walking toward the first accessible one.
67
+ const step = this.cfg.approachSpeed * 2;
68
+ const candidates = [
69
+ { x: ctx.x + step, y: ctx.y },
70
+ { x: ctx.x - step, y: ctx.y },
71
+ { x: ctx.x, y: ctx.y + step },
72
+ { x: ctx.x, y: ctx.y - step },
73
+ ];
74
+ const safe = ctx.restrictedZones.filterAccessible(candidates);
75
+ if (safe.length > 0) {
76
+ const dest = safe[0];
77
+ ctx.state.lastKnownEnemyX = dest.x;
78
+ ctx.state.lastKnownEnemyY = dest.y;
79
+ moveToward(ctx, dest.x, dest.y, this.cfg.approachSpeed);
80
+ }
81
+ ctx.transition(this.tr.idleOnEnemy);
82
+ return;
83
+ }
84
+ }
85
+ // --- Suspicion check (opt-in) ---
86
+ // Silently skips when ctx.suspicion is null (not registered by host).
87
+ if (ctx.suspicion?.hasReachedAlert(this.cfg.suspicionAlertThreshold)) {
88
+ const pos = ctx.suspicion.getLastKnownPosition();
89
+ if (pos) {
90
+ ctx.state.lastKnownEnemyX = pos.x;
91
+ ctx.state.lastKnownEnemyY = pos.y;
92
+ }
93
+ ctx.suspicion.clear();
94
+ ctx.transition(this.tr.idleOnSuspicious);
95
+ return;
96
+ }
97
+ // --- Wounded ally check (opt-in via getWoundedAllies) ---
98
+ // Silently skips when perception is null or getWoundedAllies is not implemented.
99
+ const woundedAllies = ctx.perception?.getWoundedAllies?.() ?? [];
100
+ if (woundedAllies.length > 0) {
101
+ const ally = woundedAllies[0];
102
+ ctx.state.helpWoundedTargetId = ally.id;
103
+ ctx.state.helpWoundedX = ally.x;
104
+ ctx.state.helpWoundedY = ally.y;
105
+ ctx.transition(this.tr.idleOnWoundedAlly);
106
+ return;
107
+ }
108
+ // --- Corpse detection (opt-in via getVisibleCorpses + suspicion) ---
109
+ // Feeds suspicion accumulator; the existing suspicion check above handles transition.
110
+ if (ctx.suspicion) {
111
+ for (const c of ctx.perception?.getVisibleCorpses?.() ?? []) {
112
+ ctx.suspicion.add(SuspicionStimuli.BODY_FOUND, this.cfg.corpseFoundSuspicion, c.x, c.y);
113
+ }
114
+ }
115
+ // --- Condition check (opt-in) ---
116
+ // Silently skips when ctx.conditions is null or not registered.
117
+ if (ctx.conditions?.hasCondition(this.cfg.idleConditionChannel, this.cfg.idleConditionThreshold)) {
118
+ ctx.transition(this.tr.idleOnTired);
119
+ return;
120
+ }
121
+ }
122
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
123
+ exit(_ctx) {
124
+ // Nothing to clean up.
125
+ }
126
+ }
127
+ //# sourceMappingURL=IdleState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IdleState.js","sourceRoot":"","sources":["../../../src/states/handlers/IdleState.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
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 two-phase investigate handler (X-Ray 16 `xr_investigator` equivalent).
7
+ *
8
+ * A single instance can be shared across all NPC entities.
9
+ *
10
+ * Opt-in activation — wire suspicion to INVESTIGATE instead of ALERT:
11
+ * ```ts
12
+ * const handlers = buildDefaultHandlerMap(cfg, {
13
+ * patrolOnSuspicious: 'INVESTIGATE',
14
+ * idleOnSuspicious: 'INVESTIGATE',
15
+ * });
16
+ * handlers.register('INVESTIGATE', new InvestigateState(cfg));
17
+ * ```
18
+ */
19
+ export declare class InvestigateState implements IOnlineStateHandler {
20
+ private readonly cfg;
21
+ private readonly tr;
22
+ constructor(cfg: IStateConfig, tr?: Partial<IStateTransitionMap>);
23
+ enter(ctx: INPCContext): void;
24
+ update(ctx: INPCContext, _deltaMs: number): void;
25
+ exit(ctx: INPCContext): void;
26
+ }
27
+ //# sourceMappingURL=InvestigateState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InvestigateState.d.ts","sourceRoot":"","sources":["../../../src/states/handlers/InvestigateState.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAe,gBAAgB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAc,iBAAiB,CAAC;AAE5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAO,wBAAwB,CAAC;AAGnE;;;;;;;;;;;;;GAaG;AACH,qBAAa,gBAAiB,YAAW,mBAAmB;IAC1D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAuB;gBAE9B,GAAG,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC;IAKhE,KAAK,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAO7B,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAmGhD,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;CAK7B"}
@@ -0,0 +1,145 @@
1
+ // states/handlers/InvestigateState.ts
2
+ // NPC received a suspicious stimulus and moves toward the last known position
3
+ // to investigate. Softer than ALERT — no combat assumption, calm approach.
4
+ //
5
+ // Phase 1 — APPROACH: Move toward ctx.state.lastKnownEnemyX/Y at approachSpeed.
6
+ // - Panicked morale (PANICKED) → investigateOnPanic (FLEE)
7
+ // - Visible enemy detected via ctx.perception → investigateOnEnemy (ALERT)
8
+ // - Suspicion re-accumulates above threshold → investigateOnEnemy (ALERT)
9
+ // - Overall timeout (investigateMaxDurationMs) → investigateOnTimeout (PATROL)
10
+ // - Arrived within arriveThreshold → begin Phase 2
11
+ //
12
+ // Phase 2 — LOOK_AROUND: Halt at the location, rotate, wait investigateLookAroundMs.
13
+ // - Panicked morale (PANICKED) → investigateOnPanic (FLEE)
14
+ // - Visible enemy detected via ctx.perception → investigateOnEnemy (ALERT)
15
+ // - Suspicion re-accumulates above threshold → investigateOnEnemy (ALERT)
16
+ // - Look-around timer expires, nothing found → investigateOnTimeout (PATROL)
17
+ //
18
+ // Opt-in integration:
19
+ // ctx.suspicion may be null — all suspicion checks use optional chaining.
20
+ // To activate: register this handler and set patrolOnSuspicious/idleOnSuspicious to 'INVESTIGATE'.
21
+ //
22
+ // Stateless: a single instance can be shared across all NPC entities.
23
+ //
24
+ // Sentinel: investigateLookAroundStartMs uses -1 to mean "not yet arrived",
25
+ // avoiding collision with ctx.now() === 0 on the very first frame.
26
+ import { createDefaultTransitionMap } from '../IStateTransitionMap';
27
+ import { moveToward } from './_utils';
28
+ /**
29
+ * Stateless two-phase investigate handler (X-Ray 16 `xr_investigator` equivalent).
30
+ *
31
+ * A single instance can be shared across all NPC entities.
32
+ *
33
+ * Opt-in activation — wire suspicion to INVESTIGATE instead of ALERT:
34
+ * ```ts
35
+ * const handlers = buildDefaultHandlerMap(cfg, {
36
+ * patrolOnSuspicious: 'INVESTIGATE',
37
+ * idleOnSuspicious: 'INVESTIGATE',
38
+ * });
39
+ * handlers.register('INVESTIGATE', new InvestigateState(cfg));
40
+ * ```
41
+ */
42
+ export class InvestigateState {
43
+ constructor(cfg, tr) {
44
+ this.cfg = cfg;
45
+ this.tr = createDefaultTransitionMap(tr);
46
+ }
47
+ enter(ctx) {
48
+ ctx.state.investigateStartMs = ctx.now();
49
+ ctx.state.investigateLookAroundStartMs = -1; // -1 = not yet arrived
50
+ ctx.halt();
51
+ ctx.emitVocalization('INVESTIGATE_START');
52
+ }
53
+ update(ctx, _deltaMs) {
54
+ const now = ctx.now();
55
+ // ── Priority 1 — Panic → abort investigation, flee immediately ──────────
56
+ if (ctx.state.moraleState === 'PANICKED') {
57
+ ctx.halt();
58
+ ctx.transition(this.tr.investigateOnPanic);
59
+ return;
60
+ }
61
+ // ── Priority 2 — Visible enemy → escalate immediately ───────────────────
62
+ if (ctx.perception?.hasVisibleEnemy()) {
63
+ const enemies = ctx.perception.getVisibleEnemies();
64
+ const target = enemies[0];
65
+ ctx.state.lastKnownEnemyX = target.x;
66
+ ctx.state.lastKnownEnemyY = target.y;
67
+ ctx.state.targetId = target.id;
68
+ ctx.halt();
69
+ ctx.transition(this.tr.investigateOnEnemy);
70
+ return;
71
+ }
72
+ // ── Phase 2 — LOOK_AROUND (entered when investigateLookAroundStartMs >= 0) ──
73
+ if (ctx.state.investigateLookAroundStartMs >= 0) {
74
+ ctx.halt();
75
+ // Rotate to simulate scanning — two full sweeps over the look-around window.
76
+ // Jitter is derived deterministically from arrival timestamp to avoid
77
+ // consuming ctx.random() budget every frame.
78
+ const elapsed = now - ctx.state.investigateLookAroundStartMs;
79
+ const jitter = (ctx.state.investigateLookAroundStartMs % 1000) / 1000 * 0.2;
80
+ const sweepAngle = (elapsed / this.cfg.investigateLookAroundMs) * Math.PI * 4 + jitter;
81
+ ctx.setRotation(sweepAngle);
82
+ // Suspicion re-accumulation during look-around (opt-in)
83
+ if (ctx.suspicion?.hasReachedAlert(this.cfg.suspicionAlertThreshold)) {
84
+ const pos = ctx.suspicion.getLastKnownPosition();
85
+ if (pos) {
86
+ ctx.state.lastKnownEnemyX = pos.x;
87
+ ctx.state.lastKnownEnemyY = pos.y;
88
+ }
89
+ ctx.suspicion.clear();
90
+ ctx.halt();
91
+ ctx.transition(this.tr.investigateOnEnemy);
92
+ return;
93
+ }
94
+ // Timer expired → nothing found, deescalate
95
+ if (elapsed >= this.cfg.investigateLookAroundMs) {
96
+ ctx.suspicion?.clear();
97
+ ctx.halt();
98
+ ctx.transition(this.tr.investigateOnTimeout);
99
+ }
100
+ return;
101
+ }
102
+ // ── Phase 1 — APPROACH: move toward investigate target ──────────────────
103
+ // Overall timeout guard — prevents infinite approach on unreachable points
104
+ if (now - ctx.state.investigateStartMs >= this.cfg.investigateMaxDurationMs) {
105
+ ctx.suspicion?.clear();
106
+ ctx.halt();
107
+ ctx.transition(this.tr.investigateOnTimeout);
108
+ return;
109
+ }
110
+ // Suspicion re-spike during approach → skip look-around, escalate directly
111
+ if (ctx.suspicion?.hasReachedAlert(this.cfg.suspicionAlertThreshold)) {
112
+ const pos = ctx.suspicion.getLastKnownPosition();
113
+ if (pos) {
114
+ ctx.state.lastKnownEnemyX = pos.x;
115
+ ctx.state.lastKnownEnemyY = pos.y;
116
+ }
117
+ ctx.suspicion.clear();
118
+ ctx.halt();
119
+ ctx.transition(this.tr.investigateOnEnemy);
120
+ return;
121
+ }
122
+ const destX = ctx.state.lastKnownEnemyX;
123
+ const destY = ctx.state.lastKnownEnemyY;
124
+ const dx = destX - ctx.x;
125
+ const dy = destY - ctx.y;
126
+ const distSq = dx * dx + dy * dy;
127
+ const thresh = this.cfg.arriveThreshold;
128
+ if (distSq <= thresh * thresh) {
129
+ // Arrived — begin look-around phase
130
+ ctx.state.investigateLookAroundStartMs = now;
131
+ ctx.halt();
132
+ if (dx !== 0 || dy !== 0) {
133
+ ctx.setRotation(Math.atan2(dy, dx));
134
+ }
135
+ return;
136
+ }
137
+ moveToward(ctx, destX, destY, this.cfg.approachSpeed);
138
+ }
139
+ exit(ctx) {
140
+ ctx.state.investigateStartMs = 0;
141
+ ctx.state.investigateLookAroundStartMs = -1;
142
+ ctx.halt();
143
+ }
144
+ }
145
+ //# sourceMappingURL=InvestigateState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InvestigateState.js","sourceRoot":"","sources":["../../../src/states/handlers/InvestigateState.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
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 five-phase kill-wounded handler (X-Ray 16 `stalker_kill_wounded` equivalent).
7
+ *
8
+ * A single instance can be shared across all NPC entities.
9
+ *
10
+ * Opt-in activation (add to the handler registry):
11
+ * ```ts
12
+ * const handlers = buildDefaultHandlerMap(cfg, {
13
+ * combatOnKillWounded: 'KILL_WOUNDED',
14
+ * alertOnKillWounded: 'KILL_WOUNDED',
15
+ * });
16
+ * handlers.register('KILL_WOUNDED', new KillWoundedState(cfg));
17
+ * ```
18
+ */
19
+ export declare class KillWoundedState implements IOnlineStateHandler {
20
+ private readonly cfg;
21
+ private readonly tr;
22
+ constructor(cfg: IStateConfig, tr?: Partial<IStateTransitionMap>);
23
+ enter(ctx: INPCContext): void;
24
+ update(ctx: INPCContext, _deltaMs: number): void;
25
+ exit(ctx: INPCContext): void;
26
+ }
27
+ //# sourceMappingURL=KillWoundedState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KillWoundedState.d.ts","sourceRoot":"","sources":["../../../src/states/handlers/KillWoundedState.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAS,wBAAwB,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAiB,gBAAgB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAgB,iBAAiB,CAAC;AAE9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAS,wBAAwB,CAAC;AAGrE;;;;;;;;;;;;;GAaG;AACH,qBAAa,gBAAiB,YAAW,mBAAmB;IAC1D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAuB;gBAE9B,GAAG,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC;IAKhE,KAAK,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAU7B,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IA0HhD,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;CAY7B"}