@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.
- package/LICENSE +21 -0
- package/README.md +385 -0
- package/dist/animation/AnimationController.d.ts +60 -0
- package/dist/animation/AnimationController.d.ts.map +1 -0
- package/dist/animation/AnimationController.js +71 -0
- package/dist/animation/AnimationController.js.map +1 -0
- package/dist/animation/AnimationSelector.d.ts +108 -0
- package/dist/animation/AnimationSelector.d.ts.map +1 -0
- package/dist/animation/AnimationSelector.js +194 -0
- package/dist/animation/AnimationSelector.js.map +1 -0
- package/dist/animation/index.d.ts +5 -0
- package/dist/animation/index.d.ts.map +1 -0
- package/dist/animation/index.js +4 -0
- package/dist/animation/index.js.map +1 -0
- package/dist/combat/CombatTransitionChain.d.ts +95 -0
- package/dist/combat/CombatTransitionChain.d.ts.map +1 -0
- package/dist/combat/CombatTransitionChain.js +117 -0
- package/dist/combat/CombatTransitionChain.js.map +1 -0
- package/dist/combat/LoadoutBuilder.d.ts +83 -0
- package/dist/combat/LoadoutBuilder.d.ts.map +1 -0
- package/dist/combat/LoadoutBuilder.js +213 -0
- package/dist/combat/LoadoutBuilder.js.map +1 -0
- package/dist/combat/MonsterAbilityData.d.ts +97 -0
- package/dist/combat/MonsterAbilityData.d.ts.map +1 -0
- package/dist/combat/MonsterAbilityData.js +94 -0
- package/dist/combat/MonsterAbilityData.js.map +1 -0
- package/dist/combat/WeaponSelector.d.ts +47 -0
- package/dist/combat/WeaponSelector.d.ts.map +1 -0
- package/dist/combat/WeaponSelector.js +180 -0
- package/dist/combat/WeaponSelector.js.map +1 -0
- package/dist/combat/index.d.ts +9 -0
- package/dist/combat/index.d.ts.map +1 -0
- package/dist/combat/index.js +6 -0
- package/dist/combat/index.js.map +1 -0
- package/dist/conditions/ConditionBank.d.ts +179 -0
- package/dist/conditions/ConditionBank.d.ts.map +1 -0
- package/dist/conditions/ConditionBank.js +220 -0
- package/dist/conditions/ConditionBank.js.map +1 -0
- package/dist/conditions/index.d.ts +3 -0
- package/dist/conditions/index.d.ts.map +1 -0
- package/dist/conditions/index.js +3 -0
- package/dist/conditions/index.js.map +1 -0
- package/dist/config/createDefaultAIConfig.d.ts +25 -0
- package/dist/config/createDefaultAIConfig.d.ts.map +1 -0
- package/dist/config/createDefaultAIConfig.js +147 -0
- package/dist/config/createDefaultAIConfig.js.map +1 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +3 -0
- package/dist/config/index.js.map +1 -0
- package/dist/cover/CoverAccessAdapter.d.ts +61 -0
- package/dist/cover/CoverAccessAdapter.d.ts.map +1 -0
- package/dist/cover/CoverAccessAdapter.js +74 -0
- package/dist/cover/CoverAccessAdapter.js.map +1 -0
- package/dist/cover/CoverEvaluators.d.ts +43 -0
- package/dist/cover/CoverEvaluators.d.ts.map +1 -0
- package/dist/cover/CoverEvaluators.js +193 -0
- package/dist/cover/CoverEvaluators.js.map +1 -0
- package/dist/cover/CoverLockRegistry.d.ts +50 -0
- package/dist/cover/CoverLockRegistry.d.ts.map +1 -0
- package/dist/cover/CoverLockRegistry.js +164 -0
- package/dist/cover/CoverLockRegistry.js.map +1 -0
- package/dist/cover/CoverRecommender.d.ts +32 -0
- package/dist/cover/CoverRecommender.d.ts.map +1 -0
- package/dist/cover/CoverRecommender.js +45 -0
- package/dist/cover/CoverRecommender.js.map +1 -0
- package/dist/cover/CoverRegistry.d.ts +97 -0
- package/dist/cover/CoverRegistry.d.ts.map +1 -0
- package/dist/cover/CoverRegistry.js +223 -0
- package/dist/cover/CoverRegistry.js.map +1 -0
- package/dist/cover/ICoverEvaluator.d.ts +15 -0
- package/dist/cover/ICoverEvaluator.d.ts.map +1 -0
- package/dist/cover/ICoverEvaluator.js +4 -0
- package/dist/cover/ICoverEvaluator.js.map +1 -0
- package/dist/cover/ICoverLockConfig.d.ts +83 -0
- package/dist/cover/ICoverLockConfig.d.ts.map +1 -0
- package/dist/cover/ICoverLockConfig.js +21 -0
- package/dist/cover/ICoverLockConfig.js.map +1 -0
- package/dist/cover/LoopholeGenerator.d.ts +44 -0
- package/dist/cover/LoopholeGenerator.d.ts.map +1 -0
- package/dist/cover/LoopholeGenerator.js +96 -0
- package/dist/cover/LoopholeGenerator.js.map +1 -0
- package/dist/cover/index.d.ts +11 -0
- package/dist/cover/index.d.ts.map +1 -0
- package/dist/cover/index.js +8 -0
- package/dist/cover/index.js.map +1 -0
- package/dist/goap/EvadeHazardAction.d.ts +34 -0
- package/dist/goap/EvadeHazardAction.d.ts.map +1 -0
- package/dist/goap/EvadeHazardAction.js +48 -0
- package/dist/goap/EvadeHazardAction.js.map +1 -0
- package/dist/goap/GOAPController.d.ts +114 -0
- package/dist/goap/GOAPController.d.ts.map +1 -0
- package/dist/goap/GOAPController.js +191 -0
- package/dist/goap/GOAPController.js.map +1 -0
- package/dist/goap/GoalSelector.d.ts +40 -0
- package/dist/goap/GoalSelector.d.ts.map +1 -0
- package/dist/goap/GoalSelector.js +115 -0
- package/dist/goap/GoalSelector.js.map +1 -0
- package/dist/goap/IHazardZoneAccess.d.ts +16 -0
- package/dist/goap/IHazardZoneAccess.d.ts.map +1 -0
- package/dist/goap/IHazardZoneAccess.js +2 -0
- package/dist/goap/IHazardZoneAccess.js.map +1 -0
- package/dist/goap/WorldStateBuilder.d.ts +27 -0
- package/dist/goap/WorldStateBuilder.d.ts.map +1 -0
- package/dist/goap/WorldStateBuilder.js +51 -0
- package/dist/goap/WorldStateBuilder.js.map +1 -0
- package/dist/goap/index.d.ts +9 -0
- package/dist/goap/index.d.ts.map +1 -0
- package/dist/goap/index.js +6 -0
- package/dist/goap/index.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/navigation/PathSmoother.d.ts +29 -0
- package/dist/navigation/PathSmoother.d.ts.map +1 -0
- package/dist/navigation/PathSmoother.js +172 -0
- package/dist/navigation/PathSmoother.js.map +1 -0
- package/dist/navigation/RestrictedZoneManager.d.ts +83 -0
- package/dist/navigation/RestrictedZoneManager.d.ts.map +1 -0
- package/dist/navigation/RestrictedZoneManager.js +179 -0
- package/dist/navigation/RestrictedZoneManager.js.map +1 -0
- package/dist/navigation/SmoothPathFollower.d.ts +55 -0
- package/dist/navigation/SmoothPathFollower.d.ts.map +1 -0
- package/dist/navigation/SmoothPathFollower.js +132 -0
- package/dist/navigation/SmoothPathFollower.js.map +1 -0
- package/dist/navigation/SteeringBehaviors.d.ts +123 -0
- package/dist/navigation/SteeringBehaviors.d.ts.map +1 -0
- package/dist/navigation/SteeringBehaviors.js +211 -0
- package/dist/navigation/SteeringBehaviors.js.map +1 -0
- package/dist/navigation/index.d.ts +7 -0
- package/dist/navigation/index.d.ts.map +1 -0
- package/dist/navigation/index.js +6 -0
- package/dist/navigation/index.js.map +1 -0
- package/dist/perception/NPCSensors.d.ts +129 -0
- package/dist/perception/NPCSensors.d.ts.map +1 -0
- package/dist/perception/NPCSensors.js +147 -0
- package/dist/perception/NPCSensors.js.map +1 -0
- package/dist/perception/PerceptionQuery.d.ts +65 -0
- package/dist/perception/PerceptionQuery.d.ts.map +1 -0
- package/dist/perception/PerceptionQuery.js +199 -0
- package/dist/perception/PerceptionQuery.js.map +1 -0
- package/dist/perception/index.d.ts +4 -0
- package/dist/perception/index.d.ts.map +1 -0
- package/dist/perception/index.js +4 -0
- package/dist/perception/index.js.map +1 -0
- package/dist/plugin/AIPlugin.d.ts +71 -0
- package/dist/plugin/AIPlugin.d.ts.map +1 -0
- package/dist/plugin/AIPlugin.js +134 -0
- package/dist/plugin/AIPlugin.js.map +1 -0
- package/dist/plugin/index.d.ts +3 -0
- package/dist/plugin/index.d.ts.map +1 -0
- package/dist/plugin/index.js +3 -0
- package/dist/plugin/index.js.map +1 -0
- package/dist/ports/AIPorts.d.ts +13 -0
- package/dist/ports/AIPorts.d.ts.map +1 -0
- package/dist/ports/AIPorts.js +14 -0
- package/dist/ports/AIPorts.js.map +1 -0
- package/dist/ports/ICoverPointSource.d.ts +27 -0
- package/dist/ports/ICoverPointSource.d.ts.map +1 -0
- package/dist/ports/ICoverPointSource.js +4 -0
- package/dist/ports/ICoverPointSource.js.map +1 -0
- package/dist/ports/IPerceptionProvider.d.ts +42 -0
- package/dist/ports/IPerceptionProvider.d.ts.map +1 -0
- package/dist/ports/IPerceptionProvider.js +4 -0
- package/dist/ports/IPerceptionProvider.js.map +1 -0
- package/dist/ports/index.d.ts +4 -0
- package/dist/ports/index.d.ts.map +1 -0
- package/dist/ports/index.js +3 -0
- package/dist/ports/index.js.map +1 -0
- package/dist/sound/VocalizationTypes.d.ts +57 -0
- package/dist/sound/VocalizationTypes.d.ts.map +1 -0
- package/dist/sound/VocalizationTypes.js +87 -0
- package/dist/sound/VocalizationTypes.js.map +1 -0
- package/dist/sound/index.d.ts +3 -0
- package/dist/sound/index.d.ts.map +1 -0
- package/dist/sound/index.js +3 -0
- package/dist/sound/index.js.map +1 -0
- package/dist/squad/SquadSharedTarget.d.ts +137 -0
- package/dist/squad/SquadSharedTarget.d.ts.map +1 -0
- package/dist/squad/SquadSharedTarget.js +145 -0
- package/dist/squad/SquadSharedTarget.js.map +1 -0
- package/dist/squad/SquadTactics.d.ts +63 -0
- package/dist/squad/SquadTactics.d.ts.map +1 -0
- package/dist/squad/SquadTactics.js +76 -0
- package/dist/squad/SquadTactics.js.map +1 -0
- package/dist/squad/index.d.ts +5 -0
- package/dist/squad/index.d.ts.map +1 -0
- package/dist/squad/index.js +4 -0
- package/dist/squad/index.js.map +1 -0
- package/dist/states/INPCContext.d.ts +550 -0
- package/dist/states/INPCContext.d.ts.map +1 -0
- package/dist/states/INPCContext.js +17 -0
- package/dist/states/INPCContext.js.map +1 -0
- package/dist/states/INPCOnlineState.d.ts +202 -0
- package/dist/states/INPCOnlineState.d.ts.map +1 -0
- package/dist/states/INPCOnlineState.js +9 -0
- package/dist/states/INPCOnlineState.js.map +1 -0
- package/dist/states/IOnlineStateHandler.d.ts +58 -0
- package/dist/states/IOnlineStateHandler.d.ts.map +1 -0
- package/dist/states/IOnlineStateHandler.js +13 -0
- package/dist/states/IOnlineStateHandler.js.map +1 -0
- package/dist/states/IStateConfig.d.ts +272 -0
- package/dist/states/IStateConfig.d.ts.map +1 -0
- package/dist/states/IStateConfig.js +100 -0
- package/dist/states/IStateConfig.js.map +1 -0
- package/dist/states/IStateTransitionMap.d.ts +89 -0
- package/dist/states/IStateTransitionMap.d.ts.map +1 -0
- package/dist/states/IStateTransitionMap.js +75 -0
- package/dist/states/IStateTransitionMap.js.map +1 -0
- package/dist/states/NPCOnlineState.d.ts +19 -0
- package/dist/states/NPCOnlineState.d.ts.map +1 -0
- package/dist/states/NPCOnlineState.js +75 -0
- package/dist/states/NPCOnlineState.js.map +1 -0
- package/dist/states/NPCPerception.d.ts +108 -0
- package/dist/states/NPCPerception.d.ts.map +1 -0
- package/dist/states/NPCPerception.js +122 -0
- package/dist/states/NPCPerception.js.map +1 -0
- package/dist/states/OnlineAIDriver.d.ts +64 -0
- package/dist/states/OnlineAIDriver.d.ts.map +1 -0
- package/dist/states/OnlineAIDriver.js +171 -0
- package/dist/states/OnlineAIDriver.js.map +1 -0
- package/dist/states/OnlineStateRegistryBuilder.d.ts +115 -0
- package/dist/states/OnlineStateRegistryBuilder.d.ts.map +1 -0
- package/dist/states/OnlineStateRegistryBuilder.js +184 -0
- package/dist/states/OnlineStateRegistryBuilder.js.map +1 -0
- package/dist/states/StateHandlerMap.d.ts +52 -0
- package/dist/states/StateHandlerMap.d.ts.map +1 -0
- package/dist/states/StateHandlerMap.js +88 -0
- package/dist/states/StateHandlerMap.js.map +1 -0
- package/dist/states/eat-corpse/EatCorpseState.d.ts +32 -0
- package/dist/states/eat-corpse/EatCorpseState.d.ts.map +1 -0
- package/dist/states/eat-corpse/EatCorpseState.js +126 -0
- package/dist/states/eat-corpse/EatCorpseState.js.map +1 -0
- package/dist/states/eat-corpse/EatCorpseTransitionGuard.d.ts +34 -0
- package/dist/states/eat-corpse/EatCorpseTransitionGuard.d.ts.map +1 -0
- package/dist/states/eat-corpse/EatCorpseTransitionGuard.js +82 -0
- package/dist/states/eat-corpse/EatCorpseTransitionGuard.js.map +1 -0
- package/dist/states/eat-corpse/ICorpseSource.d.ts +87 -0
- package/dist/states/eat-corpse/ICorpseSource.d.ts.map +1 -0
- package/dist/states/eat-corpse/ICorpseSource.js +5 -0
- package/dist/states/eat-corpse/ICorpseSource.js.map +1 -0
- package/dist/states/eat-corpse/IEatCorpseConfig.d.ts +75 -0
- package/dist/states/eat-corpse/IEatCorpseConfig.d.ts.map +1 -0
- package/dist/states/eat-corpse/IEatCorpseConfig.js +23 -0
- package/dist/states/eat-corpse/IEatCorpseConfig.js.map +1 -0
- package/dist/states/eat-corpse/IEatCorpsePhase.d.ts +23 -0
- package/dist/states/eat-corpse/IEatCorpsePhase.d.ts.map +1 -0
- package/dist/states/eat-corpse/IEatCorpsePhase.js +5 -0
- package/dist/states/eat-corpse/IEatCorpsePhase.js.map +1 -0
- package/dist/states/eat-corpse/index.d.ts +7 -0
- package/dist/states/eat-corpse/index.d.ts.map +1 -0
- package/dist/states/eat-corpse/index.js +11 -0
- package/dist/states/eat-corpse/index.js.map +1 -0
- package/dist/states/handlers/AlertState.d.ts +18 -0
- package/dist/states/handlers/AlertState.d.ts.map +1 -0
- package/dist/states/handlers/AlertState.js +104 -0
- package/dist/states/handlers/AlertState.js.map +1 -0
- package/dist/states/handlers/CampState.d.ts +18 -0
- package/dist/states/handlers/CampState.d.ts.map +1 -0
- package/dist/states/handlers/CampState.js +94 -0
- package/dist/states/handlers/CampState.js.map +1 -0
- package/dist/states/handlers/ChargeState.d.ts +18 -0
- package/dist/states/handlers/ChargeState.d.ts.map +1 -0
- package/dist/states/handlers/ChargeState.js +103 -0
- package/dist/states/handlers/ChargeState.js.map +1 -0
- package/dist/states/handlers/CombatState.d.ts +19 -0
- package/dist/states/handlers/CombatState.d.ts.map +1 -0
- package/dist/states/handlers/CombatState.js +137 -0
- package/dist/states/handlers/CombatState.js.map +1 -0
- package/dist/states/handlers/CombatTransitionHandler.d.ts +34 -0
- package/dist/states/handlers/CombatTransitionHandler.d.ts.map +1 -0
- package/dist/states/handlers/CombatTransitionHandler.js +137 -0
- package/dist/states/handlers/CombatTransitionHandler.js.map +1 -0
- package/dist/states/handlers/DeadState.d.ts +16 -0
- package/dist/states/handlers/DeadState.d.ts.map +1 -0
- package/dist/states/handlers/DeadState.js +35 -0
- package/dist/states/handlers/DeadState.js.map +1 -0
- package/dist/states/handlers/EvadeGrenadeState.d.ts +23 -0
- package/dist/states/handlers/EvadeGrenadeState.d.ts.map +1 -0
- package/dist/states/handlers/EvadeGrenadeState.js +93 -0
- package/dist/states/handlers/EvadeGrenadeState.js.map +1 -0
- package/dist/states/handlers/FleeState.d.ts +18 -0
- package/dist/states/handlers/FleeState.d.ts.map +1 -0
- package/dist/states/handlers/FleeState.js +61 -0
- package/dist/states/handlers/FleeState.js.map +1 -0
- package/dist/states/handlers/GrenadeState.d.ts +18 -0
- package/dist/states/handlers/GrenadeState.d.ts.map +1 -0
- package/dist/states/handlers/GrenadeState.js +61 -0
- package/dist/states/handlers/GrenadeState.js.map +1 -0
- package/dist/states/handlers/HelpWoundedState.d.ts +27 -0
- package/dist/states/handlers/HelpWoundedState.d.ts.map +1 -0
- package/dist/states/handlers/HelpWoundedState.js +131 -0
- package/dist/states/handlers/HelpWoundedState.js.map +1 -0
- package/dist/states/handlers/IdleState.d.ts +18 -0
- package/dist/states/handlers/IdleState.d.ts.map +1 -0
- package/dist/states/handlers/IdleState.js +127 -0
- package/dist/states/handlers/IdleState.js.map +1 -0
- package/dist/states/handlers/InvestigateState.d.ts +27 -0
- package/dist/states/handlers/InvestigateState.d.ts.map +1 -0
- package/dist/states/handlers/InvestigateState.js +145 -0
- package/dist/states/handlers/InvestigateState.js.map +1 -0
- package/dist/states/handlers/KillWoundedState.d.ts +27 -0
- package/dist/states/handlers/KillWoundedState.d.ts.map +1 -0
- package/dist/states/handlers/KillWoundedState.js +147 -0
- package/dist/states/handlers/KillWoundedState.js.map +1 -0
- package/dist/states/handlers/LeapState.d.ts +18 -0
- package/dist/states/handlers/LeapState.d.ts.map +1 -0
- package/dist/states/handlers/LeapState.js +115 -0
- package/dist/states/handlers/LeapState.js.map +1 -0
- package/dist/states/handlers/MonsterCombatController.d.ts +55 -0
- package/dist/states/handlers/MonsterCombatController.d.ts.map +1 -0
- package/dist/states/handlers/MonsterCombatController.js +152 -0
- package/dist/states/handlers/MonsterCombatController.js.map +1 -0
- package/dist/states/handlers/PatrolState.d.ts +18 -0
- package/dist/states/handlers/PatrolState.d.ts.map +1 -0
- package/dist/states/handlers/PatrolState.js +137 -0
- package/dist/states/handlers/PatrolState.js.map +1 -0
- package/dist/states/handlers/PsiAttackState.d.ts +18 -0
- package/dist/states/handlers/PsiAttackState.d.ts.map +1 -0
- package/dist/states/handlers/PsiAttackState.js +101 -0
- package/dist/states/handlers/PsiAttackState.js.map +1 -0
- package/dist/states/handlers/RetreatState.d.ts +18 -0
- package/dist/states/handlers/RetreatState.d.ts.map +1 -0
- package/dist/states/handlers/RetreatState.js +131 -0
- package/dist/states/handlers/RetreatState.js.map +1 -0
- package/dist/states/handlers/SearchState.d.ts +18 -0
- package/dist/states/handlers/SearchState.d.ts.map +1 -0
- package/dist/states/handlers/SearchState.js +64 -0
- package/dist/states/handlers/SearchState.js.map +1 -0
- package/dist/states/handlers/SleepState.d.ts +18 -0
- package/dist/states/handlers/SleepState.d.ts.map +1 -0
- package/dist/states/handlers/SleepState.js +94 -0
- package/dist/states/handlers/SleepState.js.map +1 -0
- package/dist/states/handlers/StalkState.d.ts +18 -0
- package/dist/states/handlers/StalkState.d.ts.map +1 -0
- package/dist/states/handlers/StalkState.js +82 -0
- package/dist/states/handlers/StalkState.js.map +1 -0
- package/dist/states/handlers/TakeCoverState.d.ts +18 -0
- package/dist/states/handlers/TakeCoverState.d.ts.map +1 -0
- package/dist/states/handlers/TakeCoverState.js +208 -0
- package/dist/states/handlers/TakeCoverState.js.map +1 -0
- package/dist/states/handlers/WoundedState.d.ts +18 -0
- package/dist/states/handlers/WoundedState.d.ts.map +1 -0
- package/dist/states/handlers/WoundedState.js +71 -0
- package/dist/states/handlers/WoundedState.js.map +1 -0
- package/dist/states/handlers/_utils.d.ts +55 -0
- package/dist/states/handlers/_utils.d.ts.map +1 -0
- package/dist/states/handlers/_utils.js +88 -0
- package/dist/states/handlers/_utils.js.map +1 -0
- package/dist/states/handlers/index.d.ts +25 -0
- package/dist/states/handlers/index.d.ts.map +1 -0
- package/dist/states/handlers/index.js +28 -0
- package/dist/states/handlers/index.js.map +1 -0
- package/dist/states/index.d.ts +17 -0
- package/dist/states/index.d.ts.map +1 -0
- package/dist/states/index.js +12 -0
- package/dist/states/index.js.map +1 -0
- package/dist/states/pack/IPackAccess.d.ts +46 -0
- package/dist/states/pack/IPackAccess.d.ts.map +1 -0
- package/dist/states/pack/IPackAccess.js +8 -0
- package/dist/states/pack/IPackAccess.js.map +1 -0
- package/dist/suspicion/SuspicionAccumulator.d.ts +166 -0
- package/dist/suspicion/SuspicionAccumulator.d.ts.map +1 -0
- package/dist/suspicion/SuspicionAccumulator.js +191 -0
- package/dist/suspicion/SuspicionAccumulator.js.map +1 -0
- package/dist/suspicion/index.d.ts +3 -0
- package/dist/suspicion/index.d.ts.map +1 -0
- package/dist/suspicion/index.js +2 -0
- package/dist/suspicion/index.js.map +1 -0
- package/dist/types/IAnimationTypes.d.ts +28 -0
- package/dist/types/IAnimationTypes.d.ts.map +1 -0
- package/dist/types/IAnimationTypes.js +17 -0
- package/dist/types/IAnimationTypes.js.map +1 -0
- package/dist/types/ICoverPoint.d.ts +76 -0
- package/dist/types/ICoverPoint.d.ts.map +1 -0
- package/dist/types/ICoverPoint.js +21 -0
- package/dist/types/ICoverPoint.js.map +1 -0
- package/dist/types/IOnlineAIConfig.d.ts +150 -0
- package/dist/types/IOnlineAIConfig.d.ts.map +1 -0
- package/dist/types/IOnlineAIConfig.js +5 -0
- package/dist/types/IOnlineAIConfig.js.map +1 -0
- package/dist/types/IPerceptionTypes.d.ts +94 -0
- package/dist/types/IPerceptionTypes.d.ts.map +1 -0
- package/dist/types/IPerceptionTypes.js +37 -0
- package/dist/types/IPerceptionTypes.js.map +1 -0
- package/dist/types/IWeaponTypes.d.ts +56 -0
- package/dist/types/IWeaponTypes.d.ts.map +1 -0
- package/dist/types/IWeaponTypes.js +15 -0
- package/dist/types/IWeaponTypes.js.map +1 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +123 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// states/eat-corpse — opt-in corpse-eating behavior module.
|
|
2
|
+
//
|
|
3
|
+
// Import explicitly to opt in:
|
|
4
|
+
// import { EatCorpseState, withEatCorpseGuard } from '@alife-sdk/ai/states/eat-corpse';
|
|
5
|
+
//
|
|
6
|
+
// Never imported by buildDefaultHandlerMap or buildMonsterHandlerMap.
|
|
7
|
+
// Zero bundle cost for projects that do not use this module.
|
|
8
|
+
export { createDefaultEatCorpseConfig, createDefaultEatCorpseGuardConfig } from './IEatCorpseConfig';
|
|
9
|
+
export { EatCorpseState } from './EatCorpseState';
|
|
10
|
+
export { withEatCorpseGuard } from './EatCorpseTransitionGuard';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/states/eat-corpse/index.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,EAAE;AACF,+BAA+B;AAC/B,0FAA0F;AAC1F,EAAE;AACF,sEAAsE;AACtE,6DAA6D;AAK7D,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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
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
|
+
/**
|
|
6
|
+
* Stateless alert-state handler.
|
|
7
|
+
*
|
|
8
|
+
* A single instance can be shared across all NPC entities.
|
|
9
|
+
*/
|
|
10
|
+
export declare class AlertState implements IOnlineStateHandler {
|
|
11
|
+
private readonly cfg;
|
|
12
|
+
private readonly tr;
|
|
13
|
+
constructor(cfg: IStateConfig, tr?: Partial<IStateTransitionMap>);
|
|
14
|
+
enter(ctx: INPCContext): void;
|
|
15
|
+
update(ctx: INPCContext, _deltaMs: number): void;
|
|
16
|
+
exit(_ctx: INPCContext): void;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=AlertState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AlertState.d.ts","sourceRoot":"","sources":["../../../src/states/handlers/AlertState.ts"],"names":[],"mappings":"AAcA,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;AAGlE;;;;GAIG;AACH,qBAAa,UAAW,YAAW,mBAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAsB;gBAE7B,GAAG,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC;IAKhE,KAAK,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAc7B,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAyEhD,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;CAG9B"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// states/handlers/AlertState.ts
|
|
2
|
+
// NPC heard something (gunshot, sound) and investigates the source.
|
|
3
|
+
// Upgrades to COMBAT when the enemy is directly spotted; reverts to PATROL
|
|
4
|
+
// if the alert timer expires without finding anyone.
|
|
5
|
+
//
|
|
6
|
+
// Morale-aware:
|
|
7
|
+
// - PANICKED NPC → skip investigation, flee immediately (FLEE).
|
|
8
|
+
//
|
|
9
|
+
// Transitions out of ALERT:
|
|
10
|
+
// - morale is PANICKED → FLEE
|
|
11
|
+
// - visible enemy spotted → COMBAT
|
|
12
|
+
// - alert timer (cfg.alertDuration) expired → PATROL
|
|
13
|
+
// - arrived at last known position → wait in place until timer
|
|
14
|
+
import { createDefaultTransitionMap } from '../IStateTransitionMap';
|
|
15
|
+
import { moveToward } from './_utils';
|
|
16
|
+
/**
|
|
17
|
+
* Stateless alert-state handler.
|
|
18
|
+
*
|
|
19
|
+
* A single instance can be shared across all NPC entities.
|
|
20
|
+
*/
|
|
21
|
+
export class AlertState {
|
|
22
|
+
constructor(cfg, tr) {
|
|
23
|
+
this.cfg = cfg;
|
|
24
|
+
this.tr = createDefaultTransitionMap(tr);
|
|
25
|
+
}
|
|
26
|
+
enter(ctx) {
|
|
27
|
+
ctx.state.alertStartMs = ctx.now();
|
|
28
|
+
ctx.halt();
|
|
29
|
+
// Pack alert broadcast (opt-in)
|
|
30
|
+
if (ctx.state.lastKnownEnemyX !== 0 || ctx.state.lastKnownEnemyY !== 0) {
|
|
31
|
+
ctx.pack?.broadcastTarget(ctx.state.targetId, ctx.state.lastKnownEnemyX, ctx.state.lastKnownEnemyY);
|
|
32
|
+
ctx.pack?.broadcastAlertLevel('ALERTED');
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
update(ctx, _deltaMs) {
|
|
36
|
+
// --- Morale check: panicked NPC flees immediately ---
|
|
37
|
+
if (ctx.state.moraleState === 'PANICKED') {
|
|
38
|
+
ctx.transition(this.tr.alertOnPanic);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
// --- Perception: visible enemy → COMBAT (or KILL_WOUNDED if wounded, opt-in) ---
|
|
42
|
+
if (ctx.perception?.hasVisibleEnemy()) {
|
|
43
|
+
const enemies = ctx.perception.getVisibleEnemies();
|
|
44
|
+
const target = enemies[0];
|
|
45
|
+
ctx.state.lastKnownEnemyX = target.x;
|
|
46
|
+
ctx.state.lastKnownEnemyY = target.y;
|
|
47
|
+
// Kill-wounded seam (opt-in) — only when morale is STABLE
|
|
48
|
+
if (ctx.state.moraleState === 'STABLE') {
|
|
49
|
+
const woundedEnemies = ctx.perception?.getWoundedEnemies?.() ?? [];
|
|
50
|
+
if (woundedEnemies.length > 0) {
|
|
51
|
+
const we = woundedEnemies[0];
|
|
52
|
+
ctx.state.killWoundedTargetId = we.id;
|
|
53
|
+
ctx.state.killWoundedTargetX = we.x;
|
|
54
|
+
ctx.state.killWoundedTargetY = we.y;
|
|
55
|
+
ctx.transition(this.tr.alertOnKillWounded);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
ctx.transition(this.tr.alertOnEnemy);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
// --- Pack combat fast-path (opt-in): skip alert timer when pack is already fighting ---
|
|
63
|
+
if (ctx.pack?.getPackAlertLevel() === 'COMBAT') {
|
|
64
|
+
const pt = ctx.pack.getPackTarget();
|
|
65
|
+
if (pt) {
|
|
66
|
+
ctx.state.lastKnownEnemyX = pt.x;
|
|
67
|
+
ctx.state.lastKnownEnemyY = pt.y;
|
|
68
|
+
ctx.state.targetId = pt.id;
|
|
69
|
+
}
|
|
70
|
+
ctx.transition(this.tr.alertOnPackCombat);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
// --- Timer countdown ---
|
|
74
|
+
const elapsed = ctx.now() - ctx.state.alertStartMs;
|
|
75
|
+
if (elapsed >= this.cfg.alertDuration) {
|
|
76
|
+
ctx.halt();
|
|
77
|
+
ctx.transition(this.tr.alertOnTimeout);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
// --- Move toward last known position ---
|
|
81
|
+
const targetX = ctx.state.lastKnownEnemyX;
|
|
82
|
+
const targetY = ctx.state.lastKnownEnemyY;
|
|
83
|
+
const dx = targetX - ctx.x;
|
|
84
|
+
const dy = targetY - ctx.y;
|
|
85
|
+
const distSq = dx * dx + dy * dy;
|
|
86
|
+
const thresh = this.cfg.arriveThreshold;
|
|
87
|
+
if (distSq <= thresh * thresh) {
|
|
88
|
+
// Reached the sound source; nothing found — wait for timer.
|
|
89
|
+
ctx.halt();
|
|
90
|
+
// Face the direction we were heading (last known angle).
|
|
91
|
+
if (targetX !== ctx.x || targetY !== ctx.y) {
|
|
92
|
+
ctx.setRotation(Math.atan2(targetY - ctx.y, targetX - ctx.x));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
moveToward(ctx, targetX, targetY, this.cfg.approachSpeed);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
100
|
+
exit(_ctx) {
|
|
101
|
+
// Nothing to clean up.
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=AlertState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AlertState.js","sourceRoot":"","sources":["../../../src/states/handlers/AlertState.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
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
|
+
/**
|
|
6
|
+
* Stateless camp-state handler.
|
|
7
|
+
*
|
|
8
|
+
* A single instance can be shared across all NPC entities.
|
|
9
|
+
*/
|
|
10
|
+
export declare class CampState implements IOnlineStateHandler {
|
|
11
|
+
private readonly cfg;
|
|
12
|
+
private readonly tr;
|
|
13
|
+
constructor(cfg: IStateConfig, tr?: Partial<IStateTransitionMap>);
|
|
14
|
+
enter(ctx: INPCContext): void;
|
|
15
|
+
update(ctx: INPCContext, _deltaMs: number): void;
|
|
16
|
+
exit(ctx: INPCContext): void;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=CampState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CampState.d.ts","sourceRoot":"","sources":["../../../src/states/handlers/CampState.ts"],"names":[],"mappings":"AAaA,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;AAOlE;;;;GAIG;AACH,qBAAa,SAAU,YAAW,mBAAmB;IACnD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAsB;gBAE7B,GAAG,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC;IAKhE,KAAK,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAa7B,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAqDhD,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;CAM7B"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
// states/handlers/CampState.ts
|
|
2
|
+
// NPC sits at a rest point with reduced vigilance (camp/guard post behavior).
|
|
3
|
+
//
|
|
4
|
+
// Behavior:
|
|
5
|
+
// - NPC stays stationary at the camp spot.
|
|
6
|
+
// - Reactions to visible enemies are delayed by cfg.schemeReactionDelayMs
|
|
7
|
+
// (simulates lower alertness while at rest).
|
|
8
|
+
// - No delay for danger-zone reactions (immediate relocation).
|
|
9
|
+
//
|
|
10
|
+
// Transitions out of CAMP:
|
|
11
|
+
// - visible enemy (after schemeReactionDelayMs delay) → COMBAT
|
|
12
|
+
// - NPC inside an inaccessible/restricted zone → ALERT (walk away first)
|
|
13
|
+
import { createDefaultTransitionMap } from '../IStateTransitionMap';
|
|
14
|
+
import { moveToward } from './_utils';
|
|
15
|
+
// Internal flag stored in ctx.state.psiPhaseStartMs repurposed as the
|
|
16
|
+
// reaction-pending timer timestamp. We use a sentinel value of 0 for "none".
|
|
17
|
+
const NO_PENDING_REACTION = 0;
|
|
18
|
+
/**
|
|
19
|
+
* Stateless camp-state handler.
|
|
20
|
+
*
|
|
21
|
+
* A single instance can be shared across all NPC entities.
|
|
22
|
+
*/
|
|
23
|
+
export class CampState {
|
|
24
|
+
constructor(cfg, tr) {
|
|
25
|
+
this.cfg = cfg;
|
|
26
|
+
this.tr = createDefaultTransitionMap(tr);
|
|
27
|
+
}
|
|
28
|
+
enter(ctx) {
|
|
29
|
+
ctx.halt();
|
|
30
|
+
// Reset the reaction timer (no pending delayed reaction on entry).
|
|
31
|
+
// We repurpose evadeStartMs as a scheme-reaction start timestamp.
|
|
32
|
+
ctx.state.evadeStartMs = NO_PENDING_REACTION;
|
|
33
|
+
// Emit a camp vocalization if a vocalization cooldown allows.
|
|
34
|
+
const now = ctx.now();
|
|
35
|
+
if (now - ctx.state.lastVocalizationMs >= this.cfg.meleeCooldownMs * 3) {
|
|
36
|
+
ctx.emitVocalization('CAMP_IDLE');
|
|
37
|
+
ctx.state.lastVocalizationMs = now;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
update(ctx, _deltaMs) {
|
|
41
|
+
const now = ctx.now();
|
|
42
|
+
// --- Pending delayed-reaction processing ---
|
|
43
|
+
const reactionStart = ctx.state.evadeStartMs;
|
|
44
|
+
if (reactionStart !== NO_PENDING_REACTION) {
|
|
45
|
+
if (now - reactionStart >= this.cfg.schemeReactionDelayMs) {
|
|
46
|
+
// Delay elapsed — execute the queued transition.
|
|
47
|
+
// The target state is encoded in ctx.state.isAlert:
|
|
48
|
+
// true → COMBAT
|
|
49
|
+
// false → ALERT
|
|
50
|
+
ctx.state.evadeStartMs = NO_PENDING_REACTION;
|
|
51
|
+
ctx.transition(ctx.state.isAlert ? this.tr.campOnEnemy : this.tr.campOnDanger);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
// Still waiting for delay — do nothing else this frame.
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
// --- Visible enemy → queue delayed COMBAT reaction ---
|
|
58
|
+
if (ctx.perception?.hasVisibleEnemy()) {
|
|
59
|
+
const enemies = ctx.perception.getVisibleEnemies();
|
|
60
|
+
const target = enemies[0];
|
|
61
|
+
ctx.state.lastKnownEnemyX = target.x;
|
|
62
|
+
ctx.state.lastKnownEnemyY = target.y;
|
|
63
|
+
ctx.state.isAlert = true;
|
|
64
|
+
ctx.state.evadeStartMs = now;
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
// --- Restricted zone check (immediate — no delay for danger zones) ---
|
|
68
|
+
if (ctx.restrictedZones !== null && !ctx.restrictedZones.isAccessible(ctx.x, ctx.y)) {
|
|
69
|
+
const step = this.cfg.approachSpeed * 2;
|
|
70
|
+
const candidates = [
|
|
71
|
+
{ x: ctx.x + step, y: ctx.y },
|
|
72
|
+
{ x: ctx.x - step, y: ctx.y },
|
|
73
|
+
{ x: ctx.x, y: ctx.y + step },
|
|
74
|
+
{ x: ctx.x, y: ctx.y - step },
|
|
75
|
+
];
|
|
76
|
+
const safe = ctx.restrictedZones.filterAccessible(candidates);
|
|
77
|
+
if (safe.length > 0) {
|
|
78
|
+
const dest = safe[0];
|
|
79
|
+
ctx.state.lastKnownEnemyX = dest.x;
|
|
80
|
+
ctx.state.lastKnownEnemyY = dest.y;
|
|
81
|
+
moveToward(ctx, dest.x, dest.y, this.cfg.approachSpeed);
|
|
82
|
+
}
|
|
83
|
+
ctx.transition(this.tr.campOnDanger);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
exit(ctx) {
|
|
88
|
+
// Clear any pending delayed reaction so it doesn't leak into the next
|
|
89
|
+
// activation of this state.
|
|
90
|
+
ctx.state.evadeStartMs = NO_PENDING_REACTION;
|
|
91
|
+
ctx.state.isAlert = false;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=CampState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CampState.js","sourceRoot":"","sources":["../../../src/states/handlers/CampState.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
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
|
+
/**
|
|
6
|
+
* Stateless boar charge-attack handler.
|
|
7
|
+
*
|
|
8
|
+
* A single instance can be shared across all NPC entities.
|
|
9
|
+
*/
|
|
10
|
+
export declare class ChargeState implements IOnlineStateHandler {
|
|
11
|
+
private readonly cfg;
|
|
12
|
+
private readonly tr;
|
|
13
|
+
constructor(cfg: IStateConfig, tr?: Partial<IStateTransitionMap>);
|
|
14
|
+
enter(ctx: INPCContext): void;
|
|
15
|
+
update(ctx: INPCContext, _deltaMs: number): void;
|
|
16
|
+
exit(ctx: INPCContext): void;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=ChargeState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChargeState.d.ts","sourceRoot":"","sources":["../../../src/states/handlers/ChargeState.ts"],"names":[],"mappings":"AAgBA,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;AACpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAIlE;;;;GAIG;AACH,qBAAa,WAAY,YAAW,mBAAmB;IAInD,OAAO,CAAC,QAAQ,CAAC,GAAG;IAHtB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAsB;gBAGtB,GAAG,EAAE,YAAY,EAClC,EAAE,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC;IAKnC,KAAK,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IA2B7B,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAsDhD,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;CAK7B"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
// states/handlers/ChargeState.ts
|
|
2
|
+
// Boar exclusive straight-line charge attack state.
|
|
3
|
+
//
|
|
4
|
+
// Phase pipeline (stored in ctx.state.chargePhase):
|
|
5
|
+
// WINDUP — entity stops during telegraph pause; counts down chargeWindupMs.
|
|
6
|
+
// Target position is locked at enter() time.
|
|
7
|
+
// CHARGE — entity moves toward stored target at approachSpeed × chargeSpeedMultiplier.
|
|
8
|
+
// Impact: dist <= meleeRange → emitMeleeHit(chargeDamageMultiplier), then COMBAT.
|
|
9
|
+
// Exit — resets active flag; host caller may also halt movement.
|
|
10
|
+
//
|
|
11
|
+
// Early abort:
|
|
12
|
+
// - Windup phase with no visible enemy → transition to IDLE (tr.chargeOnAbort).
|
|
13
|
+
//
|
|
14
|
+
// All mutable state lives in INPCOnlineState.chargePhase so this handler is
|
|
15
|
+
// stateless and safe to share across all NPC entities.
|
|
16
|
+
import { createDefaultTransitionMap } from '../IStateTransitionMap';
|
|
17
|
+
import { moveToward, distanceTo } from './_utils';
|
|
18
|
+
/**
|
|
19
|
+
* Stateless boar charge-attack handler.
|
|
20
|
+
*
|
|
21
|
+
* A single instance can be shared across all NPC entities.
|
|
22
|
+
*/
|
|
23
|
+
export class ChargeState {
|
|
24
|
+
constructor(cfg, tr) {
|
|
25
|
+
this.cfg = cfg;
|
|
26
|
+
this.tr = createDefaultTransitionMap(tr);
|
|
27
|
+
}
|
|
28
|
+
enter(ctx) {
|
|
29
|
+
var _a;
|
|
30
|
+
const now = ctx.now();
|
|
31
|
+
// Lock the target position from the first visible enemy or last known pos.
|
|
32
|
+
const enemies = ctx.perception?.getVisibleEnemies() ?? [];
|
|
33
|
+
const targetX = enemies.length > 0 ? enemies[0].x : ctx.state.lastKnownEnemyX;
|
|
34
|
+
const targetY = enemies.length > 0 ? enemies[0].y : ctx.state.lastKnownEnemyY;
|
|
35
|
+
// Lazy-initialise charge phase data if not yet present.
|
|
36
|
+
(_a = ctx.state).chargePhase ?? (_a.chargePhase = { active: false, windupStartMs: 0, charging: false, targetX: 0, targetY: 0 });
|
|
37
|
+
ctx.state.chargePhase.active = true;
|
|
38
|
+
ctx.state.chargePhase.charging = false;
|
|
39
|
+
ctx.state.chargePhase.windupStartMs = now;
|
|
40
|
+
ctx.state.chargePhase.targetX = targetX;
|
|
41
|
+
ctx.state.chargePhase.targetY = targetY;
|
|
42
|
+
// Stop completely during the windup telegraph.
|
|
43
|
+
ctx.halt();
|
|
44
|
+
// Face the target while winding up.
|
|
45
|
+
const dx = targetX - ctx.x;
|
|
46
|
+
const dy = targetY - ctx.y;
|
|
47
|
+
if (dx !== 0 || dy !== 0) {
|
|
48
|
+
ctx.setRotation(Math.atan2(dy, dx));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
update(ctx, _deltaMs) {
|
|
52
|
+
const now = ctx.now();
|
|
53
|
+
const phase = ctx.state.chargePhase;
|
|
54
|
+
const elapsed = now - phase.windupStartMs;
|
|
55
|
+
if (!phase.charging) {
|
|
56
|
+
// -----------------------------------------------------------------------
|
|
57
|
+
// WINDUP phase — wait for chargeWindupMs before launching charge
|
|
58
|
+
// -----------------------------------------------------------------------
|
|
59
|
+
// Safety: if no visible enemy and not yet charging, abort.
|
|
60
|
+
const hasEnemy = ctx.perception?.hasVisibleEnemy() ?? false;
|
|
61
|
+
if (!hasEnemy) {
|
|
62
|
+
ctx.transition(this.tr.chargeOnAbort);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (elapsed < this.cfg.chargeWindupMs) {
|
|
66
|
+
// Still winding up — face target but don't move.
|
|
67
|
+
const dx = phase.targetX - ctx.x;
|
|
68
|
+
const dy = phase.targetY - ctx.y;
|
|
69
|
+
if (dx !== 0 || dy !== 0) {
|
|
70
|
+
ctx.setRotation(Math.atan2(dy, dx));
|
|
71
|
+
}
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
// Windup complete — transition to charging phase.
|
|
75
|
+
phase.charging = true;
|
|
76
|
+
}
|
|
77
|
+
// -----------------------------------------------------------------------
|
|
78
|
+
// CHARGING phase — move toward locked target at charge speed
|
|
79
|
+
// -----------------------------------------------------------------------
|
|
80
|
+
const chargeSpeed = this.cfg.approachSpeed * this.cfg.chargeSpeedMultiplier;
|
|
81
|
+
const dist = distanceTo(ctx.x, ctx.y, phase.targetX, phase.targetY);
|
|
82
|
+
if (dist <= this.cfg.meleeRange) {
|
|
83
|
+
// Impact — apply charge damage and return to COMBAT.
|
|
84
|
+
ctx.state.lastMeleeMs = now;
|
|
85
|
+
ctx.emitMeleeHit({
|
|
86
|
+
npcId: ctx.npcId,
|
|
87
|
+
targetId: ctx.state.targetId ?? '',
|
|
88
|
+
damage: this.cfg.meleeDamage * this.cfg.chargeDamageMultiplier,
|
|
89
|
+
});
|
|
90
|
+
ctx.halt();
|
|
91
|
+
ctx.transition(this.tr.chargeOnComplete);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
// Continue charging toward the locked target.
|
|
95
|
+
moveToward(ctx, phase.targetX, phase.targetY, chargeSpeed);
|
|
96
|
+
}
|
|
97
|
+
exit(ctx) {
|
|
98
|
+
if (ctx.state.chargePhase) {
|
|
99
|
+
ctx.state.chargePhase.active = false;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=ChargeState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChargeState.js","sourceRoot":"","sources":["../../../src/states/handlers/ChargeState.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
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
|
+
/**
|
|
6
|
+
* Stateless combat state handler for human NPCs.
|
|
7
|
+
*
|
|
8
|
+
* Monsters use a separate controller (MonsterCombatController from Slice 14).
|
|
9
|
+
* A single instance can be shared across all NPC entities.
|
|
10
|
+
*/
|
|
11
|
+
export declare class CombatState implements IOnlineStateHandler {
|
|
12
|
+
private readonly cfg;
|
|
13
|
+
private readonly tr;
|
|
14
|
+
constructor(cfg: IStateConfig, tr?: Partial<IStateTransitionMap>);
|
|
15
|
+
enter(_ctx: INPCContext): void;
|
|
16
|
+
update(ctx: INPCContext, _deltaMs: number): void;
|
|
17
|
+
exit(_ctx: INPCContext): void;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=CombatState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CombatState.d.ts","sourceRoot":"","sources":["../../../src/states/handlers/CombatState.ts"],"names":[],"mappings":"AAgBA,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;AAGlE;;;;;GAKG;AACH,qBAAa,WAAY,YAAW,mBAAmB;IACrD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAsB;gBAE7B,GAAG,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC;IAKhE,KAAK,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAI9B,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAiHhD,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;CAG9B"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
// states/handlers/CombatState.ts
|
|
2
|
+
// Human NPC actively engages a visible enemy.
|
|
3
|
+
//
|
|
4
|
+
// Logic:
|
|
5
|
+
// enter — nothing special (vocalization handled by caller if needed)
|
|
6
|
+
// update —
|
|
7
|
+
// 1. No visible enemy → SEARCH (if lastKnown known) or IDLE
|
|
8
|
+
// 2. Morale PANICKED → FLEE
|
|
9
|
+
// 3. Morale SHAKEN → RETREAT
|
|
10
|
+
// 4. HP below woundedHpThreshold → WOUNDED
|
|
11
|
+
// 5. Visible enemy wounded (STABLE morale, opt-in) → KILL_WOUNDED
|
|
12
|
+
// 6. Move toward enemy when dist > combatRange, otherwise halt + check cover
|
|
13
|
+
// 7. Fire when cooldown elapsed
|
|
14
|
+
// 8. Share target with squad if available
|
|
15
|
+
// exit — nothing
|
|
16
|
+
import { createDefaultTransitionMap } from '../IStateTransitionMap';
|
|
17
|
+
import { moveToward } from './_utils';
|
|
18
|
+
/**
|
|
19
|
+
* Stateless combat state handler for human NPCs.
|
|
20
|
+
*
|
|
21
|
+
* Monsters use a separate controller (MonsterCombatController from Slice 14).
|
|
22
|
+
* A single instance can be shared across all NPC entities.
|
|
23
|
+
*/
|
|
24
|
+
export class CombatState {
|
|
25
|
+
constructor(cfg, tr) {
|
|
26
|
+
this.cfg = cfg;
|
|
27
|
+
this.tr = createDefaultTransitionMap(tr);
|
|
28
|
+
}
|
|
29
|
+
enter(_ctx) {
|
|
30
|
+
// No special enter action — caller may emit vocalization if desired.
|
|
31
|
+
}
|
|
32
|
+
update(ctx, _deltaMs) {
|
|
33
|
+
const now = ctx.now();
|
|
34
|
+
// -------------------------------------------------------------------------
|
|
35
|
+
// 1. Perception: resolve visible enemy
|
|
36
|
+
// -------------------------------------------------------------------------
|
|
37
|
+
const enemies = ctx.perception?.getVisibleEnemies() ?? [];
|
|
38
|
+
const hasEnemy = enemies.length > 0;
|
|
39
|
+
if (!hasEnemy) {
|
|
40
|
+
// No visual contact — transition based on whether a last position is known.
|
|
41
|
+
if (ctx.state.lastKnownEnemyX !== 0 || ctx.state.lastKnownEnemyY !== 0) {
|
|
42
|
+
ctx.transition(this.tr.combatOnLastKnown);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
ctx.transition(this.tr.combatOnNoEnemy);
|
|
46
|
+
}
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
// Update last known enemy position from the closest visible enemy.
|
|
50
|
+
const enemy = enemies[0];
|
|
51
|
+
ctx.state.lastKnownEnemyX = enemy.x;
|
|
52
|
+
ctx.state.lastKnownEnemyY = enemy.y;
|
|
53
|
+
// -------------------------------------------------------------------------
|
|
54
|
+
// 2. Morale checks (highest priority after target acquisition)
|
|
55
|
+
// -------------------------------------------------------------------------
|
|
56
|
+
if (ctx.state.moraleState === 'PANICKED') {
|
|
57
|
+
ctx.transition(this.tr.combatOnPanicked);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (ctx.state.moraleState === 'SHAKEN') {
|
|
61
|
+
ctx.transition(this.tr.combatOnShaken);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
// -------------------------------------------------------------------------
|
|
65
|
+
// 3. HP threshold — wounded
|
|
66
|
+
// -------------------------------------------------------------------------
|
|
67
|
+
if (ctx.health !== null) {
|
|
68
|
+
if (ctx.health.hpPercent < this.cfg.woundedHpThreshold) {
|
|
69
|
+
ctx.transition(this.tr.combatOnWounded);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// -------------------------------------------------------------------------
|
|
74
|
+
// 4. Kill-wounded seam (opt-in) — only when morale is STABLE
|
|
75
|
+
// -------------------------------------------------------------------------
|
|
76
|
+
const woundedEnemies = ctx.perception?.getWoundedEnemies?.() ?? [];
|
|
77
|
+
if (woundedEnemies.length > 0) {
|
|
78
|
+
const we = woundedEnemies[0];
|
|
79
|
+
ctx.state.killWoundedTargetId = we.id;
|
|
80
|
+
ctx.state.killWoundedTargetX = we.x;
|
|
81
|
+
ctx.state.killWoundedTargetY = we.y;
|
|
82
|
+
ctx.state.lastKnownEnemyX = we.x;
|
|
83
|
+
ctx.state.lastKnownEnemyY = we.y;
|
|
84
|
+
ctx.halt();
|
|
85
|
+
ctx.transition(this.tr.combatOnKillWounded);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
// -------------------------------------------------------------------------
|
|
89
|
+
// 5. Movement — approach or halt
|
|
90
|
+
// -------------------------------------------------------------------------
|
|
91
|
+
const dx = enemy.x - ctx.x;
|
|
92
|
+
const dy = enemy.y - ctx.y;
|
|
93
|
+
const dist = Math.sqrt(dx * dx + dy * dy);
|
|
94
|
+
if (dist > this.cfg.combatRange) {
|
|
95
|
+
moveToward(ctx, enemy.x, enemy.y, this.cfg.approachSpeed);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
ctx.halt();
|
|
99
|
+
ctx.setRotation(Math.atan2(dy, dx));
|
|
100
|
+
// Check cover transition when already in combat range.
|
|
101
|
+
if (ctx.cover !== null) {
|
|
102
|
+
const coverPt = ctx.cover.findCover(ctx.x, ctx.y, enemy.x, enemy.y, 'CLOSE');
|
|
103
|
+
if (coverPt !== null) {
|
|
104
|
+
ctx.state.coverPointX = coverPt.x;
|
|
105
|
+
ctx.state.coverPointY = coverPt.y;
|
|
106
|
+
ctx.transition(this.tr.combatOnCover);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// -------------------------------------------------------------------------
|
|
112
|
+
// 7. Fire when cooldown elapsed
|
|
113
|
+
// -------------------------------------------------------------------------
|
|
114
|
+
if (now - ctx.state.lastShootMs >= this.cfg.fireRateMs) {
|
|
115
|
+
ctx.state.lastShootMs = now;
|
|
116
|
+
const weaponType = ctx.state.primaryWeapon ?? 'rifle';
|
|
117
|
+
ctx.emitShoot({
|
|
118
|
+
npcId: ctx.npcId,
|
|
119
|
+
x: ctx.x,
|
|
120
|
+
y: ctx.y,
|
|
121
|
+
targetX: enemy.x,
|
|
122
|
+
targetY: enemy.y,
|
|
123
|
+
weaponType,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
// -------------------------------------------------------------------------
|
|
127
|
+
// 8. Share target with squad
|
|
128
|
+
// -------------------------------------------------------------------------
|
|
129
|
+
if (ctx.squad !== null) {
|
|
130
|
+
ctx.squad.shareTarget(enemy.id, enemy.x, enemy.y);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
exit(_ctx) {
|
|
134
|
+
// Nothing to clean up.
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=CombatState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CombatState.js","sourceRoot":"","sources":["../../../src/states/handlers/CombatState.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
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 { ICombatTransitionConfig, ITransitionRule } from '../../combat/CombatTransitionChain';
|
|
6
|
+
/**
|
|
7
|
+
* Stateless combat-transition coordinator handler.
|
|
8
|
+
*
|
|
9
|
+
* Consumes the pure-function CombatTransitionChain and bridges it to the
|
|
10
|
+
* INPCContext facade so any state handler can delegate complex transition
|
|
11
|
+
* evaluation without duplicating rule logic.
|
|
12
|
+
*
|
|
13
|
+
* A single instance can be shared across all NPC entities.
|
|
14
|
+
*/
|
|
15
|
+
export declare class CombatTransitionHandler implements IOnlineStateHandler {
|
|
16
|
+
private readonly cfg;
|
|
17
|
+
private readonly transitionCfg;
|
|
18
|
+
private readonly rules;
|
|
19
|
+
constructor(cfg: IStateConfig, transitionCfgOverrides?: Partial<ICombatTransitionConfig>, rules?: readonly ITransitionRule[], _tr?: Partial<IStateTransitionMap>);
|
|
20
|
+
enter(_ctx: INPCContext): void;
|
|
21
|
+
update(ctx: INPCContext, _deltaMs: number): void;
|
|
22
|
+
exit(_ctx: INPCContext): void;
|
|
23
|
+
/**
|
|
24
|
+
* Build a framework-agnostic ICombatContext snapshot from INPCContext.
|
|
25
|
+
*/
|
|
26
|
+
private _buildSnapshot;
|
|
27
|
+
/**
|
|
28
|
+
* Build a minimal INPCLoadout from the NPC's state bag.
|
|
29
|
+
* Returns a loadout with no weapons when the state has no weapon info,
|
|
30
|
+
* which signals the chain to fall back to default behaviour.
|
|
31
|
+
*/
|
|
32
|
+
private _buildLoadout;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=CombatTransitionHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CombatTransitionHandler.d.ts","sourceRoot":"","sources":["../../../src/states/handlers/CombatTransitionHandler.ts"],"names":[],"mappings":"AAYA,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;AACpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAMlE,OAAO,KAAK,EAEV,uBAAuB,EACvB,eAAe,EAChB,MAAM,oCAAoC,CAAC;AAI5C;;;;;;;;GAQG;AACH,qBAAa,uBAAwB,YAAW,mBAAmB;IAK/D,OAAO,CAAC,QAAQ,CAAC,GAAG;IAJtB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA0B;IACxD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6B;gBAGhC,GAAG,EAAE,YAAY,EAClC,sBAAsB,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,EACzD,KAAK,CAAC,EAAE,SAAS,eAAe,EAAE,EAElC,GAAG,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC;IAUpC,KAAK,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAI9B,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQhD,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAQ7B;;OAEG;IACH,OAAO,CAAC,cAAc;IAiEtB;;;;OAIG;IACH,OAAO,CAAC,aAAa;CAkCtB"}
|