@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,115 @@
|
|
|
1
|
+
// goap/GoalSelector.ts
|
|
2
|
+
// Pure function to select a GOAP goal based on configurable priority rules.
|
|
3
|
+
// No side effects — all decision logic is deterministic.
|
|
4
|
+
import { WorldState } from '@alife-sdk/core';
|
|
5
|
+
import { WorldProperty, GoalPriority } from '../types/IPerceptionTypes';
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// Pre-allocated WorldState and IGoalResult objects for DEFAULT_GOAL_RULES.
|
|
8
|
+
// These are immutable after construction — rules return the same instances
|
|
9
|
+
// every evaluation to avoid per-tick allocations.
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
const _criticalGoal = /* @__PURE__ */ (() => {
|
|
12
|
+
const ws = new WorldState();
|
|
13
|
+
ws.set(WorldProperty.CRITICALLY_WOUNDED, false);
|
|
14
|
+
ws.set(WorldProperty.ENEMY_PRESENT, false);
|
|
15
|
+
return ws;
|
|
16
|
+
})();
|
|
17
|
+
const _enemyResult = /* @__PURE__ */ (() => {
|
|
18
|
+
const ws = new WorldState();
|
|
19
|
+
ws.set(WorldProperty.ENEMY_PRESENT, false);
|
|
20
|
+
return { goal: ws, priority: GoalPriority.ENEMY_PRESENT, reason: 'Enemy detected' };
|
|
21
|
+
})();
|
|
22
|
+
const _dangerResult = /* @__PURE__ */ (() => {
|
|
23
|
+
const ws = new WorldState();
|
|
24
|
+
ws.set(WorldProperty.DANGER, false);
|
|
25
|
+
return { goal: ws, priority: GoalPriority.DANGER, reason: 'Danger signal without visible enemy' };
|
|
26
|
+
})();
|
|
27
|
+
const _anomalyResult = /* @__PURE__ */ (() => {
|
|
28
|
+
const ws = new WorldState();
|
|
29
|
+
ws.set(WorldProperty.ANOMALY_NEAR, false);
|
|
30
|
+
return { goal: ws, priority: GoalPriority.ANOMALY_AVOID, reason: 'Anomaly zone detected' };
|
|
31
|
+
})();
|
|
32
|
+
const _defaultResult = /* @__PURE__ */ (() => {
|
|
33
|
+
const ws = new WorldState();
|
|
34
|
+
ws.set(WorldProperty.AT_TARGET, true);
|
|
35
|
+
return { goal: ws, priority: GoalPriority.DEFAULT, reason: 'No threats — patrol or idle' };
|
|
36
|
+
})();
|
|
37
|
+
/**
|
|
38
|
+
* Default goal rules corresponding to the 5-band priority hierarchy.
|
|
39
|
+
* Sorted by priority ascending (highest importance first).
|
|
40
|
+
*
|
|
41
|
+
* WorldState objects are pre-allocated and reused across evaluations to
|
|
42
|
+
* eliminate per-tick allocations.
|
|
43
|
+
*/
|
|
44
|
+
export const DEFAULT_GOAL_RULES = [
|
|
45
|
+
{
|
|
46
|
+
priority: GoalPriority.CRITICALLY_WOUNDED,
|
|
47
|
+
name: 'critically_wounded',
|
|
48
|
+
evaluate(snapshot, config) {
|
|
49
|
+
if (snapshot.hpRatio <= config.healHpThreshold) {
|
|
50
|
+
return {
|
|
51
|
+
goal: _criticalGoal,
|
|
52
|
+
priority: GoalPriority.CRITICALLY_WOUNDED,
|
|
53
|
+
reason: `HP critical (${(snapshot.hpRatio * 100).toFixed(0)}%)`,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
priority: GoalPriority.ENEMY_PRESENT,
|
|
61
|
+
name: 'enemy_present',
|
|
62
|
+
evaluate(snapshot) {
|
|
63
|
+
if (snapshot.enemyPresent)
|
|
64
|
+
return _enemyResult;
|
|
65
|
+
return null;
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
priority: GoalPriority.DANGER,
|
|
70
|
+
name: 'danger',
|
|
71
|
+
evaluate(snapshot) {
|
|
72
|
+
if (snapshot.hasDanger)
|
|
73
|
+
return _dangerResult;
|
|
74
|
+
return null;
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
priority: GoalPriority.ANOMALY_AVOID,
|
|
79
|
+
name: 'anomaly_avoidance',
|
|
80
|
+
evaluate(snapshot) {
|
|
81
|
+
if (snapshot.nearAnomalyZone)
|
|
82
|
+
return _anomalyResult;
|
|
83
|
+
return null;
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
priority: GoalPriority.DEFAULT,
|
|
88
|
+
name: 'default',
|
|
89
|
+
evaluate() {
|
|
90
|
+
return _defaultResult;
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
];
|
|
94
|
+
/**
|
|
95
|
+
* Select a GOAP goal based on the current NPC state.
|
|
96
|
+
*
|
|
97
|
+
* Rules are evaluated in order — first rule that returns a non-null result wins.
|
|
98
|
+
* DEFAULT_GOAL_RULES provides the original 4-band hierarchy.
|
|
99
|
+
*
|
|
100
|
+
* @param snapshot - Pre-computed NPC world data
|
|
101
|
+
* @param config - GOAP configuration (healHpThreshold)
|
|
102
|
+
* @param rules - Optional custom goal rules. Defaults to DEFAULT_GOAL_RULES.
|
|
103
|
+
* @returns Goal and priority band info
|
|
104
|
+
*/
|
|
105
|
+
export function selectGoal(snapshot, config, rules) {
|
|
106
|
+
for (const rule of (rules ?? DEFAULT_GOAL_RULES)) {
|
|
107
|
+
const result = rule.evaluate(snapshot, config);
|
|
108
|
+
if (result)
|
|
109
|
+
return result;
|
|
110
|
+
}
|
|
111
|
+
// Fallback — should not normally be reached with default rules
|
|
112
|
+
const goal = new WorldState();
|
|
113
|
+
return { goal, priority: GoalPriority.DEFAULT, reason: 'No rules matched' };
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=GoalSelector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GoalSelector.js","sourceRoot":"","sources":["../../src/goap/GoalSelector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Port interface (seam) for spatial hazard zone avoidance used by EvadeHazardAction.
|
|
3
|
+
*
|
|
4
|
+
* Implement on a host-side adapter that translates from the game's concrete
|
|
5
|
+
* zone representation into the two queries this action needs.
|
|
6
|
+
*/
|
|
7
|
+
export interface IHazardZoneAccess {
|
|
8
|
+
/** True if (x,y) is within hazard detection radius. */
|
|
9
|
+
isNearHazard(x: number, y: number): boolean;
|
|
10
|
+
/** Normalized escape direction (unit vec) away from nearest hazard, null if already clear. */
|
|
11
|
+
getEscapeDirection(x: number, y: number): {
|
|
12
|
+
readonly x: number;
|
|
13
|
+
readonly y: number;
|
|
14
|
+
} | null;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=IHazardZoneAccess.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IHazardZoneAccess.d.ts","sourceRoot":"","sources":["../../src/goap/IHazardZoneAccess.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,uDAAuD;IACvD,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5C,8FAA8F;IAC9F,kBAAkB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG;QAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAC7F"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IHazardZoneAccess.js","sourceRoot":"","sources":["../../src/goap/IHazardZoneAccess.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { WorldState } from '@alife-sdk/core';
|
|
2
|
+
import { type INPCWorldSnapshot } from '../types/IPerceptionTypes';
|
|
3
|
+
/**
|
|
4
|
+
* A single world state property builder.
|
|
5
|
+
* Each builder is responsible for computing one boolean property from the snapshot.
|
|
6
|
+
*/
|
|
7
|
+
export interface IWorldPropertyBuilder {
|
|
8
|
+
readonly key: string;
|
|
9
|
+
build(snapshot: INPCWorldSnapshot): boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Default property builders corresponding to the original 16 hardcoded assignments.
|
|
13
|
+
* Order matches the original buildWorldState implementation.
|
|
14
|
+
*/
|
|
15
|
+
export declare const DEFAULT_WORLD_PROPERTY_BUILDERS: readonly IWorldPropertyBuilder[];
|
|
16
|
+
/**
|
|
17
|
+
* Build a GOAP WorldState from an NPC data snapshot.
|
|
18
|
+
*
|
|
19
|
+
* This is a pure function: same input → same output.
|
|
20
|
+
* The snapshot captures all relevant NPC data at a single point in time.
|
|
21
|
+
*
|
|
22
|
+
* @param snapshot - Pre-computed NPC data (health, perception, loadout, etc.)
|
|
23
|
+
* @param builders - Optional custom property builders. Defaults to DEFAULT_WORLD_PROPERTY_BUILDERS.
|
|
24
|
+
* @returns A new WorldState populated with properties from the builders
|
|
25
|
+
*/
|
|
26
|
+
export declare function buildWorldState(snapshot: INPCWorldSnapshot, builders?: readonly IWorldPropertyBuilder[]): WorldState;
|
|
27
|
+
//# sourceMappingURL=WorldStateBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorldStateBuilder.d.ts","sourceRoot":"","sources":["../../src/goap/WorldStateBuilder.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAiB,KAAK,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAElF;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC;CAC7C;AAED;;;GAGG;AACH,eAAO,MAAM,+BAA+B,EAAE,SAAS,qBAAqB,EAuB3E,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,CAAC,EAAE,SAAS,qBAAqB,EAAE,GAC1C,UAAU,CAQZ"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// goap/WorldStateBuilder.ts
|
|
2
|
+
// Pure function to build a GOAP world state snapshot from NPC data.
|
|
3
|
+
// No side effects — caller provides all inputs as a snapshot.
|
|
4
|
+
import { WorldState } from '@alife-sdk/core';
|
|
5
|
+
import { WorldProperty } from '../types/IPerceptionTypes';
|
|
6
|
+
/**
|
|
7
|
+
* Default property builders corresponding to the original 16 hardcoded assignments.
|
|
8
|
+
* Order matches the original buildWorldState implementation.
|
|
9
|
+
*/
|
|
10
|
+
export const DEFAULT_WORLD_PROPERTY_BUILDERS = [
|
|
11
|
+
// Direct properties
|
|
12
|
+
{ key: WorldProperty.ALIVE, build: (s) => s.isAlive },
|
|
13
|
+
{ key: WorldProperty.CRITICALLY_WOUNDED, build: (s) => s.hpRatio <= 0.3 },
|
|
14
|
+
{ key: WorldProperty.HAS_WEAPON, build: (s) => s.hasWeapon },
|
|
15
|
+
{ key: WorldProperty.HAS_AMMO, build: (s) => s.hasAmmo },
|
|
16
|
+
{ key: WorldProperty.IN_COVER, build: (s) => s.inCover },
|
|
17
|
+
{ key: WorldProperty.SEE_ENEMY, build: (s) => s.seeEnemy },
|
|
18
|
+
{ key: WorldProperty.ENEMY_PRESENT, build: (s) => s.enemyPresent },
|
|
19
|
+
{ key: WorldProperty.ENEMY_IN_RANGE, build: (s) => s.enemyInRange },
|
|
20
|
+
{ key: WorldProperty.DANGER, build: (s) => s.hasDanger },
|
|
21
|
+
{ key: WorldProperty.DANGER_GRENADE, build: (s) => s.hasDangerGrenade },
|
|
22
|
+
{ key: WorldProperty.ENEMY_WOUNDED, build: (s) => s.enemyWounded },
|
|
23
|
+
{ key: WorldProperty.ANOMALY_NEAR, build: (s) => s.nearAnomalyZone },
|
|
24
|
+
// Derived properties
|
|
25
|
+
{ key: WorldProperty.ENEMY_SEE_ME, build: (s) => s.seeEnemy },
|
|
26
|
+
{
|
|
27
|
+
key: WorldProperty.READY_TO_KILL,
|
|
28
|
+
build: (s) => s.hasWeapon && s.hasAmmo && s.seeEnemy && s.enemyInRange,
|
|
29
|
+
},
|
|
30
|
+
{ key: WorldProperty.POSITION_HELD, build: (s) => s.inCover && !s.seeEnemy },
|
|
31
|
+
{ key: WorldProperty.LOOKED_OUT, build: () => false },
|
|
32
|
+
{ key: WorldProperty.AT_TARGET, build: (s) => !s.enemyPresent && !s.hasDanger },
|
|
33
|
+
];
|
|
34
|
+
/**
|
|
35
|
+
* Build a GOAP WorldState from an NPC data snapshot.
|
|
36
|
+
*
|
|
37
|
+
* This is a pure function: same input → same output.
|
|
38
|
+
* The snapshot captures all relevant NPC data at a single point in time.
|
|
39
|
+
*
|
|
40
|
+
* @param snapshot - Pre-computed NPC data (health, perception, loadout, etc.)
|
|
41
|
+
* @param builders - Optional custom property builders. Defaults to DEFAULT_WORLD_PROPERTY_BUILDERS.
|
|
42
|
+
* @returns A new WorldState populated with properties from the builders
|
|
43
|
+
*/
|
|
44
|
+
export function buildWorldState(snapshot, builders) {
|
|
45
|
+
const state = new WorldState();
|
|
46
|
+
for (const b of (builders ?? DEFAULT_WORLD_PROPERTY_BUILDERS)) {
|
|
47
|
+
state.set(b.key, b.build(snapshot));
|
|
48
|
+
}
|
|
49
|
+
return state;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=WorldStateBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorldStateBuilder.js","sourceRoot":"","sources":["../../src/goap/WorldStateBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { buildWorldState, DEFAULT_WORLD_PROPERTY_BUILDERS } from './WorldStateBuilder';
|
|
2
|
+
export type { IWorldPropertyBuilder } from './WorldStateBuilder';
|
|
3
|
+
export { selectGoal, DEFAULT_GOAL_RULES } from './GoalSelector';
|
|
4
|
+
export type { IGoalResult, IGoalRule } from './GoalSelector';
|
|
5
|
+
export { GOAPController } from './GOAPController';
|
|
6
|
+
export type { IGOAPUpdateResult, IGOAPControllerState } from './GOAPController';
|
|
7
|
+
export type { IHazardZoneAccess } from './IHazardZoneAccess';
|
|
8
|
+
export { EvadeHazardAction } from './EvadeHazardAction';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/goap/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,+BAA+B,EAAE,MAAM,qBAAqB,CAAC;AACvF,YAAY,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAChE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAChF,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// goap sub-path barrel
|
|
2
|
+
export { buildWorldState, DEFAULT_WORLD_PROPERTY_BUILDERS } from './WorldStateBuilder';
|
|
3
|
+
export { selectGoal, DEFAULT_GOAL_RULES } from './GoalSelector';
|
|
4
|
+
export { GOAPController } from './GOAPController';
|
|
5
|
+
export { EvadeHazardAction } from './EvadeHazardAction';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/goap/index.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,OAAO,EAAE,eAAe,EAAE,+BAA+B,EAAE,MAAM,qBAAqB,CAAC;AAEvF,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEhE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export * from './types/index';
|
|
2
|
+
export * from './config/index';
|
|
3
|
+
export * from './cover/index';
|
|
4
|
+
export * from './combat/index';
|
|
5
|
+
export * from './navigation/index';
|
|
6
|
+
export * from './squad/index';
|
|
7
|
+
export * from './conditions/index';
|
|
8
|
+
export * from './suspicion/index';
|
|
9
|
+
export * from './animation/index';
|
|
10
|
+
export * from './sound/index';
|
|
11
|
+
export * from './perception/index';
|
|
12
|
+
export * from './goap/index';
|
|
13
|
+
export * from './ports/index';
|
|
14
|
+
export * from './plugin/index';
|
|
15
|
+
export * from './states/index';
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// @alife-sdk/ai — online frame-based NPC behavior system.
|
|
2
|
+
// Zero Phaser dependencies. Depends on @alife-sdk/core + alife-simulation.
|
|
3
|
+
export * from './types/index';
|
|
4
|
+
export * from './config/index';
|
|
5
|
+
export * from './cover/index';
|
|
6
|
+
export * from './combat/index';
|
|
7
|
+
export * from './navigation/index';
|
|
8
|
+
export * from './squad/index';
|
|
9
|
+
export * from './conditions/index';
|
|
10
|
+
export * from './suspicion/index';
|
|
11
|
+
export * from './animation/index';
|
|
12
|
+
export * from './sound/index';
|
|
13
|
+
export * from './perception/index';
|
|
14
|
+
export * from './goap/index';
|
|
15
|
+
export * from './ports/index';
|
|
16
|
+
export * from './plugin/index';
|
|
17
|
+
export * from './states/index';
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,2EAA2E;AAE3E,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Vec2, IRandom } from '@alife-sdk/core';
|
|
2
|
+
import type { INavigationConfig } from '../types/IOnlineAIConfig';
|
|
3
|
+
/**
|
|
4
|
+
* Generate a smooth path from sparse waypoints using CatmullRom interpolation.
|
|
5
|
+
*
|
|
6
|
+
* Interior points receive deterministic jitter for natural feel.
|
|
7
|
+
* Results are cached (FIFO eviction at 64 entries).
|
|
8
|
+
*
|
|
9
|
+
* @param waypoints - Sparse control points (at least 1).
|
|
10
|
+
* @param config - Navigation tuning (pointsPerSegment, smoothRandomOffset).
|
|
11
|
+
* @param random - Seeded random source for deterministic jitter.
|
|
12
|
+
* @param cache - Optional shared cache instance.
|
|
13
|
+
* @returns Dense smooth path including exact start/end.
|
|
14
|
+
*/
|
|
15
|
+
export declare function smoothPath(waypoints: readonly Vec2[], config: INavigationConfig, random: IRandom, cache?: Map<string, readonly Vec2[]>): readonly Vec2[];
|
|
16
|
+
/**
|
|
17
|
+
* Enhance a smooth path with Dubins-style arcs at sharp turns.
|
|
18
|
+
*
|
|
19
|
+
* Turns exceeding `dubinsMaxInstantTurn` get replaced with circular
|
|
20
|
+
* arc approximations for realistic movement.
|
|
21
|
+
*
|
|
22
|
+
* @param waypoints - Sparse control points.
|
|
23
|
+
* @param config - Navigation tuning.
|
|
24
|
+
* @param random - Seeded random for smooth path generation.
|
|
25
|
+
* @param cache - Optional smooth path cache.
|
|
26
|
+
* @returns Path with arc insertions at sharp turns.
|
|
27
|
+
*/
|
|
28
|
+
export declare function smoothPathWithTurning(waypoints: readonly Vec2[], config: INavigationConfig, random: IRandom, cache?: Map<string, readonly Vec2[]>): readonly Vec2[];
|
|
29
|
+
//# sourceMappingURL=PathSmoother.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PathSmoother.d.ts","sourceRoot":"","sources":["../../src/navigation/PathSmoother.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAErD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAgClE;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CACxB,SAAS,EAAE,SAAS,IAAI,EAAE,EAC1B,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,OAAO,EACf,KAAK,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE,CAAC,GACnC,SAAS,IAAI,EAAE,CA+CjB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,SAAS,IAAI,EAAE,EAC1B,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,OAAO,EACf,KAAK,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE,CAAC,GACnC,SAAS,IAAI,EAAE,CAmFjB"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
// navigation/PathSmoother.ts
|
|
2
|
+
// Immutable path smoothing pipeline using CatmullRom splines.
|
|
3
|
+
// Pure functions + LRU cache — no framework dependencies.
|
|
4
|
+
import { catmullRom } from '@alife-sdk/core';
|
|
5
|
+
const MAX_CACHE_ENTRIES = 64;
|
|
6
|
+
// Module-level scratch arrays — reused across smoothPath calls (single-threaded)
|
|
7
|
+
const _scratchXs = [];
|
|
8
|
+
const _scratchYs = [];
|
|
9
|
+
/**
|
|
10
|
+
* Pad waypoints to meet the CatmullRom minimum of 4 control points.
|
|
11
|
+
* Duplicates endpoints as necessary.
|
|
12
|
+
*/
|
|
13
|
+
function padWaypoints(pts) {
|
|
14
|
+
if (pts.length >= 4)
|
|
15
|
+
return pts;
|
|
16
|
+
if (pts.length === 1)
|
|
17
|
+
return [pts[0], pts[0], pts[0], pts[0]];
|
|
18
|
+
if (pts.length === 2)
|
|
19
|
+
return [pts[0], pts[0], pts[1], pts[1]];
|
|
20
|
+
// pts.length === 3
|
|
21
|
+
return [pts[0], pts[0], pts[1], pts[2]];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Build a cache key from waypoint coordinates.
|
|
25
|
+
* Rounds to 1 decimal to absorb floating-point noise.
|
|
26
|
+
*/
|
|
27
|
+
function cacheKey(pts) {
|
|
28
|
+
let key = '';
|
|
29
|
+
for (const p of pts) {
|
|
30
|
+
key += `${p.x.toFixed(1)},${p.y.toFixed(1)};`;
|
|
31
|
+
}
|
|
32
|
+
return key;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Generate a smooth path from sparse waypoints using CatmullRom interpolation.
|
|
36
|
+
*
|
|
37
|
+
* Interior points receive deterministic jitter for natural feel.
|
|
38
|
+
* Results are cached (FIFO eviction at 64 entries).
|
|
39
|
+
*
|
|
40
|
+
* @param waypoints - Sparse control points (at least 1).
|
|
41
|
+
* @param config - Navigation tuning (pointsPerSegment, smoothRandomOffset).
|
|
42
|
+
* @param random - Seeded random source for deterministic jitter.
|
|
43
|
+
* @param cache - Optional shared cache instance.
|
|
44
|
+
* @returns Dense smooth path including exact start/end.
|
|
45
|
+
*/
|
|
46
|
+
export function smoothPath(waypoints, config, random, cache) {
|
|
47
|
+
if (waypoints.length === 0)
|
|
48
|
+
return [];
|
|
49
|
+
if (waypoints.length === 1)
|
|
50
|
+
return [waypoints[0]];
|
|
51
|
+
const key = cacheKey(waypoints);
|
|
52
|
+
if (cache) {
|
|
53
|
+
const cached = cache.get(key);
|
|
54
|
+
if (cached)
|
|
55
|
+
return cached;
|
|
56
|
+
}
|
|
57
|
+
const padded = padWaypoints(waypoints);
|
|
58
|
+
_scratchXs.length = 0;
|
|
59
|
+
_scratchYs.length = 0;
|
|
60
|
+
for (const p of padded) {
|
|
61
|
+
_scratchXs.push(p.x);
|
|
62
|
+
_scratchYs.push(p.y);
|
|
63
|
+
}
|
|
64
|
+
const xs = _scratchXs;
|
|
65
|
+
const ys = _scratchYs;
|
|
66
|
+
const segmentCount = padded.length - 1;
|
|
67
|
+
const totalSteps = segmentCount * config.smoothPointsPerSegment + 1;
|
|
68
|
+
const points = [];
|
|
69
|
+
for (let i = 0; i < totalSteps; i++) {
|
|
70
|
+
const t = i / (totalSteps - 1);
|
|
71
|
+
let x = catmullRom(xs, t);
|
|
72
|
+
let y = catmullRom(ys, t);
|
|
73
|
+
// Apply jitter to interior points only.
|
|
74
|
+
if (i > 0 && i < totalSteps - 1 && config.smoothRandomOffset > 0) {
|
|
75
|
+
x += (random.next() - 0.5) * 2 * config.smoothRandomOffset;
|
|
76
|
+
y += (random.next() - 0.5) * 2 * config.smoothRandomOffset;
|
|
77
|
+
}
|
|
78
|
+
points.push({ x, y });
|
|
79
|
+
}
|
|
80
|
+
if (cache) {
|
|
81
|
+
cache.set(key, points);
|
|
82
|
+
if (cache.size > MAX_CACHE_ENTRIES) {
|
|
83
|
+
const oldest = cache.keys().next().value;
|
|
84
|
+
if (oldest !== undefined)
|
|
85
|
+
cache.delete(oldest);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return points;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Enhance a smooth path with Dubins-style arcs at sharp turns.
|
|
92
|
+
*
|
|
93
|
+
* Turns exceeding `dubinsMaxInstantTurn` get replaced with circular
|
|
94
|
+
* arc approximations for realistic movement.
|
|
95
|
+
*
|
|
96
|
+
* @param waypoints - Sparse control points.
|
|
97
|
+
* @param config - Navigation tuning.
|
|
98
|
+
* @param random - Seeded random for smooth path generation.
|
|
99
|
+
* @param cache - Optional smooth path cache.
|
|
100
|
+
* @returns Path with arc insertions at sharp turns.
|
|
101
|
+
*/
|
|
102
|
+
export function smoothPathWithTurning(waypoints, config, random, cache) {
|
|
103
|
+
const base = smoothPath(waypoints, config, random, cache);
|
|
104
|
+
if (base.length < 3)
|
|
105
|
+
return base;
|
|
106
|
+
const ARC_SUBDIVISIONS = 6;
|
|
107
|
+
const result = [base[0]];
|
|
108
|
+
for (let i = 1; i < base.length - 1; i++) {
|
|
109
|
+
const a = base[i - 1];
|
|
110
|
+
const b = base[i];
|
|
111
|
+
const c = base[i + 1];
|
|
112
|
+
// Compute segment vectors and lengths once — shared by both
|
|
113
|
+
// the turn-angle check and the arc construction below.
|
|
114
|
+
const abx = b.x - a.x;
|
|
115
|
+
const aby = b.y - a.y;
|
|
116
|
+
const bcx = c.x - b.x;
|
|
117
|
+
const bcy = c.y - b.y;
|
|
118
|
+
const abLen = Math.sqrt(abx * abx + aby * aby);
|
|
119
|
+
const bcLen = Math.sqrt(bcx * bcx + bcy * bcy);
|
|
120
|
+
if (abLen < 1e-6 || bcLen < 1e-6) {
|
|
121
|
+
result.push(b);
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
// Turn angle (inlined to reuse abLen/bcLen).
|
|
125
|
+
const abNx = abx / abLen;
|
|
126
|
+
const abNy = aby / abLen;
|
|
127
|
+
const bcNx = bcx / bcLen;
|
|
128
|
+
const bcNy = bcy / bcLen;
|
|
129
|
+
const dot = abNx * bcNx + abNy * bcNy;
|
|
130
|
+
const angle = Math.acos(Math.max(-1, Math.min(1, dot)));
|
|
131
|
+
if (angle <= config.dubinsMaxInstantTurn) {
|
|
132
|
+
result.push(b);
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
// Insert arc at sharp turn.
|
|
136
|
+
const halfAngle = angle / 2;
|
|
137
|
+
const sinHalf = Math.sin(halfAngle);
|
|
138
|
+
if (sinHalf < 1e-6) {
|
|
139
|
+
result.push(b);
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
// Bisector points away from the turn.
|
|
143
|
+
let bisX = abNx + bcNx;
|
|
144
|
+
let bisY = abNy + bcNy;
|
|
145
|
+
const bisLen = Math.sqrt(bisX * bisX + bisY * bisY);
|
|
146
|
+
if (bisLen < 1e-6) {
|
|
147
|
+
result.push(b);
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
bisX /= bisLen;
|
|
151
|
+
bisY /= bisLen;
|
|
152
|
+
const centerDist = config.dubinsTurningRadius / sinHalf;
|
|
153
|
+
const cx = b.x + bisX * centerDist;
|
|
154
|
+
const cy = b.y + bisY * centerDist;
|
|
155
|
+
// Compute start/end angles of the arc.
|
|
156
|
+
const startAngle = Math.atan2(a.y - cy, a.x - cx);
|
|
157
|
+
const endAngle = Math.atan2(c.y - cy, c.x - cx);
|
|
158
|
+
// Signed sweep from startAngle to endAngle — same formula for both turn directions.
|
|
159
|
+
const sweep = endAngle - startAngle;
|
|
160
|
+
for (let s = 1; s <= ARC_SUBDIVISIONS; s++) {
|
|
161
|
+
const t = s / (ARC_SUBDIVISIONS + 1);
|
|
162
|
+
const arcAngle = startAngle + sweep * t;
|
|
163
|
+
result.push({
|
|
164
|
+
x: cx + Math.cos(arcAngle) * config.dubinsTurningRadius,
|
|
165
|
+
y: cy + Math.sin(arcAngle) * config.dubinsTurningRadius,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
result.push(base[base.length - 1]);
|
|
170
|
+
return result;
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=PathSmoother.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PathSmoother.js","sourceRoot":"","sources":["../../src/navigation/PathSmoother.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { Vec2 } from '@alife-sdk/core';
|
|
2
|
+
/**
|
|
3
|
+
* Zone restriction types.
|
|
4
|
+
* - IN: NPC must stay inside the zone.
|
|
5
|
+
* - OUT: NPC cannot enter the zone.
|
|
6
|
+
* - DANGER: Soft avoidance — NPC prefers to avoid but can enter.
|
|
7
|
+
*/
|
|
8
|
+
export declare const RestrictionType: {
|
|
9
|
+
readonly IN: 0;
|
|
10
|
+
readonly OUT: 1;
|
|
11
|
+
readonly DANGER: 2;
|
|
12
|
+
};
|
|
13
|
+
export type RestrictionType = (typeof RestrictionType)[keyof typeof RestrictionType];
|
|
14
|
+
/**
|
|
15
|
+
* A circular restricted zone in world space.
|
|
16
|
+
*/
|
|
17
|
+
export interface IRestrictedZone {
|
|
18
|
+
readonly id: string;
|
|
19
|
+
readonly type: RestrictionType;
|
|
20
|
+
readonly x: number;
|
|
21
|
+
readonly y: number;
|
|
22
|
+
readonly radius: number;
|
|
23
|
+
active: boolean;
|
|
24
|
+
readonly metadata?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Manages circular no-go and soft-avoidance zones for NPC movement.
|
|
28
|
+
*
|
|
29
|
+
* Instance-based — create one per simulation. No global state.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```ts
|
|
33
|
+
* const zones = new RestrictedZoneManager(20); // 20px safety margin
|
|
34
|
+
* zones.addZone({ id: 'rad_1', type: RestrictionType.OUT, x: 100, y: 100, radius: 50, active: true });
|
|
35
|
+
*
|
|
36
|
+
* if (!zones.accessible(110, 110)) {
|
|
37
|
+
* const safe = zones.getSafeDirection(110, 110);
|
|
38
|
+
* // Move NPC along safe.dx, safe.dy
|
|
39
|
+
* }
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export declare class RestrictedZoneManager {
|
|
43
|
+
private readonly zones;
|
|
44
|
+
private readonly safeMargin;
|
|
45
|
+
constructor(safeMargin: number);
|
|
46
|
+
addZone(zone: IRestrictedZone): void;
|
|
47
|
+
removeZone(id: string): void;
|
|
48
|
+
setActive(id: string, active: boolean): void;
|
|
49
|
+
removeByMetadata(tag: string): void;
|
|
50
|
+
getAllZones(): readonly IRestrictedZone[];
|
|
51
|
+
getZonesAt(x: number, y: number): readonly IRestrictedZone[];
|
|
52
|
+
get size(): number;
|
|
53
|
+
clear(): void;
|
|
54
|
+
/**
|
|
55
|
+
* Check if a position satisfies all hard zone constraints.
|
|
56
|
+
*
|
|
57
|
+
* - OUT zones: position must be outside (radius + safeMargin).
|
|
58
|
+
* - IN zones: position must be inside zone radius.
|
|
59
|
+
* - DANGER zones: ignored (soft avoidance only).
|
|
60
|
+
*
|
|
61
|
+
* Uses squared-distance for performance. Early-exit on first violation.
|
|
62
|
+
*/
|
|
63
|
+
accessible(x: number, y: number): boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Check if a position is inside any active DANGER zone.
|
|
66
|
+
* Does not prevent movement — used to trigger escape behavior.
|
|
67
|
+
*/
|
|
68
|
+
isDangerous(x: number, y: number): boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Compute a normalized direction vector to move away from the nearest
|
|
71
|
+
* active OUT or DANGER zone that contains this point.
|
|
72
|
+
*
|
|
73
|
+
* @returns Unit vector `{x, y}` pointing away from the zone center,
|
|
74
|
+
* or null if the position is already safe.
|
|
75
|
+
*/
|
|
76
|
+
getSafeDirection(x: number, y: number): Vec2 | null;
|
|
77
|
+
/**
|
|
78
|
+
* Filter a list of waypoints to only those in accessible positions.
|
|
79
|
+
* O(waypoints × zones).
|
|
80
|
+
*/
|
|
81
|
+
filterAccessibleWaypoints<T extends Vec2>(waypoints: readonly T[]): T[];
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=RestrictedZoneManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RestrictedZoneManager.d.ts","sourceRoot":"","sources":["../../src/navigation/RestrictedZoneManager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAE5C;;;;;GAKG;AACH,eAAO,MAAM,eAAe;;;;CAIlB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,OAAO,eAAe,CAAC,CAAC;AAErF;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsC;IAC5D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,UAAU,EAAE,MAAM;IAQ9B,OAAO,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI;IAIpC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI5B,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IAK5C,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAQnC,WAAW,IAAI,SAAS,eAAe,EAAE;IAIzC,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,eAAe,EAAE;IAa5D,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,KAAK,IAAI,IAAI;IAQb;;;;;;;;OAQG;IACH,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO;IAuBzC;;;OAGG;IACH,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO;IAgB1C;;;;;;OAMG;IACH,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAuCnD;;;OAGG;IACH,yBAAyB,CAAC,CAAC,SAAS,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE;CAGxE"}
|