@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,179 @@
1
+ // navigation/RestrictedZoneManager.ts
2
+ // Instance-based restricted zone management.
3
+ // Handles hard constraints (IN/OUT) and soft danger avoidance.
4
+ /**
5
+ * Zone restriction types.
6
+ * - IN: NPC must stay inside the zone.
7
+ * - OUT: NPC cannot enter the zone.
8
+ * - DANGER: Soft avoidance — NPC prefers to avoid but can enter.
9
+ */
10
+ export const RestrictionType = {
11
+ IN: 0,
12
+ OUT: 1,
13
+ DANGER: 2,
14
+ };
15
+ /**
16
+ * Manages circular no-go and soft-avoidance zones for NPC movement.
17
+ *
18
+ * Instance-based — create one per simulation. No global state.
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * const zones = new RestrictedZoneManager(20); // 20px safety margin
23
+ * zones.addZone({ id: 'rad_1', type: RestrictionType.OUT, x: 100, y: 100, radius: 50, active: true });
24
+ *
25
+ * if (!zones.accessible(110, 110)) {
26
+ * const safe = zones.getSafeDirection(110, 110);
27
+ * // Move NPC along safe.dx, safe.dy
28
+ * }
29
+ * ```
30
+ */
31
+ export class RestrictedZoneManager {
32
+ constructor(safeMargin) {
33
+ this.zones = new Map();
34
+ this.safeMargin = safeMargin;
35
+ }
36
+ // -----------------------------------------------------------------
37
+ // Zone Lifecycle
38
+ // -----------------------------------------------------------------
39
+ addZone(zone) {
40
+ this.zones.set(zone.id, zone);
41
+ }
42
+ removeZone(id) {
43
+ this.zones.delete(id);
44
+ }
45
+ setActive(id, active) {
46
+ const zone = this.zones.get(id);
47
+ if (zone)
48
+ zone.active = active;
49
+ }
50
+ removeByMetadata(tag) {
51
+ const toDelete = [];
52
+ for (const [id, zone] of this.zones) {
53
+ if (zone.metadata === tag)
54
+ toDelete.push(id);
55
+ }
56
+ for (const id of toDelete)
57
+ this.zones.delete(id);
58
+ }
59
+ getAllZones() {
60
+ return [...this.zones.values()];
61
+ }
62
+ getZonesAt(x, y) {
63
+ const result = [];
64
+ for (const zone of this.zones.values()) {
65
+ if (!zone.active)
66
+ continue;
67
+ const dx = x - zone.x;
68
+ const dy = y - zone.y;
69
+ if (dx * dx + dy * dy <= zone.radius * zone.radius) {
70
+ result.push(zone);
71
+ }
72
+ }
73
+ return result;
74
+ }
75
+ get size() {
76
+ return this.zones.size;
77
+ }
78
+ clear() {
79
+ this.zones.clear();
80
+ }
81
+ // -----------------------------------------------------------------
82
+ // Hard Constraint Check
83
+ // -----------------------------------------------------------------
84
+ /**
85
+ * Check if a position satisfies all hard zone constraints.
86
+ *
87
+ * - OUT zones: position must be outside (radius + safeMargin).
88
+ * - IN zones: position must be inside zone radius.
89
+ * - DANGER zones: ignored (soft avoidance only).
90
+ *
91
+ * Uses squared-distance for performance. Early-exit on first violation.
92
+ */
93
+ accessible(x, y) {
94
+ for (const zone of this.zones.values()) {
95
+ if (!zone.active)
96
+ continue;
97
+ const dx = x - zone.x;
98
+ const dy = y - zone.y;
99
+ const distSq = dx * dx + dy * dy;
100
+ if (zone.type === RestrictionType.OUT) {
101
+ const effectiveR = zone.radius + this.safeMargin;
102
+ if (distSq < effectiveR * effectiveR)
103
+ return false;
104
+ }
105
+ else if (zone.type === RestrictionType.IN) {
106
+ if (distSq > zone.radius * zone.radius)
107
+ return false;
108
+ }
109
+ }
110
+ return true;
111
+ }
112
+ // -----------------------------------------------------------------
113
+ // Soft Danger Check
114
+ // -----------------------------------------------------------------
115
+ /**
116
+ * Check if a position is inside any active DANGER zone.
117
+ * Does not prevent movement — used to trigger escape behavior.
118
+ */
119
+ isDangerous(x, y) {
120
+ for (const zone of this.zones.values()) {
121
+ if (!zone.active || zone.type !== RestrictionType.DANGER)
122
+ continue;
123
+ const dx = x - zone.x;
124
+ const dy = y - zone.y;
125
+ if (dx * dx + dy * dy <= zone.radius * zone.radius)
126
+ return true;
127
+ }
128
+ return false;
129
+ }
130
+ // -----------------------------------------------------------------
131
+ // Escape Direction
132
+ // -----------------------------------------------------------------
133
+ /**
134
+ * Compute a normalized direction vector to move away from the nearest
135
+ * active OUT or DANGER zone that contains this point.
136
+ *
137
+ * @returns Unit vector `{x, y}` pointing away from the zone center,
138
+ * or null if the position is already safe.
139
+ */
140
+ getSafeDirection(x, y) {
141
+ let nearest = null;
142
+ let nearestDistSq = Infinity;
143
+ for (const zone of this.zones.values()) {
144
+ if (!zone.active)
145
+ continue;
146
+ if (zone.type !== RestrictionType.OUT && zone.type !== RestrictionType.DANGER)
147
+ continue;
148
+ const dx = x - zone.x;
149
+ const dy = y - zone.y;
150
+ const distSq = dx * dx + dy * dy;
151
+ const effectiveR = zone.type === RestrictionType.OUT
152
+ ? zone.radius + this.safeMargin
153
+ : zone.radius;
154
+ if (distSq < effectiveR * effectiveR && distSq < nearestDistSq) {
155
+ nearestDistSq = distSq;
156
+ nearest = zone;
157
+ }
158
+ }
159
+ if (!nearest)
160
+ return null;
161
+ const dx = x - nearest.x;
162
+ const dy = y - nearest.y;
163
+ const dist = Math.sqrt(dx * dx + dy * dy);
164
+ if (dist < 1e-6)
165
+ return { x: 1, y: 0 };
166
+ return { x: dx / dist, y: dy / dist };
167
+ }
168
+ // -----------------------------------------------------------------
169
+ // Waypoint Filtering
170
+ // -----------------------------------------------------------------
171
+ /**
172
+ * Filter a list of waypoints to only those in accessible positions.
173
+ * O(waypoints × zones).
174
+ */
175
+ filterAccessibleWaypoints(waypoints) {
176
+ return waypoints.filter((wp) => this.accessible(wp.x, wp.y));
177
+ }
178
+ }
179
+ //# sourceMappingURL=RestrictedZoneManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RestrictedZoneManager.js","sourceRoot":"","sources":["../../src/navigation/RestrictedZoneManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type { Vec2 } from '@alife-sdk/core';
2
+ import type { INavigationConfig } from '../types/IOnlineAIConfig';
3
+ /**
4
+ * Tracks an NPC's progress along a smooth dense path.
5
+ *
6
+ * The follower advances a cursor through the point array and
7
+ * provides a curvature-derived velocity multiplier with smooth
8
+ * easing between speed bands.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * const follower = new SmoothPathFollower(densePoints, config);
13
+ *
14
+ * // Each frame:
15
+ * follower.updatePosition(npc.x, npc.y);
16
+ * const target = follower.getCurrentTarget();
17
+ * const speed = baseSpeed * follower.getCurrentVelocityMultiplier();
18
+ * ```
19
+ */
20
+ export declare class SmoothPathFollower {
21
+ private readonly points;
22
+ private readonly velocityMultipliers;
23
+ private readonly thresholdSq;
24
+ private readonly transitionRate;
25
+ private currentIndex;
26
+ private currentVelocityMultiplier;
27
+ constructor(points: readonly Vec2[], config: INavigationConfig);
28
+ /**
29
+ * Advance the cursor if the NPC is close enough to the current target.
30
+ * @returns `true` if the cursor advanced, `false` if not yet arrived.
31
+ */
32
+ updatePosition(x: number, y: number): boolean;
33
+ /** Current waypoint the NPC should move toward, or null if path is done. */
34
+ getCurrentTarget(): Vec2 | null;
35
+ /** Whether the NPC has reached the end of the path. */
36
+ isComplete(): boolean;
37
+ /**
38
+ * Smoothed velocity multiplier for the current path segment.
39
+ * Value in approximately [velocitySlow, velocityFast] — transitions
40
+ * gradually between speed bands.
41
+ */
42
+ getCurrentVelocityMultiplier(): number;
43
+ /** Reset cursor to the start (for looping patrols). */
44
+ reset(): void;
45
+ /** Normalized progress [0, 1]. */
46
+ getProgress(): number;
47
+ /** Number of dense points in the smooth path. */
48
+ getPointCount(): number;
49
+ /**
50
+ * Pre-compute a velocity multiplier for each point based on local curvature.
51
+ * Sharp turns get slow multipliers, straight segments get fast.
52
+ */
53
+ private calculateVelocityProfile;
54
+ }
55
+ //# sourceMappingURL=SmoothPathFollower.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SmoothPathFollower.d.ts","sourceRoot":"","sources":["../../src/navigation/SmoothPathFollower.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAKlE;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAoB;IACxD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,yBAAyB,CAAS;gBAE9B,MAAM,EAAE,SAAS,IAAI,EAAE,EAAE,MAAM,EAAE,iBAAiB;IAQ9D;;;OAGG;IACH,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO;IAgB7C,4EAA4E;IAC5E,gBAAgB,IAAI,IAAI,GAAG,IAAI;IAI/B,uDAAuD;IACvD,UAAU,IAAI,OAAO;IAIrB;;;;OAIG;IACH,4BAA4B,IAAI,MAAM;IAStC,uDAAuD;IACvD,KAAK,IAAI,IAAI;IAQb,kCAAkC;IAClC,WAAW,IAAI,MAAM;IAKrB,iDAAiD;IACjD,aAAa,IAAI,MAAM;IAIvB;;;OAGG;IACH,OAAO,CAAC,wBAAwB;CA8CjC"}
@@ -0,0 +1,132 @@
1
+ // navigation/SmoothPathFollower.ts
2
+ // Per-NPC smooth path cursor with curvature-based velocity profiles.
3
+ // Stateful but framework-agnostic — no rendering, no physics.
4
+ const CURVATURE_HIGH_THRESHOLD = 0.04;
5
+ const CURVATURE_MEDIUM_THRESHOLD = 0.015;
6
+ /**
7
+ * Tracks an NPC's progress along a smooth dense path.
8
+ *
9
+ * The follower advances a cursor through the point array and
10
+ * provides a curvature-derived velocity multiplier with smooth
11
+ * easing between speed bands.
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * const follower = new SmoothPathFollower(densePoints, config);
16
+ *
17
+ * // Each frame:
18
+ * follower.updatePosition(npc.x, npc.y);
19
+ * const target = follower.getCurrentTarget();
20
+ * const speed = baseSpeed * follower.getCurrentVelocityMultiplier();
21
+ * ```
22
+ */
23
+ export class SmoothPathFollower {
24
+ constructor(points, config) {
25
+ this.currentIndex = 0;
26
+ this.points = points;
27
+ this.thresholdSq = config.arrivalThreshold * config.arrivalThreshold;
28
+ this.transitionRate = config.velocityTransitionRate;
29
+ this.velocityMultipliers = this.calculateVelocityProfile(config);
30
+ this.currentVelocityMultiplier = config.velocityCurveFast;
31
+ }
32
+ /**
33
+ * Advance the cursor if the NPC is close enough to the current target.
34
+ * @returns `true` if the cursor advanced, `false` if not yet arrived.
35
+ */
36
+ updatePosition(x, y) {
37
+ if (this.isComplete())
38
+ return false;
39
+ const target = this.points[this.currentIndex];
40
+ const dx = target.x - x;
41
+ const dy = target.y - y;
42
+ const distSq = dx * dx + dy * dy;
43
+ if (distSq <= this.thresholdSq) {
44
+ this.currentIndex++;
45
+ return true;
46
+ }
47
+ return false;
48
+ }
49
+ /** Current waypoint the NPC should move toward, or null if path is done. */
50
+ getCurrentTarget() {
51
+ return this.isComplete() ? null : this.points[this.currentIndex];
52
+ }
53
+ /** Whether the NPC has reached the end of the path. */
54
+ isComplete() {
55
+ return this.currentIndex >= this.points.length;
56
+ }
57
+ /**
58
+ * Smoothed velocity multiplier for the current path segment.
59
+ * Value in approximately [velocitySlow, velocityFast] — transitions
60
+ * gradually between speed bands.
61
+ */
62
+ getCurrentVelocityMultiplier() {
63
+ if (this.isComplete())
64
+ return 1.0;
65
+ const target = this.velocityMultipliers[this.currentIndex] ?? 1.0;
66
+ this.currentVelocityMultiplier +=
67
+ (target - this.currentVelocityMultiplier) * this.transitionRate;
68
+ return this.currentVelocityMultiplier;
69
+ }
70
+ /** Reset cursor to the start (for looping patrols). */
71
+ reset() {
72
+ this.currentIndex = 0;
73
+ this.currentVelocityMultiplier =
74
+ this.velocityMultipliers.length > 0
75
+ ? this.velocityMultipliers[0]
76
+ : 1.0;
77
+ }
78
+ /** Normalized progress [0, 1]. */
79
+ getProgress() {
80
+ if (this.points.length === 0)
81
+ return 1;
82
+ return Math.min(1, this.currentIndex / this.points.length);
83
+ }
84
+ /** Number of dense points in the smooth path. */
85
+ getPointCount() {
86
+ return this.points.length;
87
+ }
88
+ /**
89
+ * Pre-compute a velocity multiplier for each point based on local curvature.
90
+ * Sharp turns get slow multipliers, straight segments get fast.
91
+ */
92
+ calculateVelocityProfile(config) {
93
+ const pts = this.points;
94
+ if (pts.length < 3) {
95
+ return pts.map(() => config.velocityCurveFast);
96
+ }
97
+ const profile = new Array(pts.length);
98
+ for (let i = 1; i < pts.length - 1; i++) {
99
+ const a = pts[i - 1];
100
+ const b = pts[i];
101
+ const c = pts[i + 1];
102
+ const abx = b.x - a.x;
103
+ const aby = b.y - a.y;
104
+ const bcx = c.x - b.x;
105
+ const bcy = c.y - b.y;
106
+ const abLen = Math.sqrt(abx * abx + aby * aby);
107
+ const bcLen = Math.sqrt(bcx * bcx + bcy * bcy);
108
+ if (abLen < 1e-6 || bcLen < 1e-6) {
109
+ profile[i] = config.velocityCurveFast;
110
+ continue;
111
+ }
112
+ const dot = (abx * bcx + aby * bcy) / (abLen * bcLen);
113
+ const theta = Math.acos(Math.max(-1, Math.min(1, dot)));
114
+ const arcLen = (abLen + bcLen) / 2;
115
+ const kappa = arcLen > 1e-6 ? theta / arcLen : 0;
116
+ if (kappa > CURVATURE_HIGH_THRESHOLD) {
117
+ profile[i] = config.velocityCurveSlow;
118
+ }
119
+ else if (kappa > CURVATURE_MEDIUM_THRESHOLD) {
120
+ profile[i] = config.velocityCurveMedium;
121
+ }
122
+ else {
123
+ profile[i] = config.velocityCurveFast;
124
+ }
125
+ }
126
+ // Endpoints inherit nearest interior value.
127
+ profile[0] = profile[1] ?? config.velocityCurveFast;
128
+ profile[pts.length - 1] = profile[pts.length - 2] ?? config.velocityCurveFast;
129
+ return profile;
130
+ }
131
+ }
132
+ //# sourceMappingURL=SmoothPathFollower.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SmoothPathFollower.js","sourceRoot":"","sources":["../../src/navigation/SmoothPathFollower.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,123 @@
1
+ import type { Vec2 } from '@alife-sdk/core';
2
+ /**
3
+ * Tuning parameters for steering / flocking behaviors.
4
+ * All fields have sensible defaults via {@link createDefaultSteeringConfig}.
5
+ */
6
+ export interface ISteeringConfig {
7
+ /** Minimum distance between agents before separation force kicks in (px). @default 40 */
8
+ readonly separationRadius: number;
9
+ /** Weight of the separation repulsion force. @default 1.5 */
10
+ readonly separationWeight: number;
11
+ /** Radius within which neighbors are considered for cohesion (px). @default 150 */
12
+ readonly neighborRadius: number;
13
+ /** Weight of the cohesion attraction force. @default 0.5 */
14
+ readonly cohesionWeight: number;
15
+ /** Weight of the alignment direction force (applied by caller via combineForces). @default 0.3 */
16
+ readonly alignmentWeight: number;
17
+ /** Maximum magnitude of the final combined steering force (px/s). @default 80 */
18
+ readonly maxSteeringForce: number;
19
+ }
20
+ /**
21
+ * Create an {@link ISteeringConfig} with production defaults.
22
+ * Pass a partial override object to tune individual values without touching the rest.
23
+ *
24
+ * @example
25
+ * const cfg = createDefaultSteeringConfig({ separationRadius: 60 });
26
+ */
27
+ export declare function createDefaultSteeringConfig(overrides?: Partial<ISteeringConfig>): ISteeringConfig;
28
+ /**
29
+ * Compute the separation steering force — repulsion away from any neighbor
30
+ * that is closer than {@link ISteeringConfig.separationRadius}.
31
+ *
32
+ * The force is inversely proportional to distance: the closer the neighbor,
33
+ * the stronger the push. Neighbors outside the radius are ignored.
34
+ * Returns {@link ZERO} when `neighbors` is empty or none are within radius.
35
+ *
36
+ * @param self - Position of the NPC computing the force.
37
+ * @param neighbors - Positions of nearby agents (e.g. from getVisibleAllies()).
38
+ * @param config - Steering configuration.
39
+ */
40
+ export declare function separation(self: Vec2, neighbors: readonly Vec2[], config: ISteeringConfig): Vec2;
41
+ /**
42
+ * Compute the cohesion steering force — attraction toward the average position
43
+ * (center of mass) of neighbors within {@link ISteeringConfig.neighborRadius}.
44
+ *
45
+ * Returns {@link ZERO} when `neighbors` is empty or none are within the radius.
46
+ *
47
+ * @param self - Position of the NPC computing the force.
48
+ * @param neighbors - Positions of nearby agents.
49
+ * @param config - Steering configuration.
50
+ */
51
+ export declare function cohesion(self: Vec2, neighbors: readonly Vec2[], config: ISteeringConfig): Vec2;
52
+ /**
53
+ * Compute the alignment steering force — the average of all provided desired
54
+ * directions (normalized).
55
+ *
56
+ * **API note:** `self` is intentionally absent — alignment depends only on
57
+ * neighbor directions, not on the caller's own position. The caller is
58
+ * responsible for computing `neighborDirections`
59
+ * (e.g. `normalize(target − npcPos)` for each neighbor's target vector).
60
+ *
61
+ * The `alignmentWeight` from config is applied by the caller via
62
+ * {@link combineForces}, consistent with how separation / cohesion weights work.
63
+ *
64
+ * Returns {@link ZERO} when `neighborDirections` is empty.
65
+ *
66
+ * @param neighborDirections - Desired movement directions of nearby agents.
67
+ */
68
+ export declare function alignment(neighborDirections: readonly Vec2[]): Vec2;
69
+ /**
70
+ * Compute a weighted sum of arbitrary steering forces, clamped to `maxMagnitude`.
71
+ *
72
+ * This is the **extensibility escape-hatch**: SDK users can compose any mix of
73
+ * built-in forces (separation, cohesion, alignment) with their own custom forces
74
+ * without modifying the SDK.
75
+ *
76
+ * @example
77
+ * const combined = combineForces([
78
+ * { force: sep, weight: cfg.separationWeight },
79
+ * { force: coh, weight: cfg.cohesionWeight },
80
+ * { force: myFormation, weight: 2.0 },
81
+ * ], cfg.maxSteeringForce);
82
+ *
83
+ * @param forces - Array of `{ force, weight }` entries to blend.
84
+ * @param maxMagnitude - Maximum allowed magnitude of the result (px/s).
85
+ */
86
+ export declare function combineForces(forces: ReadonlyArray<{
87
+ force: Vec2;
88
+ weight: number;
89
+ }>, maxMagnitude: number): Vec2;
90
+ /**
91
+ * Compute the combined separation + cohesion steering force, clamped to
92
+ * {@link ISteeringConfig.maxSteeringForce}.
93
+ *
94
+ * Does **not** include alignment — alignment requires caller-supplied desired
95
+ * directions (see {@link alignment}). Use {@link combineForces} to add it.
96
+ *
97
+ * Returns {@link ZERO} when `neighbors` is empty.
98
+ *
99
+ * @param self - Position of the NPC.
100
+ * @param neighbors - Positions of nearby agents.
101
+ * @param config - Steering configuration.
102
+ */
103
+ export declare function computePackSteering(self: Vec2, neighbors: readonly Vec2[], config: ISteeringConfig): Vec2;
104
+ /**
105
+ * Blend a normalised primary movement direction with a computed steering force.
106
+ *
107
+ * Returns `{ vx, vy }` ready for `ctx.setVelocity()` — consistent with the
108
+ * positional-tuple style used by `moveToward` / `awayFrom` in `_utils.ts`.
109
+ *
110
+ * The result is re-normalised to `speed` so the final magnitude is always
111
+ * consistent regardless of the blend ratio.
112
+ *
113
+ * @param primaryVx - Normalised X component of the desired direction (toward target, etc.).
114
+ * @param primaryVy - Normalised Y component of the desired direction.
115
+ * @param steeringForce - Steering correction force (e.g. from computePackSteering).
116
+ * @param speed - Base movement speed (px/s).
117
+ * @param weight - Blend weight: 0 = pure primary × speed, 1 = pure steering.
118
+ */
119
+ export declare function blendWithPrimary(primaryVx: number, primaryVy: number, steeringForce: Vec2, speed: number, weight: number): {
120
+ vx: number;
121
+ vy: number;
122
+ };
123
+ //# sourceMappingURL=SteeringBehaviors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SteeringBehaviors.d.ts","sourceRoot":"","sources":["../../src/navigation/SteeringBehaviors.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAO5C;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,yFAAyF;IACzF,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAElC,6DAA6D;IAC7D,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAElC,mFAAmF;IACnF,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAEhC,4DAA4D;IAC5D,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAEhC,kGAAkG;IAClG,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IAEjC,iFAAiF;IACjF,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,SAAS,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GACnC,eAAe,CAUjB;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,SAAS,IAAI,EAAE,EAC1B,MAAM,EAAE,eAAe,GACtB,IAAI,CAwBN;AAED;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,SAAS,IAAI,EAAE,EAC1B,MAAM,EAAE,eAAe,GACtB,IAAI,CAqBN;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,SAAS,CACvB,kBAAkB,EAAE,SAAS,IAAI,EAAE,GAClC,IAAI,CAaN;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,aAAa,CAAC;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,EACtD,YAAY,EAAE,MAAM,GACnB,IAAI,CAgBN;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,SAAS,IAAI,EAAE,EAC1B,MAAM,EAAE,eAAe,GACtB,IAAI,CAaN;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,IAAI,EACnB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAe5B"}