@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,131 @@
|
|
|
1
|
+
// states/handlers/HelpWoundedState.ts
|
|
2
|
+
// NPC detected a wounded ally and moves toward them to provide assistance.
|
|
3
|
+
// Softer social response — not combat, no weapon use.
|
|
4
|
+
//
|
|
5
|
+
// Phase 1 — APPROACH: Move toward the wounded ally at approachSpeed.
|
|
6
|
+
// - Panicked morale (PANICKED) → helpWoundedOnPanic (FLEE)
|
|
7
|
+
// - Visible enemy detected via ctx.perception → helpWoundedOnEnemy (ALERT)
|
|
8
|
+
// - Overall timeout (helpWoundedMaxDurationMs) → helpWoundedOnComplete (PATROL)
|
|
9
|
+
// - Ally gone from getWoundedAllies() list → helpWoundedOnComplete (PATROL)
|
|
10
|
+
// - Arrived within arriveThreshold → begin Phase 2
|
|
11
|
+
//
|
|
12
|
+
// Phase 2 — ASSIST: Halt next to ally, hold position for helpWoundedAssistMs.
|
|
13
|
+
// - Panicked morale (PANICKED) → helpWoundedOnPanic (FLEE)
|
|
14
|
+
// - Visible enemy detected via ctx.perception → helpWoundedOnEnemy (ALERT)
|
|
15
|
+
// - Ally gone from getWoundedAllies() list → helpWoundedOnComplete (healed or dead)
|
|
16
|
+
// - Assist timer expires → helpWoundedOnComplete (PATROL)
|
|
17
|
+
//
|
|
18
|
+
// Pre-conditions set by calling state (PatrolState / IdleState):
|
|
19
|
+
// ctx.state.helpWoundedTargetId = ally.id
|
|
20
|
+
// ctx.state.helpWoundedX = ally.x
|
|
21
|
+
// ctx.state.helpWoundedY = ally.y
|
|
22
|
+
//
|
|
23
|
+
// Opt-in integration:
|
|
24
|
+
// Requires ctx.perception?.getWoundedAllies?.() to be implemented.
|
|
25
|
+
// Without it, Phase 1 immediately transitions to helpWoundedOnComplete.
|
|
26
|
+
//
|
|
27
|
+
// Stateless: a single instance can be shared across all NPC entities.
|
|
28
|
+
import { createDefaultTransitionMap } from '../IStateTransitionMap';
|
|
29
|
+
import { moveToward } from './_utils';
|
|
30
|
+
/**
|
|
31
|
+
* Stateless two-phase help-wounded handler (X-Ray 16 `xr_help_wounded` equivalent).
|
|
32
|
+
*
|
|
33
|
+
* A single instance can be shared across all NPC entities.
|
|
34
|
+
*
|
|
35
|
+
* Opt-in activation:
|
|
36
|
+
* ```ts
|
|
37
|
+
* const handlers = buildDefaultHandlerMap(cfg, {
|
|
38
|
+
* patrolOnWoundedAlly: 'HELP_WOUNDED',
|
|
39
|
+
* idleOnWoundedAlly: 'HELP_WOUNDED',
|
|
40
|
+
* });
|
|
41
|
+
* handlers.register('HELP_WOUNDED', new HelpWoundedState(cfg));
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export class HelpWoundedState {
|
|
45
|
+
constructor(cfg, tr) {
|
|
46
|
+
this.cfg = cfg;
|
|
47
|
+
this.tr = createDefaultTransitionMap(tr);
|
|
48
|
+
}
|
|
49
|
+
enter(ctx) {
|
|
50
|
+
ctx.state.helpWoundedStartMs = ctx.now();
|
|
51
|
+
ctx.state.helpWoundedAssistStartMs = -1; // -1 = not yet arrived
|
|
52
|
+
ctx.halt();
|
|
53
|
+
ctx.emitVocalization('HELP_WOUNDED_MOVING');
|
|
54
|
+
}
|
|
55
|
+
update(ctx, _deltaMs) {
|
|
56
|
+
const now = ctx.now();
|
|
57
|
+
// ── Priority 1 — Panic → flee ───────────────────────────────────────────
|
|
58
|
+
if (ctx.state.moraleState === 'PANICKED') {
|
|
59
|
+
ctx.halt();
|
|
60
|
+
ctx.transition(this.tr.helpWoundedOnPanic);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
// ── Priority 2 — Visible enemy → abandon help, fight ────────────────────
|
|
64
|
+
if (ctx.perception?.hasVisibleEnemy()) {
|
|
65
|
+
const enemies = ctx.perception.getVisibleEnemies();
|
|
66
|
+
const target = enemies[0];
|
|
67
|
+
ctx.state.lastKnownEnemyX = target.x;
|
|
68
|
+
ctx.state.lastKnownEnemyY = target.y;
|
|
69
|
+
ctx.state.targetId = target.id;
|
|
70
|
+
ctx.halt();
|
|
71
|
+
ctx.transition(this.tr.helpWoundedOnEnemy);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
// ── Phase 2 — ASSIST (arrived, helpWoundedAssistStartMs >= 0) ────────────
|
|
75
|
+
if (ctx.state.helpWoundedAssistStartMs >= 0) {
|
|
76
|
+
ctx.halt();
|
|
77
|
+
// Re-check if ally is still wounded (opt-in)
|
|
78
|
+
const allies = ctx.perception?.getWoundedAllies?.() ?? [];
|
|
79
|
+
const stillWounded = allies.find(a => a.id === ctx.state.helpWoundedTargetId);
|
|
80
|
+
if (!stillWounded) {
|
|
81
|
+
ctx.transition(this.tr.helpWoundedOnComplete); // healed or died
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
// Assist timer
|
|
85
|
+
if (now - ctx.state.helpWoundedAssistStartMs >= this.cfg.helpWoundedAssistMs) {
|
|
86
|
+
ctx.transition(this.tr.helpWoundedOnComplete);
|
|
87
|
+
}
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
// ── Phase 1 — APPROACH ───────────────────────────────────────────────────
|
|
91
|
+
// Overall timeout — prevents infinite approach on unreachable ally
|
|
92
|
+
if (now - ctx.state.helpWoundedStartMs >= this.cfg.helpWoundedMaxDurationMs) {
|
|
93
|
+
ctx.halt();
|
|
94
|
+
ctx.transition(this.tr.helpWoundedOnComplete);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
// Update ally position from fresh perception each frame (ally may crawl)
|
|
98
|
+
const allies = ctx.perception?.getWoundedAllies?.() ?? [];
|
|
99
|
+
const target = allies.find(a => a.id === ctx.state.helpWoundedTargetId) ?? null;
|
|
100
|
+
if (!target) {
|
|
101
|
+
// Ally healed, died, or left perception range
|
|
102
|
+
ctx.halt();
|
|
103
|
+
ctx.transition(this.tr.helpWoundedOnComplete);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
// Keep destination current
|
|
107
|
+
ctx.state.helpWoundedX = target.x;
|
|
108
|
+
ctx.state.helpWoundedY = target.y;
|
|
109
|
+
const dx = target.x - ctx.x;
|
|
110
|
+
const dy = target.y - ctx.y;
|
|
111
|
+
const distSq = dx * dx + dy * dy;
|
|
112
|
+
const thresh = this.cfg.arriveThreshold;
|
|
113
|
+
if (distSq <= thresh * thresh) {
|
|
114
|
+
// Arrived — begin assist phase
|
|
115
|
+
ctx.state.helpWoundedAssistStartMs = now;
|
|
116
|
+
ctx.halt();
|
|
117
|
+
ctx.emitVocalization('HELP_WOUNDED_ASSIST');
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
moveToward(ctx, target.x, target.y, this.cfg.approachSpeed);
|
|
121
|
+
}
|
|
122
|
+
exit(ctx) {
|
|
123
|
+
ctx.state.helpWoundedStartMs = 0;
|
|
124
|
+
ctx.state.helpWoundedAssistStartMs = -1;
|
|
125
|
+
ctx.state.helpWoundedTargetId = null;
|
|
126
|
+
ctx.state.helpWoundedX = 0;
|
|
127
|
+
ctx.state.helpWoundedY = 0;
|
|
128
|
+
ctx.halt();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=HelpWoundedState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HelpWoundedState.js","sourceRoot":"","sources":["../../../src/states/handlers/HelpWoundedState.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 idle-state handler.
|
|
7
|
+
*
|
|
8
|
+
* A single instance can be shared across all NPC entities.
|
|
9
|
+
*/
|
|
10
|
+
export declare class IdleState 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=IdleState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IdleState.d.ts","sourceRoot":"","sources":["../../../src/states/handlers/IdleState.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;AAIlE;;;;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;IAM7B,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAwGhD,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;CAG9B"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// states/handlers/IdleState.ts
|
|
2
|
+
// NPC stands still and waits. Lowest-activity state for non-sleeping NPCs.
|
|
3
|
+
//
|
|
4
|
+
// Transitions out of IDLE:
|
|
5
|
+
// - visible enemy detected via ctx.perception → ALERT
|
|
6
|
+
// - NPC standing inside a DANGER restricted zone → ALERT (walk away first)
|
|
7
|
+
// - accumulated suspicion exceeds threshold (opt-in) → ALERT (via idleOnSuspicious)
|
|
8
|
+
// - wounded ally detected (opt-in) → HELP_WOUNDED (via idleOnWoundedAlly)
|
|
9
|
+
// - friendly corpse seen (opt-in) → suspicion.add(BODY_FOUND) → cascades
|
|
10
|
+
// - condition channel above threshold (opt-in) → CAMP (via idleOnTired)
|
|
11
|
+
//
|
|
12
|
+
// Note: this is the "calm" default fallback. When the NPC has a patrol task
|
|
13
|
+
// assigned, the host should put it in PATROL instead.
|
|
14
|
+
import { createDefaultTransitionMap } from '../IStateTransitionMap';
|
|
15
|
+
import { moveToward } from './_utils';
|
|
16
|
+
import { SuspicionStimuli } from '../../suspicion/SuspicionAccumulator';
|
|
17
|
+
/**
|
|
18
|
+
* Stateless idle-state handler.
|
|
19
|
+
*
|
|
20
|
+
* A single instance can be shared across all NPC entities.
|
|
21
|
+
*/
|
|
22
|
+
export class IdleState {
|
|
23
|
+
constructor(cfg, tr) {
|
|
24
|
+
this.cfg = cfg;
|
|
25
|
+
this.tr = createDefaultTransitionMap(tr);
|
|
26
|
+
}
|
|
27
|
+
enter(ctx) {
|
|
28
|
+
ctx.halt();
|
|
29
|
+
// Seed the zone check timer so the check fires on the first update tick.
|
|
30
|
+
ctx.state.lastIdleAnimChangeMs = ctx.now() - this.cfg.restrictedZoneCheckIntervalMs;
|
|
31
|
+
}
|
|
32
|
+
update(ctx, _deltaMs) {
|
|
33
|
+
// --- Perception: any visible enemy → go to ALERT ---
|
|
34
|
+
if (ctx.perception?.hasVisibleEnemy()) {
|
|
35
|
+
const enemies = ctx.perception.getVisibleEnemies();
|
|
36
|
+
const target = enemies[0];
|
|
37
|
+
ctx.state.lastKnownEnemyX = target.x;
|
|
38
|
+
ctx.state.lastKnownEnemyY = target.y;
|
|
39
|
+
ctx.transition(this.tr.idleOnEnemy);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
// --- Pack alert check (opt-in) ---
|
|
43
|
+
if (ctx.pack) {
|
|
44
|
+
const level = ctx.pack.getPackAlertLevel();
|
|
45
|
+
if (level !== 'NONE') {
|
|
46
|
+
const pt = ctx.pack.getPackTarget();
|
|
47
|
+
if (pt) {
|
|
48
|
+
ctx.state.lastKnownEnemyX = pt.x;
|
|
49
|
+
ctx.state.lastKnownEnemyY = pt.y;
|
|
50
|
+
}
|
|
51
|
+
ctx.transition(this.tr.idleOnPackAlert);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// --- Restricted zone DANGER check (throttled) ---
|
|
56
|
+
// Use lastIdleAnimChangeMs as the zone-check timestamp to avoid adding a
|
|
57
|
+
// new field — the semantics ("last periodic check") are close enough.
|
|
58
|
+
const now = ctx.now();
|
|
59
|
+
const timeSinceCheck = now - ctx.state.lastIdleAnimChangeMs;
|
|
60
|
+
if (timeSinceCheck >= this.cfg.restrictedZoneCheckIntervalMs &&
|
|
61
|
+
ctx.restrictedZones !== null) {
|
|
62
|
+
ctx.state.lastIdleAnimChangeMs = now;
|
|
63
|
+
if (!ctx.restrictedZones.isAccessible(ctx.x, ctx.y)) {
|
|
64
|
+
// NPC is standing inside a restricted/dangerous zone.
|
|
65
|
+
// Escape direction: pick a safe nearby point by filtering a small set of
|
|
66
|
+
// cardinal candidate positions and walking toward the first accessible one.
|
|
67
|
+
const step = this.cfg.approachSpeed * 2;
|
|
68
|
+
const candidates = [
|
|
69
|
+
{ x: ctx.x + step, y: ctx.y },
|
|
70
|
+
{ x: ctx.x - step, y: ctx.y },
|
|
71
|
+
{ x: ctx.x, y: ctx.y + step },
|
|
72
|
+
{ x: ctx.x, y: ctx.y - step },
|
|
73
|
+
];
|
|
74
|
+
const safe = ctx.restrictedZones.filterAccessible(candidates);
|
|
75
|
+
if (safe.length > 0) {
|
|
76
|
+
const dest = safe[0];
|
|
77
|
+
ctx.state.lastKnownEnemyX = dest.x;
|
|
78
|
+
ctx.state.lastKnownEnemyY = dest.y;
|
|
79
|
+
moveToward(ctx, dest.x, dest.y, this.cfg.approachSpeed);
|
|
80
|
+
}
|
|
81
|
+
ctx.transition(this.tr.idleOnEnemy);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// --- Suspicion check (opt-in) ---
|
|
86
|
+
// Silently skips when ctx.suspicion is null (not registered by host).
|
|
87
|
+
if (ctx.suspicion?.hasReachedAlert(this.cfg.suspicionAlertThreshold)) {
|
|
88
|
+
const pos = ctx.suspicion.getLastKnownPosition();
|
|
89
|
+
if (pos) {
|
|
90
|
+
ctx.state.lastKnownEnemyX = pos.x;
|
|
91
|
+
ctx.state.lastKnownEnemyY = pos.y;
|
|
92
|
+
}
|
|
93
|
+
ctx.suspicion.clear();
|
|
94
|
+
ctx.transition(this.tr.idleOnSuspicious);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
// --- Wounded ally check (opt-in via getWoundedAllies) ---
|
|
98
|
+
// Silently skips when perception is null or getWoundedAllies is not implemented.
|
|
99
|
+
const woundedAllies = ctx.perception?.getWoundedAllies?.() ?? [];
|
|
100
|
+
if (woundedAllies.length > 0) {
|
|
101
|
+
const ally = woundedAllies[0];
|
|
102
|
+
ctx.state.helpWoundedTargetId = ally.id;
|
|
103
|
+
ctx.state.helpWoundedX = ally.x;
|
|
104
|
+
ctx.state.helpWoundedY = ally.y;
|
|
105
|
+
ctx.transition(this.tr.idleOnWoundedAlly);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
// --- Corpse detection (opt-in via getVisibleCorpses + suspicion) ---
|
|
109
|
+
// Feeds suspicion accumulator; the existing suspicion check above handles transition.
|
|
110
|
+
if (ctx.suspicion) {
|
|
111
|
+
for (const c of ctx.perception?.getVisibleCorpses?.() ?? []) {
|
|
112
|
+
ctx.suspicion.add(SuspicionStimuli.BODY_FOUND, this.cfg.corpseFoundSuspicion, c.x, c.y);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// --- Condition check (opt-in) ---
|
|
116
|
+
// Silently skips when ctx.conditions is null or not registered.
|
|
117
|
+
if (ctx.conditions?.hasCondition(this.cfg.idleConditionChannel, this.cfg.idleConditionThreshold)) {
|
|
118
|
+
ctx.transition(this.tr.idleOnTired);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
123
|
+
exit(_ctx) {
|
|
124
|
+
// Nothing to clean up.
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=IdleState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IdleState.js","sourceRoot":"","sources":["../../../src/states/handlers/IdleState.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
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 two-phase investigate handler (X-Ray 16 `xr_investigator` equivalent).
|
|
7
|
+
*
|
|
8
|
+
* A single instance can be shared across all NPC entities.
|
|
9
|
+
*
|
|
10
|
+
* Opt-in activation — wire suspicion to INVESTIGATE instead of ALERT:
|
|
11
|
+
* ```ts
|
|
12
|
+
* const handlers = buildDefaultHandlerMap(cfg, {
|
|
13
|
+
* patrolOnSuspicious: 'INVESTIGATE',
|
|
14
|
+
* idleOnSuspicious: 'INVESTIGATE',
|
|
15
|
+
* });
|
|
16
|
+
* handlers.register('INVESTIGATE', new InvestigateState(cfg));
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export declare class InvestigateState implements IOnlineStateHandler {
|
|
20
|
+
private readonly cfg;
|
|
21
|
+
private readonly tr;
|
|
22
|
+
constructor(cfg: IStateConfig, tr?: Partial<IStateTransitionMap>);
|
|
23
|
+
enter(ctx: INPCContext): void;
|
|
24
|
+
update(ctx: INPCContext, _deltaMs: number): void;
|
|
25
|
+
exit(ctx: INPCContext): void;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=InvestigateState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InvestigateState.d.ts","sourceRoot":"","sources":["../../../src/states/handlers/InvestigateState.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAe,gBAAgB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAc,iBAAiB,CAAC;AAE5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAO,wBAAwB,CAAC;AAGnE;;;;;;;;;;;;;GAaG;AACH,qBAAa,gBAAiB,YAAW,mBAAmB;IAC1D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAuB;gBAE9B,GAAG,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC;IAKhE,KAAK,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAO7B,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAmGhD,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;CAK7B"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
// states/handlers/InvestigateState.ts
|
|
2
|
+
// NPC received a suspicious stimulus and moves toward the last known position
|
|
3
|
+
// to investigate. Softer than ALERT — no combat assumption, calm approach.
|
|
4
|
+
//
|
|
5
|
+
// Phase 1 — APPROACH: Move toward ctx.state.lastKnownEnemyX/Y at approachSpeed.
|
|
6
|
+
// - Panicked morale (PANICKED) → investigateOnPanic (FLEE)
|
|
7
|
+
// - Visible enemy detected via ctx.perception → investigateOnEnemy (ALERT)
|
|
8
|
+
// - Suspicion re-accumulates above threshold → investigateOnEnemy (ALERT)
|
|
9
|
+
// - Overall timeout (investigateMaxDurationMs) → investigateOnTimeout (PATROL)
|
|
10
|
+
// - Arrived within arriveThreshold → begin Phase 2
|
|
11
|
+
//
|
|
12
|
+
// Phase 2 — LOOK_AROUND: Halt at the location, rotate, wait investigateLookAroundMs.
|
|
13
|
+
// - Panicked morale (PANICKED) → investigateOnPanic (FLEE)
|
|
14
|
+
// - Visible enemy detected via ctx.perception → investigateOnEnemy (ALERT)
|
|
15
|
+
// - Suspicion re-accumulates above threshold → investigateOnEnemy (ALERT)
|
|
16
|
+
// - Look-around timer expires, nothing found → investigateOnTimeout (PATROL)
|
|
17
|
+
//
|
|
18
|
+
// Opt-in integration:
|
|
19
|
+
// ctx.suspicion may be null — all suspicion checks use optional chaining.
|
|
20
|
+
// To activate: register this handler and set patrolOnSuspicious/idleOnSuspicious to 'INVESTIGATE'.
|
|
21
|
+
//
|
|
22
|
+
// Stateless: a single instance can be shared across all NPC entities.
|
|
23
|
+
//
|
|
24
|
+
// Sentinel: investigateLookAroundStartMs uses -1 to mean "not yet arrived",
|
|
25
|
+
// avoiding collision with ctx.now() === 0 on the very first frame.
|
|
26
|
+
import { createDefaultTransitionMap } from '../IStateTransitionMap';
|
|
27
|
+
import { moveToward } from './_utils';
|
|
28
|
+
/**
|
|
29
|
+
* Stateless two-phase investigate handler (X-Ray 16 `xr_investigator` equivalent).
|
|
30
|
+
*
|
|
31
|
+
* A single instance can be shared across all NPC entities.
|
|
32
|
+
*
|
|
33
|
+
* Opt-in activation — wire suspicion to INVESTIGATE instead of ALERT:
|
|
34
|
+
* ```ts
|
|
35
|
+
* const handlers = buildDefaultHandlerMap(cfg, {
|
|
36
|
+
* patrolOnSuspicious: 'INVESTIGATE',
|
|
37
|
+
* idleOnSuspicious: 'INVESTIGATE',
|
|
38
|
+
* });
|
|
39
|
+
* handlers.register('INVESTIGATE', new InvestigateState(cfg));
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export class InvestigateState {
|
|
43
|
+
constructor(cfg, tr) {
|
|
44
|
+
this.cfg = cfg;
|
|
45
|
+
this.tr = createDefaultTransitionMap(tr);
|
|
46
|
+
}
|
|
47
|
+
enter(ctx) {
|
|
48
|
+
ctx.state.investigateStartMs = ctx.now();
|
|
49
|
+
ctx.state.investigateLookAroundStartMs = -1; // -1 = not yet arrived
|
|
50
|
+
ctx.halt();
|
|
51
|
+
ctx.emitVocalization('INVESTIGATE_START');
|
|
52
|
+
}
|
|
53
|
+
update(ctx, _deltaMs) {
|
|
54
|
+
const now = ctx.now();
|
|
55
|
+
// ── Priority 1 — Panic → abort investigation, flee immediately ──────────
|
|
56
|
+
if (ctx.state.moraleState === 'PANICKED') {
|
|
57
|
+
ctx.halt();
|
|
58
|
+
ctx.transition(this.tr.investigateOnPanic);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
// ── Priority 2 — Visible enemy → escalate immediately ───────────────────
|
|
62
|
+
if (ctx.perception?.hasVisibleEnemy()) {
|
|
63
|
+
const enemies = ctx.perception.getVisibleEnemies();
|
|
64
|
+
const target = enemies[0];
|
|
65
|
+
ctx.state.lastKnownEnemyX = target.x;
|
|
66
|
+
ctx.state.lastKnownEnemyY = target.y;
|
|
67
|
+
ctx.state.targetId = target.id;
|
|
68
|
+
ctx.halt();
|
|
69
|
+
ctx.transition(this.tr.investigateOnEnemy);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// ── Phase 2 — LOOK_AROUND (entered when investigateLookAroundStartMs >= 0) ──
|
|
73
|
+
if (ctx.state.investigateLookAroundStartMs >= 0) {
|
|
74
|
+
ctx.halt();
|
|
75
|
+
// Rotate to simulate scanning — two full sweeps over the look-around window.
|
|
76
|
+
// Jitter is derived deterministically from arrival timestamp to avoid
|
|
77
|
+
// consuming ctx.random() budget every frame.
|
|
78
|
+
const elapsed = now - ctx.state.investigateLookAroundStartMs;
|
|
79
|
+
const jitter = (ctx.state.investigateLookAroundStartMs % 1000) / 1000 * 0.2;
|
|
80
|
+
const sweepAngle = (elapsed / this.cfg.investigateLookAroundMs) * Math.PI * 4 + jitter;
|
|
81
|
+
ctx.setRotation(sweepAngle);
|
|
82
|
+
// Suspicion re-accumulation during look-around (opt-in)
|
|
83
|
+
if (ctx.suspicion?.hasReachedAlert(this.cfg.suspicionAlertThreshold)) {
|
|
84
|
+
const pos = ctx.suspicion.getLastKnownPosition();
|
|
85
|
+
if (pos) {
|
|
86
|
+
ctx.state.lastKnownEnemyX = pos.x;
|
|
87
|
+
ctx.state.lastKnownEnemyY = pos.y;
|
|
88
|
+
}
|
|
89
|
+
ctx.suspicion.clear();
|
|
90
|
+
ctx.halt();
|
|
91
|
+
ctx.transition(this.tr.investigateOnEnemy);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
// Timer expired → nothing found, deescalate
|
|
95
|
+
if (elapsed >= this.cfg.investigateLookAroundMs) {
|
|
96
|
+
ctx.suspicion?.clear();
|
|
97
|
+
ctx.halt();
|
|
98
|
+
ctx.transition(this.tr.investigateOnTimeout);
|
|
99
|
+
}
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
// ── Phase 1 — APPROACH: move toward investigate target ──────────────────
|
|
103
|
+
// Overall timeout guard — prevents infinite approach on unreachable points
|
|
104
|
+
if (now - ctx.state.investigateStartMs >= this.cfg.investigateMaxDurationMs) {
|
|
105
|
+
ctx.suspicion?.clear();
|
|
106
|
+
ctx.halt();
|
|
107
|
+
ctx.transition(this.tr.investigateOnTimeout);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
// Suspicion re-spike during approach → skip look-around, escalate directly
|
|
111
|
+
if (ctx.suspicion?.hasReachedAlert(this.cfg.suspicionAlertThreshold)) {
|
|
112
|
+
const pos = ctx.suspicion.getLastKnownPosition();
|
|
113
|
+
if (pos) {
|
|
114
|
+
ctx.state.lastKnownEnemyX = pos.x;
|
|
115
|
+
ctx.state.lastKnownEnemyY = pos.y;
|
|
116
|
+
}
|
|
117
|
+
ctx.suspicion.clear();
|
|
118
|
+
ctx.halt();
|
|
119
|
+
ctx.transition(this.tr.investigateOnEnemy);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const destX = ctx.state.lastKnownEnemyX;
|
|
123
|
+
const destY = ctx.state.lastKnownEnemyY;
|
|
124
|
+
const dx = destX - ctx.x;
|
|
125
|
+
const dy = destY - ctx.y;
|
|
126
|
+
const distSq = dx * dx + dy * dy;
|
|
127
|
+
const thresh = this.cfg.arriveThreshold;
|
|
128
|
+
if (distSq <= thresh * thresh) {
|
|
129
|
+
// Arrived — begin look-around phase
|
|
130
|
+
ctx.state.investigateLookAroundStartMs = now;
|
|
131
|
+
ctx.halt();
|
|
132
|
+
if (dx !== 0 || dy !== 0) {
|
|
133
|
+
ctx.setRotation(Math.atan2(dy, dx));
|
|
134
|
+
}
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
moveToward(ctx, destX, destY, this.cfg.approachSpeed);
|
|
138
|
+
}
|
|
139
|
+
exit(ctx) {
|
|
140
|
+
ctx.state.investigateStartMs = 0;
|
|
141
|
+
ctx.state.investigateLookAroundStartMs = -1;
|
|
142
|
+
ctx.halt();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=InvestigateState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InvestigateState.js","sourceRoot":"","sources":["../../../src/states/handlers/InvestigateState.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
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 five-phase kill-wounded handler (X-Ray 16 `stalker_kill_wounded` equivalent).
|
|
7
|
+
*
|
|
8
|
+
* A single instance can be shared across all NPC entities.
|
|
9
|
+
*
|
|
10
|
+
* Opt-in activation (add to the handler registry):
|
|
11
|
+
* ```ts
|
|
12
|
+
* const handlers = buildDefaultHandlerMap(cfg, {
|
|
13
|
+
* combatOnKillWounded: 'KILL_WOUNDED',
|
|
14
|
+
* alertOnKillWounded: 'KILL_WOUNDED',
|
|
15
|
+
* });
|
|
16
|
+
* handlers.register('KILL_WOUNDED', new KillWoundedState(cfg));
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export declare class KillWoundedState implements IOnlineStateHandler {
|
|
20
|
+
private readonly cfg;
|
|
21
|
+
private readonly tr;
|
|
22
|
+
constructor(cfg: IStateConfig, tr?: Partial<IStateTransitionMap>);
|
|
23
|
+
enter(ctx: INPCContext): void;
|
|
24
|
+
update(ctx: INPCContext, _deltaMs: number): void;
|
|
25
|
+
exit(ctx: INPCContext): void;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=KillWoundedState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KillWoundedState.d.ts","sourceRoot":"","sources":["../../../src/states/handlers/KillWoundedState.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAS,wBAAwB,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAiB,gBAAgB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAgB,iBAAiB,CAAC;AAE9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAS,wBAAwB,CAAC;AAGrE;;;;;;;;;;;;;GAaG;AACH,qBAAa,gBAAiB,YAAW,mBAAmB;IAC1D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAuB;gBAE9B,GAAG,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC;IAKhE,KAAK,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAU7B,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IA0HhD,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;CAY7B"}
|