@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,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* All possible NPC vocalization types.
|
|
3
|
+
* The host maps these to actual audio assets.
|
|
4
|
+
*/
|
|
5
|
+
export declare const VocalizationType: {
|
|
6
|
+
readonly IDLE: "idle";
|
|
7
|
+
readonly ALERT: "alert";
|
|
8
|
+
readonly COMBAT: "combat";
|
|
9
|
+
readonly WOUNDED: "wounded";
|
|
10
|
+
readonly DEATH: "death";
|
|
11
|
+
readonly FLEE: "flee";
|
|
12
|
+
readonly GRENADE_THROW: "grenade_throw";
|
|
13
|
+
readonly GRENADE_WARNING: "grenade_warning";
|
|
14
|
+
readonly RELOAD: "reload";
|
|
15
|
+
readonly SPOTTED_ENEMY: "spotted_enemy";
|
|
16
|
+
readonly LOST_TARGET: "lost_target";
|
|
17
|
+
readonly KILL_CONFIRMED: "kill_confirmed";
|
|
18
|
+
readonly FRIENDLY_FIRE: "friendly_fire";
|
|
19
|
+
readonly HELP: "help";
|
|
20
|
+
readonly ACKNOWLEDGE: "acknowledge";
|
|
21
|
+
readonly REMARK: "remark";
|
|
22
|
+
readonly KAMP_SOCIAL: "kamp_social";
|
|
23
|
+
};
|
|
24
|
+
export type VocalizationType = (typeof VocalizationType)[keyof typeof VocalizationType];
|
|
25
|
+
/**
|
|
26
|
+
* Configuration for vocalization cooldowns per type.
|
|
27
|
+
* Prevents overlapping/spamming sounds.
|
|
28
|
+
*/
|
|
29
|
+
export interface IVocalizationConfig {
|
|
30
|
+
readonly cooldowns: Readonly<Record<VocalizationType, number>>;
|
|
31
|
+
}
|
|
32
|
+
/** Default production cooldowns (ms). */
|
|
33
|
+
export declare function createDefaultVocalizationConfig(): IVocalizationConfig;
|
|
34
|
+
/**
|
|
35
|
+
* Per-NPC vocalization cooldown tracker.
|
|
36
|
+
*
|
|
37
|
+
* Tracks last play time per type. The host calls `canPlay()` before
|
|
38
|
+
* triggering audio and `markPlayed()` after.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```ts
|
|
42
|
+
* const tracker = new VocalizationTracker(config);
|
|
43
|
+
* if (tracker.canPlay(VocalizationType.COMBAT, gameTime)) {
|
|
44
|
+
* tracker.markPlayed(VocalizationType.COMBAT, gameTime);
|
|
45
|
+
* audioSystem.play(npcId, VocalizationType.COMBAT);
|
|
46
|
+
* }
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export declare class VocalizationTracker {
|
|
50
|
+
private readonly lastPlayed;
|
|
51
|
+
private readonly config;
|
|
52
|
+
constructor(config: IVocalizationConfig);
|
|
53
|
+
canPlay(type: VocalizationType, currentTimeMs: number): boolean;
|
|
54
|
+
markPlayed(type: VocalizationType, currentTimeMs: number): void;
|
|
55
|
+
reset(): void;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=VocalizationTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VocalizationTypes.d.ts","sourceRoot":"","sources":["../../src/sound/VocalizationTypes.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;CAkBnB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,OAAO,gBAAgB,CAAC,CAAC;AAExF;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC;CAChE;AAED,yCAAyC;AACzC,wBAAgB,+BAA+B,IAAI,mBAAmB,CAsBrE;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuC;IAClE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;gBAEjC,MAAM,EAAE,mBAAmB;IAIvC,OAAO,CAAC,IAAI,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO;IAU/D,UAAU,CAAC,IAAI,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IAI/D,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// sound/VocalizationTypes.ts
|
|
2
|
+
// Type-safe vocalization system for NPC sounds.
|
|
3
|
+
// No audio playback — the host implements the actual sound renderer.
|
|
4
|
+
/**
|
|
5
|
+
* All possible NPC vocalization types.
|
|
6
|
+
* The host maps these to actual audio assets.
|
|
7
|
+
*/
|
|
8
|
+
export const VocalizationType = {
|
|
9
|
+
IDLE: 'idle',
|
|
10
|
+
ALERT: 'alert',
|
|
11
|
+
COMBAT: 'combat',
|
|
12
|
+
WOUNDED: 'wounded',
|
|
13
|
+
DEATH: 'death',
|
|
14
|
+
FLEE: 'flee',
|
|
15
|
+
GRENADE_THROW: 'grenade_throw',
|
|
16
|
+
GRENADE_WARNING: 'grenade_warning',
|
|
17
|
+
RELOAD: 'reload',
|
|
18
|
+
SPOTTED_ENEMY: 'spotted_enemy',
|
|
19
|
+
LOST_TARGET: 'lost_target',
|
|
20
|
+
KILL_CONFIRMED: 'kill_confirmed',
|
|
21
|
+
FRIENDLY_FIRE: 'friendly_fire',
|
|
22
|
+
HELP: 'help',
|
|
23
|
+
ACKNOWLEDGE: 'acknowledge',
|
|
24
|
+
REMARK: 'remark',
|
|
25
|
+
KAMP_SOCIAL: 'kamp_social',
|
|
26
|
+
};
|
|
27
|
+
/** Default production cooldowns (ms). */
|
|
28
|
+
export function createDefaultVocalizationConfig() {
|
|
29
|
+
return {
|
|
30
|
+
cooldowns: {
|
|
31
|
+
[VocalizationType.IDLE]: 15000,
|
|
32
|
+
[VocalizationType.ALERT]: 5000,
|
|
33
|
+
[VocalizationType.COMBAT]: 3000,
|
|
34
|
+
[VocalizationType.WOUNDED]: 4000,
|
|
35
|
+
[VocalizationType.DEATH]: 0,
|
|
36
|
+
[VocalizationType.FLEE]: 5000,
|
|
37
|
+
[VocalizationType.GRENADE_THROW]: 1000,
|
|
38
|
+
[VocalizationType.GRENADE_WARNING]: 2000,
|
|
39
|
+
[VocalizationType.RELOAD]: 3000,
|
|
40
|
+
[VocalizationType.SPOTTED_ENEMY]: 5000,
|
|
41
|
+
[VocalizationType.LOST_TARGET]: 5000,
|
|
42
|
+
[VocalizationType.KILL_CONFIRMED]: 3000,
|
|
43
|
+
[VocalizationType.FRIENDLY_FIRE]: 5000,
|
|
44
|
+
[VocalizationType.HELP]: 4000,
|
|
45
|
+
[VocalizationType.ACKNOWLEDGE]: 2000,
|
|
46
|
+
[VocalizationType.REMARK]: 10000,
|
|
47
|
+
[VocalizationType.KAMP_SOCIAL]: 8000,
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Per-NPC vocalization cooldown tracker.
|
|
53
|
+
*
|
|
54
|
+
* Tracks last play time per type. The host calls `canPlay()` before
|
|
55
|
+
* triggering audio and `markPlayed()` after.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```ts
|
|
59
|
+
* const tracker = new VocalizationTracker(config);
|
|
60
|
+
* if (tracker.canPlay(VocalizationType.COMBAT, gameTime)) {
|
|
61
|
+
* tracker.markPlayed(VocalizationType.COMBAT, gameTime);
|
|
62
|
+
* audioSystem.play(npcId, VocalizationType.COMBAT);
|
|
63
|
+
* }
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
export class VocalizationTracker {
|
|
67
|
+
constructor(config) {
|
|
68
|
+
this.lastPlayed = new Map();
|
|
69
|
+
this.config = config;
|
|
70
|
+
}
|
|
71
|
+
canPlay(type, currentTimeMs) {
|
|
72
|
+
const cooldown = this.config.cooldowns[type] ?? 0;
|
|
73
|
+
if (cooldown === 0)
|
|
74
|
+
return true;
|
|
75
|
+
const last = this.lastPlayed.get(type);
|
|
76
|
+
if (last === undefined)
|
|
77
|
+
return true;
|
|
78
|
+
return currentTimeMs - last >= cooldown;
|
|
79
|
+
}
|
|
80
|
+
markPlayed(type, currentTimeMs) {
|
|
81
|
+
this.lastPlayed.set(type, currentTimeMs);
|
|
82
|
+
}
|
|
83
|
+
reset() {
|
|
84
|
+
this.lastPlayed.clear();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=VocalizationTypes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VocalizationTypes.js","sourceRoot":"","sources":["../../src/sound/VocalizationTypes.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,gDAAgD;AAChD,qEAAqE;AAErE;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,aAAa,EAAE,eAAe;IAC9B,eAAe,EAAE,iBAAiB;IAClC,MAAM,EAAE,QAAQ;IAChB,aAAa,EAAE,eAAe;IAC9B,WAAW,EAAE,aAAa;IAC1B,cAAc,EAAE,gBAAgB;IAChC,aAAa,EAAE,eAAe;IAC9B,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,aAAa;IAC1B,MAAM,EAAE,QAAQ;IAChB,WAAW,EAAE,aAAa;CAClB,CAAC;AAYX,yCAAyC;AACzC,MAAM,UAAU,+BAA+B;IAC7C,OAAO;QACL,SAAS,EAAE;YACT,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,KAAM;YAC/B,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,IAAK;YAC/B,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,IAAK;YAChC,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,IAAK;YACjC,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAK;YAC9B,CAAC,gBAAgB,CAAC,aAAa,CAAC,EAAE,IAAK;YACvC,CAAC,gBAAgB,CAAC,eAAe,CAAC,EAAE,IAAK;YACzC,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,IAAK;YAChC,CAAC,gBAAgB,CAAC,aAAa,CAAC,EAAE,IAAK;YACvC,CAAC,gBAAgB,CAAC,WAAW,CAAC,EAAE,IAAK;YACrC,CAAC,gBAAgB,CAAC,cAAc,CAAC,EAAE,IAAK;YACxC,CAAC,gBAAgB,CAAC,aAAa,CAAC,EAAE,IAAK;YACvC,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAK;YAC9B,CAAC,gBAAgB,CAAC,WAAW,CAAC,EAAE,IAAK;YACrC,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,KAAM;YACjC,CAAC,gBAAgB,CAAC,WAAW,CAAC,EAAE,IAAK;SACtC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,mBAAmB;IAI9B,YAAY,MAA2B;QAHtB,eAAU,GAAG,IAAI,GAAG,EAA4B,CAAC;QAIhE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,OAAO,CAAC,IAAsB,EAAE,aAAqB;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,QAAQ,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAEhC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QAEpC,OAAO,aAAa,GAAG,IAAI,IAAI,QAAQ,CAAC;IAC1C,CAAC;IAED,UAAU,CAAC,IAAsB,EAAE,aAAqB;QACtD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK;QACH,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sound/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,+BAA+B,GAChC,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sound/index.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,+BAA+B,GAChC,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared enemy sighting propagated to all squad members.
|
|
3
|
+
*
|
|
4
|
+
* Produced by {@link SquadSharedTargetTable.shareTarget} and returned by
|
|
5
|
+
* {@link SquadSharedTargetTable.getSharedTarget}.
|
|
6
|
+
*/
|
|
7
|
+
export interface ISharedTargetInfo {
|
|
8
|
+
/** Stable entity ID of the spotted enemy. */
|
|
9
|
+
readonly targetId: string;
|
|
10
|
+
/** Enemy world X at the time of the sighting (px). */
|
|
11
|
+
readonly x: number;
|
|
12
|
+
/** Enemy world Y at the time of the sighting (px). */
|
|
13
|
+
readonly y: number;
|
|
14
|
+
/**
|
|
15
|
+
* Confidence of this indirect intel.
|
|
16
|
+
* Lower than a direct observation (1.0) — set by
|
|
17
|
+
* {@link ISquadSharedTargetConfig.sharedConfidence}.
|
|
18
|
+
*/
|
|
19
|
+
readonly confidence: number;
|
|
20
|
+
/** Epoch ms when the intel was recorded (for TTL checks). */
|
|
21
|
+
readonly sharedAtMs: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Tuning parameters for the squad shared target table.
|
|
25
|
+
* All fields have defaults via {@link createDefaultSquadSharedTargetConfig}.
|
|
26
|
+
*/
|
|
27
|
+
export interface ISquadSharedTargetConfig {
|
|
28
|
+
/**
|
|
29
|
+
* How long (ms) before shared intel expires and is treated as stale.
|
|
30
|
+
* @default 10_000
|
|
31
|
+
*/
|
|
32
|
+
readonly ttlMs: number;
|
|
33
|
+
/**
|
|
34
|
+
* Confidence value assigned to shared (indirect) sightings.
|
|
35
|
+
* Should be < 1.0 to reflect that the NPC has not seen the target directly.
|
|
36
|
+
* @default 0.8
|
|
37
|
+
*/
|
|
38
|
+
readonly sharedConfidence: number;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Create an {@link ISquadSharedTargetConfig} with production defaults.
|
|
42
|
+
* Pass a partial override object to tune individual values.
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* const cfg = createDefaultSquadSharedTargetConfig({ ttlMs: 5_000 });
|
|
46
|
+
*/
|
|
47
|
+
export declare function createDefaultSquadSharedTargetConfig(overrides?: Partial<ISquadSharedTargetConfig>): ISquadSharedTargetConfig;
|
|
48
|
+
/**
|
|
49
|
+
* Shared enemy intel store keyed by squad ID.
|
|
50
|
+
*
|
|
51
|
+
* One instance should be created per game session and shared across all NPCs.
|
|
52
|
+
* Each NPC's {@link ISquadAccess} implementation calls into this table via its
|
|
53
|
+
* own `npcId`.
|
|
54
|
+
*
|
|
55
|
+
* ### Wiring example (host layer)
|
|
56
|
+
* ```ts
|
|
57
|
+
* const sharedTargets = new SquadSharedTargetTable(
|
|
58
|
+
* npcId => squadManager.getSquadForNPC(npcId)?.id ?? null,
|
|
59
|
+
* );
|
|
60
|
+
*
|
|
61
|
+
* class MySquadAccess implements ISquadAccess {
|
|
62
|
+
* constructor(private readonly npcId: string) {}
|
|
63
|
+
* shareTarget(targetId, x, y) {
|
|
64
|
+
* sharedTargets.shareTarget(this.npcId, targetId, x, y);
|
|
65
|
+
* }
|
|
66
|
+
* getSharedTarget() {
|
|
67
|
+
* return sharedTargets.getSharedTarget(this.npcId);
|
|
68
|
+
* }
|
|
69
|
+
* // ...
|
|
70
|
+
* }
|
|
71
|
+
* ```
|
|
72
|
+
*
|
|
73
|
+
* ### Opt-in / opt-out
|
|
74
|
+
* - **Full feature**: implement `getSharedTarget()` on `ISquadAccess` above.
|
|
75
|
+
* - **Write only**: implement `shareTarget()` but not `getSharedTarget()`.
|
|
76
|
+
* - **Fully disabled**: don't implement either — PatrolState check is a no-op
|
|
77
|
+
* via `ctx.squad?.getSharedTarget?.()`.
|
|
78
|
+
*/
|
|
79
|
+
export declare class SquadSharedTargetTable {
|
|
80
|
+
private readonly npcToSquad;
|
|
81
|
+
private readonly config;
|
|
82
|
+
private readonly nowFn;
|
|
83
|
+
/** Inner store: squadId → latest ISharedTargetInfo. */
|
|
84
|
+
private readonly store;
|
|
85
|
+
/**
|
|
86
|
+
* @param npcToSquad - Returns the squad ID for an NPC, or null if not in a
|
|
87
|
+
* squad. Wrap your SquadManager:
|
|
88
|
+
* `npcId => mgr.getSquadForNPC(npcId)?.id ?? null`
|
|
89
|
+
* @param config - TTL and confidence overrides.
|
|
90
|
+
* @default createDefaultSquadSharedTargetConfig()
|
|
91
|
+
* @param nowFn - Time source.
|
|
92
|
+
* @default () => Date.now() (injectable for tests)
|
|
93
|
+
*/
|
|
94
|
+
constructor(npcToSquad: (npcId: string) => string | null, config?: Partial<ISquadSharedTargetConfig>, nowFn?: () => number);
|
|
95
|
+
/**
|
|
96
|
+
* Record a target sighting for the sender's squad.
|
|
97
|
+
*
|
|
98
|
+
* All squad members can retrieve this via {@link getSharedTarget} until
|
|
99
|
+
* the TTL expires or {@link invalidate} is called.
|
|
100
|
+
*
|
|
101
|
+
* No-op if the sender is not in any squad.
|
|
102
|
+
*
|
|
103
|
+
* @param senderNpcId - NPC ID of the entity that spotted the target.
|
|
104
|
+
* @param targetId - Stable entity ID of the enemy.
|
|
105
|
+
* @param x - Enemy world X (px).
|
|
106
|
+
* @param y - Enemy world Y (px).
|
|
107
|
+
*/
|
|
108
|
+
shareTarget(senderNpcId: string, targetId: string, x: number, y: number): void;
|
|
109
|
+
/**
|
|
110
|
+
* Return the current shared target for the given NPC's squad.
|
|
111
|
+
*
|
|
112
|
+
* Returns `null` when:
|
|
113
|
+
* - The NPC is not in any squad.
|
|
114
|
+
* - No target has been shared yet.
|
|
115
|
+
* - The intel has expired (age > ttlMs).
|
|
116
|
+
*
|
|
117
|
+
* @param npcId - NPC querying for squad intel.
|
|
118
|
+
*/
|
|
119
|
+
getSharedTarget(npcId: string): ISharedTargetInfo | null;
|
|
120
|
+
/**
|
|
121
|
+
* Explicitly clear shared intel for a squad.
|
|
122
|
+
*
|
|
123
|
+
* Call this when the target is confirmed destroyed or the engagement ends
|
|
124
|
+
* to avoid squad members chasing stale positions.
|
|
125
|
+
*
|
|
126
|
+
* @param squadId - Direct squad ID to invalidate.
|
|
127
|
+
*/
|
|
128
|
+
invalidate(squadId: string): void;
|
|
129
|
+
/**
|
|
130
|
+
* Clear all shared intel for all squads.
|
|
131
|
+
*
|
|
132
|
+
* Call on save/load or scene restart to avoid stale intel from a previous
|
|
133
|
+
* session persisting into the restored game state.
|
|
134
|
+
*/
|
|
135
|
+
clear(): void;
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=SquadSharedTarget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SquadSharedTarget.d.ts","sourceRoot":"","sources":["../../src/squad/SquadSharedTarget.ts"],"names":[],"mappings":"AAcA;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,6CAA6C;IAC7C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,sDAAsD;IACtD,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,6DAA6D;IAC7D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAED;;;;;;GAMG;AACH,wBAAgB,oCAAoC,CAClD,SAAS,CAAC,EAAE,OAAO,CAAC,wBAAwB,CAAC,GAC5C,wBAAwB,CAM1B;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAmC;IAC9D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAClD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IAErC,uDAAuD;IACvD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwC;IAE9D;;;;;;;;OAQG;gBAED,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,EAC5C,MAAM,CAAC,EAAE,OAAO,CAAC,wBAAwB,CAAC,EAC1C,KAAK,CAAC,EAAE,MAAM,MAAM;IAOtB;;;;;;;;;;;;OAYG;IACH,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAc9E;;;;;;;;;OASG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAexD;;;;;;;OAOG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIjC;;;;;OAKG;IACH,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
// squad/SquadSharedTarget.ts
|
|
2
|
+
// TTL-based squad enemy intel table.
|
|
3
|
+
//
|
|
4
|
+
// Design goals:
|
|
5
|
+
// • Zero SDK dependency — no Phaser, no alife-core imports needed.
|
|
6
|
+
// • npcToSquad callback injection — no circular dep to SquadManager.
|
|
7
|
+
// • nowFn injectable — deterministic test control.
|
|
8
|
+
// • Opt-in at the ISquadAccess level via optional getSharedTarget?().
|
|
9
|
+
// State handlers that don't call it incur zero overhead.
|
|
10
|
+
/**
|
|
11
|
+
* Create an {@link ISquadSharedTargetConfig} with production defaults.
|
|
12
|
+
* Pass a partial override object to tune individual values.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* const cfg = createDefaultSquadSharedTargetConfig({ ttlMs: 5_000 });
|
|
16
|
+
*/
|
|
17
|
+
export function createDefaultSquadSharedTargetConfig(overrides) {
|
|
18
|
+
return {
|
|
19
|
+
ttlMs: 10000,
|
|
20
|
+
sharedConfidence: 0.8,
|
|
21
|
+
...overrides,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
// SquadSharedTargetTable
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
/**
|
|
28
|
+
* Shared enemy intel store keyed by squad ID.
|
|
29
|
+
*
|
|
30
|
+
* One instance should be created per game session and shared across all NPCs.
|
|
31
|
+
* Each NPC's {@link ISquadAccess} implementation calls into this table via its
|
|
32
|
+
* own `npcId`.
|
|
33
|
+
*
|
|
34
|
+
* ### Wiring example (host layer)
|
|
35
|
+
* ```ts
|
|
36
|
+
* const sharedTargets = new SquadSharedTargetTable(
|
|
37
|
+
* npcId => squadManager.getSquadForNPC(npcId)?.id ?? null,
|
|
38
|
+
* );
|
|
39
|
+
*
|
|
40
|
+
* class MySquadAccess implements ISquadAccess {
|
|
41
|
+
* constructor(private readonly npcId: string) {}
|
|
42
|
+
* shareTarget(targetId, x, y) {
|
|
43
|
+
* sharedTargets.shareTarget(this.npcId, targetId, x, y);
|
|
44
|
+
* }
|
|
45
|
+
* getSharedTarget() {
|
|
46
|
+
* return sharedTargets.getSharedTarget(this.npcId);
|
|
47
|
+
* }
|
|
48
|
+
* // ...
|
|
49
|
+
* }
|
|
50
|
+
* ```
|
|
51
|
+
*
|
|
52
|
+
* ### Opt-in / opt-out
|
|
53
|
+
* - **Full feature**: implement `getSharedTarget()` on `ISquadAccess` above.
|
|
54
|
+
* - **Write only**: implement `shareTarget()` but not `getSharedTarget()`.
|
|
55
|
+
* - **Fully disabled**: don't implement either — PatrolState check is a no-op
|
|
56
|
+
* via `ctx.squad?.getSharedTarget?.()`.
|
|
57
|
+
*/
|
|
58
|
+
export class SquadSharedTargetTable {
|
|
59
|
+
/**
|
|
60
|
+
* @param npcToSquad - Returns the squad ID for an NPC, or null if not in a
|
|
61
|
+
* squad. Wrap your SquadManager:
|
|
62
|
+
* `npcId => mgr.getSquadForNPC(npcId)?.id ?? null`
|
|
63
|
+
* @param config - TTL and confidence overrides.
|
|
64
|
+
* @default createDefaultSquadSharedTargetConfig()
|
|
65
|
+
* @param nowFn - Time source.
|
|
66
|
+
* @default () => Date.now() (injectable for tests)
|
|
67
|
+
*/
|
|
68
|
+
constructor(npcToSquad, config, nowFn) {
|
|
69
|
+
/** Inner store: squadId → latest ISharedTargetInfo. */
|
|
70
|
+
this.store = new Map();
|
|
71
|
+
this.npcToSquad = npcToSquad;
|
|
72
|
+
this.config = createDefaultSquadSharedTargetConfig(config);
|
|
73
|
+
this.nowFn = nowFn ?? (() => Date.now());
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Record a target sighting for the sender's squad.
|
|
77
|
+
*
|
|
78
|
+
* All squad members can retrieve this via {@link getSharedTarget} until
|
|
79
|
+
* the TTL expires or {@link invalidate} is called.
|
|
80
|
+
*
|
|
81
|
+
* No-op if the sender is not in any squad.
|
|
82
|
+
*
|
|
83
|
+
* @param senderNpcId - NPC ID of the entity that spotted the target.
|
|
84
|
+
* @param targetId - Stable entity ID of the enemy.
|
|
85
|
+
* @param x - Enemy world X (px).
|
|
86
|
+
* @param y - Enemy world Y (px).
|
|
87
|
+
*/
|
|
88
|
+
shareTarget(senderNpcId, targetId, x, y) {
|
|
89
|
+
const squadId = this.npcToSquad(senderNpcId);
|
|
90
|
+
if (squadId === null)
|
|
91
|
+
return;
|
|
92
|
+
const info = {
|
|
93
|
+
targetId,
|
|
94
|
+
x,
|
|
95
|
+
y,
|
|
96
|
+
confidence: this.config.sharedConfidence,
|
|
97
|
+
sharedAtMs: this.nowFn(),
|
|
98
|
+
};
|
|
99
|
+
this.store.set(squadId, info);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Return the current shared target for the given NPC's squad.
|
|
103
|
+
*
|
|
104
|
+
* Returns `null` when:
|
|
105
|
+
* - The NPC is not in any squad.
|
|
106
|
+
* - No target has been shared yet.
|
|
107
|
+
* - The intel has expired (age > ttlMs).
|
|
108
|
+
*
|
|
109
|
+
* @param npcId - NPC querying for squad intel.
|
|
110
|
+
*/
|
|
111
|
+
getSharedTarget(npcId) {
|
|
112
|
+
const squadId = this.npcToSquad(npcId);
|
|
113
|
+
if (squadId === null)
|
|
114
|
+
return null;
|
|
115
|
+
const info = this.store.get(squadId);
|
|
116
|
+
if (info === undefined)
|
|
117
|
+
return null;
|
|
118
|
+
if (this.nowFn() - info.sharedAtMs > this.config.ttlMs) {
|
|
119
|
+
this.store.delete(squadId);
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
return info;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Explicitly clear shared intel for a squad.
|
|
126
|
+
*
|
|
127
|
+
* Call this when the target is confirmed destroyed or the engagement ends
|
|
128
|
+
* to avoid squad members chasing stale positions.
|
|
129
|
+
*
|
|
130
|
+
* @param squadId - Direct squad ID to invalidate.
|
|
131
|
+
*/
|
|
132
|
+
invalidate(squadId) {
|
|
133
|
+
this.store.delete(squadId);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Clear all shared intel for all squads.
|
|
137
|
+
*
|
|
138
|
+
* Call on save/load or scene restart to avoid stale intel from a previous
|
|
139
|
+
* session persisting into the restored game state.
|
|
140
|
+
*/
|
|
141
|
+
clear() {
|
|
142
|
+
this.store.clear();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=SquadSharedTarget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SquadSharedTarget.js","sourceRoot":"","sources":["../../src/squad/SquadSharedTarget.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,qCAAqC;AACrC,EAAE;AACF,gBAAgB;AAChB,qEAAqE;AACrE,uEAAuE;AACvE,qDAAqD;AACrD,wEAAwE;AACxE,6DAA6D;AAgD7D;;;;;;GAMG;AACH,MAAM,UAAU,oCAAoC,CAClD,SAA6C;IAE7C,OAAO;QACL,KAAK,EAAE,KAAM;QACb,gBAAgB,EAAE,GAAG;QACrB,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,OAAO,sBAAsB;IAQjC;;;;;;;;OAQG;IACH,YACE,UAA4C,EAC5C,MAA0C,EAC1C,KAAoB;QAftB,uDAAuD;QACtC,UAAK,GAAG,IAAI,GAAG,EAA6B,CAAC;QAgB5D,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,oCAAoC,CAAC,MAAM,CAAC,CAAC;QAC3D,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,WAAW,CAAC,WAAmB,EAAE,QAAgB,EAAE,CAAS,EAAE,CAAS;QACrE,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAC7C,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO;QAE7B,MAAM,IAAI,GAAsB;YAC9B,QAAQ;YACR,CAAC;YACD,CAAC;YACD,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB;YACxC,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE;SACzB,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IAED;;;;;;;;;OASG;IACH,eAAe,CAAC,KAAa;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAElC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QAEpC,IAAI,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACvD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;OAOG;IACH,UAAU,CAAC,OAAe;QACxB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED;;;;;OAKG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { ISquadTacticsConfig } from '../types/IOnlineAIConfig';
|
|
2
|
+
/**
|
|
3
|
+
* Squad command identifiers.
|
|
4
|
+
*/
|
|
5
|
+
export declare const SquadCommand: {
|
|
6
|
+
readonly ATTACK: "attack";
|
|
7
|
+
readonly COVER_ME: "cover_me";
|
|
8
|
+
readonly FOLLOW: "follow";
|
|
9
|
+
readonly HOLD: "hold";
|
|
10
|
+
readonly RETREAT: "retreat";
|
|
11
|
+
readonly SPREAD_OUT: "spread_out";
|
|
12
|
+
};
|
|
13
|
+
export type SquadCommand = (typeof SquadCommand)[keyof typeof SquadCommand];
|
|
14
|
+
/**
|
|
15
|
+
* Tactical situation snapshot for command evaluation.
|
|
16
|
+
* Aggregates squad state without entity references.
|
|
17
|
+
*/
|
|
18
|
+
export interface ISquadSituation {
|
|
19
|
+
/** Number of squad members (including leader). */
|
|
20
|
+
readonly squadSize: number;
|
|
21
|
+
/** Number of known enemies in the engagement. */
|
|
22
|
+
readonly enemyCount: number;
|
|
23
|
+
/** Average morale across all squad members [-1, 1]. */
|
|
24
|
+
readonly avgMorale: number;
|
|
25
|
+
/** Whether the leader is currently in cover. */
|
|
26
|
+
readonly leaderInCover: boolean;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* A single tactical command with its evaluation logic.
|
|
30
|
+
* Each command scores a situation and returns a priority value.
|
|
31
|
+
*/
|
|
32
|
+
export interface ISquadCommandEvaluator {
|
|
33
|
+
readonly command: SquadCommand;
|
|
34
|
+
evaluate(situation: ISquadSituation, config: ISquadTacticsConfig): number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Evaluate the best squad command for the current situation.
|
|
38
|
+
*
|
|
39
|
+
* Uses a priority-ordered decision tree (first match wins):
|
|
40
|
+
*
|
|
41
|
+
* 1. Morale collapse → RETREAT
|
|
42
|
+
* 2. No enemies → FOLLOW
|
|
43
|
+
* 3. Badly outnumbered → RETREAT
|
|
44
|
+
* 4. Even fight → HOLD
|
|
45
|
+
* 5. Numerical advantage → ATTACK
|
|
46
|
+
* 6. Leader in cover → COVER_ME
|
|
47
|
+
* 7. Default → SPREAD_OUT
|
|
48
|
+
*
|
|
49
|
+
* @param situation - Current tactical snapshot.
|
|
50
|
+
* @param config - Squad tuning configuration.
|
|
51
|
+
* @returns The recommended squad command.
|
|
52
|
+
*/
|
|
53
|
+
export declare function evaluateSituation(situation: ISquadSituation, config: ISquadTacticsConfig): SquadCommand;
|
|
54
|
+
/**
|
|
55
|
+
* States that must never be interrupted by squad commands.
|
|
56
|
+
* The host should check this before applying any command.
|
|
57
|
+
*/
|
|
58
|
+
export declare const PROTECTED_STATES: Set<string>;
|
|
59
|
+
/**
|
|
60
|
+
* Check if a command can be applied to an NPC in the given state.
|
|
61
|
+
*/
|
|
62
|
+
export declare function canApplyCommand(currentState: string): boolean;
|
|
63
|
+
//# sourceMappingURL=SquadTactics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SquadTactics.d.ts","sourceRoot":"","sources":["../../src/squad/SquadTactics.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE;;GAEG;AACH,eAAO,MAAM,YAAY;;;;;;;CAOf,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAE5E;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,kDAAkD;IAClD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,iDAAiD;IACjD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,uDAAuD;IACvD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,gDAAgD;IAChD,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;CACjC;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAAC;CAC3E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,eAAe,EAC1B,MAAM,EAAE,mBAAmB,GAC1B,YAAY,CAmCd;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,aAI3B,CAAC;AAEH;;GAEG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAE7D"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// squad/SquadTactics.ts
|
|
2
|
+
// Command pattern for squad-level tactical decisions.
|
|
3
|
+
// Pure evaluation — no entity references, no framework coupling.
|
|
4
|
+
/**
|
|
5
|
+
* Squad command identifiers.
|
|
6
|
+
*/
|
|
7
|
+
export const SquadCommand = {
|
|
8
|
+
ATTACK: 'attack',
|
|
9
|
+
COVER_ME: 'cover_me',
|
|
10
|
+
FOLLOW: 'follow',
|
|
11
|
+
HOLD: 'hold',
|
|
12
|
+
RETREAT: 'retreat',
|
|
13
|
+
SPREAD_OUT: 'spread_out',
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Evaluate the best squad command for the current situation.
|
|
17
|
+
*
|
|
18
|
+
* Uses a priority-ordered decision tree (first match wins):
|
|
19
|
+
*
|
|
20
|
+
* 1. Morale collapse → RETREAT
|
|
21
|
+
* 2. No enemies → FOLLOW
|
|
22
|
+
* 3. Badly outnumbered → RETREAT
|
|
23
|
+
* 4. Even fight → HOLD
|
|
24
|
+
* 5. Numerical advantage → ATTACK
|
|
25
|
+
* 6. Leader in cover → COVER_ME
|
|
26
|
+
* 7. Default → SPREAD_OUT
|
|
27
|
+
*
|
|
28
|
+
* @param situation - Current tactical snapshot.
|
|
29
|
+
* @param config - Squad tuning configuration.
|
|
30
|
+
* @returns The recommended squad command.
|
|
31
|
+
*/
|
|
32
|
+
export function evaluateSituation(situation, config) {
|
|
33
|
+
const { squadSize, enemyCount, avgMorale, leaderInCover } = situation;
|
|
34
|
+
// Priority 1: Morale collapse.
|
|
35
|
+
if (avgMorale <= config.moralePanickedThreshold) {
|
|
36
|
+
return SquadCommand.RETREAT;
|
|
37
|
+
}
|
|
38
|
+
// Priority 2: No threats.
|
|
39
|
+
if (enemyCount === 0) {
|
|
40
|
+
return SquadCommand.FOLLOW;
|
|
41
|
+
}
|
|
42
|
+
// Priority 3: Badly outnumbered.
|
|
43
|
+
if (enemyCount > squadSize * config.outnumberRatio) {
|
|
44
|
+
return SquadCommand.RETREAT;
|
|
45
|
+
}
|
|
46
|
+
// Priority 4: Even fight.
|
|
47
|
+
if (enemyCount >= squadSize) {
|
|
48
|
+
return SquadCommand.HOLD;
|
|
49
|
+
}
|
|
50
|
+
// Priority 5: Numerical advantage.
|
|
51
|
+
if (squadSize > enemyCount * config.outnumberRatio) {
|
|
52
|
+
return SquadCommand.ATTACK;
|
|
53
|
+
}
|
|
54
|
+
// Priority 6: Leader in cover — provide suppressive fire.
|
|
55
|
+
if (leaderInCover) {
|
|
56
|
+
return SquadCommand.COVER_ME;
|
|
57
|
+
}
|
|
58
|
+
// Default: distribute tactically.
|
|
59
|
+
return SquadCommand.SPREAD_OUT;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* States that must never be interrupted by squad commands.
|
|
63
|
+
* The host should check this before applying any command.
|
|
64
|
+
*/
|
|
65
|
+
export const PROTECTED_STATES = new Set([
|
|
66
|
+
'DEAD',
|
|
67
|
+
'WOUNDED',
|
|
68
|
+
'EVADE_GRENADE',
|
|
69
|
+
]);
|
|
70
|
+
/**
|
|
71
|
+
* Check if a command can be applied to an NPC in the given state.
|
|
72
|
+
*/
|
|
73
|
+
export function canApplyCommand(currentState) {
|
|
74
|
+
return !PROTECTED_STATES.has(currentState);
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=SquadTactics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SquadTactics.js","sourceRoot":"","sources":["../../src/squad/SquadTactics.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,sDAAsD;AACtD,iEAAiE;AAIjE;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,YAAY;CAChB,CAAC;AA4BX;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,iBAAiB,CAC/B,SAA0B,EAC1B,MAA2B;IAE3B,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,SAAS,CAAC;IAEtE,+BAA+B;IAC/B,IAAI,SAAS,IAAI,MAAM,CAAC,uBAAuB,EAAE,CAAC;QAChD,OAAO,YAAY,CAAC,OAAO,CAAC;IAC9B,CAAC;IAED,0BAA0B;IAC1B,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,YAAY,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,iCAAiC;IACjC,IAAI,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;QACnD,OAAO,YAAY,CAAC,OAAO,CAAC;IAC9B,CAAC;IAED,0BAA0B;IAC1B,IAAI,UAAU,IAAI,SAAS,EAAE,CAAC;QAC5B,OAAO,YAAY,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,mCAAmC;IACnC,IAAI,SAAS,GAAG,UAAU,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;QACnD,OAAO,YAAY,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,0DAA0D;IAC1D,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,YAAY,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAED,kCAAkC;IAClC,OAAO,YAAY,CAAC,UAAU,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IACtC,MAAM;IACN,SAAS;IACT,eAAe;CAChB,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,YAAoB;IAClD,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { evaluateSituation, SquadCommand, canApplyCommand, PROTECTED_STATES, } from './SquadTactics';
|
|
2
|
+
export type { ISquadSituation, ISquadCommandEvaluator } from './SquadTactics';
|
|
3
|
+
export { SquadSharedTargetTable, createDefaultSquadSharedTargetConfig } from './SquadSharedTarget';
|
|
4
|
+
export type { ISharedTargetInfo, ISquadSharedTargetConfig } from './SquadSharedTarget';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/squad/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAE9E,OAAO,EAAE,sBAAsB,EAAE,oCAAoC,EAAE,MAAM,qBAAqB,CAAC;AACnG,YAAY,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/squad/index.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,sBAAsB,EAAE,oCAAoC,EAAE,MAAM,qBAAqB,CAAC"}
|