@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,194 @@
1
+ // animation/AnimationSelector.ts
2
+ // Pure state → animation key resolver.
3
+ // No framework dependencies — only string/number operations.
4
+ /**
5
+ * 8-way directional system for animation facing.
6
+ * Indexed 0–7 clockwise from North.
7
+ */
8
+ export const CompassIndex = {
9
+ N: 0,
10
+ NE: 1,
11
+ E: 2,
12
+ SE: 3,
13
+ S: 4,
14
+ SW: 5,
15
+ W: 6,
16
+ NW: 7,
17
+ };
18
+ const DIRECTION_SUFFIXES = ['N', 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW'];
19
+ /**
20
+ * Animation layer for multi-layer sprite rigs.
21
+ */
22
+ export const AnimLayer = {
23
+ LEGS: 0,
24
+ TORSO: 1,
25
+ HEAD: 2,
26
+ };
27
+ /**
28
+ * AI state → animation descriptor mapping.
29
+ * Exported as default; callers may supply a custom map to override.
30
+ */
31
+ export const DEFAULT_STATE_ANIM_MAP = {
32
+ IDLE: { base: 'idle', loop: true, frameRate: 10, layer: AnimLayer.LEGS, omitDirection: false },
33
+ PATROL: { base: 'walk', loop: true, frameRate: 10, layer: AnimLayer.LEGS, omitDirection: false },
34
+ ALERT: { base: 'walk_alert', loop: true, frameRate: 10, layer: AnimLayer.LEGS, omitDirection: false },
35
+ COMBAT: { base: 'combat', loop: false, frameRate: 12, layer: AnimLayer.TORSO, omitDirection: false },
36
+ TAKE_COVER: { base: 'crouch', loop: true, frameRate: 10, layer: AnimLayer.LEGS, omitDirection: false },
37
+ SEARCH: { base: 'walk_search', loop: true, frameRate: 10, layer: AnimLayer.LEGS, omitDirection: false },
38
+ FLEE: { base: 'run', loop: true, frameRate: 14, layer: AnimLayer.LEGS, omitDirection: false },
39
+ DEAD: { base: 'death', loop: false, frameRate: 8, layer: AnimLayer.LEGS, omitDirection: true },
40
+ GRENADE: { base: 'throw', loop: false, frameRate: 10, layer: AnimLayer.TORSO, omitDirection: true },
41
+ EVADE_GRENADE: { base: 'sprint', loop: true, frameRate: 14, layer: AnimLayer.LEGS, omitDirection: false },
42
+ WOUNDED: { base: 'crawl', loop: true, frameRate: 6, layer: AnimLayer.LEGS, omitDirection: false },
43
+ RETREAT: { base: 'run_fire', loop: true, frameRate: 14, layer: AnimLayer.LEGS, omitDirection: false },
44
+ CAMP: { base: 'idle', loop: true, frameRate: 10, layer: AnimLayer.LEGS, omitDirection: false },
45
+ SLEEP: { base: 'sleep', loop: true, frameRate: 4, layer: AnimLayer.LEGS, omitDirection: true },
46
+ // Monster states
47
+ CHARGE: { base: 'charge', loop: false, frameRate: 14, layer: AnimLayer.LEGS, omitDirection: false },
48
+ STALK: { base: 'stalk', loop: true, frameRate: 8, layer: AnimLayer.LEGS, omitDirection: false },
49
+ LEAP: { base: 'leap', loop: false, frameRate: 14, layer: AnimLayer.LEGS, omitDirection: false },
50
+ PSI_ATTACK: { base: 'psi', loop: false, frameRate: 10, layer: AnimLayer.TORSO, omitDirection: true },
51
+ };
52
+ const DEFAULT_DESCRIPTOR = {
53
+ base: 'idle', loop: true, frameRate: 10, layer: AnimLayer.LEGS, omitDirection: false,
54
+ };
55
+ /**
56
+ * Weapon suffix lookup.
57
+ * GRENADE and MEDKIT use 'unarmed' (no held weapon visible).
58
+ * Keys are strings for extensibility; numeric categories are stringified at lookup time.
59
+ */
60
+ export const DEFAULT_WEAPON_SUFFIXES = {
61
+ '0': 'pistol',
62
+ '1': 'shotgun',
63
+ '2': 'rifle',
64
+ '3': 'sniper',
65
+ '4': 'unarmed',
66
+ '5': 'unarmed',
67
+ };
68
+ // ---------------------------------------------------------------------------
69
+ // Direction caching — avoids atan2 + quantize when velocity barely changes.
70
+ // ---------------------------------------------------------------------------
71
+ /** Squared magnitude threshold below which a velocity delta is "insignificant". */
72
+ const DIRECTION_CACHE_EPSILON_SQ = 4.0; // ~2px/s change
73
+ /**
74
+ * Per-entity direction cache. Stores the last computed direction and the
75
+ * velocity that produced it. `resolve()` only calls `getDirection()` when the
76
+ * velocity has changed more than a small epsilon (squared-magnitude test).
77
+ *
78
+ * Allocate one instance per NPC and pass it into `getAnimationRequest()`.
79
+ */
80
+ export class DirectionCache {
81
+ constructor() {
82
+ this._lastVx = NaN;
83
+ this._lastVy = NaN;
84
+ this._dir = CompassIndex.S;
85
+ }
86
+ /**
87
+ * Return the cached direction or recompute if velocity changed significantly.
88
+ */
89
+ resolve(vx, vy) {
90
+ const dx = vx - this._lastVx;
91
+ const dy = vy - this._lastVy;
92
+ // NaN check on first call (NaN - anything = NaN, NaN > anything = false)
93
+ if (dx * dx + dy * dy > DIRECTION_CACHE_EPSILON_SQ || this._lastVx !== this._lastVx) {
94
+ this._lastVx = vx;
95
+ this._lastVy = vy;
96
+ this._dir = getDirection(vx, vy);
97
+ }
98
+ return this._dir;
99
+ }
100
+ /** Force-invalidate the cache (e.g. on teleport). */
101
+ invalidate() {
102
+ this._lastVx = NaN;
103
+ this._lastVy = NaN;
104
+ }
105
+ }
106
+ // ---------------------------------------------------------------------------
107
+ // Pre-built lookup table for default maps — avoids template literal per frame.
108
+ // Key format: `${state}|${weaponCategory}|${direction}`
109
+ // ---------------------------------------------------------------------------
110
+ const _defaultKeyLookup = /* @__PURE__ */ (() => {
111
+ const lut = new Map();
112
+ const states = Object.keys(DEFAULT_STATE_ANIM_MAP);
113
+ const weaponKeys = Object.keys(DEFAULT_WEAPON_SUFFIXES);
114
+ for (const state of states) {
115
+ const desc = DEFAULT_STATE_ANIM_MAP[state];
116
+ for (const wk of weaponKeys) {
117
+ const weapon = DEFAULT_WEAPON_SUFFIXES[wk];
118
+ if (desc.omitDirection) {
119
+ const animKey = `${desc.base}_${weapon}`;
120
+ for (let d = 0; d < 8; d++) {
121
+ lut.set(`${state}|${wk}|${d}`, animKey);
122
+ }
123
+ }
124
+ else {
125
+ for (let d = 0; d < 8; d++) {
126
+ lut.set(`${state}|${wk}|${d}`, `${desc.base}_${weapon}_${DIRECTION_SUFFIXES[d]}`);
127
+ }
128
+ }
129
+ }
130
+ }
131
+ return lut;
132
+ })();
133
+ /**
134
+ * Convert a 2D velocity vector to an 8-way CompassIndex.
135
+ * Zero vector defaults to South (rest facing).
136
+ */
137
+ export function getDirection(vx, vy) {
138
+ if (Math.abs(vx) < 0.01 && Math.abs(vy) < 0.01)
139
+ return CompassIndex.S;
140
+ // atan2 gives angle from positive X axis, CCW positive.
141
+ // Adding π/2 rotates so that North (vy<0 in screen space) maps to 0,
142
+ // East to π/2, South to π, West to 3π/2 — clockwise from North.
143
+ const angle = Math.atan2(vy, vx);
144
+ // Map to [0, 2π] then quantize into 8 sectors (each sector = π/4).
145
+ const normalized = ((angle + Math.PI * 0.5) % (Math.PI * 2) + Math.PI * 2) % (Math.PI * 2);
146
+ const sector = Math.floor((normalized + Math.PI / 8) / (Math.PI / 4)) % 8;
147
+ return sector;
148
+ }
149
+ /**
150
+ * Build an animation key from state, weapon type, and direction.
151
+ *
152
+ * Format: `{base}_{weapon}_{direction}` or `{base}_{weapon}` if direction omitted.
153
+ * Falls back to 'rifle' for unknown weapon types.
154
+ *
155
+ * @param animMap - Custom state → descriptor map. Uses DEFAULT_STATE_ANIM_MAP when omitted.
156
+ * @param weaponSuffixes - Custom weapon suffix map. Uses DEFAULT_WEAPON_SUFFIXES when omitted.
157
+ */
158
+ export function getAnimationKey(state, weaponType, direction, animMap, weaponSuffixes) {
159
+ // Fast path: use pre-built lookup table when both maps are defaults
160
+ if (animMap === undefined && weaponSuffixes === undefined) {
161
+ const cached = _defaultKeyLookup.get(`${state}|${String(weaponType)}|${direction}`);
162
+ if (cached !== undefined)
163
+ return cached;
164
+ }
165
+ // Slow path: custom maps or unknown state/weapon combination
166
+ const map = animMap ?? DEFAULT_STATE_ANIM_MAP;
167
+ const suffixes = weaponSuffixes ?? DEFAULT_WEAPON_SUFFIXES;
168
+ const desc = map[state] ?? DEFAULT_DESCRIPTOR;
169
+ const weapon = suffixes[String(weaponType)] ?? 'rifle';
170
+ if (desc.omitDirection) {
171
+ return `${desc.base}_${weapon}`;
172
+ }
173
+ return `${desc.base}_${weapon}_${DIRECTION_SUFFIXES[direction]}`;
174
+ }
175
+ /**
176
+ * Resolve a full animation request from AI state and movement data.
177
+ *
178
+ * @param input - Animation input (state, weapon, velocity, optional maps/cache).
179
+ * @returns Complete animation request with key, loop, frame rate, and layer.
180
+ */
181
+ export function getAnimationRequest(input) {
182
+ const { state, weaponCategory, velocity, animMap, weaponSuffixes, directionCache } = input;
183
+ const map = animMap ?? DEFAULT_STATE_ANIM_MAP;
184
+ const desc = map[state] ?? DEFAULT_DESCRIPTOR;
185
+ const direction = directionCache ? directionCache.resolve(velocity.x, velocity.y) : getDirection(velocity.x, velocity.y);
186
+ const key = getAnimationKey(state, weaponCategory, direction, animMap, weaponSuffixes);
187
+ return {
188
+ key,
189
+ loop: desc.loop,
190
+ frameRate: desc.frameRate,
191
+ layer: desc.layer,
192
+ };
193
+ }
194
+ //# sourceMappingURL=AnimationSelector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnimationSelector.js","sourceRoot":"","sources":["../../src/animation/AnimationSelector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { getDirection, getAnimationKey, getAnimationRequest, DirectionCache, CompassIndex, AnimLayer, DEFAULT_STATE_ANIM_MAP, DEFAULT_WEAPON_SUFFIXES, } from './AnimationSelector';
2
+ export type { IAnimationRequest, IAnimDescriptor, IAnimationInput } from './AnimationSelector';
3
+ export { AnimationController, } from './AnimationController';
4
+ export type { IAnimationDriver, IAnimPlayOptions, ILayerPriorityMap, IAnimationControllerConfig, } from './AnimationController';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/animation/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,YAAY,EACZ,SAAS,EACT,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE/F,OAAO,EACL,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,4 @@
1
+ // animation sub-path barrel
2
+ export { getDirection, getAnimationKey, getAnimationRequest, DirectionCache, CompassIndex, AnimLayer, DEFAULT_STATE_ANIM_MAP, DEFAULT_WEAPON_SUFFIXES, } from './AnimationSelector';
3
+ export { AnimationController, } from './AnimationController';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/animation/index.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,OAAO,EACL,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,YAAY,EACZ,SAAS,EACT,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,mBAAmB,GACpB,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,95 @@
1
+ import type { INPCLoadout } from '../types/IWeaponTypes';
2
+ /**
3
+ * Snapshot of an NPC's combat state for transition evaluation.
4
+ * Framework-agnostic — no entity references, only data.
5
+ */
6
+ export interface ICombatContext {
7
+ /** Current HP / max HP [0, 1]. */
8
+ readonly hpRatio: number;
9
+ /** Morale value [-1, 1]. */
10
+ readonly moraleValue: number;
11
+ /** Is morale in PANICKED state. */
12
+ readonly isPanicked: boolean;
13
+ /** Time since last visual contact with enemy (ms). */
14
+ readonly lostSightMs: number;
15
+ /** Distance to nearest known enemy (px). */
16
+ readonly distanceToEnemy: number;
17
+ /** Number of visible enemies. */
18
+ readonly visibleEnemyCount: number;
19
+ /** NPC weapon loadout for tactical decisions. */
20
+ readonly loadout: INPCLoadout;
21
+ /** Whether the NPC can switch targets (not inertia-locked). */
22
+ readonly canSwitchTarget: boolean;
23
+ /** Time since the NPC last exited wounded state (ms). Infinity if never. */
24
+ readonly timeSinceWoundedMs: number;
25
+ /** Whether a grenade/explosion danger is active near the NPC. */
26
+ readonly hasExplosiveDanger: boolean;
27
+ /** Whether the NPC has any ammo remaining. */
28
+ readonly hasAmmo: boolean;
29
+ }
30
+ /**
31
+ * Result of a transition rule evaluation.
32
+ * A string state key (framework-agnostic) or null to continue the chain.
33
+ */
34
+ export type TransitionResult = string | null;
35
+ /**
36
+ * A single rule in the combat transition chain.
37
+ *
38
+ * Rules are stateless pure functions — they read the combat context
39
+ * and return a target state string, or null to pass to the next rule.
40
+ */
41
+ export interface ITransitionRule {
42
+ readonly name: string;
43
+ readonly priority: number;
44
+ evaluate(context: ICombatContext, config: ICombatTransitionConfig): TransitionResult;
45
+ }
46
+ /**
47
+ * Configuration thresholds for combat transitions.
48
+ */
49
+ export interface ICombatTransitionConfig {
50
+ /** HP ratio below which the NPC is considered wounded. */
51
+ readonly woundedHpThreshold: number;
52
+ /** Minimum time before re-entering wounded state (ms). */
53
+ readonly woundedReentryCooldownMs: number;
54
+ /** Morale below which the NPC should retreat. */
55
+ readonly retreatMoraleThreshold: number;
56
+ /** Time without visual contact before throwing a grenade (ms). */
57
+ readonly grenadeLostSightMs: number;
58
+ /** Time without visual contact before searching (ms). */
59
+ readonly lostSightThresholdMs: number;
60
+ /** Minimum enemies for grenade throw. */
61
+ readonly grenadeMinEnemies: number;
62
+ /** Grenade throw distance range [min, max] (px). */
63
+ readonly grenadeMinDistance: number;
64
+ readonly grenadeMaxDistance: number;
65
+ }
66
+ /** Default production configuration. */
67
+ export declare function createDefaultCombatTransitionConfig(overrides?: Partial<ICombatTransitionConfig>): ICombatTransitionConfig;
68
+ /** Priority 1: Critically wounded NPC seeks safety. */
69
+ export declare const WoundedRule: ITransitionRule;
70
+ /** Priority 2: No ammo → retreat. */
71
+ export declare const NoAmmoRule: ITransitionRule;
72
+ /** Priority 3: Explosive danger nearby → evade. */
73
+ export declare const EvadeDangerRule: ITransitionRule;
74
+ /** Priority 4: Low morale → retreat; panicked → flee. */
75
+ export declare const MoraleRule: ITransitionRule;
76
+ /** Priority 5: Lost sight long enough, has grenades → throw. */
77
+ export declare const GrenadeOpportunityRule: ITransitionRule;
78
+ /** Priority 6: Lost sight for extended time → search. */
79
+ export declare const SearchRule: ITransitionRule;
80
+ /**
81
+ * The complete default combat transition chain.
82
+ * Rules are sorted by priority (lowest number = highest priority).
83
+ */
84
+ export declare const DEFAULT_COMBAT_RULES: readonly ITransitionRule[];
85
+ /**
86
+ * Evaluate all rules in priority order. Returns the first matching
87
+ * state transition, or null if no rule triggers.
88
+ *
89
+ * @param rules - Transition rules sorted by priority.
90
+ * @param context - Current combat snapshot.
91
+ * @param config - Threshold configuration.
92
+ * @returns Target state string, or null.
93
+ */
94
+ export declare function evaluateTransitions(rules: readonly ITransitionRule[], context: ICombatContext, config: ICombatTransitionConfig): TransitionResult;
95
+ //# sourceMappingURL=CombatTransitionChain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CombatTransitionChain.d.ts","sourceRoot":"","sources":["../../src/combat/CombatTransitionChain.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,kCAAkC;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,4BAA4B;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,mCAAmC;IACnC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,sDAAsD;IACtD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,4CAA4C;IAC5C,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,iCAAiC;IACjC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,iDAAiD;IACjD,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,+DAA+D;IAC/D,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,4EAA4E;IAC5E,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,iEAAiE;IACjE,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,8CAA8C;IAC9C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAAC;AAE7C;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,uBAAuB,GAAG,gBAAgB,CAAC;CACtF;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,0DAA0D;IAC1D,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,0DAA0D;IAC1D,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAC;IAC1C,iDAAiD;IACjD,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,kEAAkE;IAClE,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,yDAAyD;IACzD,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,yCAAyC;IACzC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,oDAAoD;IACpD,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;CACrC;AAED,wCAAwC;AACxC,wBAAgB,mCAAmC,CACjD,SAAS,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAC3C,uBAAuB,CAYzB;AAMD,uDAAuD;AACvD,eAAO,MAAM,WAAW,EAAE,eAQzB,CAAC;AAEF,qCAAqC;AACrC,eAAO,MAAM,UAAU,EAAE,eAMxB,CAAC;AAEF,mDAAmD;AACnD,eAAO,MAAM,eAAe,EAAE,eAM7B,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,UAAU,EAAE,eASxB,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,sBAAsB,EAAE,eAepC,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,UAAU,EAAE,eAMxB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,eAAe,EAO1D,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,SAAS,eAAe,EAAE,EACjC,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,uBAAuB,GAC9B,gBAAgB,CAMlB"}
@@ -0,0 +1,117 @@
1
+ // combat/CombatTransitionChain.ts
2
+ // Chain of Responsibility pattern for combat state transitions.
3
+ // Each rule is a pure function evaluated in priority order.
4
+ /** Default production configuration. */
5
+ export function createDefaultCombatTransitionConfig(overrides) {
6
+ return {
7
+ woundedHpThreshold: 0.2,
8
+ woundedReentryCooldownMs: 10000,
9
+ retreatMoraleThreshold: -0.3,
10
+ grenadeLostSightMs: 2000,
11
+ lostSightThresholdMs: 3000,
12
+ grenadeMinEnemies: 2,
13
+ grenadeMinDistance: 80,
14
+ grenadeMaxDistance: 250,
15
+ ...overrides,
16
+ };
17
+ }
18
+ // -----------------------------------------------------------------------
19
+ // Concrete rules — priority ordered
20
+ // -----------------------------------------------------------------------
21
+ /** Priority 1: Critically wounded NPC seeks safety. */
22
+ export const WoundedRule = {
23
+ name: 'wounded',
24
+ priority: 1,
25
+ evaluate(ctx, cfg) {
26
+ if (ctx.hpRatio >= cfg.woundedHpThreshold)
27
+ return null;
28
+ if (ctx.timeSinceWoundedMs < cfg.woundedReentryCooldownMs)
29
+ return null;
30
+ return 'WOUNDED';
31
+ },
32
+ };
33
+ /** Priority 2: No ammo → retreat. */
34
+ export const NoAmmoRule = {
35
+ name: 'noAmmo',
36
+ priority: 2,
37
+ evaluate(ctx) {
38
+ return ctx.hasAmmo ? null : 'RETREAT';
39
+ },
40
+ };
41
+ /** Priority 3: Explosive danger nearby → evade. */
42
+ export const EvadeDangerRule = {
43
+ name: 'evadeDanger',
44
+ priority: 3,
45
+ evaluate(ctx) {
46
+ return ctx.hasExplosiveDanger ? 'EVADE_GRENADE' : null;
47
+ },
48
+ };
49
+ /** Priority 4: Low morale → retreat; panicked → flee. */
50
+ export const MoraleRule = {
51
+ name: 'morale',
52
+ priority: 4,
53
+ evaluate(ctx, cfg) {
54
+ if (ctx.isPanicked)
55
+ return 'FLEE';
56
+ if (ctx.moraleValue < cfg.retreatMoraleThreshold && ctx.canSwitchTarget)
57
+ return 'RETREAT';
58
+ return null;
59
+ },
60
+ };
61
+ /** Priority 5: Lost sight long enough, has grenades → throw. */
62
+ export const GrenadeOpportunityRule = {
63
+ name: 'grenadeOpportunity',
64
+ priority: 5,
65
+ evaluate(ctx, cfg) {
66
+ if (ctx.lostSightMs < cfg.grenadeLostSightMs)
67
+ return null;
68
+ if (ctx.lostSightMs >= cfg.lostSightThresholdMs)
69
+ return null;
70
+ if (ctx.loadout.grenades <= 0)
71
+ return null;
72
+ if (ctx.visibleEnemyCount < cfg.grenadeMinEnemies)
73
+ return null;
74
+ if (ctx.distanceToEnemy < cfg.grenadeMinDistance ||
75
+ ctx.distanceToEnemy > cfg.grenadeMaxDistance)
76
+ return null;
77
+ return 'GRENADE';
78
+ },
79
+ };
80
+ /** Priority 6: Lost sight for extended time → search. */
81
+ export const SearchRule = {
82
+ name: 'search',
83
+ priority: 6,
84
+ evaluate(ctx, cfg) {
85
+ return ctx.lostSightMs >= cfg.lostSightThresholdMs ? 'SEARCH' : null;
86
+ },
87
+ };
88
+ /**
89
+ * The complete default combat transition chain.
90
+ * Rules are sorted by priority (lowest number = highest priority).
91
+ */
92
+ export const DEFAULT_COMBAT_RULES = [
93
+ WoundedRule,
94
+ NoAmmoRule,
95
+ EvadeDangerRule,
96
+ MoraleRule,
97
+ GrenadeOpportunityRule,
98
+ SearchRule,
99
+ ];
100
+ /**
101
+ * Evaluate all rules in priority order. Returns the first matching
102
+ * state transition, or null if no rule triggers.
103
+ *
104
+ * @param rules - Transition rules sorted by priority.
105
+ * @param context - Current combat snapshot.
106
+ * @param config - Threshold configuration.
107
+ * @returns Target state string, or null.
108
+ */
109
+ export function evaluateTransitions(rules, context, config) {
110
+ for (const rule of rules) {
111
+ const result = rule.evaluate(context, config);
112
+ if (result !== null)
113
+ return result;
114
+ }
115
+ return null;
116
+ }
117
+ //# sourceMappingURL=CombatTransitionChain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CombatTransitionChain.js","sourceRoot":"","sources":["../../src/combat/CombatTransitionChain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ import { WeaponCategory } from '../types/IWeaponTypes';
2
+ import type { INPCLoadout } from '../types/IWeaponTypes';
3
+ import type { IWeaponSelectionConfig } from '../types/IOnlineAIConfig';
4
+ /**
5
+ * Builds an NPC loadout step-by-step with a fluent API.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * const loadout = new LoadoutBuilder(config.weapon)
10
+ * .withPrimary(WeaponCategory.RIFLE)
11
+ * .withSecondary(WeaponCategory.PISTOL)
12
+ * .withGrenades(2)
13
+ * .withMedkits(1)
14
+ * .build();
15
+ * ```
16
+ */
17
+ export declare class LoadoutBuilder {
18
+ private primary;
19
+ private secondary;
20
+ private grenades;
21
+ private medkits;
22
+ private readonly weaponConfigs;
23
+ constructor(weaponConfigs: IWeaponSelectionConfig);
24
+ withPrimary(category: WeaponCategory, ammo?: number): this;
25
+ withSecondary(category: WeaponCategory, ammo?: number): this;
26
+ withGrenades(count: number): this;
27
+ withMedkits(count: number): this;
28
+ build(): INPCLoadout;
29
+ private createSlot;
30
+ }
31
+ /**
32
+ * Preferred weapon type for faction-based loadout generation.
33
+ * Maps to a WeaponCategory used as the primary at mid ranks.
34
+ */
35
+ /**
36
+ * Recipe for creating a rank-appropriate NPC loadout.
37
+ * When `useFactionPreference` is true, the primary weapon is resolved
38
+ * via `resolveMidRankPrimary(factionPreference)` instead of using the literal `primary` value.
39
+ */
40
+ export interface ILoadoutRecipe {
41
+ readonly primary: WeaponCategory;
42
+ readonly secondary?: WeaponCategory | null;
43
+ readonly grenades: number;
44
+ readonly medkits: number;
45
+ readonly useFactionPreference?: boolean;
46
+ }
47
+ /**
48
+ * Default rank → loadout recipes matching the original if-else chain.
49
+ * Ranks not present (7+) fall through to formula-based generation.
50
+ */
51
+ export declare const DEFAULT_LOADOUT_RECIPES: Readonly<Record<number, ILoadoutRecipe>>;
52
+ export declare const FactionWeaponPreference: {
53
+ readonly rifle: 2;
54
+ readonly shotgun: 1;
55
+ readonly pistol: 0;
56
+ readonly sniper: 3;
57
+ };
58
+ export type FactionWeaponPreference = (typeof FactionWeaponPreference)[keyof typeof FactionWeaponPreference];
59
+ /**
60
+ * Create a rank-appropriate loadout for an NPC.
61
+ *
62
+ * Rank determines the tier of equipment. Faction preference
63
+ * influences weapon choice at mid ranks where multiple options
64
+ * are viable.
65
+ *
66
+ * | Rank | Primary | Secondary | Grenades | Medkits |
67
+ * |------|---------|-----------|----------|---------|
68
+ * | 1 | PISTOL | — | 0 | 0 |
69
+ * | 2 | PISTOL | — | 0 | 1 |
70
+ * | 3 | faction | PISTOL | 0 | 1 |
71
+ * | 4 | faction | PISTOL | 1 | 2 |
72
+ * | 5 | RIFLE | SHOTGUN | 1 | 2 |
73
+ * | 6 | RIFLE* | SHOTGUN | 2 | 2 |
74
+ * | 7+ | SNIPER | RIFLE | min(r-4,3) | 3 |
75
+ *
76
+ * *At rank 6, sniper factions get SNIPER as primary.
77
+ *
78
+ * @param recipes - Optional custom recipe map. If provided and a matching rank
79
+ * entry exists (exact or highest rank <= current), it is used instead of the
80
+ * built-in if-else chain. If not provided, the original hardcoded logic applies.
81
+ */
82
+ export declare function createLoadout(rank: number, factionPreference: WeaponCategory, config: IWeaponSelectionConfig, recipes?: Readonly<Record<number, ILoadoutRecipe>>): INPCLoadout;
83
+ //# sourceMappingURL=LoadoutBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoadoutBuilder.d.ts","sourceRoot":"","sources":["../../src/combat/LoadoutBuilder.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAe,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAEvE;;;;;;;;;;;;GAYG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyB;gBAE3C,aAAa,EAAE,sBAAsB;IAIjD,WAAW,CAAC,QAAQ,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAK1D,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAK5D,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKjC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKhC,KAAK,IAAI,WAAW;IASpB,OAAO,CAAC,UAAU;CAenB;AAED;;;GAGG;AACH;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IAC3C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC;CACzC;AAED;;;GAGG;AACH,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAO5E,CAAC;AAEF,eAAO,MAAM,uBAAuB;;;;;CAK1B,CAAC;AAEX,MAAM,MAAM,uBAAuB,GACjC,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,OAAO,uBAAuB,CAAC,CAAC;AAYzE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,iBAAiB,EAAE,cAAc,EACjC,MAAM,EAAE,sBAAsB,EAC9B,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,GACjD,WAAW,CASb"}