@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,88 @@
|
|
|
1
|
+
// states/handlers/_utils.ts
|
|
2
|
+
// Internal utility helpers shared by passive state handlers.
|
|
3
|
+
// NOT exported from the handlers barrel — internal implementation detail.
|
|
4
|
+
import { computePackSteering, blendWithPrimary, createDefaultSteeringConfig } from '../../navigation/SteeringBehaviors';
|
|
5
|
+
/**
|
|
6
|
+
* Return the Euclidean distance between two world positions.
|
|
7
|
+
*/
|
|
8
|
+
export function distanceTo(ax, ay, bx, by) {
|
|
9
|
+
const dx = bx - ax;
|
|
10
|
+
const dy = by - ay;
|
|
11
|
+
return Math.sqrt(dx * dx + dy * dy);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Return the angle in radians from (ax, ay) toward (bx, by).
|
|
15
|
+
* 0 = right, π/2 = down (screen-space Y is positive downward).
|
|
16
|
+
*/
|
|
17
|
+
export function angleToward(ax, ay, bx, by) {
|
|
18
|
+
return Math.atan2(by - ay, bx - ax);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Set the NPC's velocity so it moves toward (targetX, targetY) at the given
|
|
22
|
+
* speed (px/s). Also updates the NPC's rotation to face the target.
|
|
23
|
+
*
|
|
24
|
+
* If the NPC is already within 0.5 px of the target, velocity is zeroed to
|
|
25
|
+
* avoid jitter; no rotation change is applied.
|
|
26
|
+
*/
|
|
27
|
+
export function moveToward(ctx, targetX, targetY, speed) {
|
|
28
|
+
const dx = targetX - ctx.x;
|
|
29
|
+
const dy = targetY - ctx.y;
|
|
30
|
+
const dist = Math.sqrt(dx * dx + dy * dy);
|
|
31
|
+
if (dist < 0.5) {
|
|
32
|
+
ctx.halt();
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
ctx.setVelocity((dx / dist) * speed, (dy / dist) * speed);
|
|
36
|
+
ctx.setRotation(Math.atan2(dy, dx));
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Set the NPC's velocity so it moves directly away from (fromX, fromY) at the
|
|
40
|
+
* given speed (px/s). Also updates the NPC's rotation to face away.
|
|
41
|
+
*
|
|
42
|
+
* If the NPC is exactly on top of (fromX, fromY), a default escape direction
|
|
43
|
+
* (positive X) is used instead.
|
|
44
|
+
*/
|
|
45
|
+
export function awayFrom(ctx, fromX, fromY, speed) {
|
|
46
|
+
const dx = ctx.x - fromX;
|
|
47
|
+
const dy = ctx.y - fromY;
|
|
48
|
+
const dist = Math.sqrt(dx * dx + dy * dy);
|
|
49
|
+
if (dist < 0.5) {
|
|
50
|
+
// Standing exactly on the threat — escape along positive X by default.
|
|
51
|
+
ctx.setVelocity(speed, 0);
|
|
52
|
+
ctx.setRotation(0);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
ctx.setVelocity((dx / dist) * speed, (dy / dist) * speed);
|
|
56
|
+
ctx.setRotation(Math.atan2(dy, dx));
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Opt-in convenience helper: computes pack steering (separation + cohesion) from
|
|
60
|
+
* nearby ally positions and blends it with a primary movement direction before
|
|
61
|
+
* calling `ctx.setVelocity()` and `ctx.setRotation()`.
|
|
62
|
+
*
|
|
63
|
+
* State handlers that want group-aware movement call this instead of
|
|
64
|
+
* `moveToward()` when allies are visible.
|
|
65
|
+
*
|
|
66
|
+
* For advanced scenarios (custom forces, alignment, formation) use the
|
|
67
|
+
* composable primitives directly:
|
|
68
|
+
* `computePackSteering() + combineForces() + blendWithPrimary()`
|
|
69
|
+
*
|
|
70
|
+
* @param ctx - NPC context (provides position and setVelocity/setRotation).
|
|
71
|
+
* @param allies - Nearby ally positions (e.g. from ctx.perception.getVisibleAllies()).
|
|
72
|
+
* @param config - Steering configuration.
|
|
73
|
+
* @param primaryVx - Normalised X component of the desired movement direction.
|
|
74
|
+
* @param primaryVy - Normalised Y component of the desired movement direction.
|
|
75
|
+
* @param speed - Base movement speed (px/s).
|
|
76
|
+
* @param weight - Blend weight for the steering force [0..1]. @default 0.35
|
|
77
|
+
*/
|
|
78
|
+
export function applyPackSteering(ctx, allies, config, primaryVx, primaryVy, speed, weight = 0.35) {
|
|
79
|
+
const self = { x: ctx.x, y: ctx.y };
|
|
80
|
+
const force = computePackSteering(self, allies, config);
|
|
81
|
+
const { vx, vy } = blendWithPrimary(primaryVx, primaryVy, force, speed, weight);
|
|
82
|
+
ctx.setVelocity(vx, vy);
|
|
83
|
+
ctx.setRotation(Math.atan2(vy, vx));
|
|
84
|
+
}
|
|
85
|
+
// Re-export so handlers can build the config once in their constructor
|
|
86
|
+
// without importing directly from '../../navigation/SteeringBehaviors'.
|
|
87
|
+
export { createDefaultSteeringConfig };
|
|
88
|
+
//# sourceMappingURL=_utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_utils.js","sourceRoot":"","sources":["../../../src/states/handlers/_utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export { DeadState } from './DeadState';
|
|
2
|
+
export { IdleState } from './IdleState';
|
|
3
|
+
export { PatrolState } from './PatrolState';
|
|
4
|
+
export { AlertState } from './AlertState';
|
|
5
|
+
export { FleeState } from './FleeState';
|
|
6
|
+
export { SearchState } from './SearchState';
|
|
7
|
+
export { CampState } from './CampState';
|
|
8
|
+
export { SleepState } from './SleepState';
|
|
9
|
+
export { CombatState } from './CombatState';
|
|
10
|
+
export { TakeCoverState } from './TakeCoverState';
|
|
11
|
+
export { GrenadeState } from './GrenadeState';
|
|
12
|
+
export { CombatTransitionHandler } from './CombatTransitionHandler';
|
|
13
|
+
export { EvadeGrenadeState } from './EvadeGrenadeState';
|
|
14
|
+
export { WoundedState } from './WoundedState';
|
|
15
|
+
export { RetreatState } from './RetreatState';
|
|
16
|
+
export { MonsterCombatController, CHORNOBYL_ABILITY_SELECTOR } from './MonsterCombatController';
|
|
17
|
+
export type { MonsterAbilitySelector } from './MonsterCombatController';
|
|
18
|
+
export { ChargeState } from './ChargeState';
|
|
19
|
+
export { StalkState } from './StalkState';
|
|
20
|
+
export { LeapState } from './LeapState';
|
|
21
|
+
export { PsiAttackState } from './PsiAttackState';
|
|
22
|
+
export { InvestigateState } from './InvestigateState';
|
|
23
|
+
export { HelpWoundedState } from './HelpWoundedState';
|
|
24
|
+
export { KillWoundedState } from './KillWoundedState';
|
|
25
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/states/handlers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAQ,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAQ,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAO,cAAc,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAQ,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAQ,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAO,cAAc,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAkB,eAAe,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAe,kBAAkB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAiB,gBAAgB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAY,qBAAqB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAiB,gBAAgB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAiB,gBAAgB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAChG,YAAY,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAkB,eAAe,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAmB,cAAc,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAoB,aAAa,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAe,kBAAkB,CAAC;AAI3D,OAAO,EAAE,gBAAgB,EAAE,MAAa,oBAAoB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAa,oBAAoB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAa,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// states/handlers barrel
|
|
2
|
+
export { DeadState } from './DeadState';
|
|
3
|
+
export { IdleState } from './IdleState';
|
|
4
|
+
export { PatrolState } from './PatrolState';
|
|
5
|
+
export { AlertState } from './AlertState';
|
|
6
|
+
export { FleeState } from './FleeState';
|
|
7
|
+
export { SearchState } from './SearchState';
|
|
8
|
+
export { CampState } from './CampState';
|
|
9
|
+
export { SleepState } from './SleepState';
|
|
10
|
+
export { CombatState } from './CombatState';
|
|
11
|
+
export { TakeCoverState } from './TakeCoverState';
|
|
12
|
+
export { GrenadeState } from './GrenadeState';
|
|
13
|
+
export { CombatTransitionHandler } from './CombatTransitionHandler';
|
|
14
|
+
export { EvadeGrenadeState } from './EvadeGrenadeState';
|
|
15
|
+
export { WoundedState } from './WoundedState';
|
|
16
|
+
export { RetreatState } from './RetreatState';
|
|
17
|
+
export { MonsterCombatController, CHORNOBYL_ABILITY_SELECTOR } from './MonsterCombatController';
|
|
18
|
+
export { ChargeState } from './ChargeState';
|
|
19
|
+
export { StalkState } from './StalkState';
|
|
20
|
+
export { LeapState } from './LeapState';
|
|
21
|
+
export { PsiAttackState } from './PsiAttackState';
|
|
22
|
+
// ── Opt-in handlers (not registered by buildDefaultHandlerMap / buildMonsterHandlerMap) ──
|
|
23
|
+
// Register manually: handlers.register('INVESTIGATE', new InvestigateState(cfg));
|
|
24
|
+
// Also opt-in: CombatTransitionHandler (exported above).
|
|
25
|
+
export { InvestigateState } from './InvestigateState';
|
|
26
|
+
export { HelpWoundedState } from './HelpWoundedState';
|
|
27
|
+
export { KillWoundedState } from './KillWoundedState';
|
|
28
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/states/handlers/index.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,OAAO,EAAE,SAAS,EAAE,MAAQ,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAQ,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAO,cAAc,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAQ,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAQ,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAO,cAAc,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAkB,eAAe,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAe,kBAAkB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAiB,gBAAgB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAY,qBAAqB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAiB,gBAAgB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAiB,gBAAgB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAEhG,OAAO,EAAE,WAAW,EAAE,MAAkB,eAAe,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAmB,cAAc,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAoB,aAAa,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAe,kBAAkB,CAAC;AAC3D,4FAA4F;AAC5F,kFAAkF;AAClF,yDAAyD;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAa,oBAAoB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAa,oBAAoB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAa,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type { IStateConfig, IMovementConfig, ICombatConfig, IMonsterConfig, ITimingConfig } from './IStateConfig';
|
|
2
|
+
export { createDefaultStateConfig } from './IStateConfig';
|
|
3
|
+
export * from './IStateTransitionMap';
|
|
4
|
+
export type { ILoopholeState, IChargePhase, IStalkPhase, ILeapPhase, IPsiPhase, INPCOnlineState, } from './INPCOnlineState';
|
|
5
|
+
export { createDefaultNPCOnlineState } from './NPCOnlineState';
|
|
6
|
+
export type { INPCPerception, INPCHealth, ICoverAccess, IDangerAccess, IRestrictedZoneAccess, ISquadAccess, IConditionAccess, ISuspicionAccess, IShootPayload, IMeleeHitPayload, INPCContext, } from './INPCContext';
|
|
7
|
+
export type { IPackAccess, IPackTarget, PackAlertLevel } from './pack/IPackAccess';
|
|
8
|
+
export { PACK_ALERT_ORDER } from './pack/IPackAccess';
|
|
9
|
+
export type { IOnlineStateHandler } from './IOnlineStateHandler';
|
|
10
|
+
export { StateHandlerMap } from './StateHandlerMap';
|
|
11
|
+
export type { IVisibleEntity, INearbyItem } from './NPCPerception';
|
|
12
|
+
export { NPCPerception } from './NPCPerception';
|
|
13
|
+
export * from './handlers/index';
|
|
14
|
+
export type { IOnlineDriverHost } from './OnlineAIDriver';
|
|
15
|
+
export { OnlineAIDriver } from './OnlineAIDriver';
|
|
16
|
+
export { buildDefaultHandlerMap, buildMonsterHandlerMap, buildChornobylMonsterHandlerMap, ONLINE_STATE } from './OnlineStateRegistryBuilder';
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/states/index.ts"],"names":[],"mappings":"AAGA,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAClH,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,cAAc,uBAAuB,CAAC;AAEtC,YAAY,EACV,cAAc,EACd,YAAY,EACZ,WAAW,EACX,UAAU,EACV,SAAS,EACT,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAE/D,YAAY,EACV,cAAc,EACd,UAAU,EACV,YAAY,EACZ,aAAa,EACb,qBAAqB,EACrB,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,WAAW,GACZ,MAAM,eAAe,CAAC;AAEvB,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,cAAc,kBAAkB,CAAC;AAEjC,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,+BAA+B,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// states sub-path barrel
|
|
2
|
+
// Foundation layer for Phaser-free NPC online state handlers.
|
|
3
|
+
export { createDefaultStateConfig } from './IStateConfig';
|
|
4
|
+
export * from './IStateTransitionMap';
|
|
5
|
+
export { createDefaultNPCOnlineState } from './NPCOnlineState';
|
|
6
|
+
export { PACK_ALERT_ORDER } from './pack/IPackAccess';
|
|
7
|
+
export { StateHandlerMap } from './StateHandlerMap';
|
|
8
|
+
export { NPCPerception } from './NPCPerception';
|
|
9
|
+
export * from './handlers/index';
|
|
10
|
+
export { OnlineAIDriver } from './OnlineAIDriver';
|
|
11
|
+
export { buildDefaultHandlerMap, buildMonsterHandlerMap, buildChornobylMonsterHandlerMap, ONLINE_STATE } from './OnlineStateRegistryBuilder';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/states/index.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,8DAA8D;AAG9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,cAAc,uBAAuB,CAAC;AAWtC,OAAO,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAiB/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAItD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,cAAc,kBAAkB,CAAC;AAGjC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,+BAA+B,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export type PackAlertLevel = 'NONE' | 'ALERTED' | 'COMBAT' | 'PANIC';
|
|
2
|
+
/**
|
|
3
|
+
* Escalation order used for max-wins semantics in `broadcastAlertLevel`.
|
|
4
|
+
* Each level supersedes all levels to its left.
|
|
5
|
+
*/
|
|
6
|
+
export declare const PACK_ALERT_ORDER: ReadonlyArray<PackAlertLevel>;
|
|
7
|
+
export interface IPackTarget {
|
|
8
|
+
readonly id: string | null;
|
|
9
|
+
readonly x: number;
|
|
10
|
+
readonly y: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Opt-in pack coordination port for monster groups (Dog, Tushkano, etc.).
|
|
14
|
+
*
|
|
15
|
+
* Implement on a shared pack record accessible to all group members. State
|
|
16
|
+
* handlers call `broadcastTarget` / `broadcastAlertLevel` when they spot an
|
|
17
|
+
* enemy or start fleeing; idle/patrol members poll `getPackAlertLevel` to
|
|
18
|
+
* activate without waiting for individual perception.
|
|
19
|
+
*
|
|
20
|
+
* Register by assigning the accessor to `ctx.pack` in the host entity wrapper.
|
|
21
|
+
*
|
|
22
|
+
* ## TTL decay contract (livelock prevention)
|
|
23
|
+
*
|
|
24
|
+
* The host implementation is responsible for de-escalating the alert level over
|
|
25
|
+
* time. Without this the pack can loop indefinitely between PATROL and ALERT
|
|
26
|
+
* after a contact fades. The recommended approach is to track the last broadcast
|
|
27
|
+
* timestamp per level and reset to 'NONE' after `cfg.packAlertTtlMs` elapses
|
|
28
|
+
* without a refresh broadcast.
|
|
29
|
+
*/
|
|
30
|
+
export interface IPackAccess {
|
|
31
|
+
/** Highest alert level currently active in the pack. */
|
|
32
|
+
getPackAlertLevel(): PackAlertLevel;
|
|
33
|
+
/** Last enemy position broadcast by any pack member, or null if none. */
|
|
34
|
+
getPackTarget(): IPackTarget | null;
|
|
35
|
+
/** Broadcast a confirmed enemy position to all pack members. */
|
|
36
|
+
broadcastTarget(targetId: string | null, x: number, y: number): void;
|
|
37
|
+
/**
|
|
38
|
+
* Escalate the pack's shared alert level.
|
|
39
|
+
*
|
|
40
|
+
* **Max-wins semantics** — the level can only increase within the current TTL
|
|
41
|
+
* window. See `PACK_ALERT_ORDER` for the escalation order. The host must
|
|
42
|
+
* implement TTL-based decay back to 'NONE' (see class JSDoc above).
|
|
43
|
+
*/
|
|
44
|
+
broadcastAlertLevel(level: PackAlertLevel): void;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=IPackAccess.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IPackAccess.d.ts","sourceRoot":"","sources":["../../../src/states/pack/IPackAccess.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;AAErE;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,aAAa,CAAC,cAAc,CAE1D,CAAC;AAEF,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,WAAW;IAC1B,wDAAwD;IACxD,iBAAiB,IAAI,cAAc,CAAC;IAEpC,yEAAyE;IACzE,aAAa,IAAI,WAAW,GAAG,IAAI,CAAC;IAEpC,gEAAgE;IAChE,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAErE;;;;;;OAMG;IACH,mBAAmB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;CAClD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IPackAccess.js","sourceRoot":"","sources":["../../../src/states/pack/IPackAccess.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAkC;IAC7D,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO;CACrC,CAAC"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Named constants for the built-in suspicion stimuli.
|
|
3
|
+
*
|
|
4
|
+
* Using these avoids magic strings, but any string is a valid
|
|
5
|
+
* {@link SuspicionStimulus}.
|
|
6
|
+
*/
|
|
7
|
+
export declare const SuspicionStimuli: {
|
|
8
|
+
/** Gunshot, explosion sound heard nearby. */
|
|
9
|
+
readonly SOUND: "sound";
|
|
10
|
+
/** Enemy glimpsed briefly — partial FOV or behind cover. */
|
|
11
|
+
readonly PARTIAL_SIGHT: "partial_sight";
|
|
12
|
+
/** Footstep sounds detected. */
|
|
13
|
+
readonly FOOTSTEP: "footstep";
|
|
14
|
+
/** Explosion in vicinity. */
|
|
15
|
+
readonly EXPLOSION: "explosion";
|
|
16
|
+
/** NPC discovered a dead body in the area. */
|
|
17
|
+
readonly BODY_FOUND: "body_found";
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Open suspicion stimulus type.
|
|
21
|
+
*
|
|
22
|
+
* Derived from {@link SuspicionStimuli} so the type and constants stay in sync.
|
|
23
|
+
* Any string is valid — games can add their own stimuli without touching the SDK.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* accumulator.add(SuspicionStimuli.SOUND, 0.4, gunX, gunY);
|
|
27
|
+
* accumulator.add('psi_interference', 0.3);
|
|
28
|
+
*/
|
|
29
|
+
export type SuspicionStimulus = (typeof SuspicionStimuli)[keyof typeof SuspicionStimuli] | (string & {});
|
|
30
|
+
/**
|
|
31
|
+
* Tuning parameters for a {@link SuspicionAccumulator}.
|
|
32
|
+
* All fields have defaults via {@link createDefaultSuspicionConfig}.
|
|
33
|
+
*/
|
|
34
|
+
export interface ISuspicionConfig {
|
|
35
|
+
/**
|
|
36
|
+
* How fast suspicion decays (level/second) when no stimuli are added.
|
|
37
|
+
* A value of 0.08 means a fully saturated accumulator empties in ~12.5s.
|
|
38
|
+
* @default 0.08
|
|
39
|
+
*/
|
|
40
|
+
readonly decayRate: number;
|
|
41
|
+
/**
|
|
42
|
+
* Maximum suspicion level. Levels are clamped to `[0, maxLevel]`.
|
|
43
|
+
* @default 1.0
|
|
44
|
+
*/
|
|
45
|
+
readonly maxLevel?: number;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Create an {@link ISuspicionConfig} with production defaults.
|
|
49
|
+
* Pass a partial override object to tune individual values.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* const cfg = createDefaultSuspicionConfig({ decayRate: 0.03 });
|
|
53
|
+
*/
|
|
54
|
+
export declare function createDefaultSuspicionConfig(overrides?: Partial<ISuspicionConfig>): ISuspicionConfig;
|
|
55
|
+
/**
|
|
56
|
+
* Per-NPC suspicion/alertness accumulator.
|
|
57
|
+
*
|
|
58
|
+
* Tracks cumulative threat intensity for an NPC by accumulating stimuli
|
|
59
|
+
* (sounds, partial sightings, discovered bodies) over time, with continuous
|
|
60
|
+
* decay toward zero when no new threats are detected.
|
|
61
|
+
*
|
|
62
|
+
* When the level exceeds a configurable threshold (set in {@link IStateConfig}
|
|
63
|
+
* via `suspicionAlertThreshold`), state handlers transition to ALERT.
|
|
64
|
+
*
|
|
65
|
+
* ### Wiring example (host layer)
|
|
66
|
+
* ```ts
|
|
67
|
+
* const suspicion = new SuspicionAccumulator({ decayRate: 0.05 });
|
|
68
|
+
*
|
|
69
|
+
* const ctx: INPCContext = {
|
|
70
|
+
* // ...
|
|
71
|
+
* suspicion, // SuspicionAccumulator structurally satisfies ISuspicionAccess
|
|
72
|
+
* };
|
|
73
|
+
*
|
|
74
|
+
* // Per-frame update (before the state machine tick):
|
|
75
|
+
* suspicion.update(deltaMs / 1000);
|
|
76
|
+
*
|
|
77
|
+
* // Game event handlers:
|
|
78
|
+
* onGunshot(x, y) {
|
|
79
|
+
* suspicionFor(nearNpcId).add(SuspicionStimuli.SOUND, 0.4, x, y);
|
|
80
|
+
* }
|
|
81
|
+
* // NPCSensors integration:
|
|
82
|
+
* for (const event of sensors.detectSound(pos, range, id, faction, hearers)) {
|
|
83
|
+
* suspicionFor(event.observerId).add(
|
|
84
|
+
* SuspicionStimuli.SOUND,
|
|
85
|
+
* event.confidence * 0.5,
|
|
86
|
+
* pos.x, pos.y,
|
|
87
|
+
* );
|
|
88
|
+
* }
|
|
89
|
+
* ```
|
|
90
|
+
*
|
|
91
|
+
* ### Opt-in / opt-out
|
|
92
|
+
* - **Full feature**: wire as shown above, call `add()` on stimuli.
|
|
93
|
+
* - **Read only**: implement seam without calling `add()` — no accumulation.
|
|
94
|
+
* - **Fully disabled**: leave `ctx.suspicion = null` — all state handler
|
|
95
|
+
* checks are no-ops via `ctx.suspicion?.hasReachedAlert(...)`.
|
|
96
|
+
*/
|
|
97
|
+
export declare class SuspicionAccumulator {
|
|
98
|
+
private readonly config;
|
|
99
|
+
private level;
|
|
100
|
+
private lastKnownX;
|
|
101
|
+
private lastKnownY;
|
|
102
|
+
constructor(config?: Partial<ISuspicionConfig>);
|
|
103
|
+
/**
|
|
104
|
+
* Add suspicion from a stimulus event.
|
|
105
|
+
*
|
|
106
|
+
* **Host use only.** State handlers read via {@link hasReachedAlert} /
|
|
107
|
+
* {@link getLevel} only. Stimuli are driven by the host layer (gunshots,
|
|
108
|
+
* partial sightings, discovered bodies, etc.).
|
|
109
|
+
*
|
|
110
|
+
* @param stimulus - Type of stimulus (semantic label — does not affect storage).
|
|
111
|
+
* @param amount - Positive amount to add. Negative values are ignored.
|
|
112
|
+
* @param x - Optional threat X position; becomes {@link getLastKnownPosition}.
|
|
113
|
+
* @param y - Optional threat Y position; becomes {@link getLastKnownPosition}.
|
|
114
|
+
*/
|
|
115
|
+
add(stimulus: SuspicionStimulus, amount: number, x?: number, y?: number): void;
|
|
116
|
+
/**
|
|
117
|
+
* Current suspicion level in `[0, maxLevel]`.
|
|
118
|
+
* Returns `0` initially or after the level has fully decayed.
|
|
119
|
+
*/
|
|
120
|
+
getLevel(): number;
|
|
121
|
+
/**
|
|
122
|
+
* Returns `true` if the current level is **strictly greater than** the
|
|
123
|
+
* given threshold.
|
|
124
|
+
*
|
|
125
|
+
* When `threshold` is omitted, falls back to the configured `maxLevel`.
|
|
126
|
+
* Since `add()` clamps `level` to `maxLevel`, `level > maxLevel` is always
|
|
127
|
+
* `false` — the no-arg form **never** triggers. Always pass an explicit
|
|
128
|
+
* threshold (e.g. `IStateConfig.suspicionAlertThreshold`).
|
|
129
|
+
*
|
|
130
|
+
* @param threshold - Exclusive comparison value. @default config.maxLevel
|
|
131
|
+
*/
|
|
132
|
+
hasReachedAlert(threshold?: number): boolean;
|
|
133
|
+
/**
|
|
134
|
+
* Last threat position associated with a suspicion stimulus.
|
|
135
|
+
* Returns `null` if no position has been provided via {@link add}.
|
|
136
|
+
*/
|
|
137
|
+
getLastKnownPosition(): {
|
|
138
|
+
x: number;
|
|
139
|
+
y: number;
|
|
140
|
+
} | null;
|
|
141
|
+
/**
|
|
142
|
+
* Apply time-based decay to the suspicion level.
|
|
143
|
+
*
|
|
144
|
+
* The host calls this each game frame with `deltaMs / 1000`.
|
|
145
|
+
* Suspicion decays by `decayRate * deltaSec` each frame until it reaches zero.
|
|
146
|
+
*
|
|
147
|
+
* @param deltaSec - Elapsed time since last update, in seconds.
|
|
148
|
+
*/
|
|
149
|
+
update(deltaSec: number): void;
|
|
150
|
+
/**
|
|
151
|
+
* Clear the stored threat position without resetting the suspicion level.
|
|
152
|
+
*
|
|
153
|
+
* Useful when the host wants to discard a stale position
|
|
154
|
+
* while keeping the accumulated level intact.
|
|
155
|
+
*/
|
|
156
|
+
clearPosition(): void;
|
|
157
|
+
/**
|
|
158
|
+
* Reset suspicion level and threat position.
|
|
159
|
+
*
|
|
160
|
+
* State handlers call this after triggering an ALERT transition so
|
|
161
|
+
* the NPC starts fresh in the new state rather than re-triggering
|
|
162
|
+
* immediately on re-entry to PATROL/IDLE.
|
|
163
|
+
*/
|
|
164
|
+
clear(): void;
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=SuspicionAccumulator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SuspicionAccumulator.d.ts","sourceRoot":"","sources":["../../src/suspicion/SuspicionAccumulator.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB;IAC3B,6CAA6C;;IAE7C,4DAA4D;;IAE5D,gCAAgC;;IAEhC,6BAA6B;;IAE7B,8CAA8C;;CAEtC,CAAC;AAEX;;;;;;;;;GASG;AACH,MAAM,MAAM,iBAAiB,GACzB,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,OAAO,gBAAgB,CAAC,GACxD,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAMlB;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC1C,SAAS,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GACpC,gBAAgB,CAElB;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;IACpD,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,UAAU,CAAuB;gBAE7B,MAAM,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC;IAY9C;;;;;;;;;;;OAWG;IACH,GAAG,CAAC,QAAQ,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAgB9E;;;OAGG;IACH,QAAQ,IAAI,MAAM;IAIlB;;;;;;;;;;OAUG;IACH,eAAe,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO;IAI5C;;;OAGG;IACH,oBAAoB,IAAI;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IASvD;;;;;;;OAOG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAU9B;;;;;OAKG;IACH,aAAa,IAAI,IAAI;IAKrB;;;;;;OAMG;IACH,KAAK,IAAI,IAAI;CAKd"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Stimulus types
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
/**
|
|
5
|
+
* Named constants for the built-in suspicion stimuli.
|
|
6
|
+
*
|
|
7
|
+
* Using these avoids magic strings, but any string is a valid
|
|
8
|
+
* {@link SuspicionStimulus}.
|
|
9
|
+
*/
|
|
10
|
+
export const SuspicionStimuli = {
|
|
11
|
+
/** Gunshot, explosion sound heard nearby. */
|
|
12
|
+
SOUND: 'sound',
|
|
13
|
+
/** Enemy glimpsed briefly — partial FOV or behind cover. */
|
|
14
|
+
PARTIAL_SIGHT: 'partial_sight',
|
|
15
|
+
/** Footstep sounds detected. */
|
|
16
|
+
FOOTSTEP: 'footstep',
|
|
17
|
+
/** Explosion in vicinity. */
|
|
18
|
+
EXPLOSION: 'explosion',
|
|
19
|
+
/** NPC discovered a dead body in the area. */
|
|
20
|
+
BODY_FOUND: 'body_found',
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Create an {@link ISuspicionConfig} with production defaults.
|
|
24
|
+
* Pass a partial override object to tune individual values.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* const cfg = createDefaultSuspicionConfig({ decayRate: 0.03 });
|
|
28
|
+
*/
|
|
29
|
+
export function createDefaultSuspicionConfig(overrides) {
|
|
30
|
+
return { decayRate: 0.08, ...overrides };
|
|
31
|
+
}
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
// SuspicionAccumulator
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
/**
|
|
36
|
+
* Per-NPC suspicion/alertness accumulator.
|
|
37
|
+
*
|
|
38
|
+
* Tracks cumulative threat intensity for an NPC by accumulating stimuli
|
|
39
|
+
* (sounds, partial sightings, discovered bodies) over time, with continuous
|
|
40
|
+
* decay toward zero when no new threats are detected.
|
|
41
|
+
*
|
|
42
|
+
* When the level exceeds a configurable threshold (set in {@link IStateConfig}
|
|
43
|
+
* via `suspicionAlertThreshold`), state handlers transition to ALERT.
|
|
44
|
+
*
|
|
45
|
+
* ### Wiring example (host layer)
|
|
46
|
+
* ```ts
|
|
47
|
+
* const suspicion = new SuspicionAccumulator({ decayRate: 0.05 });
|
|
48
|
+
*
|
|
49
|
+
* const ctx: INPCContext = {
|
|
50
|
+
* // ...
|
|
51
|
+
* suspicion, // SuspicionAccumulator structurally satisfies ISuspicionAccess
|
|
52
|
+
* };
|
|
53
|
+
*
|
|
54
|
+
* // Per-frame update (before the state machine tick):
|
|
55
|
+
* suspicion.update(deltaMs / 1000);
|
|
56
|
+
*
|
|
57
|
+
* // Game event handlers:
|
|
58
|
+
* onGunshot(x, y) {
|
|
59
|
+
* suspicionFor(nearNpcId).add(SuspicionStimuli.SOUND, 0.4, x, y);
|
|
60
|
+
* }
|
|
61
|
+
* // NPCSensors integration:
|
|
62
|
+
* for (const event of sensors.detectSound(pos, range, id, faction, hearers)) {
|
|
63
|
+
* suspicionFor(event.observerId).add(
|
|
64
|
+
* SuspicionStimuli.SOUND,
|
|
65
|
+
* event.confidence * 0.5,
|
|
66
|
+
* pos.x, pos.y,
|
|
67
|
+
* );
|
|
68
|
+
* }
|
|
69
|
+
* ```
|
|
70
|
+
*
|
|
71
|
+
* ### Opt-in / opt-out
|
|
72
|
+
* - **Full feature**: wire as shown above, call `add()` on stimuli.
|
|
73
|
+
* - **Read only**: implement seam without calling `add()` — no accumulation.
|
|
74
|
+
* - **Fully disabled**: leave `ctx.suspicion = null` — all state handler
|
|
75
|
+
* checks are no-ops via `ctx.suspicion?.hasReachedAlert(...)`.
|
|
76
|
+
*/
|
|
77
|
+
export class SuspicionAccumulator {
|
|
78
|
+
constructor(config) {
|
|
79
|
+
this.level = 0;
|
|
80
|
+
this.lastKnownX = null;
|
|
81
|
+
this.lastKnownY = null;
|
|
82
|
+
const merged = createDefaultSuspicionConfig(config);
|
|
83
|
+
this.config = {
|
|
84
|
+
decayRate: merged.decayRate,
|
|
85
|
+
maxLevel: merged.maxLevel ?? 1.0,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
// ---------------------------------------------------------------------------
|
|
89
|
+
// Write (host use only)
|
|
90
|
+
// ---------------------------------------------------------------------------
|
|
91
|
+
/**
|
|
92
|
+
* Add suspicion from a stimulus event.
|
|
93
|
+
*
|
|
94
|
+
* **Host use only.** State handlers read via {@link hasReachedAlert} /
|
|
95
|
+
* {@link getLevel} only. Stimuli are driven by the host layer (gunshots,
|
|
96
|
+
* partial sightings, discovered bodies, etc.).
|
|
97
|
+
*
|
|
98
|
+
* @param stimulus - Type of stimulus (semantic label — does not affect storage).
|
|
99
|
+
* @param amount - Positive amount to add. Negative values are ignored.
|
|
100
|
+
* @param x - Optional threat X position; becomes {@link getLastKnownPosition}.
|
|
101
|
+
* @param y - Optional threat Y position; becomes {@link getLastKnownPosition}.
|
|
102
|
+
*/
|
|
103
|
+
add(stimulus, amount, x, y) {
|
|
104
|
+
if (!(amount > 0))
|
|
105
|
+
return; // rejects NaN and ≤ 0
|
|
106
|
+
this.level = Math.min(this.level + amount, this.config.maxLevel);
|
|
107
|
+
if (x !== undefined && y !== undefined) {
|
|
108
|
+
this.lastKnownX = x;
|
|
109
|
+
this.lastKnownY = y;
|
|
110
|
+
}
|
|
111
|
+
// Stimulus parameter is accepted for semantic clarity and future auditing,
|
|
112
|
+
// but the accumulator stores a single aggregate level (not per-stimulus).
|
|
113
|
+
void stimulus;
|
|
114
|
+
}
|
|
115
|
+
// ---------------------------------------------------------------------------
|
|
116
|
+
// Read
|
|
117
|
+
// ---------------------------------------------------------------------------
|
|
118
|
+
/**
|
|
119
|
+
* Current suspicion level in `[0, maxLevel]`.
|
|
120
|
+
* Returns `0` initially or after the level has fully decayed.
|
|
121
|
+
*/
|
|
122
|
+
getLevel() {
|
|
123
|
+
return this.level;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Returns `true` if the current level is **strictly greater than** the
|
|
127
|
+
* given threshold.
|
|
128
|
+
*
|
|
129
|
+
* When `threshold` is omitted, falls back to the configured `maxLevel`.
|
|
130
|
+
* Since `add()` clamps `level` to `maxLevel`, `level > maxLevel` is always
|
|
131
|
+
* `false` — the no-arg form **never** triggers. Always pass an explicit
|
|
132
|
+
* threshold (e.g. `IStateConfig.suspicionAlertThreshold`).
|
|
133
|
+
*
|
|
134
|
+
* @param threshold - Exclusive comparison value. @default config.maxLevel
|
|
135
|
+
*/
|
|
136
|
+
hasReachedAlert(threshold) {
|
|
137
|
+
return this.level > (threshold ?? this.config.maxLevel);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Last threat position associated with a suspicion stimulus.
|
|
141
|
+
* Returns `null` if no position has been provided via {@link add}.
|
|
142
|
+
*/
|
|
143
|
+
getLastKnownPosition() {
|
|
144
|
+
if (this.lastKnownX === null || this.lastKnownY === null)
|
|
145
|
+
return null;
|
|
146
|
+
return { x: this.lastKnownX, y: this.lastKnownY };
|
|
147
|
+
}
|
|
148
|
+
// ---------------------------------------------------------------------------
|
|
149
|
+
// Time-based decay
|
|
150
|
+
// ---------------------------------------------------------------------------
|
|
151
|
+
/**
|
|
152
|
+
* Apply time-based decay to the suspicion level.
|
|
153
|
+
*
|
|
154
|
+
* The host calls this each game frame with `deltaMs / 1000`.
|
|
155
|
+
* Suspicion decays by `decayRate * deltaSec` each frame until it reaches zero.
|
|
156
|
+
*
|
|
157
|
+
* @param deltaSec - Elapsed time since last update, in seconds.
|
|
158
|
+
*/
|
|
159
|
+
update(deltaSec) {
|
|
160
|
+
if (!(deltaSec > 0))
|
|
161
|
+
return; // rejects NaN and negative (would increase level)
|
|
162
|
+
const next = this.level - this.config.decayRate * deltaSec;
|
|
163
|
+
this.level = next <= 0 ? 0 : next;
|
|
164
|
+
}
|
|
165
|
+
// ---------------------------------------------------------------------------
|
|
166
|
+
// Lifecycle
|
|
167
|
+
// ---------------------------------------------------------------------------
|
|
168
|
+
/**
|
|
169
|
+
* Clear the stored threat position without resetting the suspicion level.
|
|
170
|
+
*
|
|
171
|
+
* Useful when the host wants to discard a stale position
|
|
172
|
+
* while keeping the accumulated level intact.
|
|
173
|
+
*/
|
|
174
|
+
clearPosition() {
|
|
175
|
+
this.lastKnownX = null;
|
|
176
|
+
this.lastKnownY = null;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Reset suspicion level and threat position.
|
|
180
|
+
*
|
|
181
|
+
* State handlers call this after triggering an ALERT transition so
|
|
182
|
+
* the NPC starts fresh in the new state rather than re-triggering
|
|
183
|
+
* immediately on re-entry to PATROL/IDLE.
|
|
184
|
+
*/
|
|
185
|
+
clear() {
|
|
186
|
+
this.level = 0;
|
|
187
|
+
this.lastKnownX = null;
|
|
188
|
+
this.lastKnownY = null;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=SuspicionAccumulator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SuspicionAccumulator.js","sourceRoot":"","sources":["../../src/suspicion/SuspicionAccumulator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/suspicion/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,4BAA4B,GAC7B,MAAM,wBAAwB,CAAC;AAEhC,YAAY,EACV,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/suspicion/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,4BAA4B,GAC7B,MAAM,wBAAwB,CAAC"}
|