@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,137 @@
1
+ // states/handlers/CombatTransitionHandler.ts
2
+ // Coordinator that wraps the pure-function CombatTransitionChain for use as a
3
+ // state handler.
4
+ //
5
+ // Bridges INPCContext → ICombatContext so the existing SDK logic can evaluate
6
+ // all priority-ordered transition rules and return the appropriate next state.
7
+ //
8
+ // enter: nothing
9
+ // update: build ICombatContext snapshot from ctx, run evaluateTransitions(),
10
+ // call ctx.transition() if a rule fires
11
+ // exit: nothing
12
+ import { evaluateTransitions, createDefaultCombatTransitionConfig, DEFAULT_COMBAT_RULES, } from '../../combat/CombatTransitionChain';
13
+ import { WeaponCategory } from '../../types/IWeaponTypes';
14
+ /**
15
+ * Stateless combat-transition coordinator handler.
16
+ *
17
+ * Consumes the pure-function CombatTransitionChain and bridges it to the
18
+ * INPCContext facade so any state handler can delegate complex transition
19
+ * evaluation without duplicating rule logic.
20
+ *
21
+ * A single instance can be shared across all NPC entities.
22
+ */
23
+ export class CombatTransitionHandler {
24
+ constructor(cfg, transitionCfgOverrides, rules,
25
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
26
+ _tr) {
27
+ this.cfg = cfg;
28
+ this.transitionCfg = createDefaultCombatTransitionConfig({
29
+ woundedHpThreshold: cfg.woundedHpThreshold,
30
+ retreatMoraleThreshold: cfg.retreatMoraleThreshold,
31
+ ...transitionCfgOverrides,
32
+ });
33
+ this.rules = rules ?? DEFAULT_COMBAT_RULES;
34
+ }
35
+ enter(_ctx) {
36
+ // Nothing to set up.
37
+ }
38
+ update(ctx, _deltaMs) {
39
+ const snapshot = this._buildSnapshot(ctx);
40
+ const next = evaluateTransitions(this.rules, snapshot, this.transitionCfg);
41
+ if (next !== null) {
42
+ ctx.transition(next);
43
+ }
44
+ }
45
+ exit(_ctx) {
46
+ // Nothing to clean up.
47
+ }
48
+ // ---------------------------------------------------------------------------
49
+ // Internal helpers
50
+ // ---------------------------------------------------------------------------
51
+ /**
52
+ * Build a framework-agnostic ICombatContext snapshot from INPCContext.
53
+ */
54
+ _buildSnapshot(ctx) {
55
+ const enemies = ctx.perception?.getVisibleEnemies() ?? [];
56
+ const enemy = enemies[0] ?? null;
57
+ const hpRatio = ctx.health !== null
58
+ ? ctx.health.hpPercent
59
+ : 1;
60
+ const moraleValue = ctx.state.morale;
61
+ const isPanicked = ctx.state.moraleState === 'PANICKED';
62
+ // Lost sight: if no visible enemy, estimate time since last known position.
63
+ // We treat lastShootMs as a proxy for "last active combat tick". If there is
64
+ // a visible enemy, lostSightMs = 0.
65
+ const lostSightMs = enemy !== null
66
+ ? 0
67
+ : (ctx.state.lastShootMs > 0 ? ctx.now() - ctx.state.lastShootMs : Infinity);
68
+ const distanceToEnemy = enemy !== null
69
+ ? Math.sqrt(Math.pow(enemy.x - ctx.x, 2) + Math.pow(enemy.y - ctx.y, 2))
70
+ : Math.sqrt(Math.pow(ctx.state.lastKnownEnemyX - ctx.x, 2) +
71
+ Math.pow(ctx.state.lastKnownEnemyY - ctx.y, 2));
72
+ // Target-inertia: can switch target if lock expired.
73
+ const canSwitchTarget = ctx.now() >= ctx.state.targetLockUntilMs;
74
+ // Explosive danger check via danger subsystem.
75
+ const hasExplosiveDanger = ctx.danger?.getGrenadeDanger(ctx.x, ctx.y)?.active ?? false;
76
+ // Build a minimal loadout from state bag.
77
+ const loadout = this._buildLoadout(ctx);
78
+ // Has ammo if primary or secondary has ammo, or we have no loadout (default: has ammo).
79
+ const hasAmmo = (loadout.primary !== null && loadout.primary.ammo > 0) ||
80
+ (loadout.secondary !== null && loadout.secondary.ammo > 0) ||
81
+ (loadout.primary === null && loadout.secondary === null);
82
+ // Time since wounded: use woundedStartMs as a proxy.
83
+ const timeSinceWoundedMs = ctx.state.woundedStartMs > 0
84
+ ? ctx.now() - ctx.state.woundedStartMs
85
+ : Infinity;
86
+ return {
87
+ hpRatio,
88
+ moraleValue,
89
+ isPanicked,
90
+ lostSightMs,
91
+ distanceToEnemy,
92
+ visibleEnemyCount: enemies.length,
93
+ loadout,
94
+ canSwitchTarget,
95
+ timeSinceWoundedMs,
96
+ hasExplosiveDanger,
97
+ hasAmmo,
98
+ };
99
+ }
100
+ /**
101
+ * Build a minimal INPCLoadout from the NPC's state bag.
102
+ * Returns a loadout with no weapons when the state has no weapon info,
103
+ * which signals the chain to fall back to default behaviour.
104
+ */
105
+ _buildLoadout(ctx) {
106
+ const primaryWeapon = ctx.state.primaryWeapon;
107
+ const secondaryWeapon = ctx.state.secondaryWeapon;
108
+ // Create minimal weapon slots with reasonable defaults when weapon type is known.
109
+ const primary = primaryWeapon !== null
110
+ ? {
111
+ category: WeaponCategory.RIFLE,
112
+ ammo: 30,
113
+ maxAmmo: 30,
114
+ range: { min: 100, max: 400 },
115
+ damage: this.cfg.bulletDamage,
116
+ fireRate: 1,
117
+ }
118
+ : null;
119
+ const secondary = secondaryWeapon !== null
120
+ ? {
121
+ category: WeaponCategory.PISTOL,
122
+ ammo: 15,
123
+ maxAmmo: 15,
124
+ range: { min: 0, max: 200 },
125
+ damage: this.cfg.bulletDamage * 0.7,
126
+ fireRate: 1,
127
+ }
128
+ : null;
129
+ return {
130
+ primary,
131
+ secondary,
132
+ grenades: ctx.state.grenadeCount,
133
+ medkits: ctx.state.medkitCount,
134
+ };
135
+ }
136
+ }
137
+ //# sourceMappingURL=CombatTransitionHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CombatTransitionHandler.js","sourceRoot":"","sources":["../../../src/states/handlers/CombatTransitionHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
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 dead-state handler.
7
+ *
8
+ * A single instance can be shared across all NPC entities.
9
+ */
10
+ export declare class DeadState implements IOnlineStateHandler {
11
+ constructor(_cfg: IStateConfig, _tr?: Partial<IStateTransitionMap>);
12
+ enter(ctx: INPCContext): void;
13
+ update(_ctx: INPCContext, _deltaMs: number): void;
14
+ exit(_ctx: INPCContext): void;
15
+ }
16
+ //# sourceMappingURL=DeadState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeadState.d.ts","sourceRoot":"","sources":["../../../src/states/handlers/DeadState.ts"],"names":[],"mappings":"AAUA,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;AAElE;;;;GAIG;AACH,qBAAa,SAAU,YAAW,mBAAmB;gBAKvC,IAAI,EAAE,YAAY,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC;IAElE,KAAK,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAM7B,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKjD,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;CAI9B"}
@@ -0,0 +1,35 @@
1
+ // states/handlers/DeadState.ts
2
+ // Terminal state — the NPC is dead.
3
+ //
4
+ // enter() — halts velocity and disables the physics body so the corpse no
5
+ // longer participates in collisions.
6
+ // update() — deliberate no-op: the entity will be cleaned up by the host.
7
+ // Any AI tick that reaches a dead NPC is silently swallowed.
8
+ // exit() — safety no-op; the FSM should never leave DEAD under normal
9
+ // operation, but implementations are allowed to resurrect NPCs.
10
+ /**
11
+ * Stateless dead-state handler.
12
+ *
13
+ * A single instance can be shared across all NPC entities.
14
+ */
15
+ export class DeadState {
16
+ // IStateConfig and IStateTransitionMap are accepted but not used in this
17
+ // terminal state — kept for constructor signature consistency with all other
18
+ // handlers.
19
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
20
+ constructor(_cfg, _tr) { }
21
+ enter(ctx) {
22
+ ctx.halt();
23
+ ctx.disablePhysics();
24
+ }
25
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
26
+ update(_ctx, _deltaMs) {
27
+ // Intentional no-op — dead entities do nothing each frame.
28
+ }
29
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
30
+ exit(_ctx) {
31
+ // The FSM should not exit DEAD under normal operation.
32
+ // No cleanup required — this is a safety no-op.
33
+ }
34
+ }
35
+ //# sourceMappingURL=DeadState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeadState.js","sourceRoot":"","sources":["../../../src/states/handlers/DeadState.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,oCAAoC;AACpC,EAAE;AACF,2EAA2E;AAC3E,iDAAiD;AACjD,0EAA0E;AAC1E,yEAAyE;AACzE,wEAAwE;AACxE,4EAA4E;AAO5E;;;;GAIG;AACH,MAAM,OAAO,SAAS;IACpB,yEAAyE;IACzE,6EAA6E;IAC7E,YAAY;IACZ,6DAA6D;IAC7D,YAAY,IAAkB,EAAE,GAAkC,IAAG,CAAC;IAEtE,KAAK,CAAC,GAAgB;QACpB,GAAG,CAAC,IAAI,EAAE,CAAC;QACX,GAAG,CAAC,cAAc,EAAE,CAAC;IACvB,CAAC;IAED,6DAA6D;IAC7D,MAAM,CAAC,IAAiB,EAAE,QAAgB;QACxC,2DAA2D;IAC7D,CAAC;IAED,6DAA6D;IAC7D,IAAI,CAAC,IAAiB;QACpB,uDAAuD;QACvD,gDAAgD;IAClD,CAAC;CACF"}
@@ -0,0 +1,23 @@
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 evade-grenade state handler.
7
+ *
8
+ * A single instance can be shared across all NPC entities.
9
+ */
10
+ export declare class EvadeGrenadeState 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
+ * Choose the post-evade state based on whether an enemy is currently visible.
19
+ * enemy visible → evadeOnClear (default: 'COMBAT'), no enemy → SEARCH.
20
+ */
21
+ private _exitToNextState;
22
+ }
23
+ //# sourceMappingURL=EvadeGrenadeState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EvadeGrenadeState.d.ts","sourceRoot":"","sources":["../../../src/states/handlers/EvadeGrenadeState.ts"],"names":[],"mappings":"AAuBA,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;AASlE;;;;GAIG;AACH,qBAAa,iBAAkB,YAAW,mBAAmB;IAC3D,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;IAI7B,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAqChD,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAQ5B;;;OAGG;IACH,OAAO,CAAC,gBAAgB;CAOzB"}
@@ -0,0 +1,93 @@
1
+ // states/handlers/EvadeGrenadeState.ts
2
+ // NPC sprints away from an active grenade or explosion danger.
3
+ //
4
+ // Behaviour summary:
5
+ // enter() — record ctx.now() in ctx.state.evadeStartMs so the handler
6
+ // knows when the evasion sprint began.
7
+ // update() — query ctx.danger?.getGrenadeDanger(x, y) each frame.
8
+ // If grenade danger is active:
9
+ // - move AWAY from the danger origin at
10
+ // approachSpeed × evadeSpeedMultiplier (sprint).
11
+ // Exit conditions:
12
+ // (a) Grenade danger is no longer active AND
13
+ // elapsed >= evadeGrenadeDurationMs → COMBAT or SEARCH
14
+ // (b) No danger system registered AND
15
+ // elapsed >= evadeGrenadeDurationMs → COMBAT
16
+ // (c) Grenade danger cleared early (active===false) →
17
+ // check enemy visibility: enemy present → COMBAT,
18
+ // else → SEARCH.
19
+ // exit() — halt() so the NPC doesn't keep drifting.
20
+ //
21
+ // State ID: 'EVADE_GRENADE'
22
+ // Transitions: → 'COMBAT' | 'SEARCH'
23
+ import { createDefaultTransitionMap } from '../IStateTransitionMap';
24
+ import { awayFrom } from './_utils';
25
+ /**
26
+ * Default evasion sprint duration (ms).
27
+ * Long enough to clear a grenade blast radius at sprint speed.
28
+ */
29
+ const EVADE_GRENADE_DURATION_MS = 2000;
30
+ /**
31
+ * Stateless evade-grenade state handler.
32
+ *
33
+ * A single instance can be shared across all NPC entities.
34
+ */
35
+ export class EvadeGrenadeState {
36
+ constructor(cfg, tr) {
37
+ this.cfg = cfg;
38
+ this.tr = createDefaultTransitionMap(tr);
39
+ }
40
+ enter(ctx) {
41
+ ctx.state.evadeStartMs = ctx.now();
42
+ }
43
+ update(ctx, _deltaMs) {
44
+ const now = ctx.now();
45
+ const elapsed = now - ctx.state.evadeStartMs;
46
+ // --- Query grenade/explosion danger ---
47
+ const dangerInfo = ctx.danger?.getGrenadeDanger(ctx.x, ctx.y) ?? null;
48
+ if (dangerInfo && dangerInfo.active) {
49
+ // Sprint directly away from the danger origin.
50
+ const speed = this.cfg.approachSpeed * this.cfg.evadeSpeedMultiplier;
51
+ awayFrom(ctx, dangerInfo.originX, dangerInfo.originY, speed);
52
+ // Don't exit yet — keep sprinting until danger clears or timer expires.
53
+ return;
54
+ }
55
+ // --- No active grenade danger ---
56
+ if (ctx.danger === null) {
57
+ // No danger system at all — time out and return to COMBAT.
58
+ if (elapsed >= EVADE_GRENADE_DURATION_MS) {
59
+ ctx.halt();
60
+ ctx.transition(this.tr.evadeOnNoSystem);
61
+ }
62
+ return;
63
+ }
64
+ // Danger system present but grenade is no longer active (or was never found).
65
+ if (elapsed >= EVADE_GRENADE_DURATION_MS) {
66
+ ctx.halt();
67
+ this._exitToNextState(ctx);
68
+ return;
69
+ }
70
+ // Danger cleared early — transition immediately.
71
+ ctx.halt();
72
+ this._exitToNextState(ctx);
73
+ }
74
+ exit(ctx) {
75
+ ctx.halt();
76
+ }
77
+ // ---------------------------------------------------------------------------
78
+ // Private helpers
79
+ // ---------------------------------------------------------------------------
80
+ /**
81
+ * Choose the post-evade state based on whether an enemy is currently visible.
82
+ * enemy visible → evadeOnClear (default: 'COMBAT'), no enemy → SEARCH.
83
+ */
84
+ _exitToNextState(ctx) {
85
+ if (ctx.perception?.hasVisibleEnemy()) {
86
+ ctx.transition(this.tr.evadeOnClear);
87
+ }
88
+ else {
89
+ ctx.transition('SEARCH');
90
+ }
91
+ }
92
+ }
93
+ //# sourceMappingURL=EvadeGrenadeState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EvadeGrenadeState.js","sourceRoot":"","sources":["../../../src/states/handlers/EvadeGrenadeState.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,+DAA+D;AAC/D,EAAE;AACF,qBAAqB;AACrB,yEAAyE;AACzE,oDAAoD;AACpD,oEAAoE;AACpE,4CAA4C;AAC5C,uDAAuD;AACvD,kEAAkE;AAClE,gCAAgC;AAChC,4DAA4D;AAC5D,2EAA2E;AAC3E,qDAAqD;AACrD,iEAAiE;AACjE,qEAAqE;AACrE,qEAAqE;AACrE,oCAAoC;AACpC,wDAAwD;AACxD,EAAE;AACF,4BAA4B;AAC5B,qCAAqC;AAKrC,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAEpE,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC;;;GAGG;AACH,MAAM,yBAAyB,GAAG,IAAK,CAAC;AAExC;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IAI5B,YAAY,GAAiB,EAAE,EAAiC;QAC9D,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,EAAE,GAAG,0BAA0B,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,GAAgB;QACpB,GAAG,CAAC,KAAK,CAAC,YAAY,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC;IACrC,CAAC;IAED,MAAM,CAAC,GAAgB,EAAE,QAAgB;QACvC,MAAM,GAAG,GAAO,GAAG,CAAC,GAAG,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC;QAE7C,yCAAyC;QACzC,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;QAEtE,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;YACpC,+CAA+C;YAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,oBAAoB,CAAC;YACrE,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC7D,wEAAwE;YACxE,OAAO;QACT,CAAC;QAED,mCAAmC;QACnC,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YACxB,2DAA2D;YAC3D,IAAI,OAAO,IAAI,yBAAyB,EAAE,CAAC;gBACzC,GAAG,CAAC,IAAI,EAAE,CAAC;gBACX,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC;YAC1C,CAAC;YACD,OAAO;QACT,CAAC;QAED,8EAA8E;QAC9E,IAAI,OAAO,IAAI,yBAAyB,EAAE,CAAC;YACzC,GAAG,CAAC,IAAI,EAAE,CAAC;YACX,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,iDAAiD;QACjD,GAAG,CAAC,IAAI,EAAE,CAAC;QACX,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,CAAC,GAAgB;QACnB,GAAG,CAAC,IAAI,EAAE,CAAC;IACb,CAAC;IAED,8EAA8E;IAC9E,kBAAkB;IAClB,8EAA8E;IAE9E;;;OAGG;IACK,gBAAgB,CAAC,GAAgB;QACvC,IAAI,GAAG,CAAC,UAAU,EAAE,eAAe,EAAE,EAAE,CAAC;YACtC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;CACF"}
@@ -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 flee-state handler.
7
+ *
8
+ * A single instance can be shared across all NPC entities.
9
+ */
10
+ export declare class FleeState 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=FleeState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FleeState.d.ts","sourceRoot":"","sources":["../../../src/states/handlers/FleeState.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;;;;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;IAO7B,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IA8BhD,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;CAG7B"}
@@ -0,0 +1,61 @@
1
+ // states/handlers/FleeState.ts
2
+ // NPC sprints directly away from the threat's last known position.
3
+ //
4
+ // Morale-aware speed:
5
+ // - PANICKED NPC : base flee speed × fleeSpeedMultiplier × panicFleeMultiplier
6
+ // - SHAKEN NPC : base flee speed × fleeSpeedMultiplier (no extra multiplier)
7
+ //
8
+ // Exit conditions (same rules as the game-layer FleeState):
9
+ // - moraleState is STABLE → ALERT (recovered)
10
+ // - distance from threat > cfg.fleeDistance AND morale
11
+ // is SHAKEN (not PANICKED) → PATROL (far enough)
12
+ //
13
+ // Transitions out of FLEE:
14
+ // - morale is STABLE → ALERT
15
+ // - far enough + SHAKEN → PATROL (then morale recovery will bring them back)
16
+ import { createDefaultTransitionMap } from '../IStateTransitionMap';
17
+ import { awayFrom } from './_utils';
18
+ /**
19
+ * Stateless flee-state handler.
20
+ *
21
+ * A single instance can be shared across all NPC entities.
22
+ */
23
+ export class FleeState {
24
+ constructor(cfg, tr) {
25
+ this.cfg = cfg;
26
+ this.tr = createDefaultTransitionMap(tr);
27
+ }
28
+ enter(ctx) {
29
+ // Zero velocity immediately so the first update tick applies the correct
30
+ // flee direction rather than inheriting stale combat velocity.
31
+ ctx.halt();
32
+ ctx.pack?.broadcastAlertLevel('PANIC');
33
+ }
34
+ update(ctx, _deltaMs) {
35
+ const moraleState = ctx.state.moraleState;
36
+ // --- Morale recovery: fully STABLE → resume investigating ---
37
+ if (moraleState === 'STABLE') {
38
+ ctx.halt();
39
+ ctx.transition(this.tr.fleeOnCalmed);
40
+ return;
41
+ }
42
+ const threatX = ctx.state.lastKnownEnemyX;
43
+ const threatY = ctx.state.lastKnownEnemyY;
44
+ const dx = ctx.x - threatX;
45
+ const dy = ctx.y - threatY;
46
+ const dist = Math.sqrt(dx * dx + dy * dy);
47
+ // --- SHAKEN + far enough → hold and wait for morale recovery ---
48
+ if (moraleState === 'SHAKEN' && dist >= this.cfg.fleeDistance) {
49
+ ctx.halt();
50
+ return;
51
+ }
52
+ // --- Compute flee speed ---
53
+ const panicMult = moraleState === 'PANICKED' ? this.cfg.panicFleeMultiplier : 1.0;
54
+ const speed = this.cfg.approachSpeed * this.cfg.fleeSpeedMultiplier * panicMult;
55
+ awayFrom(ctx, threatX, threatY, speed);
56
+ }
57
+ exit(ctx) {
58
+ ctx.halt();
59
+ }
60
+ }
61
+ //# sourceMappingURL=FleeState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FleeState.js","sourceRoot":"","sources":["../../../src/states/handlers/FleeState.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,mEAAmE;AACnE,EAAE;AACF,sBAAsB;AACtB,iFAAiF;AACjF,iFAAiF;AACjF,EAAE;AACF,4DAA4D;AAC5D,8EAA8E;AAC9E,yDAAyD;AACzD,+EAA+E;AAC/E,EAAE;AACF,2BAA2B;AAC3B,iCAAiC;AACjC,+EAA+E;AAK/E,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAEpE,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC;;;;GAIG;AACH,MAAM,OAAO,SAAS;IAIpB,YAAY,GAAiB,EAAE,EAAiC;QAC9D,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,EAAE,GAAG,0BAA0B,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,GAAgB;QACpB,yEAAyE;QACzE,+DAA+D;QAC/D,GAAG,CAAC,IAAI,EAAE,CAAC;QACX,GAAG,CAAC,IAAI,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,GAAgB,EAAE,QAAgB;QACvC,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC;QAE1C,+DAA+D;QAC/D,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC7B,GAAG,CAAC,IAAI,EAAE,CAAC;YACX,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC;QAC1C,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC;QAE1C,MAAM,EAAE,GAAK,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC;QAC7B,MAAM,EAAE,GAAK,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAE1C,kEAAkE;QAClE,IAAI,WAAW,KAAK,QAAQ,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YAC9D,GAAG,CAAC,IAAI,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QAED,6BAA6B;QAC7B,MAAM,SAAS,GAAG,WAAW,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,GAAG,CAAC;QAClF,MAAM,KAAK,GAAO,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,mBAAmB,GAAG,SAAS,CAAC;QAEpF,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,CAAC,GAAgB;QACnB,GAAG,CAAC,IAAI,EAAE,CAAC;IACb,CAAC;CACF"}
@@ -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 grenade-throw state handler.
7
+ *
8
+ * A single instance can be shared across all NPC entities.
9
+ */
10
+ export declare class GrenadeState 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=GrenadeState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrenadeState.d.ts","sourceRoot":"","sources":["../../../src/states/handlers/GrenadeState.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;AAEpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE;;;;GAIG;AACH,qBAAa,YAAa,YAAW,mBAAmB;IACtD,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;IAI7B,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAoChD,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;CAG9B"}
@@ -0,0 +1,61 @@
1
+ // states/handlers/GrenadeState.ts
2
+ // NPC throws a grenade at the last known enemy position.
3
+ //
4
+ // enter: record grenadeThrowStartMs = ctx.now()
5
+ // update:
6
+ // - if grenadeCount <= 0 → transition 'COMBAT' immediately
7
+ // - if elapsed >= grenadeWindupMs:
8
+ // emit shoot (weaponType: 'GRENADE'), decrement grenadeCount,
9
+ // record lastGrenadeMs, transition 'COMBAT'
10
+ // - during windup: halt movement, face last known enemy
11
+ // exit: nothing
12
+ import { createDefaultTransitionMap } from '../IStateTransitionMap';
13
+ /**
14
+ * Stateless grenade-throw state handler.
15
+ *
16
+ * A single instance can be shared across all NPC entities.
17
+ */
18
+ export class GrenadeState {
19
+ constructor(cfg, tr) {
20
+ this.cfg = cfg;
21
+ this.tr = createDefaultTransitionMap(tr);
22
+ }
23
+ enter(ctx) {
24
+ ctx.state.grenadeThrowStartMs = ctx.now();
25
+ }
26
+ update(ctx, _deltaMs) {
27
+ // Abort immediately if no grenades are available.
28
+ if (ctx.state.grenadeCount <= 0) {
29
+ ctx.transition(this.tr.grenadeOnNoAmmo);
30
+ return;
31
+ }
32
+ const now = ctx.now();
33
+ const elapsed = now - ctx.state.grenadeThrowStartMs;
34
+ if (elapsed >= this.cfg.grenadeWindupMs) {
35
+ // Throw the grenade — emit shoot event with GRENADE weapon type.
36
+ ctx.emitShoot({
37
+ npcId: ctx.npcId,
38
+ x: ctx.x,
39
+ y: ctx.y,
40
+ targetX: ctx.state.lastKnownEnemyX,
41
+ targetY: ctx.state.lastKnownEnemyY,
42
+ weaponType: 'GRENADE',
43
+ });
44
+ ctx.state.grenadeCount--;
45
+ ctx.state.lastGrenadeMs = now;
46
+ ctx.transition(this.tr.grenadeOnComplete);
47
+ return;
48
+ }
49
+ // Still in wind-up: halt and face the last known enemy position.
50
+ ctx.halt();
51
+ const dx = ctx.state.lastKnownEnemyX - ctx.x;
52
+ const dy = ctx.state.lastKnownEnemyY - ctx.y;
53
+ if (dx !== 0 || dy !== 0) {
54
+ ctx.setRotation(Math.atan2(dy, dx));
55
+ }
56
+ }
57
+ exit(_ctx) {
58
+ // Nothing to clean up.
59
+ }
60
+ }
61
+ //# sourceMappingURL=GrenadeState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrenadeState.js","sourceRoot":"","sources":["../../../src/states/handlers/GrenadeState.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,yDAAyD;AACzD,EAAE;AACF,iDAAiD;AACjD,UAAU;AACV,6DAA6D;AAC7D,qCAAqC;AACrC,oEAAoE;AACpE,kDAAkD;AAClD,0DAA0D;AAC1D,kBAAkB;AAKlB,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAGpE;;;;GAIG;AACH,MAAM,OAAO,YAAY;IAIvB,YAAY,GAAiB,EAAE,EAAiC;QAC9D,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,EAAE,GAAG,0BAA0B,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,GAAgB;QACpB,GAAG,CAAC,KAAK,CAAC,mBAAmB,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC;IAC5C,CAAC;IAED,MAAM,CAAC,GAAgB,EAAE,QAAgB;QACvC,kDAAkD;QAClD,IAAI,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE,CAAC;YAChC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC;YACxC,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAAC;QAEpD,IAAI,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;YACxC,iEAAiE;YACjE,GAAG,CAAC,SAAS,CAAC;gBACZ,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,CAAC,EAAE,GAAG,CAAC,CAAC;gBACR,CAAC,EAAE,GAAG,CAAC,CAAC;gBACR,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,eAAe;gBAClC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,eAAe;gBAClC,UAAU,EAAE,SAAS;aACtB,CAAC,CAAC;YAEH,GAAG,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;YACzB,GAAG,CAAC,KAAK,CAAC,aAAa,GAAG,GAAG,CAAC;YAC9B,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QAED,iEAAiE;QACjE,GAAG,CAAC,IAAI,EAAE,CAAC;QACX,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,eAAe,GAAG,GAAG,CAAC,CAAC,CAAC;QAC7C,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,eAAe,GAAG,GAAG,CAAC,CAAC,CAAC;QAC7C,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;YACzB,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAiB;QACpB,uBAAuB;IACzB,CAAC;CACF"}
@@ -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 help-wounded handler (X-Ray 16 `xr_help_wounded` equivalent).
7
+ *
8
+ * A single instance can be shared across all NPC entities.
9
+ *
10
+ * Opt-in activation:
11
+ * ```ts
12
+ * const handlers = buildDefaultHandlerMap(cfg, {
13
+ * patrolOnWoundedAlly: 'HELP_WOUNDED',
14
+ * idleOnWoundedAlly: 'HELP_WOUNDED',
15
+ * });
16
+ * handlers.register('HELP_WOUNDED', new HelpWoundedState(cfg));
17
+ * ```
18
+ */
19
+ export declare class HelpWoundedState 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=HelpWoundedState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HelpWoundedState.d.ts","sourceRoot":"","sources":["../../../src/states/handlers/HelpWoundedState.ts"],"names":[],"mappings":"AA4BA,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;IAiFhD,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;CAQ7B"}