@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,57 @@
1
+ /**
2
+ * All possible NPC vocalization types.
3
+ * The host maps these to actual audio assets.
4
+ */
5
+ export declare const VocalizationType: {
6
+ readonly IDLE: "idle";
7
+ readonly ALERT: "alert";
8
+ readonly COMBAT: "combat";
9
+ readonly WOUNDED: "wounded";
10
+ readonly DEATH: "death";
11
+ readonly FLEE: "flee";
12
+ readonly GRENADE_THROW: "grenade_throw";
13
+ readonly GRENADE_WARNING: "grenade_warning";
14
+ readonly RELOAD: "reload";
15
+ readonly SPOTTED_ENEMY: "spotted_enemy";
16
+ readonly LOST_TARGET: "lost_target";
17
+ readonly KILL_CONFIRMED: "kill_confirmed";
18
+ readonly FRIENDLY_FIRE: "friendly_fire";
19
+ readonly HELP: "help";
20
+ readonly ACKNOWLEDGE: "acknowledge";
21
+ readonly REMARK: "remark";
22
+ readonly KAMP_SOCIAL: "kamp_social";
23
+ };
24
+ export type VocalizationType = (typeof VocalizationType)[keyof typeof VocalizationType];
25
+ /**
26
+ * Configuration for vocalization cooldowns per type.
27
+ * Prevents overlapping/spamming sounds.
28
+ */
29
+ export interface IVocalizationConfig {
30
+ readonly cooldowns: Readonly<Record<VocalizationType, number>>;
31
+ }
32
+ /** Default production cooldowns (ms). */
33
+ export declare function createDefaultVocalizationConfig(): IVocalizationConfig;
34
+ /**
35
+ * Per-NPC vocalization cooldown tracker.
36
+ *
37
+ * Tracks last play time per type. The host calls `canPlay()` before
38
+ * triggering audio and `markPlayed()` after.
39
+ *
40
+ * @example
41
+ * ```ts
42
+ * const tracker = new VocalizationTracker(config);
43
+ * if (tracker.canPlay(VocalizationType.COMBAT, gameTime)) {
44
+ * tracker.markPlayed(VocalizationType.COMBAT, gameTime);
45
+ * audioSystem.play(npcId, VocalizationType.COMBAT);
46
+ * }
47
+ * ```
48
+ */
49
+ export declare class VocalizationTracker {
50
+ private readonly lastPlayed;
51
+ private readonly config;
52
+ constructor(config: IVocalizationConfig);
53
+ canPlay(type: VocalizationType, currentTimeMs: number): boolean;
54
+ markPlayed(type: VocalizationType, currentTimeMs: number): void;
55
+ reset(): void;
56
+ }
57
+ //# sourceMappingURL=VocalizationTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VocalizationTypes.d.ts","sourceRoot":"","sources":["../../src/sound/VocalizationTypes.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;CAkBnB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,OAAO,gBAAgB,CAAC,CAAC;AAExF;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC;CAChE;AAED,yCAAyC;AACzC,wBAAgB,+BAA+B,IAAI,mBAAmB,CAsBrE;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuC;IAClE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;gBAEjC,MAAM,EAAE,mBAAmB;IAIvC,OAAO,CAAC,IAAI,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO;IAU/D,UAAU,CAAC,IAAI,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IAI/D,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,87 @@
1
+ // sound/VocalizationTypes.ts
2
+ // Type-safe vocalization system for NPC sounds.
3
+ // No audio playback — the host implements the actual sound renderer.
4
+ /**
5
+ * All possible NPC vocalization types.
6
+ * The host maps these to actual audio assets.
7
+ */
8
+ export const VocalizationType = {
9
+ IDLE: 'idle',
10
+ ALERT: 'alert',
11
+ COMBAT: 'combat',
12
+ WOUNDED: 'wounded',
13
+ DEATH: 'death',
14
+ FLEE: 'flee',
15
+ GRENADE_THROW: 'grenade_throw',
16
+ GRENADE_WARNING: 'grenade_warning',
17
+ RELOAD: 'reload',
18
+ SPOTTED_ENEMY: 'spotted_enemy',
19
+ LOST_TARGET: 'lost_target',
20
+ KILL_CONFIRMED: 'kill_confirmed',
21
+ FRIENDLY_FIRE: 'friendly_fire',
22
+ HELP: 'help',
23
+ ACKNOWLEDGE: 'acknowledge',
24
+ REMARK: 'remark',
25
+ KAMP_SOCIAL: 'kamp_social',
26
+ };
27
+ /** Default production cooldowns (ms). */
28
+ export function createDefaultVocalizationConfig() {
29
+ return {
30
+ cooldowns: {
31
+ [VocalizationType.IDLE]: 15000,
32
+ [VocalizationType.ALERT]: 5000,
33
+ [VocalizationType.COMBAT]: 3000,
34
+ [VocalizationType.WOUNDED]: 4000,
35
+ [VocalizationType.DEATH]: 0,
36
+ [VocalizationType.FLEE]: 5000,
37
+ [VocalizationType.GRENADE_THROW]: 1000,
38
+ [VocalizationType.GRENADE_WARNING]: 2000,
39
+ [VocalizationType.RELOAD]: 3000,
40
+ [VocalizationType.SPOTTED_ENEMY]: 5000,
41
+ [VocalizationType.LOST_TARGET]: 5000,
42
+ [VocalizationType.KILL_CONFIRMED]: 3000,
43
+ [VocalizationType.FRIENDLY_FIRE]: 5000,
44
+ [VocalizationType.HELP]: 4000,
45
+ [VocalizationType.ACKNOWLEDGE]: 2000,
46
+ [VocalizationType.REMARK]: 10000,
47
+ [VocalizationType.KAMP_SOCIAL]: 8000,
48
+ },
49
+ };
50
+ }
51
+ /**
52
+ * Per-NPC vocalization cooldown tracker.
53
+ *
54
+ * Tracks last play time per type. The host calls `canPlay()` before
55
+ * triggering audio and `markPlayed()` after.
56
+ *
57
+ * @example
58
+ * ```ts
59
+ * const tracker = new VocalizationTracker(config);
60
+ * if (tracker.canPlay(VocalizationType.COMBAT, gameTime)) {
61
+ * tracker.markPlayed(VocalizationType.COMBAT, gameTime);
62
+ * audioSystem.play(npcId, VocalizationType.COMBAT);
63
+ * }
64
+ * ```
65
+ */
66
+ export class VocalizationTracker {
67
+ constructor(config) {
68
+ this.lastPlayed = new Map();
69
+ this.config = config;
70
+ }
71
+ canPlay(type, currentTimeMs) {
72
+ const cooldown = this.config.cooldowns[type] ?? 0;
73
+ if (cooldown === 0)
74
+ return true;
75
+ const last = this.lastPlayed.get(type);
76
+ if (last === undefined)
77
+ return true;
78
+ return currentTimeMs - last >= cooldown;
79
+ }
80
+ markPlayed(type, currentTimeMs) {
81
+ this.lastPlayed.set(type, currentTimeMs);
82
+ }
83
+ reset() {
84
+ this.lastPlayed.clear();
85
+ }
86
+ }
87
+ //# sourceMappingURL=VocalizationTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VocalizationTypes.js","sourceRoot":"","sources":["../../src/sound/VocalizationTypes.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,gDAAgD;AAChD,qEAAqE;AAErE;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,aAAa,EAAE,eAAe;IAC9B,eAAe,EAAE,iBAAiB;IAClC,MAAM,EAAE,QAAQ;IAChB,aAAa,EAAE,eAAe;IAC9B,WAAW,EAAE,aAAa;IAC1B,cAAc,EAAE,gBAAgB;IAChC,aAAa,EAAE,eAAe;IAC9B,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,aAAa;IAC1B,MAAM,EAAE,QAAQ;IAChB,WAAW,EAAE,aAAa;CAClB,CAAC;AAYX,yCAAyC;AACzC,MAAM,UAAU,+BAA+B;IAC7C,OAAO;QACL,SAAS,EAAE;YACT,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,KAAM;YAC/B,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,IAAK;YAC/B,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,IAAK;YAChC,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,IAAK;YACjC,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAK;YAC9B,CAAC,gBAAgB,CAAC,aAAa,CAAC,EAAE,IAAK;YACvC,CAAC,gBAAgB,CAAC,eAAe,CAAC,EAAE,IAAK;YACzC,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,IAAK;YAChC,CAAC,gBAAgB,CAAC,aAAa,CAAC,EAAE,IAAK;YACvC,CAAC,gBAAgB,CAAC,WAAW,CAAC,EAAE,IAAK;YACrC,CAAC,gBAAgB,CAAC,cAAc,CAAC,EAAE,IAAK;YACxC,CAAC,gBAAgB,CAAC,aAAa,CAAC,EAAE,IAAK;YACvC,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAK;YAC9B,CAAC,gBAAgB,CAAC,WAAW,CAAC,EAAE,IAAK;YACrC,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,KAAM;YACjC,CAAC,gBAAgB,CAAC,WAAW,CAAC,EAAE,IAAK;SACtC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,mBAAmB;IAI9B,YAAY,MAA2B;QAHtB,eAAU,GAAG,IAAI,GAAG,EAA4B,CAAC;QAIhE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,OAAO,CAAC,IAAsB,EAAE,aAAqB;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,QAAQ,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAEhC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QAEpC,OAAO,aAAa,GAAG,IAAI,IAAI,QAAQ,CAAC;IAC1C,CAAC;IAED,UAAU,CAAC,IAAsB,EAAE,aAAqB;QACtD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK;QACH,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ export { VocalizationType, VocalizationTracker, createDefaultVocalizationConfig, } from './VocalizationTypes';
2
+ export type { IVocalizationConfig } from './VocalizationTypes';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sound/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,+BAA+B,GAChC,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,3 @@
1
+ // sound sub-path barrel
2
+ export { VocalizationType, VocalizationTracker, createDefaultVocalizationConfig, } from './VocalizationTypes';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sound/index.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,+BAA+B,GAChC,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Shared enemy sighting propagated to all squad members.
3
+ *
4
+ * Produced by {@link SquadSharedTargetTable.shareTarget} and returned by
5
+ * {@link SquadSharedTargetTable.getSharedTarget}.
6
+ */
7
+ export interface ISharedTargetInfo {
8
+ /** Stable entity ID of the spotted enemy. */
9
+ readonly targetId: string;
10
+ /** Enemy world X at the time of the sighting (px). */
11
+ readonly x: number;
12
+ /** Enemy world Y at the time of the sighting (px). */
13
+ readonly y: number;
14
+ /**
15
+ * Confidence of this indirect intel.
16
+ * Lower than a direct observation (1.0) — set by
17
+ * {@link ISquadSharedTargetConfig.sharedConfidence}.
18
+ */
19
+ readonly confidence: number;
20
+ /** Epoch ms when the intel was recorded (for TTL checks). */
21
+ readonly sharedAtMs: number;
22
+ }
23
+ /**
24
+ * Tuning parameters for the squad shared target table.
25
+ * All fields have defaults via {@link createDefaultSquadSharedTargetConfig}.
26
+ */
27
+ export interface ISquadSharedTargetConfig {
28
+ /**
29
+ * How long (ms) before shared intel expires and is treated as stale.
30
+ * @default 10_000
31
+ */
32
+ readonly ttlMs: number;
33
+ /**
34
+ * Confidence value assigned to shared (indirect) sightings.
35
+ * Should be < 1.0 to reflect that the NPC has not seen the target directly.
36
+ * @default 0.8
37
+ */
38
+ readonly sharedConfidence: number;
39
+ }
40
+ /**
41
+ * Create an {@link ISquadSharedTargetConfig} with production defaults.
42
+ * Pass a partial override object to tune individual values.
43
+ *
44
+ * @example
45
+ * const cfg = createDefaultSquadSharedTargetConfig({ ttlMs: 5_000 });
46
+ */
47
+ export declare function createDefaultSquadSharedTargetConfig(overrides?: Partial<ISquadSharedTargetConfig>): ISquadSharedTargetConfig;
48
+ /**
49
+ * Shared enemy intel store keyed by squad ID.
50
+ *
51
+ * One instance should be created per game session and shared across all NPCs.
52
+ * Each NPC's {@link ISquadAccess} implementation calls into this table via its
53
+ * own `npcId`.
54
+ *
55
+ * ### Wiring example (host layer)
56
+ * ```ts
57
+ * const sharedTargets = new SquadSharedTargetTable(
58
+ * npcId => squadManager.getSquadForNPC(npcId)?.id ?? null,
59
+ * );
60
+ *
61
+ * class MySquadAccess implements ISquadAccess {
62
+ * constructor(private readonly npcId: string) {}
63
+ * shareTarget(targetId, x, y) {
64
+ * sharedTargets.shareTarget(this.npcId, targetId, x, y);
65
+ * }
66
+ * getSharedTarget() {
67
+ * return sharedTargets.getSharedTarget(this.npcId);
68
+ * }
69
+ * // ...
70
+ * }
71
+ * ```
72
+ *
73
+ * ### Opt-in / opt-out
74
+ * - **Full feature**: implement `getSharedTarget()` on `ISquadAccess` above.
75
+ * - **Write only**: implement `shareTarget()` but not `getSharedTarget()`.
76
+ * - **Fully disabled**: don't implement either — PatrolState check is a no-op
77
+ * via `ctx.squad?.getSharedTarget?.()`.
78
+ */
79
+ export declare class SquadSharedTargetTable {
80
+ private readonly npcToSquad;
81
+ private readonly config;
82
+ private readonly nowFn;
83
+ /** Inner store: squadId → latest ISharedTargetInfo. */
84
+ private readonly store;
85
+ /**
86
+ * @param npcToSquad - Returns the squad ID for an NPC, or null if not in a
87
+ * squad. Wrap your SquadManager:
88
+ * `npcId => mgr.getSquadForNPC(npcId)?.id ?? null`
89
+ * @param config - TTL and confidence overrides.
90
+ * @default createDefaultSquadSharedTargetConfig()
91
+ * @param nowFn - Time source.
92
+ * @default () => Date.now() (injectable for tests)
93
+ */
94
+ constructor(npcToSquad: (npcId: string) => string | null, config?: Partial<ISquadSharedTargetConfig>, nowFn?: () => number);
95
+ /**
96
+ * Record a target sighting for the sender's squad.
97
+ *
98
+ * All squad members can retrieve this via {@link getSharedTarget} until
99
+ * the TTL expires or {@link invalidate} is called.
100
+ *
101
+ * No-op if the sender is not in any squad.
102
+ *
103
+ * @param senderNpcId - NPC ID of the entity that spotted the target.
104
+ * @param targetId - Stable entity ID of the enemy.
105
+ * @param x - Enemy world X (px).
106
+ * @param y - Enemy world Y (px).
107
+ */
108
+ shareTarget(senderNpcId: string, targetId: string, x: number, y: number): void;
109
+ /**
110
+ * Return the current shared target for the given NPC's squad.
111
+ *
112
+ * Returns `null` when:
113
+ * - The NPC is not in any squad.
114
+ * - No target has been shared yet.
115
+ * - The intel has expired (age > ttlMs).
116
+ *
117
+ * @param npcId - NPC querying for squad intel.
118
+ */
119
+ getSharedTarget(npcId: string): ISharedTargetInfo | null;
120
+ /**
121
+ * Explicitly clear shared intel for a squad.
122
+ *
123
+ * Call this when the target is confirmed destroyed or the engagement ends
124
+ * to avoid squad members chasing stale positions.
125
+ *
126
+ * @param squadId - Direct squad ID to invalidate.
127
+ */
128
+ invalidate(squadId: string): void;
129
+ /**
130
+ * Clear all shared intel for all squads.
131
+ *
132
+ * Call on save/load or scene restart to avoid stale intel from a previous
133
+ * session persisting into the restored game state.
134
+ */
135
+ clear(): void;
136
+ }
137
+ //# sourceMappingURL=SquadSharedTarget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SquadSharedTarget.d.ts","sourceRoot":"","sources":["../../src/squad/SquadSharedTarget.ts"],"names":[],"mappings":"AAcA;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,6CAA6C;IAC7C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,sDAAsD;IACtD,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,6DAA6D;IAC7D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAED;;;;;;GAMG;AACH,wBAAgB,oCAAoC,CAClD,SAAS,CAAC,EAAE,OAAO,CAAC,wBAAwB,CAAC,GAC5C,wBAAwB,CAM1B;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAmC;IAC9D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAClD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IAErC,uDAAuD;IACvD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwC;IAE9D;;;;;;;;OAQG;gBAED,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,EAC5C,MAAM,CAAC,EAAE,OAAO,CAAC,wBAAwB,CAAC,EAC1C,KAAK,CAAC,EAAE,MAAM,MAAM;IAOtB;;;;;;;;;;;;OAYG;IACH,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAc9E;;;;;;;;;OASG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAexD;;;;;;;OAOG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIjC;;;;;OAKG;IACH,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,145 @@
1
+ // squad/SquadSharedTarget.ts
2
+ // TTL-based squad enemy intel table.
3
+ //
4
+ // Design goals:
5
+ // • Zero SDK dependency — no Phaser, no alife-core imports needed.
6
+ // • npcToSquad callback injection — no circular dep to SquadManager.
7
+ // • nowFn injectable — deterministic test control.
8
+ // • Opt-in at the ISquadAccess level via optional getSharedTarget?().
9
+ // State handlers that don't call it incur zero overhead.
10
+ /**
11
+ * Create an {@link ISquadSharedTargetConfig} with production defaults.
12
+ * Pass a partial override object to tune individual values.
13
+ *
14
+ * @example
15
+ * const cfg = createDefaultSquadSharedTargetConfig({ ttlMs: 5_000 });
16
+ */
17
+ export function createDefaultSquadSharedTargetConfig(overrides) {
18
+ return {
19
+ ttlMs: 10000,
20
+ sharedConfidence: 0.8,
21
+ ...overrides,
22
+ };
23
+ }
24
+ // ---------------------------------------------------------------------------
25
+ // SquadSharedTargetTable
26
+ // ---------------------------------------------------------------------------
27
+ /**
28
+ * Shared enemy intel store keyed by squad ID.
29
+ *
30
+ * One instance should be created per game session and shared across all NPCs.
31
+ * Each NPC's {@link ISquadAccess} implementation calls into this table via its
32
+ * own `npcId`.
33
+ *
34
+ * ### Wiring example (host layer)
35
+ * ```ts
36
+ * const sharedTargets = new SquadSharedTargetTable(
37
+ * npcId => squadManager.getSquadForNPC(npcId)?.id ?? null,
38
+ * );
39
+ *
40
+ * class MySquadAccess implements ISquadAccess {
41
+ * constructor(private readonly npcId: string) {}
42
+ * shareTarget(targetId, x, y) {
43
+ * sharedTargets.shareTarget(this.npcId, targetId, x, y);
44
+ * }
45
+ * getSharedTarget() {
46
+ * return sharedTargets.getSharedTarget(this.npcId);
47
+ * }
48
+ * // ...
49
+ * }
50
+ * ```
51
+ *
52
+ * ### Opt-in / opt-out
53
+ * - **Full feature**: implement `getSharedTarget()` on `ISquadAccess` above.
54
+ * - **Write only**: implement `shareTarget()` but not `getSharedTarget()`.
55
+ * - **Fully disabled**: don't implement either — PatrolState check is a no-op
56
+ * via `ctx.squad?.getSharedTarget?.()`.
57
+ */
58
+ export class SquadSharedTargetTable {
59
+ /**
60
+ * @param npcToSquad - Returns the squad ID for an NPC, or null if not in a
61
+ * squad. Wrap your SquadManager:
62
+ * `npcId => mgr.getSquadForNPC(npcId)?.id ?? null`
63
+ * @param config - TTL and confidence overrides.
64
+ * @default createDefaultSquadSharedTargetConfig()
65
+ * @param nowFn - Time source.
66
+ * @default () => Date.now() (injectable for tests)
67
+ */
68
+ constructor(npcToSquad, config, nowFn) {
69
+ /** Inner store: squadId → latest ISharedTargetInfo. */
70
+ this.store = new Map();
71
+ this.npcToSquad = npcToSquad;
72
+ this.config = createDefaultSquadSharedTargetConfig(config);
73
+ this.nowFn = nowFn ?? (() => Date.now());
74
+ }
75
+ /**
76
+ * Record a target sighting for the sender's squad.
77
+ *
78
+ * All squad members can retrieve this via {@link getSharedTarget} until
79
+ * the TTL expires or {@link invalidate} is called.
80
+ *
81
+ * No-op if the sender is not in any squad.
82
+ *
83
+ * @param senderNpcId - NPC ID of the entity that spotted the target.
84
+ * @param targetId - Stable entity ID of the enemy.
85
+ * @param x - Enemy world X (px).
86
+ * @param y - Enemy world Y (px).
87
+ */
88
+ shareTarget(senderNpcId, targetId, x, y) {
89
+ const squadId = this.npcToSquad(senderNpcId);
90
+ if (squadId === null)
91
+ return;
92
+ const info = {
93
+ targetId,
94
+ x,
95
+ y,
96
+ confidence: this.config.sharedConfidence,
97
+ sharedAtMs: this.nowFn(),
98
+ };
99
+ this.store.set(squadId, info);
100
+ }
101
+ /**
102
+ * Return the current shared target for the given NPC's squad.
103
+ *
104
+ * Returns `null` when:
105
+ * - The NPC is not in any squad.
106
+ * - No target has been shared yet.
107
+ * - The intel has expired (age > ttlMs).
108
+ *
109
+ * @param npcId - NPC querying for squad intel.
110
+ */
111
+ getSharedTarget(npcId) {
112
+ const squadId = this.npcToSquad(npcId);
113
+ if (squadId === null)
114
+ return null;
115
+ const info = this.store.get(squadId);
116
+ if (info === undefined)
117
+ return null;
118
+ if (this.nowFn() - info.sharedAtMs > this.config.ttlMs) {
119
+ this.store.delete(squadId);
120
+ return null;
121
+ }
122
+ return info;
123
+ }
124
+ /**
125
+ * Explicitly clear shared intel for a squad.
126
+ *
127
+ * Call this when the target is confirmed destroyed or the engagement ends
128
+ * to avoid squad members chasing stale positions.
129
+ *
130
+ * @param squadId - Direct squad ID to invalidate.
131
+ */
132
+ invalidate(squadId) {
133
+ this.store.delete(squadId);
134
+ }
135
+ /**
136
+ * Clear all shared intel for all squads.
137
+ *
138
+ * Call on save/load or scene restart to avoid stale intel from a previous
139
+ * session persisting into the restored game state.
140
+ */
141
+ clear() {
142
+ this.store.clear();
143
+ }
144
+ }
145
+ //# sourceMappingURL=SquadSharedTarget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SquadSharedTarget.js","sourceRoot":"","sources":["../../src/squad/SquadSharedTarget.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,qCAAqC;AACrC,EAAE;AACF,gBAAgB;AAChB,qEAAqE;AACrE,uEAAuE;AACvE,qDAAqD;AACrD,wEAAwE;AACxE,6DAA6D;AAgD7D;;;;;;GAMG;AACH,MAAM,UAAU,oCAAoC,CAClD,SAA6C;IAE7C,OAAO;QACL,KAAK,EAAE,KAAM;QACb,gBAAgB,EAAE,GAAG;QACrB,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,OAAO,sBAAsB;IAQjC;;;;;;;;OAQG;IACH,YACE,UAA4C,EAC5C,MAA0C,EAC1C,KAAoB;QAftB,uDAAuD;QACtC,UAAK,GAAG,IAAI,GAAG,EAA6B,CAAC;QAgB5D,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,oCAAoC,CAAC,MAAM,CAAC,CAAC;QAC3D,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,WAAW,CAAC,WAAmB,EAAE,QAAgB,EAAE,CAAS,EAAE,CAAS;QACrE,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAC7C,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO;QAE7B,MAAM,IAAI,GAAsB;YAC9B,QAAQ;YACR,CAAC;YACD,CAAC;YACD,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB;YACxC,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE;SACzB,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IAED;;;;;;;;;OASG;IACH,eAAe,CAAC,KAAa;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAElC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QAEpC,IAAI,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACvD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;OAOG;IACH,UAAU,CAAC,OAAe;QACxB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED;;;;;OAKG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF"}
@@ -0,0 +1,63 @@
1
+ import type { ISquadTacticsConfig } from '../types/IOnlineAIConfig';
2
+ /**
3
+ * Squad command identifiers.
4
+ */
5
+ export declare const SquadCommand: {
6
+ readonly ATTACK: "attack";
7
+ readonly COVER_ME: "cover_me";
8
+ readonly FOLLOW: "follow";
9
+ readonly HOLD: "hold";
10
+ readonly RETREAT: "retreat";
11
+ readonly SPREAD_OUT: "spread_out";
12
+ };
13
+ export type SquadCommand = (typeof SquadCommand)[keyof typeof SquadCommand];
14
+ /**
15
+ * Tactical situation snapshot for command evaluation.
16
+ * Aggregates squad state without entity references.
17
+ */
18
+ export interface ISquadSituation {
19
+ /** Number of squad members (including leader). */
20
+ readonly squadSize: number;
21
+ /** Number of known enemies in the engagement. */
22
+ readonly enemyCount: number;
23
+ /** Average morale across all squad members [-1, 1]. */
24
+ readonly avgMorale: number;
25
+ /** Whether the leader is currently in cover. */
26
+ readonly leaderInCover: boolean;
27
+ }
28
+ /**
29
+ * A single tactical command with its evaluation logic.
30
+ * Each command scores a situation and returns a priority value.
31
+ */
32
+ export interface ISquadCommandEvaluator {
33
+ readonly command: SquadCommand;
34
+ evaluate(situation: ISquadSituation, config: ISquadTacticsConfig): number;
35
+ }
36
+ /**
37
+ * Evaluate the best squad command for the current situation.
38
+ *
39
+ * Uses a priority-ordered decision tree (first match wins):
40
+ *
41
+ * 1. Morale collapse → RETREAT
42
+ * 2. No enemies → FOLLOW
43
+ * 3. Badly outnumbered → RETREAT
44
+ * 4. Even fight → HOLD
45
+ * 5. Numerical advantage → ATTACK
46
+ * 6. Leader in cover → COVER_ME
47
+ * 7. Default → SPREAD_OUT
48
+ *
49
+ * @param situation - Current tactical snapshot.
50
+ * @param config - Squad tuning configuration.
51
+ * @returns The recommended squad command.
52
+ */
53
+ export declare function evaluateSituation(situation: ISquadSituation, config: ISquadTacticsConfig): SquadCommand;
54
+ /**
55
+ * States that must never be interrupted by squad commands.
56
+ * The host should check this before applying any command.
57
+ */
58
+ export declare const PROTECTED_STATES: Set<string>;
59
+ /**
60
+ * Check if a command can be applied to an NPC in the given state.
61
+ */
62
+ export declare function canApplyCommand(currentState: string): boolean;
63
+ //# sourceMappingURL=SquadTactics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SquadTactics.d.ts","sourceRoot":"","sources":["../../src/squad/SquadTactics.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE;;GAEG;AACH,eAAO,MAAM,YAAY;;;;;;;CAOf,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAE5E;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,kDAAkD;IAClD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,iDAAiD;IACjD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,uDAAuD;IACvD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,gDAAgD;IAChD,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;CACjC;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAAC;CAC3E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,eAAe,EAC1B,MAAM,EAAE,mBAAmB,GAC1B,YAAY,CAmCd;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,aAI3B,CAAC;AAEH;;GAEG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAE7D"}
@@ -0,0 +1,76 @@
1
+ // squad/SquadTactics.ts
2
+ // Command pattern for squad-level tactical decisions.
3
+ // Pure evaluation — no entity references, no framework coupling.
4
+ /**
5
+ * Squad command identifiers.
6
+ */
7
+ export const SquadCommand = {
8
+ ATTACK: 'attack',
9
+ COVER_ME: 'cover_me',
10
+ FOLLOW: 'follow',
11
+ HOLD: 'hold',
12
+ RETREAT: 'retreat',
13
+ SPREAD_OUT: 'spread_out',
14
+ };
15
+ /**
16
+ * Evaluate the best squad command for the current situation.
17
+ *
18
+ * Uses a priority-ordered decision tree (first match wins):
19
+ *
20
+ * 1. Morale collapse → RETREAT
21
+ * 2. No enemies → FOLLOW
22
+ * 3. Badly outnumbered → RETREAT
23
+ * 4. Even fight → HOLD
24
+ * 5. Numerical advantage → ATTACK
25
+ * 6. Leader in cover → COVER_ME
26
+ * 7. Default → SPREAD_OUT
27
+ *
28
+ * @param situation - Current tactical snapshot.
29
+ * @param config - Squad tuning configuration.
30
+ * @returns The recommended squad command.
31
+ */
32
+ export function evaluateSituation(situation, config) {
33
+ const { squadSize, enemyCount, avgMorale, leaderInCover } = situation;
34
+ // Priority 1: Morale collapse.
35
+ if (avgMorale <= config.moralePanickedThreshold) {
36
+ return SquadCommand.RETREAT;
37
+ }
38
+ // Priority 2: No threats.
39
+ if (enemyCount === 0) {
40
+ return SquadCommand.FOLLOW;
41
+ }
42
+ // Priority 3: Badly outnumbered.
43
+ if (enemyCount > squadSize * config.outnumberRatio) {
44
+ return SquadCommand.RETREAT;
45
+ }
46
+ // Priority 4: Even fight.
47
+ if (enemyCount >= squadSize) {
48
+ return SquadCommand.HOLD;
49
+ }
50
+ // Priority 5: Numerical advantage.
51
+ if (squadSize > enemyCount * config.outnumberRatio) {
52
+ return SquadCommand.ATTACK;
53
+ }
54
+ // Priority 6: Leader in cover — provide suppressive fire.
55
+ if (leaderInCover) {
56
+ return SquadCommand.COVER_ME;
57
+ }
58
+ // Default: distribute tactically.
59
+ return SquadCommand.SPREAD_OUT;
60
+ }
61
+ /**
62
+ * States that must never be interrupted by squad commands.
63
+ * The host should check this before applying any command.
64
+ */
65
+ export const PROTECTED_STATES = new Set([
66
+ 'DEAD',
67
+ 'WOUNDED',
68
+ 'EVADE_GRENADE',
69
+ ]);
70
+ /**
71
+ * Check if a command can be applied to an NPC in the given state.
72
+ */
73
+ export function canApplyCommand(currentState) {
74
+ return !PROTECTED_STATES.has(currentState);
75
+ }
76
+ //# sourceMappingURL=SquadTactics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SquadTactics.js","sourceRoot":"","sources":["../../src/squad/SquadTactics.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,sDAAsD;AACtD,iEAAiE;AAIjE;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,YAAY;CAChB,CAAC;AA4BX;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,iBAAiB,CAC/B,SAA0B,EAC1B,MAA2B;IAE3B,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,SAAS,CAAC;IAEtE,+BAA+B;IAC/B,IAAI,SAAS,IAAI,MAAM,CAAC,uBAAuB,EAAE,CAAC;QAChD,OAAO,YAAY,CAAC,OAAO,CAAC;IAC9B,CAAC;IAED,0BAA0B;IAC1B,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,YAAY,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,iCAAiC;IACjC,IAAI,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;QACnD,OAAO,YAAY,CAAC,OAAO,CAAC;IAC9B,CAAC;IAED,0BAA0B;IAC1B,IAAI,UAAU,IAAI,SAAS,EAAE,CAAC;QAC5B,OAAO,YAAY,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,mCAAmC;IACnC,IAAI,SAAS,GAAG,UAAU,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;QACnD,OAAO,YAAY,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,0DAA0D;IAC1D,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,YAAY,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAED,kCAAkC;IAClC,OAAO,YAAY,CAAC,UAAU,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IACtC,MAAM;IACN,SAAS;IACT,eAAe;CAChB,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,YAAoB;IAClD,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { evaluateSituation, SquadCommand, canApplyCommand, PROTECTED_STATES, } from './SquadTactics';
2
+ export type { ISquadSituation, ISquadCommandEvaluator } from './SquadTactics';
3
+ export { SquadSharedTargetTable, createDefaultSquadSharedTargetConfig } from './SquadSharedTarget';
4
+ export type { ISharedTargetInfo, ISquadSharedTargetConfig } from './SquadSharedTarget';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/squad/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAE9E,OAAO,EAAE,sBAAsB,EAAE,oCAAoC,EAAE,MAAM,qBAAqB,CAAC;AACnG,YAAY,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,4 @@
1
+ // squad sub-path barrel
2
+ export { evaluateSituation, SquadCommand, canApplyCommand, PROTECTED_STATES, } from './SquadTactics';
3
+ export { SquadSharedTargetTable, createDefaultSquadSharedTargetConfig } from './SquadSharedTarget';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/squad/index.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,sBAAsB,EAAE,oCAAoC,EAAE,MAAM,qBAAqB,CAAC"}