@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,88 @@
1
+ // states/handlers/_utils.ts
2
+ // Internal utility helpers shared by passive state handlers.
3
+ // NOT exported from the handlers barrel — internal implementation detail.
4
+ import { computePackSteering, blendWithPrimary, createDefaultSteeringConfig } from '../../navigation/SteeringBehaviors';
5
+ /**
6
+ * Return the Euclidean distance between two world positions.
7
+ */
8
+ export function distanceTo(ax, ay, bx, by) {
9
+ const dx = bx - ax;
10
+ const dy = by - ay;
11
+ return Math.sqrt(dx * dx + dy * dy);
12
+ }
13
+ /**
14
+ * Return the angle in radians from (ax, ay) toward (bx, by).
15
+ * 0 = right, π/2 = down (screen-space Y is positive downward).
16
+ */
17
+ export function angleToward(ax, ay, bx, by) {
18
+ return Math.atan2(by - ay, bx - ax);
19
+ }
20
+ /**
21
+ * Set the NPC's velocity so it moves toward (targetX, targetY) at the given
22
+ * speed (px/s). Also updates the NPC's rotation to face the target.
23
+ *
24
+ * If the NPC is already within 0.5 px of the target, velocity is zeroed to
25
+ * avoid jitter; no rotation change is applied.
26
+ */
27
+ export function moveToward(ctx, targetX, targetY, speed) {
28
+ const dx = targetX - ctx.x;
29
+ const dy = targetY - ctx.y;
30
+ const dist = Math.sqrt(dx * dx + dy * dy);
31
+ if (dist < 0.5) {
32
+ ctx.halt();
33
+ return;
34
+ }
35
+ ctx.setVelocity((dx / dist) * speed, (dy / dist) * speed);
36
+ ctx.setRotation(Math.atan2(dy, dx));
37
+ }
38
+ /**
39
+ * Set the NPC's velocity so it moves directly away from (fromX, fromY) at the
40
+ * given speed (px/s). Also updates the NPC's rotation to face away.
41
+ *
42
+ * If the NPC is exactly on top of (fromX, fromY), a default escape direction
43
+ * (positive X) is used instead.
44
+ */
45
+ export function awayFrom(ctx, fromX, fromY, speed) {
46
+ const dx = ctx.x - fromX;
47
+ const dy = ctx.y - fromY;
48
+ const dist = Math.sqrt(dx * dx + dy * dy);
49
+ if (dist < 0.5) {
50
+ // Standing exactly on the threat — escape along positive X by default.
51
+ ctx.setVelocity(speed, 0);
52
+ ctx.setRotation(0);
53
+ return;
54
+ }
55
+ ctx.setVelocity((dx / dist) * speed, (dy / dist) * speed);
56
+ ctx.setRotation(Math.atan2(dy, dx));
57
+ }
58
+ /**
59
+ * Opt-in convenience helper: computes pack steering (separation + cohesion) from
60
+ * nearby ally positions and blends it with a primary movement direction before
61
+ * calling `ctx.setVelocity()` and `ctx.setRotation()`.
62
+ *
63
+ * State handlers that want group-aware movement call this instead of
64
+ * `moveToward()` when allies are visible.
65
+ *
66
+ * For advanced scenarios (custom forces, alignment, formation) use the
67
+ * composable primitives directly:
68
+ * `computePackSteering() + combineForces() + blendWithPrimary()`
69
+ *
70
+ * @param ctx - NPC context (provides position and setVelocity/setRotation).
71
+ * @param allies - Nearby ally positions (e.g. from ctx.perception.getVisibleAllies()).
72
+ * @param config - Steering configuration.
73
+ * @param primaryVx - Normalised X component of the desired movement direction.
74
+ * @param primaryVy - Normalised Y component of the desired movement direction.
75
+ * @param speed - Base movement speed (px/s).
76
+ * @param weight - Blend weight for the steering force [0..1]. @default 0.35
77
+ */
78
+ export function applyPackSteering(ctx, allies, config, primaryVx, primaryVy, speed, weight = 0.35) {
79
+ const self = { x: ctx.x, y: ctx.y };
80
+ const force = computePackSteering(self, allies, config);
81
+ const { vx, vy } = blendWithPrimary(primaryVx, primaryVy, force, speed, weight);
82
+ ctx.setVelocity(vx, vy);
83
+ ctx.setRotation(Math.atan2(vy, vx));
84
+ }
85
+ // Re-export so handlers can build the config once in their constructor
86
+ // without importing directly from '../../navigation/SteeringBehaviors'.
87
+ export { createDefaultSteeringConfig };
88
+ //# sourceMappingURL=_utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_utils.js","sourceRoot":"","sources":["../../../src/states/handlers/_utils.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,6DAA6D;AAC7D,0EAA0E;AAG1E,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AAGxH;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU;IACvE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACnB,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACnB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU;IACxE,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;AACtC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CACxB,GAAgB,EAChB,OAAe,EACf,OAAe,EACf,KAAa;IAEb,MAAM,EAAE,GAAG,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC;IAC3B,MAAM,EAAE,GAAG,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC;IAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAE1C,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC;QACf,GAAG,CAAC,IAAI,EAAE,CAAC;QACX,OAAO;IACT,CAAC;IAED,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;IAC1D,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AACtC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CACtB,GAAgB,EAChB,KAAa,EACb,KAAa,EACb,KAAa;IAEb,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;IACzB,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;IACzB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAE1C,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC;QACf,uEAAuE;QACvE,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC1B,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QACnB,OAAO;IACT,CAAC;IAED,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;IAC1D,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AACtC,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAAgB,EAChB,MAA+C,EAC/C,MAAuB,EACvB,SAAiB,EACjB,SAAiB,EACjB,KAAa,EACb,MAAM,GAAG,IAAI;IAEb,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;IACpC,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACxD,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,gBAAgB,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAChF,GAAG,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACxB,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,uEAAuE;AACvE,wEAAwE;AACxE,OAAO,EAAE,2BAA2B,EAAE,CAAC"}
@@ -0,0 +1,25 @@
1
+ export { DeadState } from './DeadState';
2
+ export { IdleState } from './IdleState';
3
+ export { PatrolState } from './PatrolState';
4
+ export { AlertState } from './AlertState';
5
+ export { FleeState } from './FleeState';
6
+ export { SearchState } from './SearchState';
7
+ export { CampState } from './CampState';
8
+ export { SleepState } from './SleepState';
9
+ export { CombatState } from './CombatState';
10
+ export { TakeCoverState } from './TakeCoverState';
11
+ export { GrenadeState } from './GrenadeState';
12
+ export { CombatTransitionHandler } from './CombatTransitionHandler';
13
+ export { EvadeGrenadeState } from './EvadeGrenadeState';
14
+ export { WoundedState } from './WoundedState';
15
+ export { RetreatState } from './RetreatState';
16
+ export { MonsterCombatController, CHORNOBYL_ABILITY_SELECTOR } from './MonsterCombatController';
17
+ export type { MonsterAbilitySelector } from './MonsterCombatController';
18
+ export { ChargeState } from './ChargeState';
19
+ export { StalkState } from './StalkState';
20
+ export { LeapState } from './LeapState';
21
+ export { PsiAttackState } from './PsiAttackState';
22
+ export { InvestigateState } from './InvestigateState';
23
+ export { HelpWoundedState } from './HelpWoundedState';
24
+ export { KillWoundedState } from './KillWoundedState';
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/states/handlers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAQ,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAQ,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAO,cAAc,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAQ,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAQ,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAO,cAAc,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAkB,eAAe,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAe,kBAAkB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAiB,gBAAgB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAY,qBAAqB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAiB,gBAAgB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAiB,gBAAgB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAChG,YAAY,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAkB,eAAe,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAmB,cAAc,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAoB,aAAa,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAe,kBAAkB,CAAC;AAI3D,OAAO,EAAE,gBAAgB,EAAE,MAAa,oBAAoB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAa,oBAAoB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAa,oBAAoB,CAAC"}
@@ -0,0 +1,28 @@
1
+ // states/handlers barrel
2
+ export { DeadState } from './DeadState';
3
+ export { IdleState } from './IdleState';
4
+ export { PatrolState } from './PatrolState';
5
+ export { AlertState } from './AlertState';
6
+ export { FleeState } from './FleeState';
7
+ export { SearchState } from './SearchState';
8
+ export { CampState } from './CampState';
9
+ export { SleepState } from './SleepState';
10
+ export { CombatState } from './CombatState';
11
+ export { TakeCoverState } from './TakeCoverState';
12
+ export { GrenadeState } from './GrenadeState';
13
+ export { CombatTransitionHandler } from './CombatTransitionHandler';
14
+ export { EvadeGrenadeState } from './EvadeGrenadeState';
15
+ export { WoundedState } from './WoundedState';
16
+ export { RetreatState } from './RetreatState';
17
+ export { MonsterCombatController, CHORNOBYL_ABILITY_SELECTOR } from './MonsterCombatController';
18
+ export { ChargeState } from './ChargeState';
19
+ export { StalkState } from './StalkState';
20
+ export { LeapState } from './LeapState';
21
+ export { PsiAttackState } from './PsiAttackState';
22
+ // ── Opt-in handlers (not registered by buildDefaultHandlerMap / buildMonsterHandlerMap) ──
23
+ // Register manually: handlers.register('INVESTIGATE', new InvestigateState(cfg));
24
+ // Also opt-in: CombatTransitionHandler (exported above).
25
+ export { InvestigateState } from './InvestigateState';
26
+ export { HelpWoundedState } from './HelpWoundedState';
27
+ export { KillWoundedState } from './KillWoundedState';
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/states/handlers/index.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,OAAO,EAAE,SAAS,EAAE,MAAQ,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAQ,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAO,cAAc,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAQ,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAQ,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAO,cAAc,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAkB,eAAe,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAe,kBAAkB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAiB,gBAAgB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAY,qBAAqB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAiB,gBAAgB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAiB,gBAAgB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAEhG,OAAO,EAAE,WAAW,EAAE,MAAkB,eAAe,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAmB,cAAc,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAoB,aAAa,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAe,kBAAkB,CAAC;AAC3D,4FAA4F;AAC5F,kFAAkF;AAClF,yDAAyD;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAa,oBAAoB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAa,oBAAoB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAa,oBAAoB,CAAC"}
@@ -0,0 +1,17 @@
1
+ export type { IStateConfig, IMovementConfig, ICombatConfig, IMonsterConfig, ITimingConfig } from './IStateConfig';
2
+ export { createDefaultStateConfig } from './IStateConfig';
3
+ export * from './IStateTransitionMap';
4
+ export type { ILoopholeState, IChargePhase, IStalkPhase, ILeapPhase, IPsiPhase, INPCOnlineState, } from './INPCOnlineState';
5
+ export { createDefaultNPCOnlineState } from './NPCOnlineState';
6
+ export type { INPCPerception, INPCHealth, ICoverAccess, IDangerAccess, IRestrictedZoneAccess, ISquadAccess, IConditionAccess, ISuspicionAccess, IShootPayload, IMeleeHitPayload, INPCContext, } from './INPCContext';
7
+ export type { IPackAccess, IPackTarget, PackAlertLevel } from './pack/IPackAccess';
8
+ export { PACK_ALERT_ORDER } from './pack/IPackAccess';
9
+ export type { IOnlineStateHandler } from './IOnlineStateHandler';
10
+ export { StateHandlerMap } from './StateHandlerMap';
11
+ export type { IVisibleEntity, INearbyItem } from './NPCPerception';
12
+ export { NPCPerception } from './NPCPerception';
13
+ export * from './handlers/index';
14
+ export type { IOnlineDriverHost } from './OnlineAIDriver';
15
+ export { OnlineAIDriver } from './OnlineAIDriver';
16
+ export { buildDefaultHandlerMap, buildMonsterHandlerMap, buildChornobylMonsterHandlerMap, ONLINE_STATE } from './OnlineStateRegistryBuilder';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/states/index.ts"],"names":[],"mappings":"AAGA,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAClH,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,cAAc,uBAAuB,CAAC;AAEtC,YAAY,EACV,cAAc,EACd,YAAY,EACZ,WAAW,EACX,UAAU,EACV,SAAS,EACT,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAE/D,YAAY,EACV,cAAc,EACd,UAAU,EACV,YAAY,EACZ,aAAa,EACb,qBAAqB,EACrB,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,WAAW,GACZ,MAAM,eAAe,CAAC;AAEvB,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,cAAc,kBAAkB,CAAC;AAEjC,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,+BAA+B,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC"}
@@ -0,0 +1,12 @@
1
+ // states sub-path barrel
2
+ // Foundation layer for Phaser-free NPC online state handlers.
3
+ export { createDefaultStateConfig } from './IStateConfig';
4
+ export * from './IStateTransitionMap';
5
+ export { createDefaultNPCOnlineState } from './NPCOnlineState';
6
+ export { PACK_ALERT_ORDER } from './pack/IPackAccess';
7
+ export { StateHandlerMap } from './StateHandlerMap';
8
+ export { NPCPerception } from './NPCPerception';
9
+ export * from './handlers/index';
10
+ export { OnlineAIDriver } from './OnlineAIDriver';
11
+ export { buildDefaultHandlerMap, buildMonsterHandlerMap, buildChornobylMonsterHandlerMap, ONLINE_STATE } from './OnlineStateRegistryBuilder';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/states/index.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,8DAA8D;AAG9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,cAAc,uBAAuB,CAAC;AAWtC,OAAO,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAiB/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAItD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,cAAc,kBAAkB,CAAC;AAGjC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,+BAA+B,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC"}
@@ -0,0 +1,46 @@
1
+ export type PackAlertLevel = 'NONE' | 'ALERTED' | 'COMBAT' | 'PANIC';
2
+ /**
3
+ * Escalation order used for max-wins semantics in `broadcastAlertLevel`.
4
+ * Each level supersedes all levels to its left.
5
+ */
6
+ export declare const PACK_ALERT_ORDER: ReadonlyArray<PackAlertLevel>;
7
+ export interface IPackTarget {
8
+ readonly id: string | null;
9
+ readonly x: number;
10
+ readonly y: number;
11
+ }
12
+ /**
13
+ * Opt-in pack coordination port for monster groups (Dog, Tushkano, etc.).
14
+ *
15
+ * Implement on a shared pack record accessible to all group members. State
16
+ * handlers call `broadcastTarget` / `broadcastAlertLevel` when they spot an
17
+ * enemy or start fleeing; idle/patrol members poll `getPackAlertLevel` to
18
+ * activate without waiting for individual perception.
19
+ *
20
+ * Register by assigning the accessor to `ctx.pack` in the host entity wrapper.
21
+ *
22
+ * ## TTL decay contract (livelock prevention)
23
+ *
24
+ * The host implementation is responsible for de-escalating the alert level over
25
+ * time. Without this the pack can loop indefinitely between PATROL and ALERT
26
+ * after a contact fades. The recommended approach is to track the last broadcast
27
+ * timestamp per level and reset to 'NONE' after `cfg.packAlertTtlMs` elapses
28
+ * without a refresh broadcast.
29
+ */
30
+ export interface IPackAccess {
31
+ /** Highest alert level currently active in the pack. */
32
+ getPackAlertLevel(): PackAlertLevel;
33
+ /** Last enemy position broadcast by any pack member, or null if none. */
34
+ getPackTarget(): IPackTarget | null;
35
+ /** Broadcast a confirmed enemy position to all pack members. */
36
+ broadcastTarget(targetId: string | null, x: number, y: number): void;
37
+ /**
38
+ * Escalate the pack's shared alert level.
39
+ *
40
+ * **Max-wins semantics** — the level can only increase within the current TTL
41
+ * window. See `PACK_ALERT_ORDER` for the escalation order. The host must
42
+ * implement TTL-based decay back to 'NONE' (see class JSDoc above).
43
+ */
44
+ broadcastAlertLevel(level: PackAlertLevel): void;
45
+ }
46
+ //# sourceMappingURL=IPackAccess.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IPackAccess.d.ts","sourceRoot":"","sources":["../../../src/states/pack/IPackAccess.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;AAErE;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,aAAa,CAAC,cAAc,CAE1D,CAAC;AAEF,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,WAAW;IAC1B,wDAAwD;IACxD,iBAAiB,IAAI,cAAc,CAAC;IAEpC,yEAAyE;IACzE,aAAa,IAAI,WAAW,GAAG,IAAI,CAAC;IAEpC,gEAAgE;IAChE,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAErE;;;;;;OAMG;IACH,mBAAmB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;CAClD"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Escalation order used for max-wins semantics in `broadcastAlertLevel`.
3
+ * Each level supersedes all levels to its left.
4
+ */
5
+ export const PACK_ALERT_ORDER = [
6
+ 'NONE', 'ALERTED', 'COMBAT', 'PANIC',
7
+ ];
8
+ //# sourceMappingURL=IPackAccess.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IPackAccess.js","sourceRoot":"","sources":["../../../src/states/pack/IPackAccess.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAkC;IAC7D,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO;CACrC,CAAC"}
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Named constants for the built-in suspicion stimuli.
3
+ *
4
+ * Using these avoids magic strings, but any string is a valid
5
+ * {@link SuspicionStimulus}.
6
+ */
7
+ export declare const SuspicionStimuli: {
8
+ /** Gunshot, explosion sound heard nearby. */
9
+ readonly SOUND: "sound";
10
+ /** Enemy glimpsed briefly — partial FOV or behind cover. */
11
+ readonly PARTIAL_SIGHT: "partial_sight";
12
+ /** Footstep sounds detected. */
13
+ readonly FOOTSTEP: "footstep";
14
+ /** Explosion in vicinity. */
15
+ readonly EXPLOSION: "explosion";
16
+ /** NPC discovered a dead body in the area. */
17
+ readonly BODY_FOUND: "body_found";
18
+ };
19
+ /**
20
+ * Open suspicion stimulus type.
21
+ *
22
+ * Derived from {@link SuspicionStimuli} so the type and constants stay in sync.
23
+ * Any string is valid — games can add their own stimuli without touching the SDK.
24
+ *
25
+ * @example
26
+ * accumulator.add(SuspicionStimuli.SOUND, 0.4, gunX, gunY);
27
+ * accumulator.add('psi_interference', 0.3);
28
+ */
29
+ export type SuspicionStimulus = (typeof SuspicionStimuli)[keyof typeof SuspicionStimuli] | (string & {});
30
+ /**
31
+ * Tuning parameters for a {@link SuspicionAccumulator}.
32
+ * All fields have defaults via {@link createDefaultSuspicionConfig}.
33
+ */
34
+ export interface ISuspicionConfig {
35
+ /**
36
+ * How fast suspicion decays (level/second) when no stimuli are added.
37
+ * A value of 0.08 means a fully saturated accumulator empties in ~12.5s.
38
+ * @default 0.08
39
+ */
40
+ readonly decayRate: number;
41
+ /**
42
+ * Maximum suspicion level. Levels are clamped to `[0, maxLevel]`.
43
+ * @default 1.0
44
+ */
45
+ readonly maxLevel?: number;
46
+ }
47
+ /**
48
+ * Create an {@link ISuspicionConfig} with production defaults.
49
+ * Pass a partial override object to tune individual values.
50
+ *
51
+ * @example
52
+ * const cfg = createDefaultSuspicionConfig({ decayRate: 0.03 });
53
+ */
54
+ export declare function createDefaultSuspicionConfig(overrides?: Partial<ISuspicionConfig>): ISuspicionConfig;
55
+ /**
56
+ * Per-NPC suspicion/alertness accumulator.
57
+ *
58
+ * Tracks cumulative threat intensity for an NPC by accumulating stimuli
59
+ * (sounds, partial sightings, discovered bodies) over time, with continuous
60
+ * decay toward zero when no new threats are detected.
61
+ *
62
+ * When the level exceeds a configurable threshold (set in {@link IStateConfig}
63
+ * via `suspicionAlertThreshold`), state handlers transition to ALERT.
64
+ *
65
+ * ### Wiring example (host layer)
66
+ * ```ts
67
+ * const suspicion = new SuspicionAccumulator({ decayRate: 0.05 });
68
+ *
69
+ * const ctx: INPCContext = {
70
+ * // ...
71
+ * suspicion, // SuspicionAccumulator structurally satisfies ISuspicionAccess
72
+ * };
73
+ *
74
+ * // Per-frame update (before the state machine tick):
75
+ * suspicion.update(deltaMs / 1000);
76
+ *
77
+ * // Game event handlers:
78
+ * onGunshot(x, y) {
79
+ * suspicionFor(nearNpcId).add(SuspicionStimuli.SOUND, 0.4, x, y);
80
+ * }
81
+ * // NPCSensors integration:
82
+ * for (const event of sensors.detectSound(pos, range, id, faction, hearers)) {
83
+ * suspicionFor(event.observerId).add(
84
+ * SuspicionStimuli.SOUND,
85
+ * event.confidence * 0.5,
86
+ * pos.x, pos.y,
87
+ * );
88
+ * }
89
+ * ```
90
+ *
91
+ * ### Opt-in / opt-out
92
+ * - **Full feature**: wire as shown above, call `add()` on stimuli.
93
+ * - **Read only**: implement seam without calling `add()` — no accumulation.
94
+ * - **Fully disabled**: leave `ctx.suspicion = null` — all state handler
95
+ * checks are no-ops via `ctx.suspicion?.hasReachedAlert(...)`.
96
+ */
97
+ export declare class SuspicionAccumulator {
98
+ private readonly config;
99
+ private level;
100
+ private lastKnownX;
101
+ private lastKnownY;
102
+ constructor(config?: Partial<ISuspicionConfig>);
103
+ /**
104
+ * Add suspicion from a stimulus event.
105
+ *
106
+ * **Host use only.** State handlers read via {@link hasReachedAlert} /
107
+ * {@link getLevel} only. Stimuli are driven by the host layer (gunshots,
108
+ * partial sightings, discovered bodies, etc.).
109
+ *
110
+ * @param stimulus - Type of stimulus (semantic label — does not affect storage).
111
+ * @param amount - Positive amount to add. Negative values are ignored.
112
+ * @param x - Optional threat X position; becomes {@link getLastKnownPosition}.
113
+ * @param y - Optional threat Y position; becomes {@link getLastKnownPosition}.
114
+ */
115
+ add(stimulus: SuspicionStimulus, amount: number, x?: number, y?: number): void;
116
+ /**
117
+ * Current suspicion level in `[0, maxLevel]`.
118
+ * Returns `0` initially or after the level has fully decayed.
119
+ */
120
+ getLevel(): number;
121
+ /**
122
+ * Returns `true` if the current level is **strictly greater than** the
123
+ * given threshold.
124
+ *
125
+ * When `threshold` is omitted, falls back to the configured `maxLevel`.
126
+ * Since `add()` clamps `level` to `maxLevel`, `level > maxLevel` is always
127
+ * `false` — the no-arg form **never** triggers. Always pass an explicit
128
+ * threshold (e.g. `IStateConfig.suspicionAlertThreshold`).
129
+ *
130
+ * @param threshold - Exclusive comparison value. @default config.maxLevel
131
+ */
132
+ hasReachedAlert(threshold?: number): boolean;
133
+ /**
134
+ * Last threat position associated with a suspicion stimulus.
135
+ * Returns `null` if no position has been provided via {@link add}.
136
+ */
137
+ getLastKnownPosition(): {
138
+ x: number;
139
+ y: number;
140
+ } | null;
141
+ /**
142
+ * Apply time-based decay to the suspicion level.
143
+ *
144
+ * The host calls this each game frame with `deltaMs / 1000`.
145
+ * Suspicion decays by `decayRate * deltaSec` each frame until it reaches zero.
146
+ *
147
+ * @param deltaSec - Elapsed time since last update, in seconds.
148
+ */
149
+ update(deltaSec: number): void;
150
+ /**
151
+ * Clear the stored threat position without resetting the suspicion level.
152
+ *
153
+ * Useful when the host wants to discard a stale position
154
+ * while keeping the accumulated level intact.
155
+ */
156
+ clearPosition(): void;
157
+ /**
158
+ * Reset suspicion level and threat position.
159
+ *
160
+ * State handlers call this after triggering an ALERT transition so
161
+ * the NPC starts fresh in the new state rather than re-triggering
162
+ * immediately on re-entry to PATROL/IDLE.
163
+ */
164
+ clear(): void;
165
+ }
166
+ //# sourceMappingURL=SuspicionAccumulator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SuspicionAccumulator.d.ts","sourceRoot":"","sources":["../../src/suspicion/SuspicionAccumulator.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB;IAC3B,6CAA6C;;IAE7C,4DAA4D;;IAE5D,gCAAgC;;IAEhC,6BAA6B;;IAE7B,8CAA8C;;CAEtC,CAAC;AAEX;;;;;;;;;GASG;AACH,MAAM,MAAM,iBAAiB,GACzB,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,OAAO,gBAAgB,CAAC,GACxD,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAMlB;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC1C,SAAS,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GACpC,gBAAgB,CAElB;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;IACpD,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,UAAU,CAAuB;gBAE7B,MAAM,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC;IAY9C;;;;;;;;;;;OAWG;IACH,GAAG,CAAC,QAAQ,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAgB9E;;;OAGG;IACH,QAAQ,IAAI,MAAM;IAIlB;;;;;;;;;;OAUG;IACH,eAAe,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO;IAI5C;;;OAGG;IACH,oBAAoB,IAAI;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IASvD;;;;;;;OAOG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAU9B;;;;;OAKG;IACH,aAAa,IAAI,IAAI;IAKrB;;;;;;OAMG;IACH,KAAK,IAAI,IAAI;CAKd"}
@@ -0,0 +1,191 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Stimulus types
3
+ // ---------------------------------------------------------------------------
4
+ /**
5
+ * Named constants for the built-in suspicion stimuli.
6
+ *
7
+ * Using these avoids magic strings, but any string is a valid
8
+ * {@link SuspicionStimulus}.
9
+ */
10
+ export const SuspicionStimuli = {
11
+ /** Gunshot, explosion sound heard nearby. */
12
+ SOUND: 'sound',
13
+ /** Enemy glimpsed briefly — partial FOV or behind cover. */
14
+ PARTIAL_SIGHT: 'partial_sight',
15
+ /** Footstep sounds detected. */
16
+ FOOTSTEP: 'footstep',
17
+ /** Explosion in vicinity. */
18
+ EXPLOSION: 'explosion',
19
+ /** NPC discovered a dead body in the area. */
20
+ BODY_FOUND: 'body_found',
21
+ };
22
+ /**
23
+ * Create an {@link ISuspicionConfig} with production defaults.
24
+ * Pass a partial override object to tune individual values.
25
+ *
26
+ * @example
27
+ * const cfg = createDefaultSuspicionConfig({ decayRate: 0.03 });
28
+ */
29
+ export function createDefaultSuspicionConfig(overrides) {
30
+ return { decayRate: 0.08, ...overrides };
31
+ }
32
+ // ---------------------------------------------------------------------------
33
+ // SuspicionAccumulator
34
+ // ---------------------------------------------------------------------------
35
+ /**
36
+ * Per-NPC suspicion/alertness accumulator.
37
+ *
38
+ * Tracks cumulative threat intensity for an NPC by accumulating stimuli
39
+ * (sounds, partial sightings, discovered bodies) over time, with continuous
40
+ * decay toward zero when no new threats are detected.
41
+ *
42
+ * When the level exceeds a configurable threshold (set in {@link IStateConfig}
43
+ * via `suspicionAlertThreshold`), state handlers transition to ALERT.
44
+ *
45
+ * ### Wiring example (host layer)
46
+ * ```ts
47
+ * const suspicion = new SuspicionAccumulator({ decayRate: 0.05 });
48
+ *
49
+ * const ctx: INPCContext = {
50
+ * // ...
51
+ * suspicion, // SuspicionAccumulator structurally satisfies ISuspicionAccess
52
+ * };
53
+ *
54
+ * // Per-frame update (before the state machine tick):
55
+ * suspicion.update(deltaMs / 1000);
56
+ *
57
+ * // Game event handlers:
58
+ * onGunshot(x, y) {
59
+ * suspicionFor(nearNpcId).add(SuspicionStimuli.SOUND, 0.4, x, y);
60
+ * }
61
+ * // NPCSensors integration:
62
+ * for (const event of sensors.detectSound(pos, range, id, faction, hearers)) {
63
+ * suspicionFor(event.observerId).add(
64
+ * SuspicionStimuli.SOUND,
65
+ * event.confidence * 0.5,
66
+ * pos.x, pos.y,
67
+ * );
68
+ * }
69
+ * ```
70
+ *
71
+ * ### Opt-in / opt-out
72
+ * - **Full feature**: wire as shown above, call `add()` on stimuli.
73
+ * - **Read only**: implement seam without calling `add()` — no accumulation.
74
+ * - **Fully disabled**: leave `ctx.suspicion = null` — all state handler
75
+ * checks are no-ops via `ctx.suspicion?.hasReachedAlert(...)`.
76
+ */
77
+ export class SuspicionAccumulator {
78
+ constructor(config) {
79
+ this.level = 0;
80
+ this.lastKnownX = null;
81
+ this.lastKnownY = null;
82
+ const merged = createDefaultSuspicionConfig(config);
83
+ this.config = {
84
+ decayRate: merged.decayRate,
85
+ maxLevel: merged.maxLevel ?? 1.0,
86
+ };
87
+ }
88
+ // ---------------------------------------------------------------------------
89
+ // Write (host use only)
90
+ // ---------------------------------------------------------------------------
91
+ /**
92
+ * Add suspicion from a stimulus event.
93
+ *
94
+ * **Host use only.** State handlers read via {@link hasReachedAlert} /
95
+ * {@link getLevel} only. Stimuli are driven by the host layer (gunshots,
96
+ * partial sightings, discovered bodies, etc.).
97
+ *
98
+ * @param stimulus - Type of stimulus (semantic label — does not affect storage).
99
+ * @param amount - Positive amount to add. Negative values are ignored.
100
+ * @param x - Optional threat X position; becomes {@link getLastKnownPosition}.
101
+ * @param y - Optional threat Y position; becomes {@link getLastKnownPosition}.
102
+ */
103
+ add(stimulus, amount, x, y) {
104
+ if (!(amount > 0))
105
+ return; // rejects NaN and ≤ 0
106
+ this.level = Math.min(this.level + amount, this.config.maxLevel);
107
+ if (x !== undefined && y !== undefined) {
108
+ this.lastKnownX = x;
109
+ this.lastKnownY = y;
110
+ }
111
+ // Stimulus parameter is accepted for semantic clarity and future auditing,
112
+ // but the accumulator stores a single aggregate level (not per-stimulus).
113
+ void stimulus;
114
+ }
115
+ // ---------------------------------------------------------------------------
116
+ // Read
117
+ // ---------------------------------------------------------------------------
118
+ /**
119
+ * Current suspicion level in `[0, maxLevel]`.
120
+ * Returns `0` initially or after the level has fully decayed.
121
+ */
122
+ getLevel() {
123
+ return this.level;
124
+ }
125
+ /**
126
+ * Returns `true` if the current level is **strictly greater than** the
127
+ * given threshold.
128
+ *
129
+ * When `threshold` is omitted, falls back to the configured `maxLevel`.
130
+ * Since `add()` clamps `level` to `maxLevel`, `level > maxLevel` is always
131
+ * `false` — the no-arg form **never** triggers. Always pass an explicit
132
+ * threshold (e.g. `IStateConfig.suspicionAlertThreshold`).
133
+ *
134
+ * @param threshold - Exclusive comparison value. @default config.maxLevel
135
+ */
136
+ hasReachedAlert(threshold) {
137
+ return this.level > (threshold ?? this.config.maxLevel);
138
+ }
139
+ /**
140
+ * Last threat position associated with a suspicion stimulus.
141
+ * Returns `null` if no position has been provided via {@link add}.
142
+ */
143
+ getLastKnownPosition() {
144
+ if (this.lastKnownX === null || this.lastKnownY === null)
145
+ return null;
146
+ return { x: this.lastKnownX, y: this.lastKnownY };
147
+ }
148
+ // ---------------------------------------------------------------------------
149
+ // Time-based decay
150
+ // ---------------------------------------------------------------------------
151
+ /**
152
+ * Apply time-based decay to the suspicion level.
153
+ *
154
+ * The host calls this each game frame with `deltaMs / 1000`.
155
+ * Suspicion decays by `decayRate * deltaSec` each frame until it reaches zero.
156
+ *
157
+ * @param deltaSec - Elapsed time since last update, in seconds.
158
+ */
159
+ update(deltaSec) {
160
+ if (!(deltaSec > 0))
161
+ return; // rejects NaN and negative (would increase level)
162
+ const next = this.level - this.config.decayRate * deltaSec;
163
+ this.level = next <= 0 ? 0 : next;
164
+ }
165
+ // ---------------------------------------------------------------------------
166
+ // Lifecycle
167
+ // ---------------------------------------------------------------------------
168
+ /**
169
+ * Clear the stored threat position without resetting the suspicion level.
170
+ *
171
+ * Useful when the host wants to discard a stale position
172
+ * while keeping the accumulated level intact.
173
+ */
174
+ clearPosition() {
175
+ this.lastKnownX = null;
176
+ this.lastKnownY = null;
177
+ }
178
+ /**
179
+ * Reset suspicion level and threat position.
180
+ *
181
+ * State handlers call this after triggering an ALERT transition so
182
+ * the NPC starts fresh in the new state rather than re-triggering
183
+ * immediately on re-entry to PATROL/IDLE.
184
+ */
185
+ clear() {
186
+ this.level = 0;
187
+ this.lastKnownX = null;
188
+ this.lastKnownY = null;
189
+ }
190
+ }
191
+ //# sourceMappingURL=SuspicionAccumulator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SuspicionAccumulator.js","sourceRoot":"","sources":["../../src/suspicion/SuspicionAccumulator.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,6CAA6C;IAC7C,KAAK,EAAU,OAAO;IACtB,4DAA4D;IAC5D,aAAa,EAAE,eAAe;IAC9B,gCAAgC;IAChC,QAAQ,EAAO,UAAU;IACzB,6BAA6B;IAC7B,SAAS,EAAM,WAAW;IAC1B,8CAA8C;IAC9C,UAAU,EAAK,YAAY;CACnB,CAAC;AAuCX;;;;;;GAMG;AACH,MAAM,UAAU,4BAA4B,CAC1C,SAAqC;IAErC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,SAAS,EAAE,CAAC;AAC3C,CAAC;AAED,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,MAAM,OAAO,oBAAoB;IAM/B,YAAY,MAAkC;QAJtC,UAAK,GAAW,CAAC,CAAC;QAClB,eAAU,GAAkB,IAAI,CAAC;QACjC,eAAU,GAAkB,IAAI,CAAC;QAGvC,MAAM,MAAM,GAAG,4BAA4B,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,GAAG;YACZ,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,QAAQ,EAAG,MAAM,CAAC,QAAQ,IAAI,GAAG;SAClC,CAAC;IACJ,CAAC;IAED,8EAA8E;IAC9E,wBAAwB;IACxB,8EAA8E;IAE9E;;;;;;;;;;;OAWG;IACH,GAAG,CAAC,QAA2B,EAAE,MAAc,EAAE,CAAU,EAAE,CAAU;QACrE,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YAAE,OAAO,CAAC,sBAAsB;QACjD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACjE,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACvC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;YACpB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QACtB,CAAC;QACD,2EAA2E;QAC3E,0EAA0E;QAC1E,KAAK,QAAQ,CAAC;IAChB,CAAC;IAED,8EAA8E;IAC9E,OAAO;IACP,8EAA8E;IAE9E;;;OAGG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED;;;;;;;;;;OAUG;IACH,eAAe,CAAC,SAAkB;QAChC,OAAO,IAAI,CAAC,KAAK,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAED;;;OAGG;IACH,oBAAoB;QAClB,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QACtE,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;IACpD,CAAC;IAED,8EAA8E;IAC9E,mBAAmB;IACnB,8EAA8E;IAE9E;;;;;;;OAOG;IACH,MAAM,CAAC,QAAgB;QACrB,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC;YAAE,OAAO,CAAC,kDAAkD;QAC/E,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC3D,IAAI,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACpC,CAAC;IAED,8EAA8E;IAC9E,YAAY;IACZ,8EAA8E;IAE9E;;;;;OAKG;IACH,aAAa;QACX,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;IAED;;;;;;OAMG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ export { SuspicionAccumulator, SuspicionStimuli, createDefaultSuspicionConfig, } from './SuspicionAccumulator';
2
+ export type { SuspicionStimulus, ISuspicionConfig, } from './SuspicionAccumulator';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/suspicion/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,4BAA4B,GAC7B,MAAM,wBAAwB,CAAC;AAEhC,YAAY,EACV,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { SuspicionAccumulator, SuspicionStimuli, createDefaultSuspicionConfig, } from './SuspicionAccumulator';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/suspicion/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,4BAA4B,GAC7B,MAAM,wBAAwB,CAAC"}