@alife-sdk/ai 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (395) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +385 -0
  3. package/dist/animation/AnimationController.d.ts +60 -0
  4. package/dist/animation/AnimationController.d.ts.map +1 -0
  5. package/dist/animation/AnimationController.js +71 -0
  6. package/dist/animation/AnimationController.js.map +1 -0
  7. package/dist/animation/AnimationSelector.d.ts +108 -0
  8. package/dist/animation/AnimationSelector.d.ts.map +1 -0
  9. package/dist/animation/AnimationSelector.js +194 -0
  10. package/dist/animation/AnimationSelector.js.map +1 -0
  11. package/dist/animation/index.d.ts +5 -0
  12. package/dist/animation/index.d.ts.map +1 -0
  13. package/dist/animation/index.js +4 -0
  14. package/dist/animation/index.js.map +1 -0
  15. package/dist/combat/CombatTransitionChain.d.ts +95 -0
  16. package/dist/combat/CombatTransitionChain.d.ts.map +1 -0
  17. package/dist/combat/CombatTransitionChain.js +117 -0
  18. package/dist/combat/CombatTransitionChain.js.map +1 -0
  19. package/dist/combat/LoadoutBuilder.d.ts +83 -0
  20. package/dist/combat/LoadoutBuilder.d.ts.map +1 -0
  21. package/dist/combat/LoadoutBuilder.js +213 -0
  22. package/dist/combat/LoadoutBuilder.js.map +1 -0
  23. package/dist/combat/MonsterAbilityData.d.ts +97 -0
  24. package/dist/combat/MonsterAbilityData.d.ts.map +1 -0
  25. package/dist/combat/MonsterAbilityData.js +94 -0
  26. package/dist/combat/MonsterAbilityData.js.map +1 -0
  27. package/dist/combat/WeaponSelector.d.ts +47 -0
  28. package/dist/combat/WeaponSelector.d.ts.map +1 -0
  29. package/dist/combat/WeaponSelector.js +180 -0
  30. package/dist/combat/WeaponSelector.js.map +1 -0
  31. package/dist/combat/index.d.ts +9 -0
  32. package/dist/combat/index.d.ts.map +1 -0
  33. package/dist/combat/index.js +6 -0
  34. package/dist/combat/index.js.map +1 -0
  35. package/dist/conditions/ConditionBank.d.ts +179 -0
  36. package/dist/conditions/ConditionBank.d.ts.map +1 -0
  37. package/dist/conditions/ConditionBank.js +220 -0
  38. package/dist/conditions/ConditionBank.js.map +1 -0
  39. package/dist/conditions/index.d.ts +3 -0
  40. package/dist/conditions/index.d.ts.map +1 -0
  41. package/dist/conditions/index.js +3 -0
  42. package/dist/conditions/index.js.map +1 -0
  43. package/dist/config/createDefaultAIConfig.d.ts +25 -0
  44. package/dist/config/createDefaultAIConfig.d.ts.map +1 -0
  45. package/dist/config/createDefaultAIConfig.js +147 -0
  46. package/dist/config/createDefaultAIConfig.js.map +1 -0
  47. package/dist/config/index.d.ts +2 -0
  48. package/dist/config/index.d.ts.map +1 -0
  49. package/dist/config/index.js +3 -0
  50. package/dist/config/index.js.map +1 -0
  51. package/dist/cover/CoverAccessAdapter.d.ts +61 -0
  52. package/dist/cover/CoverAccessAdapter.d.ts.map +1 -0
  53. package/dist/cover/CoverAccessAdapter.js +74 -0
  54. package/dist/cover/CoverAccessAdapter.js.map +1 -0
  55. package/dist/cover/CoverEvaluators.d.ts +43 -0
  56. package/dist/cover/CoverEvaluators.d.ts.map +1 -0
  57. package/dist/cover/CoverEvaluators.js +193 -0
  58. package/dist/cover/CoverEvaluators.js.map +1 -0
  59. package/dist/cover/CoverLockRegistry.d.ts +50 -0
  60. package/dist/cover/CoverLockRegistry.d.ts.map +1 -0
  61. package/dist/cover/CoverLockRegistry.js +164 -0
  62. package/dist/cover/CoverLockRegistry.js.map +1 -0
  63. package/dist/cover/CoverRecommender.d.ts +32 -0
  64. package/dist/cover/CoverRecommender.d.ts.map +1 -0
  65. package/dist/cover/CoverRecommender.js +45 -0
  66. package/dist/cover/CoverRecommender.js.map +1 -0
  67. package/dist/cover/CoverRegistry.d.ts +97 -0
  68. package/dist/cover/CoverRegistry.d.ts.map +1 -0
  69. package/dist/cover/CoverRegistry.js +223 -0
  70. package/dist/cover/CoverRegistry.js.map +1 -0
  71. package/dist/cover/ICoverEvaluator.d.ts +15 -0
  72. package/dist/cover/ICoverEvaluator.d.ts.map +1 -0
  73. package/dist/cover/ICoverEvaluator.js +4 -0
  74. package/dist/cover/ICoverEvaluator.js.map +1 -0
  75. package/dist/cover/ICoverLockConfig.d.ts +83 -0
  76. package/dist/cover/ICoverLockConfig.d.ts.map +1 -0
  77. package/dist/cover/ICoverLockConfig.js +21 -0
  78. package/dist/cover/ICoverLockConfig.js.map +1 -0
  79. package/dist/cover/LoopholeGenerator.d.ts +44 -0
  80. package/dist/cover/LoopholeGenerator.d.ts.map +1 -0
  81. package/dist/cover/LoopholeGenerator.js +96 -0
  82. package/dist/cover/LoopholeGenerator.js.map +1 -0
  83. package/dist/cover/index.d.ts +11 -0
  84. package/dist/cover/index.d.ts.map +1 -0
  85. package/dist/cover/index.js +8 -0
  86. package/dist/cover/index.js.map +1 -0
  87. package/dist/goap/EvadeHazardAction.d.ts +34 -0
  88. package/dist/goap/EvadeHazardAction.d.ts.map +1 -0
  89. package/dist/goap/EvadeHazardAction.js +48 -0
  90. package/dist/goap/EvadeHazardAction.js.map +1 -0
  91. package/dist/goap/GOAPController.d.ts +114 -0
  92. package/dist/goap/GOAPController.d.ts.map +1 -0
  93. package/dist/goap/GOAPController.js +191 -0
  94. package/dist/goap/GOAPController.js.map +1 -0
  95. package/dist/goap/GoalSelector.d.ts +40 -0
  96. package/dist/goap/GoalSelector.d.ts.map +1 -0
  97. package/dist/goap/GoalSelector.js +115 -0
  98. package/dist/goap/GoalSelector.js.map +1 -0
  99. package/dist/goap/IHazardZoneAccess.d.ts +16 -0
  100. package/dist/goap/IHazardZoneAccess.d.ts.map +1 -0
  101. package/dist/goap/IHazardZoneAccess.js +2 -0
  102. package/dist/goap/IHazardZoneAccess.js.map +1 -0
  103. package/dist/goap/WorldStateBuilder.d.ts +27 -0
  104. package/dist/goap/WorldStateBuilder.d.ts.map +1 -0
  105. package/dist/goap/WorldStateBuilder.js +51 -0
  106. package/dist/goap/WorldStateBuilder.js.map +1 -0
  107. package/dist/goap/index.d.ts +9 -0
  108. package/dist/goap/index.d.ts.map +1 -0
  109. package/dist/goap/index.js +6 -0
  110. package/dist/goap/index.js.map +1 -0
  111. package/dist/index.d.ts +16 -0
  112. package/dist/index.d.ts.map +1 -0
  113. package/dist/index.js +18 -0
  114. package/dist/index.js.map +1 -0
  115. package/dist/navigation/PathSmoother.d.ts +29 -0
  116. package/dist/navigation/PathSmoother.d.ts.map +1 -0
  117. package/dist/navigation/PathSmoother.js +172 -0
  118. package/dist/navigation/PathSmoother.js.map +1 -0
  119. package/dist/navigation/RestrictedZoneManager.d.ts +83 -0
  120. package/dist/navigation/RestrictedZoneManager.d.ts.map +1 -0
  121. package/dist/navigation/RestrictedZoneManager.js +179 -0
  122. package/dist/navigation/RestrictedZoneManager.js.map +1 -0
  123. package/dist/navigation/SmoothPathFollower.d.ts +55 -0
  124. package/dist/navigation/SmoothPathFollower.d.ts.map +1 -0
  125. package/dist/navigation/SmoothPathFollower.js +132 -0
  126. package/dist/navigation/SmoothPathFollower.js.map +1 -0
  127. package/dist/navigation/SteeringBehaviors.d.ts +123 -0
  128. package/dist/navigation/SteeringBehaviors.d.ts.map +1 -0
  129. package/dist/navigation/SteeringBehaviors.js +211 -0
  130. package/dist/navigation/SteeringBehaviors.js.map +1 -0
  131. package/dist/navigation/index.d.ts +7 -0
  132. package/dist/navigation/index.d.ts.map +1 -0
  133. package/dist/navigation/index.js +6 -0
  134. package/dist/navigation/index.js.map +1 -0
  135. package/dist/perception/NPCSensors.d.ts +129 -0
  136. package/dist/perception/NPCSensors.d.ts.map +1 -0
  137. package/dist/perception/NPCSensors.js +147 -0
  138. package/dist/perception/NPCSensors.js.map +1 -0
  139. package/dist/perception/PerceptionQuery.d.ts +65 -0
  140. package/dist/perception/PerceptionQuery.d.ts.map +1 -0
  141. package/dist/perception/PerceptionQuery.js +199 -0
  142. package/dist/perception/PerceptionQuery.js.map +1 -0
  143. package/dist/perception/index.d.ts +4 -0
  144. package/dist/perception/index.d.ts.map +1 -0
  145. package/dist/perception/index.js +4 -0
  146. package/dist/perception/index.js.map +1 -0
  147. package/dist/plugin/AIPlugin.d.ts +71 -0
  148. package/dist/plugin/AIPlugin.d.ts.map +1 -0
  149. package/dist/plugin/AIPlugin.js +134 -0
  150. package/dist/plugin/AIPlugin.js.map +1 -0
  151. package/dist/plugin/index.d.ts +3 -0
  152. package/dist/plugin/index.d.ts.map +1 -0
  153. package/dist/plugin/index.js +3 -0
  154. package/dist/plugin/index.js.map +1 -0
  155. package/dist/ports/AIPorts.d.ts +13 -0
  156. package/dist/ports/AIPorts.d.ts.map +1 -0
  157. package/dist/ports/AIPorts.js +14 -0
  158. package/dist/ports/AIPorts.js.map +1 -0
  159. package/dist/ports/ICoverPointSource.d.ts +27 -0
  160. package/dist/ports/ICoverPointSource.d.ts.map +1 -0
  161. package/dist/ports/ICoverPointSource.js +4 -0
  162. package/dist/ports/ICoverPointSource.js.map +1 -0
  163. package/dist/ports/IPerceptionProvider.d.ts +42 -0
  164. package/dist/ports/IPerceptionProvider.d.ts.map +1 -0
  165. package/dist/ports/IPerceptionProvider.js +4 -0
  166. package/dist/ports/IPerceptionProvider.js.map +1 -0
  167. package/dist/ports/index.d.ts +4 -0
  168. package/dist/ports/index.d.ts.map +1 -0
  169. package/dist/ports/index.js +3 -0
  170. package/dist/ports/index.js.map +1 -0
  171. package/dist/sound/VocalizationTypes.d.ts +57 -0
  172. package/dist/sound/VocalizationTypes.d.ts.map +1 -0
  173. package/dist/sound/VocalizationTypes.js +87 -0
  174. package/dist/sound/VocalizationTypes.js.map +1 -0
  175. package/dist/sound/index.d.ts +3 -0
  176. package/dist/sound/index.d.ts.map +1 -0
  177. package/dist/sound/index.js +3 -0
  178. package/dist/sound/index.js.map +1 -0
  179. package/dist/squad/SquadSharedTarget.d.ts +137 -0
  180. package/dist/squad/SquadSharedTarget.d.ts.map +1 -0
  181. package/dist/squad/SquadSharedTarget.js +145 -0
  182. package/dist/squad/SquadSharedTarget.js.map +1 -0
  183. package/dist/squad/SquadTactics.d.ts +63 -0
  184. package/dist/squad/SquadTactics.d.ts.map +1 -0
  185. package/dist/squad/SquadTactics.js +76 -0
  186. package/dist/squad/SquadTactics.js.map +1 -0
  187. package/dist/squad/index.d.ts +5 -0
  188. package/dist/squad/index.d.ts.map +1 -0
  189. package/dist/squad/index.js +4 -0
  190. package/dist/squad/index.js.map +1 -0
  191. package/dist/states/INPCContext.d.ts +550 -0
  192. package/dist/states/INPCContext.d.ts.map +1 -0
  193. package/dist/states/INPCContext.js +17 -0
  194. package/dist/states/INPCContext.js.map +1 -0
  195. package/dist/states/INPCOnlineState.d.ts +202 -0
  196. package/dist/states/INPCOnlineState.d.ts.map +1 -0
  197. package/dist/states/INPCOnlineState.js +9 -0
  198. package/dist/states/INPCOnlineState.js.map +1 -0
  199. package/dist/states/IOnlineStateHandler.d.ts +58 -0
  200. package/dist/states/IOnlineStateHandler.d.ts.map +1 -0
  201. package/dist/states/IOnlineStateHandler.js +13 -0
  202. package/dist/states/IOnlineStateHandler.js.map +1 -0
  203. package/dist/states/IStateConfig.d.ts +272 -0
  204. package/dist/states/IStateConfig.d.ts.map +1 -0
  205. package/dist/states/IStateConfig.js +100 -0
  206. package/dist/states/IStateConfig.js.map +1 -0
  207. package/dist/states/IStateTransitionMap.d.ts +89 -0
  208. package/dist/states/IStateTransitionMap.d.ts.map +1 -0
  209. package/dist/states/IStateTransitionMap.js +75 -0
  210. package/dist/states/IStateTransitionMap.js.map +1 -0
  211. package/dist/states/NPCOnlineState.d.ts +19 -0
  212. package/dist/states/NPCOnlineState.d.ts.map +1 -0
  213. package/dist/states/NPCOnlineState.js +75 -0
  214. package/dist/states/NPCOnlineState.js.map +1 -0
  215. package/dist/states/NPCPerception.d.ts +108 -0
  216. package/dist/states/NPCPerception.d.ts.map +1 -0
  217. package/dist/states/NPCPerception.js +122 -0
  218. package/dist/states/NPCPerception.js.map +1 -0
  219. package/dist/states/OnlineAIDriver.d.ts +64 -0
  220. package/dist/states/OnlineAIDriver.d.ts.map +1 -0
  221. package/dist/states/OnlineAIDriver.js +171 -0
  222. package/dist/states/OnlineAIDriver.js.map +1 -0
  223. package/dist/states/OnlineStateRegistryBuilder.d.ts +115 -0
  224. package/dist/states/OnlineStateRegistryBuilder.d.ts.map +1 -0
  225. package/dist/states/OnlineStateRegistryBuilder.js +184 -0
  226. package/dist/states/OnlineStateRegistryBuilder.js.map +1 -0
  227. package/dist/states/StateHandlerMap.d.ts +52 -0
  228. package/dist/states/StateHandlerMap.d.ts.map +1 -0
  229. package/dist/states/StateHandlerMap.js +88 -0
  230. package/dist/states/StateHandlerMap.js.map +1 -0
  231. package/dist/states/eat-corpse/EatCorpseState.d.ts +32 -0
  232. package/dist/states/eat-corpse/EatCorpseState.d.ts.map +1 -0
  233. package/dist/states/eat-corpse/EatCorpseState.js +126 -0
  234. package/dist/states/eat-corpse/EatCorpseState.js.map +1 -0
  235. package/dist/states/eat-corpse/EatCorpseTransitionGuard.d.ts +34 -0
  236. package/dist/states/eat-corpse/EatCorpseTransitionGuard.d.ts.map +1 -0
  237. package/dist/states/eat-corpse/EatCorpseTransitionGuard.js +82 -0
  238. package/dist/states/eat-corpse/EatCorpseTransitionGuard.js.map +1 -0
  239. package/dist/states/eat-corpse/ICorpseSource.d.ts +87 -0
  240. package/dist/states/eat-corpse/ICorpseSource.d.ts.map +1 -0
  241. package/dist/states/eat-corpse/ICorpseSource.js +5 -0
  242. package/dist/states/eat-corpse/ICorpseSource.js.map +1 -0
  243. package/dist/states/eat-corpse/IEatCorpseConfig.d.ts +75 -0
  244. package/dist/states/eat-corpse/IEatCorpseConfig.d.ts.map +1 -0
  245. package/dist/states/eat-corpse/IEatCorpseConfig.js +23 -0
  246. package/dist/states/eat-corpse/IEatCorpseConfig.js.map +1 -0
  247. package/dist/states/eat-corpse/IEatCorpsePhase.d.ts +23 -0
  248. package/dist/states/eat-corpse/IEatCorpsePhase.d.ts.map +1 -0
  249. package/dist/states/eat-corpse/IEatCorpsePhase.js +5 -0
  250. package/dist/states/eat-corpse/IEatCorpsePhase.js.map +1 -0
  251. package/dist/states/eat-corpse/index.d.ts +7 -0
  252. package/dist/states/eat-corpse/index.d.ts.map +1 -0
  253. package/dist/states/eat-corpse/index.js +11 -0
  254. package/dist/states/eat-corpse/index.js.map +1 -0
  255. package/dist/states/handlers/AlertState.d.ts +18 -0
  256. package/dist/states/handlers/AlertState.d.ts.map +1 -0
  257. package/dist/states/handlers/AlertState.js +104 -0
  258. package/dist/states/handlers/AlertState.js.map +1 -0
  259. package/dist/states/handlers/CampState.d.ts +18 -0
  260. package/dist/states/handlers/CampState.d.ts.map +1 -0
  261. package/dist/states/handlers/CampState.js +94 -0
  262. package/dist/states/handlers/CampState.js.map +1 -0
  263. package/dist/states/handlers/ChargeState.d.ts +18 -0
  264. package/dist/states/handlers/ChargeState.d.ts.map +1 -0
  265. package/dist/states/handlers/ChargeState.js +103 -0
  266. package/dist/states/handlers/ChargeState.js.map +1 -0
  267. package/dist/states/handlers/CombatState.d.ts +19 -0
  268. package/dist/states/handlers/CombatState.d.ts.map +1 -0
  269. package/dist/states/handlers/CombatState.js +137 -0
  270. package/dist/states/handlers/CombatState.js.map +1 -0
  271. package/dist/states/handlers/CombatTransitionHandler.d.ts +34 -0
  272. package/dist/states/handlers/CombatTransitionHandler.d.ts.map +1 -0
  273. package/dist/states/handlers/CombatTransitionHandler.js +137 -0
  274. package/dist/states/handlers/CombatTransitionHandler.js.map +1 -0
  275. package/dist/states/handlers/DeadState.d.ts +16 -0
  276. package/dist/states/handlers/DeadState.d.ts.map +1 -0
  277. package/dist/states/handlers/DeadState.js +35 -0
  278. package/dist/states/handlers/DeadState.js.map +1 -0
  279. package/dist/states/handlers/EvadeGrenadeState.d.ts +23 -0
  280. package/dist/states/handlers/EvadeGrenadeState.d.ts.map +1 -0
  281. package/dist/states/handlers/EvadeGrenadeState.js +93 -0
  282. package/dist/states/handlers/EvadeGrenadeState.js.map +1 -0
  283. package/dist/states/handlers/FleeState.d.ts +18 -0
  284. package/dist/states/handlers/FleeState.d.ts.map +1 -0
  285. package/dist/states/handlers/FleeState.js +61 -0
  286. package/dist/states/handlers/FleeState.js.map +1 -0
  287. package/dist/states/handlers/GrenadeState.d.ts +18 -0
  288. package/dist/states/handlers/GrenadeState.d.ts.map +1 -0
  289. package/dist/states/handlers/GrenadeState.js +61 -0
  290. package/dist/states/handlers/GrenadeState.js.map +1 -0
  291. package/dist/states/handlers/HelpWoundedState.d.ts +27 -0
  292. package/dist/states/handlers/HelpWoundedState.d.ts.map +1 -0
  293. package/dist/states/handlers/HelpWoundedState.js +131 -0
  294. package/dist/states/handlers/HelpWoundedState.js.map +1 -0
  295. package/dist/states/handlers/IdleState.d.ts +18 -0
  296. package/dist/states/handlers/IdleState.d.ts.map +1 -0
  297. package/dist/states/handlers/IdleState.js +127 -0
  298. package/dist/states/handlers/IdleState.js.map +1 -0
  299. package/dist/states/handlers/InvestigateState.d.ts +27 -0
  300. package/dist/states/handlers/InvestigateState.d.ts.map +1 -0
  301. package/dist/states/handlers/InvestigateState.js +145 -0
  302. package/dist/states/handlers/InvestigateState.js.map +1 -0
  303. package/dist/states/handlers/KillWoundedState.d.ts +27 -0
  304. package/dist/states/handlers/KillWoundedState.d.ts.map +1 -0
  305. package/dist/states/handlers/KillWoundedState.js +147 -0
  306. package/dist/states/handlers/KillWoundedState.js.map +1 -0
  307. package/dist/states/handlers/LeapState.d.ts +18 -0
  308. package/dist/states/handlers/LeapState.d.ts.map +1 -0
  309. package/dist/states/handlers/LeapState.js +115 -0
  310. package/dist/states/handlers/LeapState.js.map +1 -0
  311. package/dist/states/handlers/MonsterCombatController.d.ts +55 -0
  312. package/dist/states/handlers/MonsterCombatController.d.ts.map +1 -0
  313. package/dist/states/handlers/MonsterCombatController.js +152 -0
  314. package/dist/states/handlers/MonsterCombatController.js.map +1 -0
  315. package/dist/states/handlers/PatrolState.d.ts +18 -0
  316. package/dist/states/handlers/PatrolState.d.ts.map +1 -0
  317. package/dist/states/handlers/PatrolState.js +137 -0
  318. package/dist/states/handlers/PatrolState.js.map +1 -0
  319. package/dist/states/handlers/PsiAttackState.d.ts +18 -0
  320. package/dist/states/handlers/PsiAttackState.d.ts.map +1 -0
  321. package/dist/states/handlers/PsiAttackState.js +101 -0
  322. package/dist/states/handlers/PsiAttackState.js.map +1 -0
  323. package/dist/states/handlers/RetreatState.d.ts +18 -0
  324. package/dist/states/handlers/RetreatState.d.ts.map +1 -0
  325. package/dist/states/handlers/RetreatState.js +131 -0
  326. package/dist/states/handlers/RetreatState.js.map +1 -0
  327. package/dist/states/handlers/SearchState.d.ts +18 -0
  328. package/dist/states/handlers/SearchState.d.ts.map +1 -0
  329. package/dist/states/handlers/SearchState.js +64 -0
  330. package/dist/states/handlers/SearchState.js.map +1 -0
  331. package/dist/states/handlers/SleepState.d.ts +18 -0
  332. package/dist/states/handlers/SleepState.d.ts.map +1 -0
  333. package/dist/states/handlers/SleepState.js +94 -0
  334. package/dist/states/handlers/SleepState.js.map +1 -0
  335. package/dist/states/handlers/StalkState.d.ts +18 -0
  336. package/dist/states/handlers/StalkState.d.ts.map +1 -0
  337. package/dist/states/handlers/StalkState.js +82 -0
  338. package/dist/states/handlers/StalkState.js.map +1 -0
  339. package/dist/states/handlers/TakeCoverState.d.ts +18 -0
  340. package/dist/states/handlers/TakeCoverState.d.ts.map +1 -0
  341. package/dist/states/handlers/TakeCoverState.js +208 -0
  342. package/dist/states/handlers/TakeCoverState.js.map +1 -0
  343. package/dist/states/handlers/WoundedState.d.ts +18 -0
  344. package/dist/states/handlers/WoundedState.d.ts.map +1 -0
  345. package/dist/states/handlers/WoundedState.js +71 -0
  346. package/dist/states/handlers/WoundedState.js.map +1 -0
  347. package/dist/states/handlers/_utils.d.ts +55 -0
  348. package/dist/states/handlers/_utils.d.ts.map +1 -0
  349. package/dist/states/handlers/_utils.js +88 -0
  350. package/dist/states/handlers/_utils.js.map +1 -0
  351. package/dist/states/handlers/index.d.ts +25 -0
  352. package/dist/states/handlers/index.d.ts.map +1 -0
  353. package/dist/states/handlers/index.js +28 -0
  354. package/dist/states/handlers/index.js.map +1 -0
  355. package/dist/states/index.d.ts +17 -0
  356. package/dist/states/index.d.ts.map +1 -0
  357. package/dist/states/index.js +12 -0
  358. package/dist/states/index.js.map +1 -0
  359. package/dist/states/pack/IPackAccess.d.ts +46 -0
  360. package/dist/states/pack/IPackAccess.d.ts.map +1 -0
  361. package/dist/states/pack/IPackAccess.js +8 -0
  362. package/dist/states/pack/IPackAccess.js.map +1 -0
  363. package/dist/suspicion/SuspicionAccumulator.d.ts +166 -0
  364. package/dist/suspicion/SuspicionAccumulator.d.ts.map +1 -0
  365. package/dist/suspicion/SuspicionAccumulator.js +191 -0
  366. package/dist/suspicion/SuspicionAccumulator.js.map +1 -0
  367. package/dist/suspicion/index.d.ts +3 -0
  368. package/dist/suspicion/index.d.ts.map +1 -0
  369. package/dist/suspicion/index.js +2 -0
  370. package/dist/suspicion/index.js.map +1 -0
  371. package/dist/types/IAnimationTypes.d.ts +28 -0
  372. package/dist/types/IAnimationTypes.d.ts.map +1 -0
  373. package/dist/types/IAnimationTypes.js +17 -0
  374. package/dist/types/IAnimationTypes.js.map +1 -0
  375. package/dist/types/ICoverPoint.d.ts +76 -0
  376. package/dist/types/ICoverPoint.d.ts.map +1 -0
  377. package/dist/types/ICoverPoint.js +21 -0
  378. package/dist/types/ICoverPoint.js.map +1 -0
  379. package/dist/types/IOnlineAIConfig.d.ts +150 -0
  380. package/dist/types/IOnlineAIConfig.d.ts.map +1 -0
  381. package/dist/types/IOnlineAIConfig.js +5 -0
  382. package/dist/types/IOnlineAIConfig.js.map +1 -0
  383. package/dist/types/IPerceptionTypes.d.ts +94 -0
  384. package/dist/types/IPerceptionTypes.d.ts.map +1 -0
  385. package/dist/types/IPerceptionTypes.js +37 -0
  386. package/dist/types/IPerceptionTypes.js.map +1 -0
  387. package/dist/types/IWeaponTypes.d.ts +56 -0
  388. package/dist/types/IWeaponTypes.d.ts.map +1 -0
  389. package/dist/types/IWeaponTypes.js +15 -0
  390. package/dist/types/IWeaponTypes.js.map +1 -0
  391. package/dist/types/index.d.ts +10 -0
  392. package/dist/types/index.d.ts.map +1 -0
  393. package/dist/types/index.js +5 -0
  394. package/dist/types/index.js.map +1 -0
  395. package/package.json +123 -0
@@ -0,0 +1,88 @@
1
+ // states/StateHandlerMap.ts
2
+ // Fluent registry for online state handlers.
3
+ //
4
+ // Usage:
5
+ // const handlers = buildDefaultHandlerMap(cfg, tr)
6
+ // .register('HUNT', new HuntState(cfg))
7
+ // .register('AMBUSH', new AmbushState(cfg));
8
+ //
9
+ // const driver = new OnlineAIDriver(ctx, handlers, 'IDLE');
10
+ /**
11
+ * Type-safe registry for online NPC state handlers.
12
+ *
13
+ * Wraps a Map<string, IOnlineStateHandler> with a fluent API to make
14
+ * custom state registration explicit and discoverable.
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * // Zombie game with custom states
19
+ * const handlers = buildDefaultHandlerMap(cfg, {
20
+ * combatOnPanicked: 'shamble_away',
21
+ * monsterOnNoEnemy: 'wander',
22
+ * })
23
+ * .register('HUNT', new HuntState(cfg))
24
+ * .register('shamble_away', new ShamblingFleeState(cfg))
25
+ * .extend(buildMonsterHandlerMap(cfg));
26
+ * ```
27
+ */
28
+ export class StateHandlerMap {
29
+ constructor(entries) {
30
+ this._map = new Map(entries);
31
+ }
32
+ /**
33
+ * Register a handler for a state ID.
34
+ * Overwrites any existing handler for that ID.
35
+ * Returns `this` for fluent chaining.
36
+ */
37
+ register(stateId, handler) {
38
+ this._map.set(stateId, handler);
39
+ return this;
40
+ }
41
+ /**
42
+ * Merge all handlers from another StateHandlerMap or Map.
43
+ * Existing IDs in `this` are NOT overwritten — use {@link register} for targeted overrides.
44
+ * Returns `this` for fluent chaining.
45
+ */
46
+ extend(other) {
47
+ const source = other instanceof StateHandlerMap ? other._map : other;
48
+ for (const [id, handler] of source) {
49
+ if (!this._map.has(id)) {
50
+ this._map.set(id, handler);
51
+ }
52
+ }
53
+ return this;
54
+ }
55
+ /**
56
+ * Override all handlers from another StateHandlerMap or Map.
57
+ * Existing IDs in `this` ARE overwritten.
58
+ * Returns `this` for fluent chaining.
59
+ */
60
+ override(other) {
61
+ const source = other instanceof StateHandlerMap ? other._map : other;
62
+ for (const [id, handler] of source) {
63
+ this._map.set(id, handler);
64
+ }
65
+ return this;
66
+ }
67
+ /** Returns the handler registered for `stateId`, or undefined. */
68
+ get(stateId) {
69
+ return this._map.get(stateId);
70
+ }
71
+ /** Returns true if a handler for `stateId` is registered. */
72
+ has(stateId) {
73
+ return this._map.has(stateId);
74
+ }
75
+ /** Number of registered handlers. */
76
+ get size() {
77
+ return this._map.size;
78
+ }
79
+ /** Iterate over all [stateId, handler] pairs. */
80
+ [Symbol.iterator]() {
81
+ return this._map[Symbol.iterator]();
82
+ }
83
+ /** Returns the underlying Map (read-only view). */
84
+ toMap() {
85
+ return this._map;
86
+ }
87
+ }
88
+ //# sourceMappingURL=StateHandlerMap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StateHandlerMap.js","sourceRoot":"","sources":["../../src/states/StateHandlerMap.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,6CAA6C;AAC7C,EAAE;AACF,SAAS;AACT,qDAAqD;AACrD,4CAA4C;AAC5C,iDAAiD;AACjD,EAAE;AACF,8DAA8D;AAI9D;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,eAAe;IAG1B,YAAY,OAAiD;QAC3D,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED;;;;OAIG;IACH,QAAQ,CAAC,OAAe,EAAE,OAA4B;QACpD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,KAAyD;QAC9D,MAAM,MAAM,GAAG,KAAK,YAAY,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;QACrE,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,MAAM,EAAE,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBACvB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACH,QAAQ,CAAC,KAAyD;QAChE,MAAM,MAAM,GAAG,KAAK,YAAY,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;QACrE,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,MAAM,EAAE,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,kEAAkE;IAClE,GAAG,CAAC,OAAe;QACjB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAED,6DAA6D;IAC7D,GAAG,CAAC,OAAe;QACjB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAED,qCAAqC;IACrC,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACxB,CAAC;IAED,iDAAiD;IACjD,CAAC,MAAM,CAAC,QAAQ,CAAC;QACf,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;IACtC,CAAC;IAED,mDAAmD;IACnD,KAAK;QACH,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;CACF"}
@@ -0,0 +1,32 @@
1
+ import type { IOnlineStateHandler } from '../IOnlineStateHandler';
2
+ import type { INPCContext } from '../INPCContext';
3
+ import type { IStateConfig } from '../IStateConfig';
4
+ import type { IStateTransitionMap } from '../IStateTransitionMap';
5
+ import type { ICorpseSource } from './ICorpseSource';
6
+ import type { IEatCorpseConfig } from './IEatCorpseConfig';
7
+ /**
8
+ * Stateless EAT_CORPSE state handler for predatory NPCs.
9
+ *
10
+ * A single instance can be shared across all NPC entities.
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * // Register alongside the default monster handler map:
15
+ * const handlers = buildMonsterHandlerMap(cfg, {
16
+ * monsterOnNoEnemy: 'EAT_CORPSE', // try eating after a kill
17
+ * eatCorpseOnNoCorpse: 'IDLE', // nothing nearby? just idle
18
+ * });
19
+ * handlers.set('EAT_CORPSE', new EatCorpseState(cfg, tr, corpseSource));
20
+ * ```
21
+ */
22
+ export declare class EatCorpseState implements IOnlineStateHandler {
23
+ private readonly cfg;
24
+ private readonly tr;
25
+ private readonly source;
26
+ private readonly eatCfg;
27
+ constructor(cfg: IStateConfig, tr: Partial<IStateTransitionMap> | undefined, corpseSource: ICorpseSource, eatCfg?: Partial<IEatCorpseConfig>);
28
+ enter(ctx: INPCContext): void;
29
+ update(ctx: INPCContext, _deltaMs: number): void;
30
+ exit(ctx: INPCContext): void;
31
+ }
32
+ //# sourceMappingURL=EatCorpseState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EatCorpseState.d.ts","sourceRoot":"","sources":["../../../src/states/eat-corpse/EatCorpseState.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D;;;;;;;;;;;;;;GAcG;AACH,qBAAa,cAAe,YAAW,mBAAmB;IACxD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAsB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;gBAGxC,GAAG,EAAE,YAAY,EACjB,EAAE,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,SAAS,EAC5C,YAAY,EAAE,aAAa,EAC3B,MAAM,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC;IAQpC,KAAK,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAmC7B,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAsDhD,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;CAK7B"}
@@ -0,0 +1,126 @@
1
+ // states/eat-corpse/EatCorpseState.ts
2
+ // Opt-in state handler: predatory NPC approaches and consumes a nearby corpse.
3
+ //
4
+ // Phase cycle:
5
+ // APPROACH — NPC moves toward the target corpse.
6
+ // EATING — NPC halts at the corpse for eatDurationMs.
7
+ // DONE — Reward applied, consumeCorpse() called, transition out.
8
+ //
9
+ // Transitions out:
10
+ // - Eating complete → eatCorpseOnDone (default: 'IDLE')
11
+ // - No corpse in radius → eatCorpseOnNoCorpse (default: 'IDLE')
12
+ // - Enemy spotted → eatCorpseOnInterrupt (default: 'ALERT')
13
+ //
14
+ // enter: find nearest corpse, set phase data
15
+ // exit: mark phase inactive (corpse NOT consumed unless eating completed)
16
+ //
17
+ // Opt-in: never registered by buildDefaultHandlerMap / buildMonsterHandlerMap.
18
+ // Register manually:
19
+ // handlerMap.set('EAT_CORPSE', new EatCorpseState(cfg, tr, corpseSource));
20
+ import { createDefaultTransitionMap } from '../IStateTransitionMap';
21
+ import { moveToward, distanceTo } from '../handlers/_utils';
22
+ import { createDefaultEatCorpseConfig } from './IEatCorpseConfig';
23
+ /**
24
+ * Stateless EAT_CORPSE state handler for predatory NPCs.
25
+ *
26
+ * A single instance can be shared across all NPC entities.
27
+ *
28
+ * @example
29
+ * ```ts
30
+ * // Register alongside the default monster handler map:
31
+ * const handlers = buildMonsterHandlerMap(cfg, {
32
+ * monsterOnNoEnemy: 'EAT_CORPSE', // try eating after a kill
33
+ * eatCorpseOnNoCorpse: 'IDLE', // nothing nearby? just idle
34
+ * });
35
+ * handlers.set('EAT_CORPSE', new EatCorpseState(cfg, tr, corpseSource));
36
+ * ```
37
+ */
38
+ export class EatCorpseState {
39
+ constructor(cfg, tr, corpseSource, eatCfg) {
40
+ this.cfg = cfg;
41
+ this.tr = createDefaultTransitionMap(tr);
42
+ this.source = corpseSource;
43
+ this.eatCfg = createDefaultEatCorpseConfig(eatCfg);
44
+ }
45
+ enter(ctx) {
46
+ var _a;
47
+ const corpses = this.source.findCorpses(ctx.npcId, ctx.x, ctx.y, this.eatCfg.searchRadius);
48
+ if (corpses.length === 0) {
49
+ ctx.transition(this.tr.eatCorpseOnNoCorpse);
50
+ return;
51
+ }
52
+ const target = corpses[0];
53
+ // Lazy-init phase bag — zero cost for NPCs that never eat.
54
+ (_a = ctx.state).eatCorpsePhase ?? (_a.eatCorpsePhase = {
55
+ active: false,
56
+ corpseId: '',
57
+ corpseX: 0,
58
+ corpseY: 0,
59
+ healAmount: 0,
60
+ eatStartMs: 0,
61
+ eating: false,
62
+ });
63
+ const phase = ctx.state.eatCorpsePhase;
64
+ phase.active = true;
65
+ phase.corpseId = target.id;
66
+ phase.corpseX = target.x;
67
+ phase.corpseY = target.y;
68
+ phase.healAmount = target.healAmount;
69
+ phase.eatStartMs = 0;
70
+ phase.eating = false;
71
+ ctx.emitVocalization('EAT_CORPSE_START');
72
+ }
73
+ update(ctx, _deltaMs) {
74
+ const phase = ctx.state.eatCorpsePhase;
75
+ if (!phase?.active) {
76
+ ctx.transition(this.tr.eatCorpseOnNoCorpse);
77
+ return;
78
+ }
79
+ // Interrupt: enemy spotted (even while eating).
80
+ if (ctx.perception?.hasVisibleEnemy()) {
81
+ const enemy = ctx.perception.getVisibleEnemies()[0];
82
+ ctx.state.lastKnownEnemyX = enemy.x;
83
+ ctx.state.lastKnownEnemyY = enemy.y;
84
+ ctx.state.targetId = enemy.id;
85
+ ctx.transition(this.tr.eatCorpseOnInterrupt);
86
+ return;
87
+ }
88
+ const now = ctx.now();
89
+ // APPROACH phase: move toward corpse until close enough.
90
+ if (!phase.eating) {
91
+ const dist = distanceTo(ctx.x, ctx.y, phase.corpseX, phase.corpseY);
92
+ if (dist > this.eatCfg.arriveThreshold) {
93
+ const speed = this.eatCfg.approachSpeed ?? this.cfg.approachSpeed;
94
+ moveToward(ctx, phase.corpseX, phase.corpseY, speed);
95
+ return;
96
+ }
97
+ // Arrived — start eating.
98
+ phase.eating = true;
99
+ phase.eatStartMs = now;
100
+ ctx.halt();
101
+ return;
102
+ }
103
+ // EATING phase: wait for duration then apply reward.
104
+ ctx.halt();
105
+ if (now - phase.eatStartMs >= this.eatCfg.eatDurationMs) {
106
+ // consumeCorpse returns false if another NPC already consumed this
107
+ // corpse during the approach/eating phase (TOCTOU race). Gate heal and
108
+ // morale reward on successful consumption — always transition out.
109
+ const consumed = this.source.consumeCorpse(ctx.npcId, phase.corpseId);
110
+ if (consumed) {
111
+ if (phase.healAmount > 0) {
112
+ ctx.health?.heal(phase.healAmount);
113
+ }
114
+ ctx.state.morale = Math.min(1, Math.max(-1, ctx.state.morale + this.eatCfg.moraleBoost));
115
+ }
116
+ ctx.emitVocalization('EAT_CORPSE_DONE');
117
+ ctx.transition(this.tr.eatCorpseOnDone);
118
+ }
119
+ }
120
+ exit(ctx) {
121
+ if (ctx.state.eatCorpsePhase) {
122
+ ctx.state.eatCorpsePhase.active = false;
123
+ }
124
+ }
125
+ }
126
+ //# sourceMappingURL=EatCorpseState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EatCorpseState.js","sourceRoot":"","sources":["../../../src/states/eat-corpse/EatCorpseState.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { IOnlineStateHandler } from '../IOnlineStateHandler';
2
+ import type { ICorpseSource } from './ICorpseSource';
3
+ import type { IEatCorpseGuardConfig } from './IEatCorpseConfig';
4
+ /**
5
+ * Wraps an existing calm-state handler (IDLE, PATROL, CAMP, etc.) with a
6
+ * periodic hunger check. When the NPC's HP drops below `hungerHpThreshold`,
7
+ * a random roll is performed, and if corpses are nearby, the NPC transitions
8
+ * to `eatStateId` (default `'EAT_CORPSE'`).
9
+ *
10
+ * The inner handler's behavior is fully preserved — enter, update, and exit
11
+ * are all forwarded before the hunger check runs.
12
+ *
13
+ * **Memory**: stores a `Map<string, number>` (npcId → lastCheckMs) in the
14
+ * decorator closure. Entries are removed in `exit()` to prevent leaks.
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * // Wrap IDLE and PATROL so dogs/boars look for corpses while calm:
19
+ * const idleWithEating = withEatCorpseGuard(handlers.get('IDLE')!, corpseSource, {
20
+ * allowedEntityTypes: ['dog', 'boar'],
21
+ * hungerHpThreshold: 0.7,
22
+ * });
23
+ * handlers.set('IDLE', idleWithEating);
24
+ * handlers.set('PATROL', withEatCorpseGuard(handlers.get('PATROL')!, corpseSource, {
25
+ * allowedEntityTypes: ['dog', 'boar'],
26
+ * }));
27
+ * ```
28
+ *
29
+ * @param inner - The handler to wrap.
30
+ * @param corpseSource - Host-provided corpse discovery service.
31
+ * @param guardCfg - Optional config overrides.
32
+ */
33
+ export declare function withEatCorpseGuard(inner: IOnlineStateHandler, corpseSource: ICorpseSource, guardCfg?: Partial<IEatCorpseGuardConfig>): IOnlineStateHandler;
34
+ //# sourceMappingURL=EatCorpseTransitionGuard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EatCorpseTransitionGuard.d.ts","sourceRoot":"","sources":["../../../src/states/eat-corpse/EatCorpseTransitionGuard.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,mBAAmB,EAC1B,YAAY,EAAE,aAAa,EAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,GACxC,mBAAmB,CAwDrB"}
@@ -0,0 +1,82 @@
1
+ // states/eat-corpse/EatCorpseTransitionGuard.ts
2
+ // Decorator that adds periodic corpse-hunger checks to calm-state handlers.
3
+ import { createDefaultEatCorpseGuardConfig } from './IEatCorpseConfig';
4
+ /**
5
+ * Wraps an existing calm-state handler (IDLE, PATROL, CAMP, etc.) with a
6
+ * periodic hunger check. When the NPC's HP drops below `hungerHpThreshold`,
7
+ * a random roll is performed, and if corpses are nearby, the NPC transitions
8
+ * to `eatStateId` (default `'EAT_CORPSE'`).
9
+ *
10
+ * The inner handler's behavior is fully preserved — enter, update, and exit
11
+ * are all forwarded before the hunger check runs.
12
+ *
13
+ * **Memory**: stores a `Map<string, number>` (npcId → lastCheckMs) in the
14
+ * decorator closure. Entries are removed in `exit()` to prevent leaks.
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * // Wrap IDLE and PATROL so dogs/boars look for corpses while calm:
19
+ * const idleWithEating = withEatCorpseGuard(handlers.get('IDLE')!, corpseSource, {
20
+ * allowedEntityTypes: ['dog', 'boar'],
21
+ * hungerHpThreshold: 0.7,
22
+ * });
23
+ * handlers.set('IDLE', idleWithEating);
24
+ * handlers.set('PATROL', withEatCorpseGuard(handlers.get('PATROL')!, corpseSource, {
25
+ * allowedEntityTypes: ['dog', 'boar'],
26
+ * }));
27
+ * ```
28
+ *
29
+ * @param inner - The handler to wrap.
30
+ * @param corpseSource - Host-provided corpse discovery service.
31
+ * @param guardCfg - Optional config overrides.
32
+ */
33
+ export function withEatCorpseGuard(inner, corpseSource, guardCfg) {
34
+ const cfg = createDefaultEatCorpseGuardConfig(guardCfg);
35
+ // Per-NPC last-check timestamps, stored in decorator closure.
36
+ const lastCheckMs = new Map();
37
+ return {
38
+ enter(ctx) {
39
+ inner.enter(ctx);
40
+ },
41
+ exit(ctx) {
42
+ inner.exit(ctx);
43
+ lastCheckMs.delete(ctx.npcId);
44
+ },
45
+ update(ctx, deltaMs) {
46
+ // Capture current state ID before delegating so we can detect if the
47
+ // inner handler already triggered a transition (e.g. IDLE spotted an
48
+ // enemy and called ctx.transition('ALERT')). If the state changed we
49
+ // must bail — overriding a completed transition would cause the NPC to
50
+ // ignore threats and walk toward corpses during combat.
51
+ const stateBefore = ctx.currentStateId;
52
+ inner.update(ctx, deltaMs);
53
+ if (ctx.currentStateId !== stateBefore)
54
+ return;
55
+ // Entity-type filter (skip if this NPC type doesn't eat).
56
+ if (cfg.allowedEntityTypes !== null &&
57
+ !cfg.allowedEntityTypes.includes(ctx.entityType)) {
58
+ return;
59
+ }
60
+ // Throttle: only check every checkIntervalMs.
61
+ // Use -Infinity as sentinel so the very first call always proceeds
62
+ // regardless of ctx.now() value (even if it returns 0).
63
+ const now = ctx.now();
64
+ const last = lastCheckMs.get(ctx.npcId) ?? -Infinity;
65
+ if (now - last < cfg.checkIntervalMs)
66
+ return;
67
+ lastCheckMs.set(ctx.npcId, now);
68
+ // Only hungry NPCs look for food.
69
+ if ((ctx.health?.hpPercent ?? 1) > cfg.hungerHpThreshold)
70
+ return;
71
+ // Probabilistic roll to avoid every NPC eating at the same moment.
72
+ if (ctx.random() >= cfg.eatProbability)
73
+ return;
74
+ // Pre-flight corpse check — avoids EAT_CORPSE enter/exit ping-pong.
75
+ const corpses = corpseSource.findCorpses(ctx.npcId, ctx.x, ctx.y, cfg.searchRadius);
76
+ if (corpses.length === 0)
77
+ return;
78
+ ctx.transition(cfg.eatStateId);
79
+ },
80
+ };
81
+ }
82
+ //# sourceMappingURL=EatCorpseTransitionGuard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EatCorpseTransitionGuard.js","sourceRoot":"","sources":["../../../src/states/eat-corpse/EatCorpseTransitionGuard.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,4EAA4E;AAK5E,OAAO,EAAE,iCAAiC,EAAE,MAAM,oBAAoB,CAAC;AAGvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAA0B,EAC1B,YAA2B,EAC3B,QAAyC;IAEzC,MAAM,GAAG,GAAG,iCAAiC,CAAC,QAAQ,CAAC,CAAC;IACxD,8DAA8D;IAC9D,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE9C,OAAO;QACL,KAAK,CAAC,GAAgB;YACpB,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QAED,IAAI,CAAC,GAAgB;YACnB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;QAED,MAAM,CAAC,GAAgB,EAAE,OAAe;YACtC,qEAAqE;YACrE,qEAAqE;YACrE,qEAAqE;YACrE,uEAAuE;YACvE,wDAAwD;YACxD,MAAM,WAAW,GAAG,GAAG,CAAC,cAAc,CAAC;YACvC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC3B,IAAI,GAAG,CAAC,cAAc,KAAK,WAAW;gBAAE,OAAO;YAE/C,0DAA0D;YAC1D,IACE,GAAG,CAAC,kBAAkB,KAAK,IAAI;gBAC/B,CAAC,GAAG,CAAC,kBAAkB,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAChD,CAAC;gBACD,OAAO;YACT,CAAC;YAED,8CAA8C;YAC9C,mEAAmE;YACnE,wDAAwD;YACxD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;YACrD,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC,eAAe;gBAAE,OAAO;YAC7C,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAEhC,kCAAkC;YAClC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,iBAAiB;gBAAE,OAAO;YAEjE,mEAAmE;YACnE,IAAI,GAAG,CAAC,MAAM,EAAE,IAAI,GAAG,CAAC,cAAc;gBAAE,OAAO;YAE/C,oEAAoE;YACpE,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,CACtC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,YAAY,CAC1C,CAAC;YACF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAEjC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACjC,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * A single corpse available for consumption.
3
+ *
4
+ * Populated by the host from its own entity system.
5
+ * `healAmount` is per-corpse so different enemy types can yield
6
+ * different rewards (e.g. boar corpse > dog corpse).
7
+ * `corpseType` is a passthrough tag — the SDK ignores it, but the host
8
+ * may use it inside `findCorpses()` to filter by edibility.
9
+ */
10
+ export interface ICorpseRecord {
11
+ /** Stable entity ID of the corpse. */
12
+ readonly id: string;
13
+ /** World X of the corpse (px). */
14
+ readonly x: number;
15
+ /** World Y of the corpse (px). */
16
+ readonly y: number;
17
+ /**
18
+ * HP to restore to the eating NPC on successful consumption.
19
+ * 0 means no HP reward (morale boost still applies).
20
+ */
21
+ readonly healAmount: number;
22
+ /**
23
+ * Optional tag for host-side filtering (e.g. 'human', 'animal').
24
+ * The SDK never reads this field.
25
+ */
26
+ readonly corpseType?: string;
27
+ }
28
+ /**
29
+ * Callback interface the host injects into `EatCorpseState`.
30
+ *
31
+ * Mirrors the `emitMeleeHit()` / `emitShoot()` pattern:
32
+ * the SDK declares intent (`consumeCorpse`) and the host executes the
33
+ * side-effect (entity removal, loot drop, etc.).
34
+ *
35
+ * @example
36
+ * ```ts
37
+ * // Phaser layer implementation:
38
+ * const corpseSource: ICorpseSource = {
39
+ * findCorpses(npcId, x, y, radius) {
40
+ * return spatialGrid.query(x, y, radius)
41
+ * .filter(e => e.type === 'corpse')
42
+ * .map(e => ({ id: e.id, x: e.x, y: e.y, healAmount: 20 }));
43
+ * },
44
+ * consumeCorpse(_npcId, corpseId) {
45
+ * const entity = scene.getEntityById(corpseId);
46
+ * if (!entity) return false;
47
+ * entity.destroy();
48
+ * return true;
49
+ * },
50
+ * };
51
+ * ```
52
+ */
53
+ export interface ICorpseSource {
54
+ /**
55
+ * Return corpses within `radius` px of the NPC, sorted nearest-first.
56
+ *
57
+ * @param npcId - ID of the requesting NPC (for ownership checks if needed).
58
+ * @param x - Searcher world X.
59
+ * @param y - Searcher world Y.
60
+ * @param radius - Search radius (px).
61
+ */
62
+ findCorpses(npcId: string, x: number, y: number, radius: number): ReadonlyArray<ICorpseRecord>;
63
+ /**
64
+ * Mark a corpse as consumed (remove it from the world).
65
+ *
66
+ * Called by `EatCorpseState` after the eating timer completes.
67
+ * If `corpseId` was already removed (race with another NPC or despawn),
68
+ * return `false` — the SDK will skip the heal and morale reward.
69
+ *
70
+ * @param npcId - ID of the consuming NPC.
71
+ * @param corpseId - ID of the corpse to remove.
72
+ * @returns `true` if the corpse was successfully consumed, `false` if it
73
+ * was already gone (duplicate eat, early despawn, etc.).
74
+ *
75
+ * @example
76
+ * ```ts
77
+ * consumeCorpse(_npcId, corpseId) {
78
+ * const entity = scene.getEntityById(corpseId);
79
+ * if (!entity) return false;
80
+ * entity.destroy();
81
+ * return true;
82
+ * },
83
+ * ```
84
+ */
85
+ consumeCorpse(npcId: string, corpseId: string): boolean;
86
+ }
87
+ //# sourceMappingURL=ICorpseSource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ICorpseSource.d.ts","sourceRoot":"","sources":["../../../src/states/eat-corpse/ICorpseSource.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,MAAM,WAAW,aAAa;IAC5B,sCAAsC;IACtC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;;;OAOG;IACH,WAAW,CACT,KAAK,EAAE,MAAM,EACb,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,MAAM,EAAE,MAAM,GACb,aAAa,CAAC,aAAa,CAAC,CAAC;IAEhC;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;CACzD"}
@@ -0,0 +1,5 @@
1
+ // states/eat-corpse/ICorpseSource.ts
2
+ // Host-implemented corpse discovery and consumption interface.
3
+ // The SDK never creates, stores, or destroys corpse records.
4
+ export {};
5
+ //# sourceMappingURL=ICorpseSource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ICorpseSource.js","sourceRoot":"","sources":["../../../src/states/eat-corpse/ICorpseSource.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,+DAA+D;AAC/D,6DAA6D"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Tuning parameters for the EAT_CORPSE state handler.
3
+ *
4
+ * All distances are in world pixels; all durations in milliseconds.
5
+ */
6
+ export interface IEatCorpseConfig {
7
+ /**
8
+ * Radius (px) to search for corpses on `enter()`.
9
+ * @default 250
10
+ */
11
+ readonly searchRadius: number;
12
+ /**
13
+ * How long the NPC spends eating before the corpse is consumed (ms).
14
+ * @default 4_000
15
+ */
16
+ readonly eatDurationMs: number;
17
+ /**
18
+ * Approach speed toward the corpse (px/s).
19
+ * When omitted, falls back to `IStateConfig.approachSpeed`.
20
+ */
21
+ readonly approachSpeed?: number;
22
+ /**
23
+ * Distance threshold at which the NPC is considered "at" the corpse (px).
24
+ * @default 24
25
+ */
26
+ readonly arriveThreshold: number;
27
+ /**
28
+ * Additive morale bonus applied on successful consumption.
29
+ * Clamped to [-1, 1] after addition.
30
+ * @default 0.15
31
+ */
32
+ readonly moraleBoost: number;
33
+ }
34
+ export declare function createDefaultEatCorpseConfig(overrides?: Partial<IEatCorpseConfig>): IEatCorpseConfig;
35
+ /**
36
+ * Tuning parameters for `withEatCorpseGuard()`.
37
+ */
38
+ export interface IEatCorpseGuardConfig {
39
+ /**
40
+ * Interval between hunger checks (ms). Controls how often `findCorpses` is
41
+ * called from within calm states (IDLE / PATROL).
42
+ * @default 5_000
43
+ */
44
+ readonly checkIntervalMs: number;
45
+ /**
46
+ * HP fraction at or below which the NPC considers eating.
47
+ * 1.0 = always hungry; 0.0 = never hungry.
48
+ * @default 0.7
49
+ */
50
+ readonly hungerHpThreshold: number;
51
+ /**
52
+ * Probability [0, 1) of transitioning to EAT_CORPSE when conditions are met.
53
+ * Sampled via `ctx.random()`.
54
+ * @default 0.4
55
+ */
56
+ readonly eatProbability: number;
57
+ /**
58
+ * Radius (px) used in the guard's pre-flight `findCorpses` check.
59
+ * Should match or exceed `IEatCorpseConfig.searchRadius`.
60
+ * @default 250
61
+ */
62
+ readonly searchRadius: number;
63
+ /**
64
+ * State ID to transition to when the guard triggers.
65
+ * @default 'EAT_CORPSE'
66
+ */
67
+ readonly eatStateId: string;
68
+ /**
69
+ * Entity types allowed to trigger the guard, or null to allow all.
70
+ * @default null
71
+ */
72
+ readonly allowedEntityTypes: ReadonlyArray<string> | null;
73
+ }
74
+ export declare function createDefaultEatCorpseGuardConfig(overrides?: Partial<IEatCorpseGuardConfig>): IEatCorpseGuardConfig;
75
+ //# sourceMappingURL=IEatCorpseConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IEatCorpseConfig.d.ts","sourceRoot":"","sources":["../../../src/states/eat-corpse/IEatCorpseConfig.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAE9B;;;OAGG;IACH,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAE/B;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAEhC;;;OAGG;IACH,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IAEjC;;;;OAIG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAgB,4BAA4B,CAC1C,SAAS,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GACpC,gBAAgB,CAQlB;AAMD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IAEjC;;;;OAIG;IACH,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IAEnC;;;;OAIG;IACH,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAEhC;;;;OAIG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAE9B;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B;;;OAGG;IACH,QAAQ,CAAC,kBAAkB,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;CAC3D;AAED,wBAAgB,iCAAiC,CAC/C,SAAS,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,GACzC,qBAAqB,CAUvB"}
@@ -0,0 +1,23 @@
1
+ // states/eat-corpse/IEatCorpseConfig.ts
2
+ // Configuration for EatCorpseState and withEatCorpseGuard.
3
+ export function createDefaultEatCorpseConfig(overrides) {
4
+ return {
5
+ searchRadius: 250,
6
+ eatDurationMs: 4000,
7
+ arriveThreshold: 24,
8
+ moraleBoost: 0.15,
9
+ ...overrides,
10
+ };
11
+ }
12
+ export function createDefaultEatCorpseGuardConfig(overrides) {
13
+ return {
14
+ checkIntervalMs: 5000,
15
+ hungerHpThreshold: 0.7,
16
+ eatProbability: 0.4,
17
+ searchRadius: 250,
18
+ eatStateId: 'EAT_CORPSE',
19
+ allowedEntityTypes: null,
20
+ ...overrides,
21
+ };
22
+ }
23
+ //# sourceMappingURL=IEatCorpseConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IEatCorpseConfig.js","sourceRoot":"","sources":["../../../src/states/eat-corpse/IEatCorpseConfig.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,2DAA2D;AAwC3D,MAAM,UAAU,4BAA4B,CAC1C,SAAqC;IAErC,OAAO;QACL,YAAY,EAAE,GAAG;QACjB,aAAa,EAAE,IAAK;QACpB,eAAe,EAAE,EAAE;QACnB,WAAW,EAAE,IAAI;QACjB,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAmDD,MAAM,UAAU,iCAAiC,CAC/C,SAA0C;IAE1C,OAAO;QACL,eAAe,EAAE,IAAK;QACtB,iBAAiB,EAAE,GAAG;QACtB,cAAc,EAAE,GAAG;QACnB,YAAY,EAAE,GAAG;QACjB,UAAU,EAAE,YAAY;QACxB,kBAAkB,EAAE,IAAI;QACxB,GAAG,SAAS;KACb,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Mutable phase data stored in `INPCOnlineState.eatCorpsePhase`.
3
+ *
4
+ * Lazy-initialised by `EatCorpseState.enter()` via the `??=` operator;
5
+ * zero-cost for NPCs that never enter EAT_CORPSE.
6
+ */
7
+ export interface IEatCorpsePhase {
8
+ /** Whether the eat sequence is currently active. */
9
+ active: boolean;
10
+ /** Stable entity ID of the target corpse. */
11
+ corpseId: string;
12
+ /** World X of the target corpse (set once in enter). */
13
+ corpseX: number;
14
+ /** World Y of the target corpse (set once in enter). */
15
+ corpseY: number;
16
+ /** HP reward to apply on completion (copied from ICorpseRecord.healAmount). */
17
+ healAmount: number;
18
+ /** ctx.now() when the eating phase began (0 while still approaching). */
19
+ eatStartMs: number;
20
+ /** True once the NPC has arrived at the corpse and started eating. */
21
+ eating: boolean;
22
+ }
23
+ //# sourceMappingURL=IEatCorpsePhase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IEatCorpsePhase.d.ts","sourceRoot":"","sources":["../../../src/states/eat-corpse/IEatCorpsePhase.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,oDAAoD;IACpD,MAAM,EAAE,OAAO,CAAC;IAChB,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,UAAU,EAAE,MAAM,CAAC;IACnB,yEAAyE;IACzE,UAAU,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,MAAM,EAAE,OAAO,CAAC;CACjB"}
@@ -0,0 +1,5 @@
1
+ // states/eat-corpse/IEatCorpsePhase.ts
2
+ // Per-NPC mutable phase data for the EAT_CORPSE state.
3
+ // Follows the same pattern as IChargePhase, IStalkPhase, etc.
4
+ export {};
5
+ //# sourceMappingURL=IEatCorpsePhase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IEatCorpsePhase.js","sourceRoot":"","sources":["../../../src/states/eat-corpse/IEatCorpsePhase.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,uDAAuD;AACvD,8DAA8D"}
@@ -0,0 +1,7 @@
1
+ export type { ICorpseRecord, ICorpseSource } from './ICorpseSource';
2
+ export type { IEatCorpsePhase } from './IEatCorpsePhase';
3
+ export type { IEatCorpseConfig, IEatCorpseGuardConfig } from './IEatCorpseConfig';
4
+ export { createDefaultEatCorpseConfig, createDefaultEatCorpseGuardConfig } from './IEatCorpseConfig';
5
+ export { EatCorpseState } from './EatCorpseState';
6
+ export { withEatCorpseGuard } from './EatCorpseTransitionGuard';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/states/eat-corpse/index.ts"],"names":[],"mappings":"AAQA,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACpE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,YAAY,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,4BAA4B,EAAE,iCAAiC,EAAE,MAAM,oBAAoB,CAAC;AACrG,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC"}