@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,199 @@
|
|
|
1
|
+
// perception/PerceptionQuery.ts
|
|
2
|
+
// Pure math functions for spatial perception queries.
|
|
3
|
+
// No side effects, no state — all functions are deterministic.
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// Reusable scratch arrays — one per filter function.
|
|
6
|
+
// Single-threaded, safe to reuse between calls.
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
const _visibleScratch = [];
|
|
9
|
+
const _hearingScratch = [];
|
|
10
|
+
const _hostileScratch = [];
|
|
11
|
+
const _friendlyScratch = [];
|
|
12
|
+
/**
|
|
13
|
+
* Check if a target is within a vision cone.
|
|
14
|
+
*
|
|
15
|
+
* Uses squared-distance for the range check (no sqrt).
|
|
16
|
+
* The vision cone is defined by a half-angle from the facing direction.
|
|
17
|
+
*
|
|
18
|
+
* @returns true if target is within range AND within the cone angle
|
|
19
|
+
*/
|
|
20
|
+
export function isInFOV(origin, facingAngle, target, visionRange, visionHalfAngle) {
|
|
21
|
+
const dx = target.x - origin.x;
|
|
22
|
+
const dy = target.y - origin.y;
|
|
23
|
+
const dSq = dx * dx + dy * dy;
|
|
24
|
+
if (dSq > visionRange * visionRange)
|
|
25
|
+
return false;
|
|
26
|
+
if (dSq === 0)
|
|
27
|
+
return true;
|
|
28
|
+
// Dot-product cone test — avoids Math.atan2 + normalizeAngle
|
|
29
|
+
const facingDx = Math.cos(facingAngle);
|
|
30
|
+
const facingDy = Math.sin(facingAngle);
|
|
31
|
+
const dot = dx * facingDx + dy * facingDy;
|
|
32
|
+
if (dot <= 0)
|
|
33
|
+
return false;
|
|
34
|
+
const cosHalfSq = Math.cos(visionHalfAngle) ** 2;
|
|
35
|
+
return dot * dot >= cosHalfSq * dSq;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Filter entities that are visible to the observer.
|
|
39
|
+
*
|
|
40
|
+
* Combines FOV cone test with alive check.
|
|
41
|
+
* O(n) where n = candidate count.
|
|
42
|
+
* Precomputes trig values once per call (same pattern as scanForEnemies).
|
|
43
|
+
* Returns a reusable scratch array — do not hold a reference across calls.
|
|
44
|
+
*/
|
|
45
|
+
export function filterVisibleEntities(origin, facingAngle, candidates, config) {
|
|
46
|
+
_visibleScratch.length = 0;
|
|
47
|
+
const rangeSq = config.visionRange * config.visionRange;
|
|
48
|
+
// Precompute trig once per observer — avoids per-entity cos/sin in isInFOV
|
|
49
|
+
const facingDx = Math.cos(facingAngle);
|
|
50
|
+
const facingDy = Math.sin(facingAngle);
|
|
51
|
+
const cosHalfSq = Math.cos(config.visionHalfAngle) ** 2;
|
|
52
|
+
for (const entity of candidates) {
|
|
53
|
+
if (!entity.isAlive)
|
|
54
|
+
continue;
|
|
55
|
+
const dx = entity.position.x - origin.x;
|
|
56
|
+
const dy = entity.position.y - origin.y;
|
|
57
|
+
const dSq = dx * dx + dy * dy;
|
|
58
|
+
if (dSq > rangeSq)
|
|
59
|
+
continue;
|
|
60
|
+
if (dSq === 0) {
|
|
61
|
+
_visibleScratch.push(entity);
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
// Dot-product cone test
|
|
65
|
+
const dot = dx * facingDx + dy * facingDy;
|
|
66
|
+
if (dot > 0 && dot * dot >= cosHalfSq * dSq) {
|
|
67
|
+
_visibleScratch.push(entity);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return _visibleScratch;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Filter entities that can hear a sound from a source.
|
|
74
|
+
*
|
|
75
|
+
* Sound is omnidirectional — no cone test, just distance.
|
|
76
|
+
* Uses squared-distance for performance.
|
|
77
|
+
* Returns a reusable scratch array — do not hold a reference across calls.
|
|
78
|
+
*
|
|
79
|
+
* @param source - Sound origin point
|
|
80
|
+
* @param soundRange - Maximum propagation range (px)
|
|
81
|
+
* @param entities - All candidate listeners
|
|
82
|
+
* @param hearingRange - Per-listener hearing range (overrides soundRange if smaller)
|
|
83
|
+
*/
|
|
84
|
+
export function filterHearingEntities(source, soundRange, entities, hearingRange) {
|
|
85
|
+
_hearingScratch.length = 0;
|
|
86
|
+
const effectiveRange = hearingRange !== undefined
|
|
87
|
+
? Math.min(soundRange, hearingRange)
|
|
88
|
+
: soundRange;
|
|
89
|
+
const rangeSq = effectiveRange * effectiveRange;
|
|
90
|
+
for (const entity of entities) {
|
|
91
|
+
if (!entity.isAlive)
|
|
92
|
+
continue;
|
|
93
|
+
const dx = entity.position.x - source.x;
|
|
94
|
+
const dy = entity.position.y - source.y;
|
|
95
|
+
if (dx * dx + dy * dy <= rangeSq) {
|
|
96
|
+
_hearingScratch.push(entity);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return _hearingScratch;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Filter entities by faction hostility.
|
|
103
|
+
* Returns a reusable scratch array — do not hold a reference across calls.
|
|
104
|
+
*
|
|
105
|
+
* @param entities - Entity candidates
|
|
106
|
+
* @param observerFactionId - The observer's faction
|
|
107
|
+
* @param isHostile - Callback checking if two factions are hostile
|
|
108
|
+
*/
|
|
109
|
+
export function filterHostileEntities(entities, observerFactionId, isHostile) {
|
|
110
|
+
_hostileScratch.length = 0;
|
|
111
|
+
for (const entity of entities) {
|
|
112
|
+
if (entity.factionId === observerFactionId)
|
|
113
|
+
continue;
|
|
114
|
+
if (isHostile(observerFactionId, entity.factionId)) {
|
|
115
|
+
_hostileScratch.push(entity);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return _hostileScratch;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Filter entities that are friendlies (same faction OR non-hostile).
|
|
122
|
+
* Returns a reusable scratch array — do not hold a reference across calls.
|
|
123
|
+
*/
|
|
124
|
+
export function filterFriendlyEntities(entities, observerFactionId, isHostile) {
|
|
125
|
+
_friendlyScratch.length = 0;
|
|
126
|
+
for (const entity of entities) {
|
|
127
|
+
if (entity.factionId === observerFactionId) {
|
|
128
|
+
_friendlyScratch.push(entity);
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (!isHostile(observerFactionId, entity.factionId)) {
|
|
132
|
+
_friendlyScratch.push(entity);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return _friendlyScratch;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Calculate squared distance between two points.
|
|
139
|
+
* Avoid sqrt when only comparing relative distances.
|
|
140
|
+
*/
|
|
141
|
+
export function distanceSq(a, b) {
|
|
142
|
+
const dx = a.x - b.x;
|
|
143
|
+
const dy = a.y - b.y;
|
|
144
|
+
return dx * dx + dy * dy;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Find the closest entity to a position.
|
|
148
|
+
* Returns null if array is empty.
|
|
149
|
+
*/
|
|
150
|
+
export function findClosest(origin, entities) {
|
|
151
|
+
let best = null;
|
|
152
|
+
let bestDist = Infinity;
|
|
153
|
+
for (const entity of entities) {
|
|
154
|
+
const dist = distanceSq(origin, entity.position);
|
|
155
|
+
if (dist < bestDist) {
|
|
156
|
+
bestDist = dist;
|
|
157
|
+
best = entity;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return best;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Full perception scan: find visible hostile entities.
|
|
164
|
+
*
|
|
165
|
+
* Combines FOV filtering + faction filtering in a single pass.
|
|
166
|
+
* This is the primary query used by GOAP world state building.
|
|
167
|
+
*/
|
|
168
|
+
export function scanForEnemies(origin, facingAngle, candidates, observerFactionId, isHostile, config) {
|
|
169
|
+
const result = [];
|
|
170
|
+
const rangeSq = config.visionRange * config.visionRange;
|
|
171
|
+
// Precompute once per observer — avoid per-entity atan2
|
|
172
|
+
const facingDx = Math.cos(facingAngle);
|
|
173
|
+
const facingDy = Math.sin(facingAngle);
|
|
174
|
+
const cosHalfSq = Math.cos(config.visionHalfAngle) ** 2;
|
|
175
|
+
for (const entity of candidates) {
|
|
176
|
+
if (!entity.isAlive)
|
|
177
|
+
continue;
|
|
178
|
+
if (entity.factionId === observerFactionId)
|
|
179
|
+
continue;
|
|
180
|
+
if (!isHostile(observerFactionId, entity.factionId))
|
|
181
|
+
continue;
|
|
182
|
+
const dx = entity.position.x - origin.x;
|
|
183
|
+
const dy = entity.position.y - origin.y;
|
|
184
|
+
const dSq = dx * dx + dy * dy;
|
|
185
|
+
if (dSq > rangeSq)
|
|
186
|
+
continue;
|
|
187
|
+
if (dSq === 0) {
|
|
188
|
+
result.push(entity);
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
// Dot-product cone test
|
|
192
|
+
const dot = dx * facingDx + dy * facingDy;
|
|
193
|
+
if (dot > 0 && dot * dot >= cosHalfSq * dSq) {
|
|
194
|
+
result.push(entity);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return result;
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=PerceptionQuery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PerceptionQuery.js","sourceRoot":"","sources":["../../src/perception/PerceptionQuery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { isInFOV, filterVisibleEntities, filterHearingEntities, filterHostileEntities, filterFriendlyEntities, distanceSq, findClosest, scanForEnemies, } from './PerceptionQuery';
|
|
2
|
+
export { NPCSensors, filterFreshIntel } from './NPCSensors';
|
|
3
|
+
export type { IPerceptibleEntity, IDetectionEvent, INPCSensorsConfig, } from './NPCSensors';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/perception/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,OAAO,EACP,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,UAAU,EACV,WAAW,EACX,cAAc,GACf,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC5D,YAAY,EACV,kBAAkB,EAClB,eAAe,EACf,iBAAiB,GAClB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// perception sub-path barrel
|
|
2
|
+
export { isInFOV, filterVisibleEntities, filterHearingEntities, filterHostileEntities, filterFriendlyEntities, distanceSq, findClosest, scanForEnemies, } from './PerceptionQuery';
|
|
3
|
+
export { NPCSensors, filterFreshIntel } from './NPCSensors';
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/perception/index.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,OAAO,EACL,OAAO,EACP,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,UAAU,EACV,WAAW,EACX,cAAc,GACf,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { IALifePlugin, ALifeKernel, IRandom } from '@alife-sdk/core';
|
|
2
|
+
import type { IOnlineAIConfig } from '../types/IOnlineAIConfig';
|
|
3
|
+
import type { ICoverAccess } from '../states/INPCContext';
|
|
4
|
+
import { CoverRegistry } from '../cover/CoverRegistry';
|
|
5
|
+
import { CoverLockRegistry } from '../cover/CoverLockRegistry';
|
|
6
|
+
import type { ICoverLockConfig } from '../cover/ICoverLockConfig';
|
|
7
|
+
import { RestrictedZoneManager } from '../navigation/RestrictedZoneManager';
|
|
8
|
+
/**
|
|
9
|
+
* Configuration for the AI plugin.
|
|
10
|
+
*/
|
|
11
|
+
export interface IAIPluginConfig {
|
|
12
|
+
readonly ai: IOnlineAIConfig;
|
|
13
|
+
/** Optional cover lock config overrides. Set to false to disable locking entirely. */
|
|
14
|
+
readonly coverLock?: Partial<ICoverLockConfig> | false;
|
|
15
|
+
}
|
|
16
|
+
export declare function createDefaultAIPluginConfig(): IAIPluginConfig;
|
|
17
|
+
/**
|
|
18
|
+
* A-Life AI Plugin — tactical AI subsystem.
|
|
19
|
+
*
|
|
20
|
+
* Provides:
|
|
21
|
+
* - CoverRegistry for tactical cover management
|
|
22
|
+
* - RestrictedZoneManager for movement constraints
|
|
23
|
+
* - All pure-function utilities (weapon selection, transitions, animation)
|
|
24
|
+
*
|
|
25
|
+
* Optional port: ICoverPointSource for auto-populating cover points.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```ts
|
|
29
|
+
* const aiPlugin = new AIPlugin(random, config);
|
|
30
|
+
* kernel.use(aiPlugin);
|
|
31
|
+
*
|
|
32
|
+
* // After init:
|
|
33
|
+
* const cover = aiPlugin.coverRegistry;
|
|
34
|
+
* const zones = aiPlugin.restrictedZones;
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare class AIPlugin implements IALifePlugin {
|
|
38
|
+
readonly name = "ai";
|
|
39
|
+
readonly dependencies: readonly [];
|
|
40
|
+
readonly coverRegistry: CoverRegistry;
|
|
41
|
+
readonly coverLockRegistry: CoverLockRegistry | null;
|
|
42
|
+
readonly restrictedZones: RestrictedZoneManager;
|
|
43
|
+
private kernel;
|
|
44
|
+
private readonly config;
|
|
45
|
+
/**
|
|
46
|
+
* @param random - Deterministic random source.
|
|
47
|
+
* @param config - Plugin configuration overrides.
|
|
48
|
+
* @param timeFn - Time source for cover lock TTL (ms). Required when
|
|
49
|
+
* cover locking is enabled (default). Pass `() => Date.now()`
|
|
50
|
+
* for real-time locking or integrate with your game clock.
|
|
51
|
+
*/
|
|
52
|
+
constructor(random: IRandom, config?: Partial<IAIPluginConfig>, timeFn?: () => number);
|
|
53
|
+
install(kernel: ALifeKernel): void;
|
|
54
|
+
init(): void;
|
|
55
|
+
destroy(): void;
|
|
56
|
+
serialize(): Record<string, unknown>;
|
|
57
|
+
restore(state: Record<string, unknown>): void;
|
|
58
|
+
/**
|
|
59
|
+
* Create a per-NPC `ICoverAccess` adapter backed by this plugin's registries.
|
|
60
|
+
*
|
|
61
|
+
* The returned adapter is stateful — it tracks the last cover point found so
|
|
62
|
+
* that `lockLastFound()` can acquire a TTL lock without the caller managing
|
|
63
|
+
* point IDs. Create one adapter per NPC entity; do not share across entities.
|
|
64
|
+
*
|
|
65
|
+
* @param npcId - Stable NPC identifier (used for occupancy filtering and locking).
|
|
66
|
+
*/
|
|
67
|
+
createCoverAccess(npcId: string): ICoverAccess;
|
|
68
|
+
/** Get the AI configuration. */
|
|
69
|
+
getConfig(): IOnlineAIConfig;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=AIPlugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AIPlugin.d.ts","sourceRoot":"","sources":["../../src/plugin/AIPlugin.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAE/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAwB,MAAM,qCAAqC,CAAC;AAGlG;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,eAAe,CAAC;IAC7B,sFAAsF;IACtF,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,KAAK,CAAC;CACxD;AAED,wBAAgB,2BAA2B,IAAI,eAAe,CAE7D;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,QAAS,YAAW,YAAY;IAC3C,QAAQ,CAAC,IAAI,QAAQ;IACrB,QAAQ,CAAC,YAAY,cAAe;IAEpC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACrD,QAAQ,CAAC,eAAe,EAAE,qBAAqB,CAAC;IAEhD,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IAEzC;;;;;;OAMG;gBACS,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,MAAM;IA2BrF,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAIlC,IAAI,IAAI,IAAI;IAcZ,OAAO,IAAI,IAAI;IAOf,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAmBpC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAoB7C;;;;;;;;OAQG;IACH,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY;IAI9C,gCAAgC;IAChC,SAAS,IAAI,eAAe;CAG7B"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
// plugin/AIPlugin.ts
|
|
2
|
+
// A-Life AI plugin — registers the tactical AI subsystem with the kernel.
|
|
3
|
+
import { createDefaultAIConfig } from '../config/createDefaultAIConfig';
|
|
4
|
+
import { CoverRegistry } from '../cover/CoverRegistry';
|
|
5
|
+
import { CoverLockRegistry } from '../cover/CoverLockRegistry';
|
|
6
|
+
import { CoverAccessAdapter } from '../cover/CoverAccessAdapter';
|
|
7
|
+
import { RestrictedZoneManager } from '../navigation/RestrictedZoneManager';
|
|
8
|
+
import { AIPorts } from '../ports/AIPorts';
|
|
9
|
+
export function createDefaultAIPluginConfig() {
|
|
10
|
+
return { ai: createDefaultAIConfig() };
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* A-Life AI Plugin — tactical AI subsystem.
|
|
14
|
+
*
|
|
15
|
+
* Provides:
|
|
16
|
+
* - CoverRegistry for tactical cover management
|
|
17
|
+
* - RestrictedZoneManager for movement constraints
|
|
18
|
+
* - All pure-function utilities (weapon selection, transitions, animation)
|
|
19
|
+
*
|
|
20
|
+
* Optional port: ICoverPointSource for auto-populating cover points.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```ts
|
|
24
|
+
* const aiPlugin = new AIPlugin(random, config);
|
|
25
|
+
* kernel.use(aiPlugin);
|
|
26
|
+
*
|
|
27
|
+
* // After init:
|
|
28
|
+
* const cover = aiPlugin.coverRegistry;
|
|
29
|
+
* const zones = aiPlugin.restrictedZones;
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export class AIPlugin {
|
|
33
|
+
/**
|
|
34
|
+
* @param random - Deterministic random source.
|
|
35
|
+
* @param config - Plugin configuration overrides.
|
|
36
|
+
* @param timeFn - Time source for cover lock TTL (ms). Required when
|
|
37
|
+
* cover locking is enabled (default). Pass `() => Date.now()`
|
|
38
|
+
* for real-time locking or integrate with your game clock.
|
|
39
|
+
*/
|
|
40
|
+
constructor(random, config, timeFn) {
|
|
41
|
+
this.name = 'ai';
|
|
42
|
+
this.dependencies = [];
|
|
43
|
+
this.kernel = null;
|
|
44
|
+
const merged = {
|
|
45
|
+
ai: createDefaultAIConfig(config?.ai),
|
|
46
|
+
coverLock: config?.coverLock,
|
|
47
|
+
};
|
|
48
|
+
this.config = merged;
|
|
49
|
+
// Create lock registry unless explicitly disabled.
|
|
50
|
+
const lockCfg = merged.coverLock;
|
|
51
|
+
if (lockCfg !== false) {
|
|
52
|
+
const fn = timeFn ?? (() => Date.now());
|
|
53
|
+
this.coverLockRegistry = new CoverLockRegistry(fn, lockCfg);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
this.coverLockRegistry = null;
|
|
57
|
+
}
|
|
58
|
+
this.coverRegistry = new CoverRegistry(merged.ai.cover, random, this.coverLockRegistry ?? undefined);
|
|
59
|
+
this.restrictedZones = new RestrictedZoneManager(merged.ai.navigation.restrictedZoneSafeMargin);
|
|
60
|
+
}
|
|
61
|
+
install(kernel) {
|
|
62
|
+
this.kernel = kernel;
|
|
63
|
+
}
|
|
64
|
+
init() {
|
|
65
|
+
// Auto-populate cover points if the host provided a source.
|
|
66
|
+
const source = this.kernel?.portRegistry.tryGet(AIPorts.CoverPointSource);
|
|
67
|
+
if (source) {
|
|
68
|
+
const points = source.getPoints({
|
|
69
|
+
minX: -Infinity,
|
|
70
|
+
minY: -Infinity,
|
|
71
|
+
maxX: Infinity,
|
|
72
|
+
maxY: Infinity,
|
|
73
|
+
});
|
|
74
|
+
this.coverRegistry.addPoints(points);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
destroy() {
|
|
78
|
+
this.coverRegistry.clear();
|
|
79
|
+
this.coverLockRegistry?.clear();
|
|
80
|
+
this.restrictedZones.clear();
|
|
81
|
+
this.kernel = null;
|
|
82
|
+
}
|
|
83
|
+
serialize() {
|
|
84
|
+
// Cover locks are intentionally NOT serialized — they are ephemeral TTL
|
|
85
|
+
// reservations that expire within seconds. Persisting stale locks across
|
|
86
|
+
// save/load cycles would permanently block cover points with no recovery
|
|
87
|
+
// path. NPCs will re-acquire locks naturally on their next TakeCover/Retreat
|
|
88
|
+
// state entry after loading.
|
|
89
|
+
const zones = this.restrictedZones.getAllZones().map((z) => ({
|
|
90
|
+
id: z.id,
|
|
91
|
+
type: z.type,
|
|
92
|
+
x: z.x,
|
|
93
|
+
y: z.y,
|
|
94
|
+
radius: z.radius,
|
|
95
|
+
active: z.active,
|
|
96
|
+
metadata: z.metadata,
|
|
97
|
+
}));
|
|
98
|
+
return { zones };
|
|
99
|
+
}
|
|
100
|
+
restore(state) {
|
|
101
|
+
this.restrictedZones.clear();
|
|
102
|
+
const zones = state.zones;
|
|
103
|
+
if (zones) {
|
|
104
|
+
for (const z of zones) {
|
|
105
|
+
this.restrictedZones.addZone({
|
|
106
|
+
id: z.id,
|
|
107
|
+
type: z.type,
|
|
108
|
+
x: z.x,
|
|
109
|
+
y: z.y,
|
|
110
|
+
radius: z.radius,
|
|
111
|
+
active: z.active,
|
|
112
|
+
metadata: z.metadata,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Create a per-NPC `ICoverAccess` adapter backed by this plugin's registries.
|
|
119
|
+
*
|
|
120
|
+
* The returned adapter is stateful — it tracks the last cover point found so
|
|
121
|
+
* that `lockLastFound()` can acquire a TTL lock without the caller managing
|
|
122
|
+
* point IDs. Create one adapter per NPC entity; do not share across entities.
|
|
123
|
+
*
|
|
124
|
+
* @param npcId - Stable NPC identifier (used for occupancy filtering and locking).
|
|
125
|
+
*/
|
|
126
|
+
createCoverAccess(npcId) {
|
|
127
|
+
return new CoverAccessAdapter(this.coverRegistry, this.coverLockRegistry, npcId);
|
|
128
|
+
}
|
|
129
|
+
/** Get the AI configuration. */
|
|
130
|
+
getConfig() {
|
|
131
|
+
return this.config.ai;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=AIPlugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AIPlugin.js","sourceRoot":"","sources":["../../src/plugin/AIPlugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AACnE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,OAAO,EAAE,QAAQ,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ICoverPointSource } from './ICoverPointSource';
|
|
2
|
+
import type { IPerceptionProvider } from './IPerceptionProvider';
|
|
3
|
+
/**
|
|
4
|
+
* AI subsystem port tokens.
|
|
5
|
+
*
|
|
6
|
+
* All AI ports are optional — the plugin works without them but
|
|
7
|
+
* gains additional capabilities when they're provided.
|
|
8
|
+
*/
|
|
9
|
+
export declare const AIPorts: {
|
|
10
|
+
readonly CoverPointSource: import("@alife-sdk/core").PortToken<ICoverPointSource>;
|
|
11
|
+
readonly PerceptionProvider: import("@alife-sdk/core").PortToken<IPerceptionProvider>;
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=AIPorts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AIPorts.d.ts","sourceRoot":"","sources":["../../src/ports/AIPorts.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE;;;;;GAKG;AACH,eAAO,MAAM,OAAO;;;CASV,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// ports/AIPorts.ts
|
|
2
|
+
// Port tokens for the AI plugin.
|
|
3
|
+
import { createPortToken } from '@alife-sdk/core';
|
|
4
|
+
/**
|
|
5
|
+
* AI subsystem port tokens.
|
|
6
|
+
*
|
|
7
|
+
* All AI ports are optional — the plugin works without them but
|
|
8
|
+
* gains additional capabilities when they're provided.
|
|
9
|
+
*/
|
|
10
|
+
export const AIPorts = {
|
|
11
|
+
CoverPointSource: createPortToken('coverPointSource', 'Provides cover point positions from host level data'),
|
|
12
|
+
PerceptionProvider: createPortToken('perceptionProvider', 'Provides spatial entity queries for perception system'),
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=AIPorts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AIPorts.js","sourceRoot":"","sources":["../../src/ports/AIPorts.ts"],"names":[],"mappings":"AAAA,mBAAmB;AACnB,iCAAiC;AAEjC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAIlD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,gBAAgB,EAAE,eAAe,CAC/B,kBAAkB,EAClB,qDAAqD,CACtD;IACD,kBAAkB,EAAE,eAAe,CACjC,oBAAoB,EACpB,uDAAuD,CACxD;CACO,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal cover point data from the host.
|
|
3
|
+
* The AI plugin converts these to full ICoverPoint objects.
|
|
4
|
+
*/
|
|
5
|
+
export interface ICoverPointData {
|
|
6
|
+
readonly x: number;
|
|
7
|
+
readonly y: number;
|
|
8
|
+
readonly radius?: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Port interface for providing cover point data to the AI system.
|
|
12
|
+
*
|
|
13
|
+
* The host implements this to feed cover point positions from its
|
|
14
|
+
* tilemap, level editor, or procedural generation system.
|
|
15
|
+
*
|
|
16
|
+
* This is an optional port — if not provided, cover points must
|
|
17
|
+
* be registered manually via `CoverRegistry.addPoint()`.
|
|
18
|
+
*/
|
|
19
|
+
export interface ICoverPointSource {
|
|
20
|
+
getPoints(bounds: {
|
|
21
|
+
readonly minX: number;
|
|
22
|
+
readonly minY: number;
|
|
23
|
+
readonly maxX: number;
|
|
24
|
+
readonly maxY: number;
|
|
25
|
+
}): readonly ICoverPointData[];
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=ICoverPointSource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ICoverPointSource.d.ts","sourceRoot":"","sources":["../../src/ports/ICoverPointSource.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,MAAM,EAAE;QAChB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;KACvB,GAAG,SAAS,eAAe,EAAE,CAAC;CAChC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ICoverPointSource.js","sourceRoot":"","sources":["../../src/ports/ICoverPointSource.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,4DAA4D"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { Vec2 } from '@alife-sdk/core';
|
|
2
|
+
import type { IPerceivedEntity } from '../types/IPerceptionTypes';
|
|
3
|
+
/**
|
|
4
|
+
* Port providing spatial entity queries for perception.
|
|
5
|
+
*
|
|
6
|
+
* The host implements this to bridge between the game's entity storage
|
|
7
|
+
* (e.g. Phaser sprites, ECS, etc.) and the SDK's pure perception queries.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* // Host implementation using Phaser scene
|
|
12
|
+
* const provider: IPerceptionProvider = {
|
|
13
|
+
* getEntitiesInRadius(center, radius) {
|
|
14
|
+
* return scene.physics.overlapCirc(center.x, center.y, radius)
|
|
15
|
+
* .map(body => ({
|
|
16
|
+
* entityId: body.gameObject.getData('npcId'),
|
|
17
|
+
* position: { x: body.x, y: body.y },
|
|
18
|
+
* factionId: body.gameObject.getData('factionId'),
|
|
19
|
+
* isAlive: body.gameObject.active,
|
|
20
|
+
* }));
|
|
21
|
+
* },
|
|
22
|
+
* isLineOfSightClear(from, to) {
|
|
23
|
+
* // Raycast using physics engine
|
|
24
|
+
* return !scene.physics.world.raycast(from, to).hasHit;
|
|
25
|
+
* },
|
|
26
|
+
* };
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export interface IPerceptionProvider {
|
|
30
|
+
/**
|
|
31
|
+
* Get all perceivable entities within a radius.
|
|
32
|
+
* Used for both vision and hearing queries.
|
|
33
|
+
*/
|
|
34
|
+
getEntitiesInRadius(center: Vec2, radius: number): readonly IPerceivedEntity[];
|
|
35
|
+
/**
|
|
36
|
+
* Check if there is a clear line of sight between two points.
|
|
37
|
+
* Used to refine vision checks (walls, obstacles).
|
|
38
|
+
* Optional — if not provided, LOS is assumed clear.
|
|
39
|
+
*/
|
|
40
|
+
isLineOfSightClear?(from: Vec2, to: Vec2): boolean;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=IPerceptionProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IPerceptionProvider.d.ts","sourceRoot":"","sources":["../../src/ports/IPerceptionProvider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAElE;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,mBAAmB,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,gBAAgB,EAAE,CAAC;IAE/E;;;;OAIG;IACH,kBAAkB,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,GAAG,OAAO,CAAC;CACpD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IPerceptionProvider.js","sourceRoot":"","sources":["../../src/ports/IPerceptionProvider.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,2DAA2D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ports/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC9E,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ports/index.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC"}
|