blacktrigram 0.7.39 β 0.7.41
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/lib/App2.js.map +1 -1
- package/lib/audio/AudioAssetLoader.js.map +1 -1
- package/lib/audio/AudioAssetRegistry.js.map +1 -1
- package/lib/audio/AudioCache.js.map +1 -1
- package/lib/audio/AudioManager.js.map +1 -1
- package/lib/audio/AudioMonitor.js.map +1 -1
- package/lib/audio/AudioPool.js.map +1 -1
- package/lib/audio/AudioProvider.js.map +1 -1
- package/lib/audio/AudioUtils.js.map +1 -1
- package/lib/audio/BoneImpactAudioMap.js.map +1 -1
- package/lib/audio/VariantSelector.js.map +1 -1
- package/lib/audio/types.js.map +1 -1
- package/lib/components/screens/combat/CombatScreen3D.js.map +1 -1
- package/lib/components/screens/combat/components/controls/CombatButtons.js.map +1 -1
- package/lib/components/screens/combat/components/controls/CombatControlsPanel.js.map +1 -1
- package/lib/components/screens/combat/components/controls/ControlsGuide.js.map +1 -1
- package/lib/components/screens/combat/components/controls/KeyboardHints.js.map +1 -1
- package/lib/components/screens/combat/components/controls/PauseMenu.js.map +1 -1
- package/lib/components/screens/combat/components/controls/PauseMenuButton.js.map +1 -1
- package/lib/components/screens/combat/components/controls/QuickSettings.js.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodDecals3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodLossOverlayHtml.js.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodParticles3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodViscosity3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/CombatParticleEffects3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/ConsciousnessBlur.js.map +1 -1
- package/lib/components/screens/combat/components/effects/InternalDamage3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/PainVignette.js.map +1 -1
- package/lib/components/screens/combat/components/effects/ParticleAudio3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/TraumaOverlay3D.js.map +1 -1
- package/lib/components/screens/combat/components/feedback/MatchCountdown.js.map +1 -1
- package/lib/components/screens/combat/components/feedback/RoundAnnouncementOverlayHtml.js.map +1 -1
- package/lib/components/screens/combat/components/feedback/RoundDisplayStatus.js.map +1 -1
- package/lib/components/screens/combat/components/feedback/RoundStartAnnouncementOverlayHtml.js.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatBottomHUD.js.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatLeftHUD.js.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatPortraitStatusStrip.js.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatRightHUD.js.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatTopHUD.js.map +1 -1
- package/lib/components/screens/combat/components/hud/DifficultyIndicator.js.map +1 -1
- package/lib/components/screens/combat/components/hud/FPSMonitor.js.map +1 -1
- package/lib/components/screens/combat/components/hud/MobileControlsWrapper.js.map +1 -1
- package/lib/components/screens/combat/components/hud/PlayerStateOverlayHtml.js.map +1 -1
- package/lib/components/screens/combat/components/indicators/BalanceIndicator.js.map +1 -1
- package/lib/components/screens/combat/components/indicators/InputBufferDisplay.js.map +1 -1
- package/lib/components/screens/combat/components/indicators/StaminaWarning.js.map +1 -1
- package/lib/components/screens/combat/components/indicators/TechniqueNameDisplay.js.map +1 -1
- package/lib/components/screens/combat/helpers/AnimationUpdater.js.map +1 -1
- package/lib/components/screens/combat/helpers/combatHelpers.js.map +1 -1
- package/lib/components/screens/combat/hooks/useAICombat.js.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatActions.js.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatAttackMovement.js.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatAudio.js.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatLayout.js.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatState.js.map +1 -1
- package/lib/components/screens/controls/ControlsScreen3D.js.map +1 -1
- package/lib/components/screens/controls/components/ControlBindingsOverlayHtml.js.map +1 -1
- package/lib/components/screens/controls/components/ControlCategoryTabsOverlayHtml.js.map +1 -1
- package/lib/components/screens/controls/components/GamepadVisualization3D.js.map +1 -1
- package/lib/components/screens/controls/components/InteractiveControlDemoOverlayHtml.js.map +1 -1
- package/lib/components/screens/controls/components/Key3D.js.map +1 -1
- package/lib/components/screens/controls/components/VisualKeyboard3D.js.map +1 -1
- package/lib/components/screens/controls/constants/ControlsConstants.js.map +1 -1
- package/lib/components/screens/controls/hooks/useControlsState.js.map +1 -1
- package/lib/components/screens/endscreen/EndScreen3D.js.map +1 -1
- package/lib/components/screens/endscreen/components/DefeatAnimation3D.js.map +1 -1
- package/lib/components/screens/endscreen/components/MatchStatisticsDisplayOverlayHtml.js.map +1 -1
- package/lib/components/screens/endscreen/components/NavigationButtonsOverlayHtml.js.map +1 -1
- package/lib/components/screens/endscreen/components/PerformanceBreakdownOverlayHtml.js.map +1 -1
- package/lib/components/screens/endscreen/components/PerformanceRatingOverlayHtml.js.map +1 -1
- package/lib/components/screens/endscreen/components/VictoryAnimation3D.js.map +1 -1
- package/lib/components/screens/endscreen/components/WinnerDisplayOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/IntroScreen3D.js +1 -1
- package/lib/components/screens/intro/IntroScreen3D.js.map +1 -1
- package/lib/components/screens/intro/components/AbilityListOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/ArchetypeCardGridOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/ArchetypeCardOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/ArchetypeDisplayOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/EnhancedArchetypeDisplayOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/MenuButtonsOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/MenuSectionOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/StatBarOverlayHtml.js.map +1 -1
- package/lib/components/screens/philosophy/PhilosophyScreen3D.js.map +1 -1
- package/lib/components/screens/training/TrainingScreen3D.js.map +1 -1
- package/lib/components/screens/training/components/AnatomyControlsOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/AnatomyOverlay3D.js.map +1 -1
- package/lib/components/screens/training/components/FootPlacementMarkers3D.js.map +1 -1
- package/lib/components/screens/training/components/FootworkDrillsOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/HitFeedbackEffect3D.js.map +1 -1
- package/lib/components/screens/training/components/TrainingButtonsOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/TrainingControlsOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/TrainingDummy3D.js.map +1 -1
- package/lib/components/screens/training/components/TrainingFeedbackOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/TrainingModeSelectorOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/TrainingStatsOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/VitalPointMarker3D.js.map +1 -1
- package/lib/components/screens/training/components/VitalPointTrainingOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/hud/TrainingBottomHUD.js.map +1 -1
- package/lib/components/screens/training/components/hud/TrainingLeftHUD.js.map +1 -1
- package/lib/components/screens/training/components/hud/TrainingRightHUD.js.map +1 -1
- package/lib/components/screens/training/components/hud/TrainingTopHUD.js.map +1 -1
- package/lib/components/screens/training/hooks/useAttackMovement.js.map +1 -1
- package/lib/components/screens/training/hooks/useTrainingActions.js.map +1 -1
- package/lib/components/screens/training/hooks/useTrainingLayout.js.map +1 -1
- package/lib/components/screens/training/hooks/useTrainingState.js.map +1 -1
- package/lib/components/shared/base/BaseButton.js.map +1 -1
- package/lib/components/shared/base/BaseButtonOverlayHtml.js.map +1 -1
- package/lib/components/shared/base/BasePanel.js.map +1 -1
- package/lib/components/shared/base/BaseText.js.map +1 -1
- package/lib/components/shared/base/useKoreanTheme.js.map +1 -1
- package/lib/components/shared/debug/PerformanceDebugOverlayHtml.js.map +1 -1
- package/lib/components/shared/mobile/ActionButtons.js.map +1 -1
- package/lib/components/shared/mobile/GestureRecognizerPure.js.map +1 -1
- package/lib/components/shared/mobile/HapticController.js.map +1 -1
- package/lib/components/shared/mobile/MobileControlsPure.js.map +1 -1
- package/lib/components/shared/mobile/StanceWheelPure.js.map +1 -1
- package/lib/components/shared/mobile/TouchOptimizer.js.map +1 -1
- package/lib/components/shared/mobile/VirtualDPad.js.map +1 -1
- package/lib/components/shared/three/anatomy/BodySurface.js.map +1 -1
- package/lib/components/shared/three/anatomy/BoneAttachedMuscles.js.map +1 -1
- package/lib/components/shared/three/anatomy/BoneClothing.js.map +1 -1
- package/lib/components/shared/three/anatomy/BoneRenderer.js.map +1 -1
- package/lib/components/shared/three/anatomy/Face3D.js.map +1 -1
- package/lib/components/shared/three/anatomy/Foot3D.js.map +1 -1
- package/lib/components/shared/three/anatomy/Hand3D.js.map +1 -1
- package/lib/components/shared/three/effects/ActionFeedback.js.map +1 -1
- package/lib/components/shared/three/effects/DamageNumbers.js.map +1 -1
- package/lib/components/shared/three/effects/HitEffects3D.js.map +1 -1
- package/lib/components/shared/three/effects/PlayerStateIndicators.js.map +1 -1
- package/lib/components/shared/three/effects/StanceSymbol3D.js.map +1 -1
- package/lib/components/shared/three/effects/StanceTransitionEffect.js.map +1 -1
- package/lib/components/shared/three/effects/VitalPointMarkers3D.js.map +1 -1
- package/lib/components/shared/three/indicators/ElementalColorSystem.js.map +1 -1
- package/lib/components/shared/three/indicators/GuardIndicator.js.map +1 -1
- package/lib/components/shared/three/indicators/HapticFeedback.js.map +1 -1
- package/lib/components/shared/three/indicators/StanceChangeIndicator.js.map +1 -1
- package/lib/components/shared/three/models/Player3DWithTransitions.js.map +1 -1
- package/lib/components/shared/three/models/SkeletalPlayer3D.js.map +1 -1
- package/lib/components/shared/three/optimization/AdaptiveQuality.js.map +1 -1
- package/lib/components/shared/three/scene/AtmosphericParticles3D.js.map +1 -1
- package/lib/components/shared/three/scene/BackgroundScene3D.js.map +1 -1
- package/lib/components/shared/three/scene/CombatArena3D.js.map +1 -1
- package/lib/components/shared/three/scene/KoreanSignage3D.js.map +1 -1
- package/lib/components/shared/three/ui/ArchetypeCard.js.map +1 -1
- package/lib/components/shared/three/ui/BodyPartHealthDisplay.js.map +1 -1
- package/lib/components/shared/three/ui/BreathingIndicator2.js.map +1 -1
- package/lib/components/shared/three/ui/CombatReadinessBar.js.map +1 -1
- package/lib/components/shared/three/ui/ComboCounter.js.map +1 -1
- package/lib/components/shared/three/ui/HealthBar.js.map +1 -1
- package/lib/components/shared/three/ui/KoreanButton.js.map +1 -1
- package/lib/components/shared/three/ui/KoreanPanel.js.map +1 -1
- package/lib/components/shared/three/ui/KoreanText.js.map +1 -1
- package/lib/components/shared/three/ui/MenuList.js.map +1 -1
- package/lib/components/shared/three/ui/PlayerHUD.js.map +1 -1
- package/lib/components/shared/three/ui/ProgressBar.js.map +1 -1
- package/lib/components/shared/three/ui/SpeedIndicatorHUD.js.map +1 -1
- package/lib/components/shared/three/ui/StaminaBar.js.map +1 -1
- package/lib/components/shared/three/ui/TechniqueBar.js.map +1 -1
- package/lib/components/shared/three/ui/TechniqueCard.js.map +1 -1
- package/lib/components/shared/three/ui/VitalPointOverlayControlsHtml.js.map +1 -1
- package/lib/components/shared/ui/BackButton.js.map +1 -1
- package/lib/components/shared/ui/BaseHUDContainer.js.map +1 -1
- package/lib/components/shared/ui/CombatTimer.js.map +1 -1
- package/lib/components/shared/ui/ErrorModal.js.map +1 -1
- package/lib/components/shared/ui/LoadingState.js.map +1 -1
- package/lib/components/shared/ui/SplashScreen.js +2 -2
- package/lib/components/shared/ui/SplashScreen.js.map +1 -1
- package/lib/components/shared/ui/VitalPointOverlayControlsPure.js.map +1 -1
- package/lib/components/shared/ui/VolumeControl.js.map +1 -1
- package/lib/components/shared/ui/shared/ConfirmDialog.js.map +1 -1
- package/lib/components/ui/combat/BalanceIndicatorOverlayHtml.js.map +1 -1
- package/lib/constants/bodyDimensions.js.map +1 -1
- package/lib/constants/bodyRenderingConstants.js.map +1 -1
- package/lib/data/archetypeClothing.js.map +1 -1
- package/lib/data/archetypePhysicalAttributes.js.map +1 -1
- package/lib/data/techniqueMappings.js.map +1 -1
- package/lib/data/techniques.js.map +1 -1
- package/lib/hooks/useActionFeedback.js.map +1 -1
- package/lib/hooks/useBalanceAnimations.js.map +1 -1
- package/lib/hooks/useCombatTimer.js.map +1 -1
- package/lib/hooks/useDebounce.js.map +1 -1
- package/lib/hooks/useHUDLayout.js.map +1 -1
- package/lib/hooks/useHandPoseTransitions.js.map +1 -1
- package/lib/hooks/useKeyboardControls.js.map +1 -1
- package/lib/hooks/useMatchCountdown.js.map +1 -1
- package/lib/hooks/useMuscleActivation.js.map +1 -1
- package/lib/hooks/usePauseMenu.js.map +1 -1
- package/lib/hooks/usePlayerAnimation.js.map +1 -1
- package/lib/hooks/useResponsiveLayout.js.map +1 -1
- package/lib/hooks/useRoundTransition.js.map +1 -1
- package/lib/hooks/useSkeletalAnimation.js.map +1 -1
- package/lib/hooks/useTechniqueSelection.js.map +1 -1
- package/lib/hooks/useThrottle.js.map +1 -1
- package/lib/hooks/useTouchControls.js.map +1 -1
- package/lib/hooks/useWebGLContextLossHandler.js.map +1 -1
- package/lib/hooks/useWindowSize.js.map +1 -1
- package/lib/systems/CombatSystem.js.map +1 -1
- package/lib/systems/EffectCalculator.js.map +1 -1
- package/lib/systems/LayoutSystem.js.map +1 -1
- package/lib/systems/PlayerEffectManager.js.map +1 -1
- package/lib/systems/ResponsiveScaling.js.map +1 -1
- package/lib/systems/TrigramSystem.js.map +1 -1
- package/lib/systems/VitalPointSystem.js.map +1 -1
- package/lib/systems/ai/AIPersonality.js.map +1 -1
- package/lib/systems/ai/AdaptiveDifficulty.js.map +1 -1
- package/lib/systems/ai/ArchetypeEnforcer.js.map +1 -1
- package/lib/systems/ai/ComboSystem.js.map +1 -1
- package/lib/systems/ai/DecisionTree.js.map +1 -1
- package/lib/systems/ai/TrainingAI.js.map +1 -1
- package/lib/systems/ai/types.js.map +1 -1
- package/lib/systems/animation/builders/AnimationBuilder.js.map +1 -1
- package/lib/systems/animation/builders/HandPoseApplicator.js.map +1 -1
- package/lib/systems/animation/builders/HandPoses.js.map +1 -1
- package/lib/systems/animation/builders/KeyframeConfig.js.map +1 -1
- package/lib/systems/animation/builders/KeyframeInterpolation.js +3 -90
- package/lib/systems/animation/builders/KeyframeInterpolation.js.map +1 -1
- package/lib/systems/animation/builders/KickPhaseApplicator.js.map +1 -1
- package/lib/systems/animation/builders/KoreanGuardPositions.js.map +1 -1
- package/lib/systems/animation/builders/MartialArtsAnimationBuilder.js.map +1 -1
- package/lib/systems/animation/builders/MartialArtsConstants.js.map +1 -1
- package/lib/systems/animation/builders/MartialPoseApplicator.js.map +1 -1
- package/lib/systems/animation/builders/PunchPhaseApplicator.js.map +1 -1
- package/lib/systems/animation/builders/SkeletonRig.js.map +1 -1
- package/lib/systems/animation/builders/TrigramGuardApplicator.js.map +1 -1
- package/lib/systems/animation/catalogs/DefensiveAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/FootworkSkeletalAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/RecoveryAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/StanceAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/StanceAttackAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/StanceGuardPoses.js.map +1 -1
- package/lib/systems/animation/catalogs/StanceIdleAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/StanceLocomotionAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/StepSkeletalAnimations.js.map +1 -1
- package/lib/systems/animation/core/AnimationHitTiming.js.map +1 -1
- package/lib/systems/animation/core/AnimationOptimizations.js.map +1 -1
- package/lib/systems/animation/core/AnimationPriority.js.map +1 -1
- package/lib/systems/animation/core/AnimationRegistry.js.map +1 -1
- package/lib/systems/animation/core/AnimationStateMachine.js.map +1 -1
- package/lib/systems/animation/core/AnimationTransitions.js.map +1 -1
- package/lib/systems/animation/core/LateralityTransform.js.map +1 -1
- package/lib/systems/animation/core/RecoveryPhaseEnhancer.js.map +1 -1
- package/lib/systems/animation/core/TechniqueAnimationMapper.js.map +1 -1
- package/lib/systems/animation/core/TechniqueAnimationMapping.js.map +1 -1
- package/lib/systems/animation/core/types.js.map +1 -1
- package/lib/systems/animation/systems/AdvancedJointMovements.js.map +1 -1
- package/lib/systems/animation/systems/BodyFacingSystem.js.map +1 -1
- package/lib/systems/animation/systems/FacialExpressions.js.map +1 -1
- package/lib/systems/animation/systems/FallAnimations.js.map +1 -1
- package/lib/systems/animation/systems/MuscleActivation.js.map +1 -1
- package/lib/systems/bodypart/BodyPartDamageIntegration.js.map +1 -1
- package/lib/systems/bodypart/BodyPartHealthSystem.js.map +1 -1
- package/lib/systems/bodypart/BodyPartPositionMapping.js.map +1 -1
- package/lib/systems/bodypart/CombatInjuryIntegration.js.map +1 -1
- package/lib/systems/bodypart/InjuryIntegration.js.map +1 -1
- package/lib/systems/bodypart/InjuryTracker.js.map +1 -1
- package/lib/systems/bodypart/MovementPenaltySystem.js.map +1 -1
- package/lib/systems/bodypart/PlayerInjuryTrackingManager.js.map +1 -1
- package/lib/systems/bodypart/types.js.map +1 -1
- package/lib/systems/breathing/BreathingDisruptionSystem.js.map +1 -1
- package/lib/systems/breathing/feedback.js.map +1 -1
- package/lib/systems/breathing/integration.js.map +1 -1
- package/lib/systems/combat/BalanceSystem.js.map +1 -1
- package/lib/systems/combat/BreakingStatusEffects.js.map +1 -1
- package/lib/systems/combat/CombatStateSystem.js.map +1 -1
- package/lib/systems/combat/ConsciousnessSystem.js.map +1 -1
- package/lib/systems/combat/FallIntegration.js.map +1 -1
- package/lib/systems/combat/GrappleSystem.js.map +1 -1
- package/lib/systems/combat/LimbExposureSystem.js.map +1 -1
- package/lib/systems/combat/PainResponseSystem.js.map +1 -1
- package/lib/systems/combat/TrainingCombatSystem.js.map +1 -1
- package/lib/systems/combat/painConsciousnessUtils.js.map +1 -1
- package/lib/systems/combat/typeGuards.js.map +1 -1
- package/lib/systems/effects.js.map +1 -1
- package/lib/systems/game.js.map +1 -1
- package/lib/systems/movement/InjuryMovementModifier.js.map +1 -1
- package/lib/systems/movement/helpers/AccelerationUpdater.js.map +1 -1
- package/lib/systems/movement/helpers/accelerationUtils.js.map +1 -1
- package/lib/systems/movement/integration.js.map +1 -1
- package/lib/systems/physics/AttackMovementPhysics.js.map +1 -1
- package/lib/systems/physics/CollisionDetection.js.map +1 -1
- package/lib/systems/physics/CoordinateMapper.js.map +1 -1
- package/lib/systems/physics/KnockbackPhysics.js.map +1 -1
- package/lib/systems/physics/MovementPhysics.js.map +1 -1
- package/lib/systems/physics/PhysicalReachCalculator.js.map +1 -1
- package/lib/systems/physics/SpeedModifierSystem.js.map +1 -1
- package/lib/systems/trigram/KoreanCulture.js.map +1 -1
- package/lib/systems/trigram/KoreanTechniques.js.map +1 -1
- package/lib/systems/trigram/StanceManager.js.map +1 -1
- package/lib/systems/trigram/TransitionCalculator.js.map +1 -1
- package/lib/systems/trigram/TrigramCalculator.js.map +1 -1
- package/lib/systems/trigram/techniques/DarkOpsTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/GamTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/GanTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/GonTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/SonTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/TechniqueConfig.js.map +1 -1
- package/lib/systems/trigram/techniques/index.js.map +1 -1
- package/lib/systems/trigram/types/GonTechniqueExtensions.js.map +1 -1
- package/lib/systems/trigram/types.js.map +1 -1
- package/lib/systems/types.js.map +1 -1
- package/lib/systems/vitalpoint/DamageCalculator.js.map +1 -1
- package/lib/systems/vitalpoint/HitDetection.js.map +1 -1
- package/lib/systems/vitalpoint/KoreanAnatomy.js.map +1 -1
- package/lib/systems/vitalpoint/KoreanVitalPoints.js.map +1 -1
- package/lib/systems/vitalpoint/MeridianVitalPointMapping.js.map +1 -1
- package/lib/types/AccessibilityTypes.js.map +1 -1
- package/lib/types/PhysicsTypes.js.map +1 -1
- package/lib/types/common.js.map +1 -1
- package/lib/types/constants/colors.js.map +1 -1
- package/lib/types/constants/designSystem.js.map +1 -1
- package/lib/types/constants/layout.js.map +1 -1
- package/lib/types/constants/performance.js.map +1 -1
- package/lib/types/constants/typography.js.map +1 -1
- package/lib/types/facial.js.map +1 -1
- package/lib/types/hand-animation.js.map +1 -1
- package/lib/types/injury.js.map +1 -1
- package/lib/types/physics.js.map +1 -1
- package/lib/types/skeletal.js.map +1 -1
- package/lib/types/techniqueId.js.map +1 -1
- package/lib/utils/accessibility.js.map +1 -1
- package/lib/utils/arenaWorldDimensions.js.map +1 -1
- package/lib/utils/assetConfig.js.map +1 -1
- package/lib/utils/characterScaling.js.map +1 -1
- package/lib/utils/colorHelpers.js.map +1 -1
- package/lib/utils/colorUtils.js.map +1 -1
- package/lib/utils/combatReadiness.js.map +1 -1
- package/lib/utils/controlMapping.js.map +1 -1
- package/lib/utils/deviceDetection.js.map +1 -1
- package/lib/utils/effectUtils.js.map +1 -1
- package/lib/utils/fabricTextures.js.map +1 -1
- package/lib/utils/hapticFeedback.js.map +1 -1
- package/lib/utils/haptics.js.map +1 -1
- package/lib/utils/htmlOverlayHelpers.js.map +1 -1
- package/lib/utils/inputSystem.js.map +1 -1
- package/lib/utils/koreanThemeHelpers.js.map +1 -1
- package/lib/utils/math.js.map +1 -1
- package/lib/utils/mobileLayoutHelpers.js.map +1 -1
- package/lib/utils/mobileUIUtils.js.map +1 -1
- package/lib/utils/performance/PerformanceMonitor.js.map +1 -1
- package/lib/utils/performance/PerformanceOverlay3D.js.map +1 -1
- package/lib/utils/performance/usePerformanceMonitor.js.map +1 -1
- package/lib/utils/performanceOptimization.js.map +1 -1
- package/lib/utils/player3DHelpers.js.map +1 -1
- package/lib/utils/playerUtils.js.map +1 -1
- package/lib/utils/responsiveLayout.js.map +1 -1
- package/lib/utils/responsiveLayoutHelpers.js.map +1 -1
- package/lib/utils/responsiveOrientationConstants.js.map +1 -1
- package/lib/utils/safeAreaUtils.js.map +1 -1
- package/lib/utils/sharedPhysicsConfig.js.map +1 -1
- package/lib/utils/skeletonScaling.js.map +1 -1
- package/lib/utils/stanceHelpers.js.map +1 -1
- package/lib/utils/threeObjectPool.js.map +1 -1
- package/lib/utils/visualEffects.js.map +1 -1
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FootworkSkeletalAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/FootworkSkeletalAnimations.ts"],"sourcesContent":["/**\n * Korean Martial Arts Footwork Animations with Skeletal Keyframes (λ³΄λ² μ λλ©μ΄μ
)\n *\n * **PHASE 4 ENHANCEMENT: 95%+ Korean Martial Arts Authenticity**\n *\n * Defines realistic footwork animation sequences for specialized movement patterns:\n * - μ¬λΌμ΄λ μ€ν
(Slide Step): Lead foot moves first, rear follows\n * - μ€μμΉ μ€ν
(Switch Step): Quick stance reversal with hop\n * - λ°μ΄μ€ μ€ν
(Bounce Step): Rhythmic boxing-style bounce\n * - μΌκ° μ΄λ (Triangle Footwork): Three-point angular movement\n * - μν보 (Circular Step): Lateral movement maintaining guard\n * - λ―ΈλλΌλ³΄ (Glide Step): Both feet move together smoothly\n * - μΆμ‘±νμ (Pivot Step): Ball-of-foot rotation\n * - μμ보 (Shuffle): Quick micro-adjustments\n *\n * Korean Martial Arts Footwork Principles Applied:\n * - λλ€λ° (Didimbal): Stepping foot mechanics with proper heel/ball placement\n * - μΆλ° (Chukbal): Pivot foot stability and balance maintenance\n * - 체μ€μ΄λ (Chejung Idong): Smooth weight transfer between feet\n * - μ€μ¬μ΄λ (Jungsim Idong): Center of mass movement coordination\n * - 보λ²μ λ¦¬λ¬ (Bobeop-ui Rhythm): Rhythmic footwork patterns from boxing\n *\n * @module systems/animation/FootworkSkeletalAnimations\n * @category Animation System\n * @korean 보λ²μ λλ©μ΄μ
\n */\n\nimport type { SkeletalAnimation } from \"@/types/skeletal\";\nimport { BoneName } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\nimport { toRadians } from \"@/utils/math\";\n\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n// CIRCULAR STEP ANIMATIONS (μν보) - Lateral circular footwork\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\n/**\n * CIRCULAR STEP LEFT Animation (μν보 μ’)\n *\n * **Korean Martial Arts Principle**: μν μΈ‘λ©΄ μ΄λ (Circular lateral movement)\n *\n * Creates angle by moving laterally in an arc:\n * 1. Both feet move in synchronized circular pattern\n * 2. Maintains guard and balance throughout\n * 3. Creates angle advantage for counter-striking\n * 4. Common in Taekyon and Hapkido for off-line positioning\n *\n * **Tactical Use**: Circle to opponent's weak side\n *\n * @korean μν보μ’μ λλ©μ΄μ
\n */\nexport const FOOTWORK_CIRCULAR_LEFT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_circular_left\", \"μν보 μ’\")\n .asMovement(0.3)\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Begin circular arc left (μνΈ μμ)\n .at(0.1, \"ease-out\")\n .position(BoneName.PELVIS, -0.08, -0.01, 0.05) // Arc pattern\n .rotate(BoneName.PELVIS, 0, toRadians(5), toRadians(3))\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Mid-arc (μνΈ μ€κ°)\n .at(0.2, \"linear\")\n .position(BoneName.PELVIS, -0.2, 0, 0.08) // Peak of arc\n .rotate(BoneName.PELVIS, 0, toRadians(8), toRadians(5))\n .rotate(BoneName.SPINE_LOWER, 0, toRadians(-4), 0) // Counter-rotate upper body\n .done<MartialArtsAnimationBuilder>()\n // Complete circle (μ μμ±)\n .at(0.3, \"ease-in\")\n .position(BoneName.PELVIS, -0.25, 0, 0.1) // Final position\n .rotate(BoneName.PELVIS, 0, 0, 0) // Reset rotation\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * CIRCULAR STEP RIGHT Animation (μν보 μ°)\n *\n * **Korean Martial Arts Principle**: μν μΈ‘λ©΄ μ΄λ (Circular lateral movement)\n *\n * Mirror of left circular step for right lateral arc movement.\n *\n * @korean μν보μ°μ λλ©μ΄μ
\n */\nexport const FOOTWORK_CIRCULAR_RIGHT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_circular_right\", \"μν보 μ°\")\n .asMovement(0.3)\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Begin circular arc right (μνΈ μμ)\n .at(0.1, \"ease-out\")\n .position(BoneName.PELVIS, 0.08, -0.01, 0.05) // Arc pattern\n .rotate(BoneName.PELVIS, 0, toRadians(-5), toRadians(-3))\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Mid-arc (μνΈ μ€κ°)\n .at(0.2, \"linear\")\n .position(BoneName.PELVIS, 0.2, 0, 0.08) // Peak of arc\n .rotate(BoneName.PELVIS, 0, toRadians(-8), toRadians(-5))\n .rotate(BoneName.SPINE_LOWER, 0, toRadians(4), 0) // Counter-rotate upper body\n .done<MartialArtsAnimationBuilder>()\n // Complete circle (μ μμ±)\n .at(0.3, \"ease-in\")\n .position(BoneName.PELVIS, 0.25, 0, 0.1) // Final position\n .rotate(BoneName.PELVIS, 0, 0, 0) // Reset rotation\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n// SLIDE STEP ANIMATIONS (λ―ΈλλΌλ³΄) - Lead foot moves, rear follows\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\n/**\n * SLIDE STEP FORWARD Animation (λ―ΈλλΌλ³΄ μ )\n *\n * **Korean Martial Arts Principle**: λλ€λ° μ ν μ΄λ (Lead foot advances first)\n *\n * Authentic boxing/Korean martial arts slide step where:\n * 1. Lead foot (left) lifts and advances 30cm forward\n * 2. Weight transfers to lead foot\n * 3. Rear foot (right) slides forward to maintain stance width\n * 4. Guard maintained throughout - no telegraphing\n *\n * **Weight Transfer Mechanics** (체μ€μ΄λ μ리):\n * - Phase 1 (0-0.05s): Weight shifts to rear foot, lead foot lifts (μ€λΉ)\n * - Phase 2 (0.05-0.12s): Lead foot extends forward, heel-first landing (μ΄λ)\n * - Phase 3 (0.12-0.18s): Weight transfers to lead, rear foot slides (μ°©μ§)\n * - Phase 4 (0.18-0.2s): Stance width restored, balanced (μμ )\n *\n * **Distance**: 30cm forward | **Duration**: 200ms (12 frames @ 60fps)\n * **Maintains**: Stance width, guard position, forward-facing orientation\n *\n * @korean λ―ΈλλΌλ³΄μ μ λλ©μ΄μ
\n */\nexport const FOOTWORK_SLIDE_FORWARD_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_slide_forward\", \"λ―ΈλλΌλ³΄ μ \")\n .asMovement(0.2)\n // Initial stance - balanced position\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0) // Front knee slight bend\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0) // Back knee more bent\n .done<MartialArtsAnimationBuilder>()\n // Phase 1: Weight shift to rear, lead foot lightens (μ€λΉ)\n .at(0.03, \"ease-out\")\n .position(BoneName.PELVIS, 0.03, 0, 0.02) // Weight back\n .rotate(BoneName.KNEE_R, toRadians(-15), 0, 0) // Rear knee bends more\n .rotate(BoneName.KNEE_L, toRadians(-5), 0, 0) // Lead knee straightens\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Lead foot lifts and extends (μ΄λ - λλ€λ°)\n .at(0.08, \"linear\")\n .position(BoneName.PELVIS, 0.02, -0.01, 0.08) // Forward, slight drop\n .rotate(BoneName.HIP_L, toRadians(-20), 0, 0) // Lead hip lifts\n .rotate(BoneName.KNEE_L, toRadians(-25), 0, 0) // Lead knee lifts\n .rotate(BoneName.FOOT_L, toRadians(20), 0, 0) // Toe up, heel ready\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Lead foot lands, weight begins transfer (μ°©μ§)\n .at(0.14, \"ease-in\")\n .position(BoneName.PELVIS, 0, -0.015, 0.2) // Forward on lead foot\n .rotate(BoneName.HIP_L, toRadians(-10), 0, 0) \n .rotate(BoneName.KNEE_L, toRadians(-12), 0, 0) // Lead accepts weight\n .rotate(BoneName.FOOT_L, toRadians(5), 0, 0) // Foot rolling flat\n .rotate(BoneName.KNEE_R, toRadians(-8), 0, 0) // Rear lightens\n .done<MartialArtsAnimationBuilder>()\n // Final: Balanced stance restored\n .at(0.2, \"ease-in\")\n .position(BoneName.PELVIS, 0, 0, 0.3) // Final forward position\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0) // Balanced\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0) // Balanced\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * SLIDE STEP BACKWARD Animation (λ―ΈλλΌλ³΄ ν)\n *\n * **Korean Martial Arts Principle**: νν΄ μ μ ν μ΄λ (Rear foot retreats first)\n *\n * Defensive retreat maintaining stance and guard:\n * 1. Rear foot (right) lifts and moves 30cm backward\n * 2. Weight transfers to rear foot (ball-of-foot landing)\n * 3. Lead foot (left) slides backward to maintain stance width\n * 4. Eyes stay on opponent, guard up\n *\n * **Weight Transfer**: Lead foot β Rear foot β Balanced\n * **Landing**: Ball-of-foot first (unlike forward heel-first)\n *\n * @korean λ―ΈλλΌλ³΄νμ λλ©μ΄μ
\n */\nexport const FOOTWORK_SLIDE_BACK_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_slide_back\", \"λ―ΈλλΌλ³΄ ν\")\n .asMovement(0.2)\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Weight shift to lead foot (μ€λΉ)\n .at(0.03, \"ease-out\")\n .position(BoneName.PELVIS, -0.03, 0, -0.02) // Weight forward\n .rotate(BoneName.KNEE_L, toRadians(-15), 0, 0) // Lead accepts weight\n .rotate(BoneName.KNEE_R, toRadians(-5), 0, 0) // Rear lightens\n .done<MartialArtsAnimationBuilder>()\n // Rear foot lifts and extends back (μ΄λ)\n .at(0.08, \"linear\")\n .position(BoneName.PELVIS, -0.02, -0.01, -0.08) // Backward\n .rotate(BoneName.HIP_R, toRadians(18), 0, 0) // Rear hip extends\n .rotate(BoneName.KNEE_R, toRadians(-20), 0, 0) // Rear knee lifts slightly\n .rotate(BoneName.FOOT_R, toRadians(-15), 0, 0) // Ball of foot ready\n .done<MartialArtsAnimationBuilder>()\n // Rear foot lands on ball, weight transfers (μ°©μ§)\n .at(0.14, \"ease-in\")\n .position(BoneName.PELVIS, 0, -0.015, -0.2) // Backward on rear foot\n .rotate(BoneName.HIP_R, toRadians(8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-12), 0, 0) // Rear accepts weight\n .rotate(BoneName.FOOT_R, toRadians(-8), 0, 0) // Heel settling\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0) // Lead lightens\n .done<MartialArtsAnimationBuilder>()\n // Final position\n .at(0.2, \"ease-in\")\n .position(BoneName.PELVIS, 0, 0, -0.3) // Final rear position\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n// SLIDE STEP ANIMATIONS (λ―ΈλλΌλ³΄) - Lateral Movement\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\n/**\n * SLIDE STEP LEFT Animation (λ―ΈλλΌλ³΄ μ’)\n *\n * **Korean Martial Arts Principle**: μΈ‘λ©΄ μ ν μ΄λ (Lateral lead foot movement)\n *\n * Creates angle advantage while maintaining forward guard:\n * 1. Left foot slides 25cm lateral left\n * 2. Weight shifts left while maintaining balance\n * 3. Right foot follows to restore stance width\n * 4. Pelvis rotates slightly, spine counter-rotates to keep guard forward\n *\n * **Tactical Advantage**: Off-line positioning, angle creation\n *\n * @korean λ―ΈλλΌλ³΄μ’μ λλ©μ΄μ
\n */\nexport const FOOTWORK_SLIDE_LEFT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_slide_left\", \"λ―ΈλλΌλ³΄ μ’\")\n .asMovement(0.2)\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Weight shifts right (μ€λΉ)\n .at(0.05, \"ease-out\")\n .position(BoneName.PELVIS, 0.04, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, toRadians(3)) // Tilt right\n .rotate(BoneName.KNEE_R, toRadians(-12), 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-5), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Left foot slides lateral (μ΄λ)\n .at(0.1, \"linear\")\n .position(BoneName.PELVIS, -0.08, -0.01, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(5), toRadians(5)) // Hip engages\n .rotate(BoneName.SPINE_LOWER, 0, toRadians(-3), 0) // Counter-rotate\n .done<MartialArtsAnimationBuilder>()\n // Weight transfers to left (μ°©μ§)\n .at(0.15, \"ease-in\")\n .position(BoneName.PELVIS, -0.2, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-8), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Final position (μμ )\n .at(0.2, \"ease-in\")\n .position(BoneName.PELVIS, -0.25, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, 0) // Return neutral\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard forward\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * SLIDE STEP RIGHT Animation (λ―ΈλλΌλ³΄ μ°)\n *\n * **Korean Martial Arts Principle**: μΈ‘λ©΄ μ ν μ΄λ (Lateral lead foot movement)\n *\n * Mirror of left slide step for right lateral movement.\n *\n * @korean λ―ΈλλΌλ³΄μ°μ λλ©μ΄μ
\n */\nexport const FOOTWORK_SLIDE_RIGHT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_slide_right\", \"λ―ΈλλΌλ³΄ μ°\")\n .asMovement(0.2)\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Weight shifts left (μ€λΉ)\n .at(0.05, \"ease-out\")\n .position(BoneName.PELVIS, -0.04, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, toRadians(-3))\n .rotate(BoneName.KNEE_L, toRadians(-12), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-5), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Right foot slides lateral (μ΄λ)\n .at(0.1, \"linear\")\n .position(BoneName.PELVIS, 0.08, -0.01, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(-5), toRadians(-5))\n .rotate(BoneName.SPINE_LOWER, 0, toRadians(3), 0)\n .done<MartialArtsAnimationBuilder>()\n // Weight transfers to right (μ°©μ§)\n .at(0.15, \"ease-in\")\n .position(BoneName.PELVIS, 0.2, 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Final position (μμ )\n .at(0.2, \"ease-in\")\n .position(BoneName.PELVIS, 0.25, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n// SWITCH STEP ANIMATION (μ€μμΉ μ€ν
) - Stance Reversal\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\n/**\n * SWITCH STEP Animation (μ€μμΉ μ€ν
)\n *\n * **Korean Martial Arts Principle**: λ°λ°κΏ λμ½ (Foot-exchange hop)\n *\n * Quick stance reversal used to confuse opponent or change angles:\n * 1. Small hop off ground with both feet\n * 2. Feet exchange positions mid-air (lead becomes rear, rear becomes lead)\n * 3. Land with opposite foot forward\n * 4. Brief moment of vulnerability during hop\n *\n * **Weight Transfer**: Balanced β Airborne β Reversed stance\n * **Duration**: 280ms (fast for rhythm disruption)\n * **Tactical Use**: Feint opponent's timing, switch power side\n *\n * **Momentary Vulnerability**: During hop, cannot defend or attack\n *\n * @korean μ€μμΉμ€ν
μ λλ©μ΄μ
\n */\nexport const FOOTWORK_SWITCH_STEP_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_switch_step\", \"μ€μμΉ μ€ν
\")\n .asMovement(0.28)\n // Initial stance - left foot forward\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Crouch preparation for hop (μ€λΉ)\n .at(0.05, \"ease-out\")\n .position(BoneName.PELVIS, 0, -0.03, 0) // Drop for spring\n .rotate(BoneName.KNEE_L, toRadians(-20), 0, 0) // Deep crouch\n .rotate(BoneName.KNEE_R, toRadians(-22), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Explosive hop - both feet leave ground (λμ½)\n .at(0.1, \"ease-out\")\n .position(BoneName.PELVIS, 0, 0.05, 0) // Airborne\n .rotate(BoneName.KNEE_L, toRadians(-15), 0, 0) // Legs partially extend\n .rotate(BoneName.KNEE_R, toRadians(-18), 0, 0)\n .rotate(BoneName.HIP_L, toRadians(5), 0, 0) // Begin rotation\n .rotate(BoneName.HIP_R, toRadians(-5), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Mid-air - feet exchange (κ³΅μ€ κ΅ν)\n .at(0.15, \"linear\")\n .position(BoneName.PELVIS, 0, 0.04, 0) // Peak of hop\n .rotate(BoneName.PELVIS, 0, toRadians(15), 0) // Body rotates\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Landing - right foot now forward (μ°©μ§)\n .at(0.2, \"ease-in\")\n .position(BoneName.PELVIS, 0, -0.02, 0) // Impact absorption\n .rotate(BoneName.PELVIS, 0, toRadians(25), 0) // Rotation continues\n .rotate(BoneName.KNEE_R, toRadians(-18), 0, 0) // Right knee bends\n .rotate(BoneName.KNEE_L, toRadians(-20), 0, 0) // Left knee bends\n .done<MartialArtsAnimationBuilder>()\n // Stabilization - reversed stance (μμ )\n .at(0.25, \"ease-in\")\n .position(BoneName.PELVIS, 0, -0.01, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(30), 0) // Complete rotation\n .rotate(BoneName.KNEE_R, toRadians(-8), 0, 0) // Now lead foot\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0) // Now rear foot\n .done<MartialArtsAnimationBuilder>()\n // Final - stable reversed stance\n .at(0.28, \"ease-in\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(30), 0)\n .rotate(BoneName.KNEE_R, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n// BOUNCE STEP ANIMATION (λ°μ΄μ€ μ€ν
) - Rhythmic Movement\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\n/**\n * BOUNCE STEP Animation (λ°μ΄μ€ μ€ν
)\n *\n * **Korean Martial Arts Principle**: λ¦¬λ¬ λ³΄λ² (Rhythmic footwork)\n *\n * Light bouncing movement on balls of feet from boxing:\n * 1. Constant up-down bouncing motion\n * 2. Weight on balls of feet, heels slightly elevated\n * 3. Creates rhythm that's harder for opponent to time\n * 4. Energy efficient - small bounces, not jumps\n *\n * **Weight Distribution**: Always on balls of feet (μκΏμΉ)\n * **Height Variation**: 2-3cm vertical displacement\n * **Frequency**: 2.5 bounces per second (fast rhythm)\n * **Duration**: 400ms for complete bounce cycle\n *\n * **Tactical Advantage**: \n * - Unpredictable timing\n * - Faster reaction time from active stance\n * - Harder to time attacks against\n *\n * @korean λ°μ΄μ€μ€ν
μ λλ©μ΄μ
\n */\nexport const FOOTWORK_BOUNCE_STEP_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_bounce_step\", \"λ°μ΄μ€ μ€ν
\")\n .asMovement(0.4)\n // Start on balls of feet (μ€λΉ)\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0.01, 0) // Slightly elevated\n .rotate(BoneName.KNEE_L, toRadians(-5), 0, 0) // Slight bend\n .rotate(BoneName.KNEE_R, toRadians(-7), 0, 0)\n .rotate(BoneName.FOOT_L, toRadians(-10), 0, 0) // Heel up\n .rotate(BoneName.FOOT_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // First bounce down (1μ°¨ λ°μ΄μ€ νκ°)\n .at(0.08, \"ease-in\")\n .position(BoneName.PELVIS, 0, -0.01, 0)\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0) // Knees absorb\n .rotate(BoneName.KNEE_R, toRadians(-12), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // First bounce up (1μ°¨ λ°μ΄μ€ μμΉ)\n .at(0.16, \"ease-out\")\n .position(BoneName.PELVIS, 0, 0.02, 0.05) // Slight forward drift\n .rotate(BoneName.KNEE_L, toRadians(-5), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-7), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Second bounce down (2μ°¨ λ°μ΄μ€ νκ°)\n .at(0.24, \"ease-in\")\n .position(BoneName.PELVIS, 0, -0.01, 0.08)\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-12), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Second bounce up (2μ°¨ λ°μ΄μ€ μμΉ)\n .at(0.32, \"ease-out\")\n .position(BoneName.PELVIS, 0, 0.02, 0.12)\n .rotate(BoneName.KNEE_L, toRadians(-5), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-7), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Final position - ready for next bounce (μ΅μ’
μμΉ)\n .at(0.4, \"ease-in\")\n .position(BoneName.PELVIS, 0, 0.01, 0.15)\n .rotate(BoneName.KNEE_L, toRadians(-7), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-9), 0, 0)\n .rotate(BoneName.FOOT_L, toRadians(-10), 0, 0) // Still on balls\n .rotate(BoneName.FOOT_R, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n// TRIANGLE FOOTWORK ANIMATION (μΌκ° μ΄λ) - Advanced Angles\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\n/**\n * TRIANGLE FOOTWORK Animation (μΌκ° μ΄λ)\n *\n * **Korean Martial Arts Principle**: μΌκ° μ§λ² (Triangle tactical positioning)\n *\n * Advanced footwork creating tactical angles through three-point movement:\n * 1. Step forward-left at 45Β° (Point 1)\n * 2. Pivot on lead foot (Point 2)\n * 3. Step lateral-left to complete triangle (Point 3)\n * 4. Results in off-angle position with opponent exposed\n *\n * **Tactical Geometry**:\n * - Creates 90Β° angle from original position\n * - Off-line from opponent's centerline\n * - Opens attack angles to opponent's side\n * - Defensive value: harder to hit\n *\n * **Duration**: 650ms (requires precision)\n * **Distance**: 40cm total displacement (diagonal pattern)\n *\n * @korean μΌκ°μ΄λμ λλ©μ΄μ
\n */\nexport const FOOTWORK_TRIANGLE_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_triangle\", \"μΌκ° μ΄λ\")\n .asMovement(0.65)\n // Initial stance\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Point 1: Step forward-left at 45Β° (1λ² μ§μ - μ μ’ 45Β°)\n .at(0.15, \"ease-out\")\n .position(BoneName.PELVIS, -0.12, -0.01, 0.12) // Diagonal forward-left\n .rotate(BoneName.PELVIS, 0, toRadians(-10), 0) // Slight body turn\n .rotate(BoneName.KNEE_L, toRadians(-12), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Point 2: Pivot on lead foot (2λ² μ§μ - μΆλ° νμ )\n .at(0.35, \"linear\")\n .position(BoneName.PELVIS, -0.15, -0.015, 0.15)\n .rotate(BoneName.PELVIS, 0, toRadians(-35), 0) // Pivot 45Β° more\n .rotate(BoneName.SPINE_LOWER, 0, toRadians(15), 0) // Counter-rotate upper body\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0) // Pivot foot stable\n .rotate(BoneName.KNEE_R, toRadians(-8), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Point 3: Step lateral-left to complete triangle (3λ² μ§μ - μ’μΈ‘ μμ±)\n .at(0.5, \"ease-in\")\n .position(BoneName.PELVIS, -0.28, -0.02, 0.12) // Lateral left\n .rotate(BoneName.PELVIS, 0, toRadians(-45), 0) // 90Β° total from start\n .rotate(BoneName.SPINE_LOWER, 0, toRadians(10), 0)\n .rotate(BoneName.KNEE_L, toRadians(-12), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Final: Stabilize in off-angle position (μ΅μ’
μμ ν)\n .at(0.65, \"ease-in\")\n .position(BoneName.PELVIS, -0.3, 0, 0.1) // Final triangle point\n .rotate(BoneName.PELVIS, 0, toRadians(-45), 0) // 90Β° off-line\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0) // Upper body faces forward\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained throughout\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n// PIVOT STEP ANIMATIONS (μΆμ‘±νμ ) - Ball-of-Foot Rotation\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\n/**\n * PIVOT LEFT Animation (μΆμ‘±νμ μ’)\n *\n * **Korean Martial Arts Principle**: μκΏμΉ νμ (Ball-of-foot pivot)\n *\n * 45Β° rotation to the left on planted lead foot:\n * 1. Weight shifts to lead foot (left)\n * 2. Pivot on ball of lead foot\n * 3. Rear foot swings left in arc\n * 4. Upper body rotates with lower, guard maintained\n *\n * **Pivot Mechanics** (νμ μν):\n * - Pivot point: Ball of lead foot (μκΏμΉ)\n * - Weight: 80% on pivot foot during rotation\n * - Arc: Rear foot travels 25cm in arc\n * - Speed: 280ms for smooth 45Β° rotation\n *\n * **Tactical Use**: Quick angle change, evade linear attacks\n *\n * @korean μΆμ‘±νμ μ’μ λλ©μ΄μ
\n */\nexport const FOOTWORK_PIVOT_LEFT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_pivot_left\", \"μΆμ‘±νμ μ’\")\n .asMovement(0.25)\n // Initial stance\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Weight shift to lead foot (pivot preparation) (μ€λΉ)\n .at(0.06, \"ease-out\")\n .position(BoneName.PELVIS, -0.02, -0.01, 0) // Forward onto lead\n .rotate(BoneName.KNEE_L, toRadians(-12), 0, 0) // Lead accepts weight\n .rotate(BoneName.KNEE_R, toRadians(-5), 0, 0) // Rear lightens\n .rotate(BoneName.FOOT_L, toRadians(-8), 0, 0) // Weight on ball\n .done<MartialArtsAnimationBuilder>()\n // Begin pivot - rear foot lifts slightly (νμ μμ)\n .at(0.12, \"linear\")\n .position(BoneName.PELVIS, -0.02, -0.015, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(-15), 0) // Body begins rotation\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0) // Pivot foot stable\n .rotate(BoneName.KNEE_R, toRadians(-8), 0, 0) // Rear foot active\n .rotate(BoneName.HIP_R, toRadians(5), 0, 0) // Rear hip lifts\n .done<MartialArtsAnimationBuilder>()\n // Mid-pivot - maximum rotation speed (νμ κ°μ)\n .at(0.18, \"linear\")\n .position(BoneName.PELVIS, -0.01, -0.02, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(-35), 0) // Fast rotation\n .rotate(BoneName.SPINE_LOWER, 0, toRadians(5), 0) // Slight counter-rotate for balance\n .rotate(BoneName.KNEE_L, toRadians(-12), 0, 0)\n .rotate(BoneName.FOOT_L, toRadians(-10), 0, 0) // Still on ball\n .done<MartialArtsAnimationBuilder>()\n // Complete pivot - rear foot plants (νμ μλ£)\n .at(0.2, \"ease-in\")\n .position(BoneName.PELVIS, 0, -0.015, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(-45), 0) // 45Β° rotation complete\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0) // Body aligned\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0) // Rear foot plants\n .rotate(BoneName.FOOT_L, toRadians(-5), 0, 0) // Pivot foot settling\n .done<MartialArtsAnimationBuilder>()\n // Stabilize in new angle (μμ ν)\n .at(0.25, \"ease-in\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(-45), 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.FOOT_L, 0, 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * PIVOT RIGHT Animation (μΆμ‘±νμ μ°)\n *\n * **Korean Martial Arts Principle**: μκΏμΉ νμ (Ball-of-foot pivot)\n *\n * 45Β° rotation to the right on planted lead foot.\n * Mirror of left pivot mechanics.\n *\n * @korean μΆμ‘±νμ μ°μ λλ©μ΄μ
\n */\nexport const FOOTWORK_PIVOT_RIGHT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_pivot_right\", \"μΆμ‘±νμ μ°\")\n .asMovement(0.25)\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Weight shift to lead foot (μ€λΉ)\n .at(0.06, \"ease-out\")\n .position(BoneName.PELVIS, -0.02, -0.01, 0)\n .rotate(BoneName.KNEE_L, toRadians(-12), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-5), 0, 0)\n .rotate(BoneName.FOOT_L, toRadians(-8), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Begin pivot (νμ μμ)\n .at(0.12, \"linear\")\n .position(BoneName.PELVIS, -0.02, -0.015, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(15), 0) // Right rotation\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-8), 0, 0)\n .rotate(BoneName.HIP_R, toRadians(5), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Mid-pivot (νμ κ°μ)\n .at(0.18, \"linear\")\n .position(BoneName.PELVIS, -0.01, -0.02, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(35), 0)\n .rotate(BoneName.SPINE_LOWER, 0, toRadians(-5), 0)\n .rotate(BoneName.KNEE_L, toRadians(-12), 0, 0)\n .rotate(BoneName.FOOT_L, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Complete pivot (νμ μλ£)\n .at(0.2, \"ease-in\")\n .position(BoneName.PELVIS, 0, -0.015, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(45), 0)\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.FOOT_L, toRadians(-5), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Stabilize (μμ ν)\n .at(0.25, \"ease-in\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(45), 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.FOOT_L, 0, 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n// SHUFFLE STEP ANIMATION (μμ보) - Micro-Adjustments\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\n/**\n * SHUFFLE STEP Animation (μμ보)\n *\n * **Korean Martial Arts Principle**: λ―ΈμΈ μ‘°μ (Micro-position adjustment)\n *\n * Quick 10cm micro-adjustment for positional fine-tuning:\n * 1. Both feet move together in small shuffle\n * 2. Minimal vertical displacement (stay low)\n * 3. Ultra-fast 100ms duration\n * 4. Used for range management and timing adjustments\n *\n * **Characteristics**:\n * - Distance: 10cm (half a foot width)\n * - Duration: 100ms (ultra-fast, 6 frames @ 60fps)\n * - Weight: Remains balanced throughout\n * - Height: Minimal bob (1cm max)\n *\n * **Tactical Use**: \n * - Fine-tune distance without committing\n * - Adjust stance width\n * - Reset rhythm\n * - Feint movement\n *\n * @korean μμ보μ λλ©μ΄μ
\n */\nexport const FOOTWORK_SHUFFLE_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_shuffle\", \"μμ보\")\n .asMovement(0.1)\n // Initial - balanced on both feet\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Slight crouch for shuffle (μ€λΉ)\n .at(0.03, \"ease-out\")\n .position(BoneName.PELVIS, 0, -0.008, 0) // Minimal drop\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-12), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Execute shuffle forward (μ€ν)\n .at(0.07, \"linear\")\n .position(BoneName.PELVIS, 0, -0.01, 0.1) // 10cm forward\n .rotate(BoneName.KNEE_L, toRadians(-9), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-11), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Return to normal height (볡κ·)\n .at(0.1, \"ease-in\")\n .position(BoneName.PELVIS, 0, 0, 0.1) // Final position\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n// ANIMATION COLLECTIONS\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\n/**\n * Map of all footwork animations by name\n *\n * **PHASE 4 ENHANCED**: 95%+ Korean martial arts authenticity\n * All animations now feature:\n * - Detailed weight transfer mechanics (체μ€μ΄λ)\n * - Proper foot placement (λλ€λ°/μΆλ°)\n * - Guard maintenance throughout\n * - Realistic timing and distances\n * - Cultural authenticity with Korean terminology\n *\n * @korean 보λ²μ λλ©μ΄μ
λ§΅\n */\nexport const FOOTWORK_ANIMATIONS = new Map<string, SkeletalAnimation>([\n // Circular Steps (μν보) - Lateral circular movement\n [\"footwork_circular_left\", FOOTWORK_CIRCULAR_LEFT_ANIMATION],\n [\"footwork_circular_right\", FOOTWORK_CIRCULAR_RIGHT_ANIMATION],\n \n // Slide Steps (λ―ΈλλΌλ³΄) - Lead foot moves first\n [\"footwork_slide_forward\", FOOTWORK_SLIDE_FORWARD_ANIMATION],\n [\"footwork_slide_back\", FOOTWORK_SLIDE_BACK_ANIMATION],\n [\"footwork_slide_left\", FOOTWORK_SLIDE_LEFT_ANIMATION],\n [\"footwork_slide_right\", FOOTWORK_SLIDE_RIGHT_ANIMATION],\n \n // Pivot Steps (μΆμ‘±νμ ) - Ball-of-foot rotation\n [\"footwork_pivot_left\", FOOTWORK_PIVOT_LEFT_ANIMATION],\n [\"footwork_pivot_right\", FOOTWORK_PIVOT_RIGHT_ANIMATION],\n \n // Shuffle Step (μμ보) - Micro-adjustments\n [\"footwork_shuffle\", FOOTWORK_SHUFFLE_ANIMATION],\n]);\n\n/**\n * Get footwork animation by name\n *\n * @param animationName - Animation identifier\n * @returns Footwork animation or undefined if not found\n * @korean 보λ²μ λλ©μ΄μ
κ°μ Έμ€κΈ°\n */\nexport function getFootworkAnimation(\n animationName: string\n): SkeletalAnimation | undefined {\n return FOOTWORK_ANIMATIONS.get(animationName);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FootworkSkeletalAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/FootworkSkeletalAnimations.ts"],"sourcesContent":["/**\n * Korean Martial Arts Footwork Animations with Skeletal Keyframes (λ³΄λ² μ λλ©μ΄μ
)\n *\n * **PHASE 4 ENHANCEMENT: 95%+ Korean Martial Arts Authenticity**\n *\n * Defines realistic footwork animation sequences for specialized movement patterns:\n * - μ¬λΌμ΄λ μ€ν
(Slide Step): Lead foot moves first, rear follows\n * - μ€μμΉ μ€ν
(Switch Step): Quick stance reversal with hop\n * - λ°μ΄μ€ μ€ν
(Bounce Step): Rhythmic boxing-style bounce\n * - μΌκ° μ΄λ (Triangle Footwork): Three-point angular movement\n * - μν보 (Circular Step): Lateral movement maintaining guard\n * - λ―ΈλλΌλ³΄ (Glide Step): Both feet move together smoothly\n * - μΆμ‘±νμ (Pivot Step): Ball-of-foot rotation\n * - μμ보 (Shuffle): Quick micro-adjustments\n *\n * Korean Martial Arts Footwork Principles Applied:\n * - λλ€λ° (Didimbal): Stepping foot mechanics with proper heel/ball placement\n * - μΆλ° (Chukbal): Pivot foot stability and balance maintenance\n * - 체μ€μ΄λ (Chejung Idong): Smooth weight transfer between feet\n * - μ€μ¬μ΄λ (Jungsim Idong): Center of mass movement coordination\n * - 보λ²μ λ¦¬λ¬ (Bobeop-ui Rhythm): Rhythmic footwork patterns from boxing\n *\n * @module systems/animation/FootworkSkeletalAnimations\n * @category Animation System\n * @korean 보λ²μ λλ©μ΄μ
\n */\n\nimport type { SkeletalAnimation } from \"@/types/skeletal\";\nimport { BoneName } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\nimport { toRadians } from \"@/utils/math\";\n\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n// CIRCULAR STEP ANIMATIONS (μν보) - Lateral circular footwork\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\n/**\n * CIRCULAR STEP LEFT Animation (μν보 μ’)\n *\n * **Korean Martial Arts Principle**: μν μΈ‘λ©΄ μ΄λ (Circular lateral movement)\n *\n * Creates angle by moving laterally in an arc:\n * 1. Both feet move in synchronized circular pattern\n * 2. Maintains guard and balance throughout\n * 3. Creates angle advantage for counter-striking\n * 4. Common in Taekyon and Hapkido for off-line positioning\n *\n * **Tactical Use**: Circle to opponent's weak side\n *\n * @korean μν보μ’μ λλ©μ΄μ
\n */\nexport const FOOTWORK_CIRCULAR_LEFT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_circular_left\", \"μν보 μ’\")\n .asMovement(0.3)\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Begin circular arc left (μνΈ μμ)\n .at(0.1, \"ease-out\")\n .position(BoneName.PELVIS, -0.08, -0.01, 0.05) // Arc pattern\n .rotate(BoneName.PELVIS, 0, toRadians(5), toRadians(3))\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Mid-arc (μνΈ μ€κ°)\n .at(0.2, \"linear\")\n .position(BoneName.PELVIS, -0.2, 0, 0.08) // Peak of arc\n .rotate(BoneName.PELVIS, 0, toRadians(8), toRadians(5))\n .rotate(BoneName.SPINE_LOWER, 0, toRadians(-4), 0) // Counter-rotate upper body\n .done<MartialArtsAnimationBuilder>()\n // Complete circle (μ μμ±)\n .at(0.3, \"ease-in\")\n .position(BoneName.PELVIS, -0.25, 0, 0.1) // Final position\n .rotate(BoneName.PELVIS, 0, 0, 0) // Reset rotation\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * CIRCULAR STEP RIGHT Animation (μν보 μ°)\n *\n * **Korean Martial Arts Principle**: μν μΈ‘λ©΄ μ΄λ (Circular lateral movement)\n *\n * Mirror of left circular step for right lateral arc movement.\n *\n * @korean μν보μ°μ λλ©μ΄μ
\n */\nexport const FOOTWORK_CIRCULAR_RIGHT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_circular_right\", \"μν보 μ°\")\n .asMovement(0.3)\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Begin circular arc right (μνΈ μμ)\n .at(0.1, \"ease-out\")\n .position(BoneName.PELVIS, 0.08, -0.01, 0.05) // Arc pattern\n .rotate(BoneName.PELVIS, 0, toRadians(-5), toRadians(-3))\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Mid-arc (μνΈ μ€κ°)\n .at(0.2, \"linear\")\n .position(BoneName.PELVIS, 0.2, 0, 0.08) // Peak of arc\n .rotate(BoneName.PELVIS, 0, toRadians(-8), toRadians(-5))\n .rotate(BoneName.SPINE_LOWER, 0, toRadians(4), 0) // Counter-rotate upper body\n .done<MartialArtsAnimationBuilder>()\n // Complete circle (μ μμ±)\n .at(0.3, \"ease-in\")\n .position(BoneName.PELVIS, 0.25, 0, 0.1) // Final position\n .rotate(BoneName.PELVIS, 0, 0, 0) // Reset rotation\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n// SLIDE STEP ANIMATIONS (λ―ΈλλΌλ³΄) - Lead foot moves, rear follows\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\n/**\n * SLIDE STEP FORWARD Animation (λ―ΈλλΌλ³΄ μ )\n *\n * **Korean Martial Arts Principle**: λλ€λ° μ ν μ΄λ (Lead foot advances first)\n *\n * Authentic boxing/Korean martial arts slide step where:\n * 1. Lead foot (left) lifts and advances 30cm forward\n * 2. Weight transfers to lead foot\n * 3. Rear foot (right) slides forward to maintain stance width\n * 4. Guard maintained throughout - no telegraphing\n *\n * **Weight Transfer Mechanics** (체μ€μ΄λ μ리):\n * - Phase 1 (0-0.05s): Weight shifts to rear foot, lead foot lifts (μ€λΉ)\n * - Phase 2 (0.05-0.12s): Lead foot extends forward, heel-first landing (μ΄λ)\n * - Phase 3 (0.12-0.18s): Weight transfers to lead, rear foot slides (μ°©μ§)\n * - Phase 4 (0.18-0.2s): Stance width restored, balanced (μμ )\n *\n * **Distance**: 30cm forward | **Duration**: 200ms (12 frames @ 60fps)\n * **Maintains**: Stance width, guard position, forward-facing orientation\n *\n * @korean λ―ΈλλΌλ³΄μ μ λλ©μ΄μ
\n */\nexport const FOOTWORK_SLIDE_FORWARD_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_slide_forward\", \"λ―ΈλλΌλ³΄ μ \")\n .asMovement(0.2)\n // Initial stance - balanced position\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0) // Front knee slight bend\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0) // Back knee more bent\n .done<MartialArtsAnimationBuilder>()\n // Phase 1: Weight shift to rear, lead foot lightens (μ€λΉ)\n .at(0.03, \"ease-out\")\n .position(BoneName.PELVIS, 0.03, 0, 0.02) // Weight back\n .rotate(BoneName.KNEE_R, toRadians(-15), 0, 0) // Rear knee bends more\n .rotate(BoneName.KNEE_L, toRadians(-5), 0, 0) // Lead knee straightens\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Lead foot lifts and extends (μ΄λ - λλ€λ°)\n .at(0.08, \"linear\")\n .position(BoneName.PELVIS, 0.02, -0.01, 0.08) // Forward, slight drop\n .rotate(BoneName.HIP_L, toRadians(-20), 0, 0) // Lead hip lifts\n .rotate(BoneName.KNEE_L, toRadians(-25), 0, 0) // Lead knee lifts\n .rotate(BoneName.FOOT_L, toRadians(20), 0, 0) // Toe up, heel ready\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Lead foot lands, weight begins transfer (μ°©μ§)\n .at(0.14, \"ease-in\")\n .position(BoneName.PELVIS, 0, -0.015, 0.2) // Forward on lead foot\n .rotate(BoneName.HIP_L, toRadians(-10), 0, 0) \n .rotate(BoneName.KNEE_L, toRadians(-12), 0, 0) // Lead accepts weight\n .rotate(BoneName.FOOT_L, toRadians(5), 0, 0) // Foot rolling flat\n .rotate(BoneName.KNEE_R, toRadians(-8), 0, 0) // Rear lightens\n .done<MartialArtsAnimationBuilder>()\n // Final: Balanced stance restored\n .at(0.2, \"ease-in\")\n .position(BoneName.PELVIS, 0, 0, 0.3) // Final forward position\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0) // Balanced\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0) // Balanced\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * SLIDE STEP BACKWARD Animation (λ―ΈλλΌλ³΄ ν)\n *\n * **Korean Martial Arts Principle**: νν΄ μ μ ν μ΄λ (Rear foot retreats first)\n *\n * Defensive retreat maintaining stance and guard:\n * 1. Rear foot (right) lifts and moves 30cm backward\n * 2. Weight transfers to rear foot (ball-of-foot landing)\n * 3. Lead foot (left) slides backward to maintain stance width\n * 4. Eyes stay on opponent, guard up\n *\n * **Weight Transfer**: Lead foot β Rear foot β Balanced\n * **Landing**: Ball-of-foot first (unlike forward heel-first)\n *\n * @korean λ―ΈλλΌλ³΄νμ λλ©μ΄μ
\n */\nexport const FOOTWORK_SLIDE_BACK_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_slide_back\", \"λ―ΈλλΌλ³΄ ν\")\n .asMovement(0.2)\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Weight shift to lead foot (μ€λΉ)\n .at(0.03, \"ease-out\")\n .position(BoneName.PELVIS, -0.03, 0, -0.02) // Weight forward\n .rotate(BoneName.KNEE_L, toRadians(-15), 0, 0) // Lead accepts weight\n .rotate(BoneName.KNEE_R, toRadians(-5), 0, 0) // Rear lightens\n .done<MartialArtsAnimationBuilder>()\n // Rear foot lifts and extends back (μ΄λ)\n .at(0.08, \"linear\")\n .position(BoneName.PELVIS, -0.02, -0.01, -0.08) // Backward\n .rotate(BoneName.HIP_R, toRadians(18), 0, 0) // Rear hip extends\n .rotate(BoneName.KNEE_R, toRadians(-20), 0, 0) // Rear knee lifts slightly\n .rotate(BoneName.FOOT_R, toRadians(-15), 0, 0) // Ball of foot ready\n .done<MartialArtsAnimationBuilder>()\n // Rear foot lands on ball, weight transfers (μ°©μ§)\n .at(0.14, \"ease-in\")\n .position(BoneName.PELVIS, 0, -0.015, -0.2) // Backward on rear foot\n .rotate(BoneName.HIP_R, toRadians(8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-12), 0, 0) // Rear accepts weight\n .rotate(BoneName.FOOT_R, toRadians(-8), 0, 0) // Heel settling\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0) // Lead lightens\n .done<MartialArtsAnimationBuilder>()\n // Final position\n .at(0.2, \"ease-in\")\n .position(BoneName.PELVIS, 0, 0, -0.3) // Final rear position\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n// SLIDE STEP ANIMATIONS (λ―ΈλλΌλ³΄) - Lateral Movement\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\n/**\n * SLIDE STEP LEFT Animation (λ―ΈλλΌλ³΄ μ’)\n *\n * **Korean Martial Arts Principle**: μΈ‘λ©΄ μ ν μ΄λ (Lateral lead foot movement)\n *\n * Creates angle advantage while maintaining forward guard:\n * 1. Left foot slides 25cm lateral left\n * 2. Weight shifts left while maintaining balance\n * 3. Right foot follows to restore stance width\n * 4. Pelvis rotates slightly, spine counter-rotates to keep guard forward\n *\n * **Tactical Advantage**: Off-line positioning, angle creation\n *\n * @korean λ―ΈλλΌλ³΄μ’μ λλ©μ΄μ
\n */\nexport const FOOTWORK_SLIDE_LEFT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_slide_left\", \"λ―ΈλλΌλ³΄ μ’\")\n .asMovement(0.2)\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Weight shifts right (μ€λΉ)\n .at(0.05, \"ease-out\")\n .position(BoneName.PELVIS, 0.04, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, toRadians(3)) // Tilt right\n .rotate(BoneName.KNEE_R, toRadians(-12), 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-5), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Left foot slides lateral (μ΄λ)\n .at(0.1, \"linear\")\n .position(BoneName.PELVIS, -0.08, -0.01, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(5), toRadians(5)) // Hip engages\n .rotate(BoneName.SPINE_LOWER, 0, toRadians(-3), 0) // Counter-rotate\n .done<MartialArtsAnimationBuilder>()\n // Weight transfers to left (μ°©μ§)\n .at(0.15, \"ease-in\")\n .position(BoneName.PELVIS, -0.2, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-8), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Final position (μμ )\n .at(0.2, \"ease-in\")\n .position(BoneName.PELVIS, -0.25, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, 0) // Return neutral\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard forward\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * SLIDE STEP RIGHT Animation (λ―ΈλλΌλ³΄ μ°)\n *\n * **Korean Martial Arts Principle**: μΈ‘λ©΄ μ ν μ΄λ (Lateral lead foot movement)\n *\n * Mirror of left slide step for right lateral movement.\n *\n * @korean λ―ΈλλΌλ³΄μ°μ λλ©μ΄μ
\n */\nexport const FOOTWORK_SLIDE_RIGHT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_slide_right\", \"λ―ΈλλΌλ³΄ μ°\")\n .asMovement(0.2)\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Weight shifts left (μ€λΉ)\n .at(0.05, \"ease-out\")\n .position(BoneName.PELVIS, -0.04, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, toRadians(-3))\n .rotate(BoneName.KNEE_L, toRadians(-12), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-5), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Right foot slides lateral (μ΄λ)\n .at(0.1, \"linear\")\n .position(BoneName.PELVIS, 0.08, -0.01, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(-5), toRadians(-5))\n .rotate(BoneName.SPINE_LOWER, 0, toRadians(3), 0)\n .done<MartialArtsAnimationBuilder>()\n // Weight transfers to right (μ°©μ§)\n .at(0.15, \"ease-in\")\n .position(BoneName.PELVIS, 0.2, 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Final position (μμ )\n .at(0.2, \"ease-in\")\n .position(BoneName.PELVIS, 0.25, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n// SWITCH STEP ANIMATION (μ€μμΉ μ€ν
) - Stance Reversal\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\n/**\n * SWITCH STEP Animation (μ€μμΉ μ€ν
)\n *\n * **Korean Martial Arts Principle**: λ°λ°κΏ λμ½ (Foot-exchange hop)\n *\n * Quick stance reversal used to confuse opponent or change angles:\n * 1. Small hop off ground with both feet\n * 2. Feet exchange positions mid-air (lead becomes rear, rear becomes lead)\n * 3. Land with opposite foot forward\n * 4. Brief moment of vulnerability during hop\n *\n * **Weight Transfer**: Balanced β Airborne β Reversed stance\n * **Duration**: 280ms (fast for rhythm disruption)\n * **Tactical Use**: Feint opponent's timing, switch power side\n *\n * **Momentary Vulnerability**: During hop, cannot defend or attack\n *\n * @korean μ€μμΉμ€ν
μ λλ©μ΄μ
\n */\nexport const FOOTWORK_SWITCH_STEP_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_switch_step\", \"μ€μμΉ μ€ν
\")\n .asMovement(0.28)\n // Initial stance - left foot forward\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Crouch preparation for hop (μ€λΉ)\n .at(0.05, \"ease-out\")\n .position(BoneName.PELVIS, 0, -0.03, 0) // Drop for spring\n .rotate(BoneName.KNEE_L, toRadians(-20), 0, 0) // Deep crouch\n .rotate(BoneName.KNEE_R, toRadians(-22), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Explosive hop - both feet leave ground (λμ½)\n .at(0.1, \"ease-out\")\n .position(BoneName.PELVIS, 0, 0.05, 0) // Airborne\n .rotate(BoneName.KNEE_L, toRadians(-15), 0, 0) // Legs partially extend\n .rotate(BoneName.KNEE_R, toRadians(-18), 0, 0)\n .rotate(BoneName.HIP_L, toRadians(5), 0, 0) // Begin rotation\n .rotate(BoneName.HIP_R, toRadians(-5), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Mid-air - feet exchange (κ³΅μ€ κ΅ν)\n .at(0.15, \"linear\")\n .position(BoneName.PELVIS, 0, 0.04, 0) // Peak of hop\n .rotate(BoneName.PELVIS, 0, toRadians(15), 0) // Body rotates\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Landing - right foot now forward (μ°©μ§)\n .at(0.2, \"ease-in\")\n .position(BoneName.PELVIS, 0, -0.02, 0) // Impact absorption\n .rotate(BoneName.PELVIS, 0, toRadians(25), 0) // Rotation continues\n .rotate(BoneName.KNEE_R, toRadians(-18), 0, 0) // Right knee bends\n .rotate(BoneName.KNEE_L, toRadians(-20), 0, 0) // Left knee bends\n .done<MartialArtsAnimationBuilder>()\n // Stabilization - reversed stance (μμ )\n .at(0.25, \"ease-in\")\n .position(BoneName.PELVIS, 0, -0.01, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(30), 0) // Complete rotation\n .rotate(BoneName.KNEE_R, toRadians(-8), 0, 0) // Now lead foot\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0) // Now rear foot\n .done<MartialArtsAnimationBuilder>()\n // Final - stable reversed stance\n .at(0.28, \"ease-in\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(30), 0)\n .rotate(BoneName.KNEE_R, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n// BOUNCE STEP ANIMATION (λ°μ΄μ€ μ€ν
) - Rhythmic Movement\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\n/**\n * BOUNCE STEP Animation (λ°μ΄μ€ μ€ν
)\n *\n * **Korean Martial Arts Principle**: λ¦¬λ¬ λ³΄λ² (Rhythmic footwork)\n *\n * Light bouncing movement on balls of feet from boxing:\n * 1. Constant up-down bouncing motion\n * 2. Weight on balls of feet, heels slightly elevated\n * 3. Creates rhythm that's harder for opponent to time\n * 4. Energy efficient - small bounces, not jumps\n *\n * **Weight Distribution**: Always on balls of feet (μκΏμΉ)\n * **Height Variation**: 2-3cm vertical displacement\n * **Frequency**: 2.5 bounces per second (fast rhythm)\n * **Duration**: 400ms for complete bounce cycle\n *\n * **Tactical Advantage**: \n * - Unpredictable timing\n * - Faster reaction time from active stance\n * - Harder to time attacks against\n *\n * @korean λ°μ΄μ€μ€ν
μ λλ©μ΄μ
\n */\nexport const FOOTWORK_BOUNCE_STEP_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_bounce_step\", \"λ°μ΄μ€ μ€ν
\")\n .asMovement(0.4)\n // Start on balls of feet (μ€λΉ)\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0.01, 0) // Slightly elevated\n .rotate(BoneName.KNEE_L, toRadians(-5), 0, 0) // Slight bend\n .rotate(BoneName.KNEE_R, toRadians(-7), 0, 0)\n .rotate(BoneName.FOOT_L, toRadians(-10), 0, 0) // Heel up\n .rotate(BoneName.FOOT_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // First bounce down (1μ°¨ λ°μ΄μ€ νκ°)\n .at(0.08, \"ease-in\")\n .position(BoneName.PELVIS, 0, -0.01, 0)\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0) // Knees absorb\n .rotate(BoneName.KNEE_R, toRadians(-12), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // First bounce up (1μ°¨ λ°μ΄μ€ μμΉ)\n .at(0.16, \"ease-out\")\n .position(BoneName.PELVIS, 0, 0.02, 0.05) // Slight forward drift\n .rotate(BoneName.KNEE_L, toRadians(-5), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-7), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Second bounce down (2μ°¨ λ°μ΄μ€ νκ°)\n .at(0.24, \"ease-in\")\n .position(BoneName.PELVIS, 0, -0.01, 0.08)\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-12), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Second bounce up (2μ°¨ λ°μ΄μ€ μμΉ)\n .at(0.32, \"ease-out\")\n .position(BoneName.PELVIS, 0, 0.02, 0.12)\n .rotate(BoneName.KNEE_L, toRadians(-5), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-7), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Final position - ready for next bounce (μ΅μ’
μμΉ)\n .at(0.4, \"ease-in\")\n .position(BoneName.PELVIS, 0, 0.01, 0.15)\n .rotate(BoneName.KNEE_L, toRadians(-7), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-9), 0, 0)\n .rotate(BoneName.FOOT_L, toRadians(-10), 0, 0) // Still on balls\n .rotate(BoneName.FOOT_R, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n// TRIANGLE FOOTWORK ANIMATION (μΌκ° μ΄λ) - Advanced Angles\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\n/**\n * TRIANGLE FOOTWORK Animation (μΌκ° μ΄λ)\n *\n * **Korean Martial Arts Principle**: μΌκ° μ§λ² (Triangle tactical positioning)\n *\n * Advanced footwork creating tactical angles through three-point movement:\n * 1. Step forward-left at 45Β° (Point 1)\n * 2. Pivot on lead foot (Point 2)\n * 3. Step lateral-left to complete triangle (Point 3)\n * 4. Results in off-angle position with opponent exposed\n *\n * **Tactical Geometry**:\n * - Creates 90Β° angle from original position\n * - Off-line from opponent's centerline\n * - Opens attack angles to opponent's side\n * - Defensive value: harder to hit\n *\n * **Duration**: 650ms (requires precision)\n * **Distance**: 40cm total displacement (diagonal pattern)\n *\n * @korean μΌκ°μ΄λμ λλ©μ΄μ
\n */\nexport const FOOTWORK_TRIANGLE_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_triangle\", \"μΌκ° μ΄λ\")\n .asMovement(0.65)\n // Initial stance\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Point 1: Step forward-left at 45Β° (1λ² μ§μ - μ μ’ 45Β°)\n .at(0.15, \"ease-out\")\n .position(BoneName.PELVIS, -0.12, -0.01, 0.12) // Diagonal forward-left\n .rotate(BoneName.PELVIS, 0, toRadians(-10), 0) // Slight body turn\n .rotate(BoneName.KNEE_L, toRadians(-12), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Point 2: Pivot on lead foot (2λ² μ§μ - μΆλ° νμ )\n .at(0.35, \"linear\")\n .position(BoneName.PELVIS, -0.15, -0.015, 0.15)\n .rotate(BoneName.PELVIS, 0, toRadians(-35), 0) // Pivot 45Β° more\n .rotate(BoneName.SPINE_LOWER, 0, toRadians(15), 0) // Counter-rotate upper body\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0) // Pivot foot stable\n .rotate(BoneName.KNEE_R, toRadians(-8), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Point 3: Step lateral-left to complete triangle (3λ² μ§μ - μ’μΈ‘ μμ±)\n .at(0.5, \"ease-in\")\n .position(BoneName.PELVIS, -0.28, -0.02, 0.12) // Lateral left\n .rotate(BoneName.PELVIS, 0, toRadians(-45), 0) // 90Β° total from start\n .rotate(BoneName.SPINE_LOWER, 0, toRadians(10), 0)\n .rotate(BoneName.KNEE_L, toRadians(-12), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Final: Stabilize in off-angle position (μ΅μ’
μμ ν)\n .at(0.65, \"ease-in\")\n .position(BoneName.PELVIS, -0.3, 0, 0.1) // Final triangle point\n .rotate(BoneName.PELVIS, 0, toRadians(-45), 0) // 90Β° off-line\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0) // Upper body faces forward\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained throughout\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n// PIVOT STEP ANIMATIONS (μΆμ‘±νμ ) - Ball-of-Foot Rotation\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\n/**\n * PIVOT LEFT Animation (μΆμ‘±νμ μ’)\n *\n * **Korean Martial Arts Principle**: μκΏμΉ νμ (Ball-of-foot pivot)\n *\n * 45Β° rotation to the left on planted lead foot:\n * 1. Weight shifts to lead foot (left)\n * 2. Pivot on ball of lead foot\n * 3. Rear foot swings left in arc\n * 4. Upper body rotates with lower, guard maintained\n *\n * **Pivot Mechanics** (νμ μν):\n * - Pivot point: Ball of lead foot (μκΏμΉ)\n * - Weight: 80% on pivot foot during rotation\n * - Arc: Rear foot travels 25cm in arc\n * - Speed: 280ms for smooth 45Β° rotation\n *\n * **Tactical Use**: Quick angle change, evade linear attacks\n *\n * @korean μΆμ‘±νμ μ’μ λλ©μ΄μ
\n */\nexport const FOOTWORK_PIVOT_LEFT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_pivot_left\", \"μΆμ‘±νμ μ’\")\n .asMovement(0.25)\n // Initial stance\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Weight shift to lead foot (pivot preparation) (μ€λΉ)\n .at(0.06, \"ease-out\")\n .position(BoneName.PELVIS, -0.02, -0.01, 0) // Forward onto lead\n .rotate(BoneName.KNEE_L, toRadians(-12), 0, 0) // Lead accepts weight\n .rotate(BoneName.KNEE_R, toRadians(-5), 0, 0) // Rear lightens\n .rotate(BoneName.FOOT_L, toRadians(-8), 0, 0) // Weight on ball\n .done<MartialArtsAnimationBuilder>()\n // Begin pivot - rear foot lifts slightly (νμ μμ)\n .at(0.12, \"linear\")\n .position(BoneName.PELVIS, -0.02, -0.015, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(-15), 0) // Body begins rotation\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0) // Pivot foot stable\n .rotate(BoneName.KNEE_R, toRadians(-8), 0, 0) // Rear foot active\n .rotate(BoneName.HIP_R, toRadians(5), 0, 0) // Rear hip lifts\n .done<MartialArtsAnimationBuilder>()\n // Mid-pivot - maximum rotation speed (νμ κ°μ)\n .at(0.18, \"linear\")\n .position(BoneName.PELVIS, -0.01, -0.02, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(-35), 0) // Fast rotation\n .rotate(BoneName.SPINE_LOWER, 0, toRadians(5), 0) // Slight counter-rotate for balance\n .rotate(BoneName.KNEE_L, toRadians(-12), 0, 0)\n .rotate(BoneName.FOOT_L, toRadians(-10), 0, 0) // Still on ball\n .done<MartialArtsAnimationBuilder>()\n // Complete pivot - rear foot plants (νμ μλ£)\n .at(0.2, \"ease-in\")\n .position(BoneName.PELVIS, 0, -0.015, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(-45), 0) // 45Β° rotation complete\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0) // Body aligned\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0) // Rear foot plants\n .rotate(BoneName.FOOT_L, toRadians(-5), 0, 0) // Pivot foot settling\n .done<MartialArtsAnimationBuilder>()\n // Stabilize in new angle (μμ ν)\n .at(0.25, \"ease-in\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(-45), 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.FOOT_L, 0, 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * PIVOT RIGHT Animation (μΆμ‘±νμ μ°)\n *\n * **Korean Martial Arts Principle**: μκΏμΉ νμ (Ball-of-foot pivot)\n *\n * 45Β° rotation to the right on planted lead foot.\n * Mirror of left pivot mechanics.\n *\n * @korean μΆμ‘±νμ μ°μ λλ©μ΄μ
\n */\nexport const FOOTWORK_PIVOT_RIGHT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_pivot_right\", \"μΆμ‘±νμ μ°\")\n .asMovement(0.25)\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Weight shift to lead foot (μ€λΉ)\n .at(0.06, \"ease-out\")\n .position(BoneName.PELVIS, -0.02, -0.01, 0)\n .rotate(BoneName.KNEE_L, toRadians(-12), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-5), 0, 0)\n .rotate(BoneName.FOOT_L, toRadians(-8), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Begin pivot (νμ μμ)\n .at(0.12, \"linear\")\n .position(BoneName.PELVIS, -0.02, -0.015, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(15), 0) // Right rotation\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-8), 0, 0)\n .rotate(BoneName.HIP_R, toRadians(5), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Mid-pivot (νμ κ°μ)\n .at(0.18, \"linear\")\n .position(BoneName.PELVIS, -0.01, -0.02, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(35), 0)\n .rotate(BoneName.SPINE_LOWER, 0, toRadians(-5), 0)\n .rotate(BoneName.KNEE_L, toRadians(-12), 0, 0)\n .rotate(BoneName.FOOT_L, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Complete pivot (νμ μλ£)\n .at(0.2, \"ease-in\")\n .position(BoneName.PELVIS, 0, -0.015, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(45), 0)\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.FOOT_L, toRadians(-5), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Stabilize (μμ ν)\n .at(0.25, \"ease-in\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(45), 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.FOOT_L, 0, 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n// SHUFFLE STEP ANIMATION (μμ보) - Micro-Adjustments\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\n/**\n * SHUFFLE STEP Animation (μμ보)\n *\n * **Korean Martial Arts Principle**: λ―ΈμΈ μ‘°μ (Micro-position adjustment)\n *\n * Quick 10cm micro-adjustment for positional fine-tuning:\n * 1. Both feet move together in small shuffle\n * 2. Minimal vertical displacement (stay low)\n * 3. Ultra-fast 100ms duration\n * 4. Used for range management and timing adjustments\n *\n * **Characteristics**:\n * - Distance: 10cm (half a foot width)\n * - Duration: 100ms (ultra-fast, 6 frames @ 60fps)\n * - Weight: Remains balanced throughout\n * - Height: Minimal bob (1cm max)\n *\n * **Tactical Use**: \n * - Fine-tune distance without committing\n * - Adjust stance width\n * - Reset rhythm\n * - Feint movement\n *\n * @korean μμ보μ λλ©μ΄μ
\n */\nexport const FOOTWORK_SHUFFLE_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_shuffle\", \"μμ보\")\n .asMovement(0.1)\n // Initial - balanced on both feet\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Slight crouch for shuffle (μ€λΉ)\n .at(0.03, \"ease-out\")\n .position(BoneName.PELVIS, 0, -0.008, 0) // Minimal drop\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-12), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Execute shuffle forward (μ€ν)\n .at(0.07, \"linear\")\n .position(BoneName.PELVIS, 0, -0.01, 0.1) // 10cm forward\n .rotate(BoneName.KNEE_L, toRadians(-9), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-11), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Return to normal height (볡κ·)\n .at(0.1, \"ease-in\")\n .position(BoneName.PELVIS, 0, 0, 0.1) // Final position\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n// ANIMATION COLLECTIONS\n// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\n/**\n * Map of all footwork animations by name\n *\n * **PHASE 4 ENHANCED**: 95%+ Korean martial arts authenticity\n * All animations now feature:\n * - Detailed weight transfer mechanics (체μ€μ΄λ)\n * - Proper foot placement (λλ€λ°/μΆλ°)\n * - Guard maintenance throughout\n * - Realistic timing and distances\n * - Cultural authenticity with Korean terminology\n *\n * @korean 보λ²μ λλ©μ΄μ
λ§΅\n */\nexport const FOOTWORK_ANIMATIONS = new Map<string, SkeletalAnimation>([\n // Circular Steps (μν보) - Lateral circular movement\n [\"footwork_circular_left\", FOOTWORK_CIRCULAR_LEFT_ANIMATION],\n [\"footwork_circular_right\", FOOTWORK_CIRCULAR_RIGHT_ANIMATION],\n \n // Slide Steps (λ―ΈλλΌλ³΄) - Lead foot moves first\n [\"footwork_slide_forward\", FOOTWORK_SLIDE_FORWARD_ANIMATION],\n [\"footwork_slide_back\", FOOTWORK_SLIDE_BACK_ANIMATION],\n [\"footwork_slide_left\", FOOTWORK_SLIDE_LEFT_ANIMATION],\n [\"footwork_slide_right\", FOOTWORK_SLIDE_RIGHT_ANIMATION],\n \n // Pivot Steps (μΆμ‘±νμ ) - Ball-of-foot rotation\n [\"footwork_pivot_left\", FOOTWORK_PIVOT_LEFT_ANIMATION],\n [\"footwork_pivot_right\", FOOTWORK_PIVOT_RIGHT_ANIMATION],\n \n // Shuffle Step (μμ보) - Micro-adjustments\n [\"footwork_shuffle\", FOOTWORK_SHUFFLE_ANIMATION],\n]);\n\n/**\n * Get footwork animation by name\n *\n * @param animationName - Animation identifier\n * @returns Footwork animation or undefined if not found\n * @korean 보λ²μ λλ©μ΄μ
κ°μ Έμ€κΈ°\n */\nexport function getFootworkAnimation(\n animationName: string\n): SkeletalAnimation | undefined {\n return FOOTWORK_ANIMATIONS.get(animationName);\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RecoveryAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/RecoveryAnimations.ts"],"sourcesContent":["/**\n * Recovery Animation System for Black Trigram\n *\n * Implements realistic recovery animations for standing up from fallen states.\n * Based on Korean martial arts recovery techniques (κΈ°μ - Gisang).\n *\n * @module systems/animation/RecoveryAnimations\n * @category Animation\n * @korean κΈ°μμ λλ©μ΄μ
\n */\n\nimport type { GroundState, RecoveryAnimationType } from \"../core/types\";\nimport {\n GROUND_STATE_TO_RECOVERY,\n RECOVERY_TYPE_TO_ANIMATION,\n} from \"../core/types\";\n\n/**\n * Recovery animation keyframe data structure\n *\n * Defines key poses during recovery animations for skeletal rendering.\n * Each keyframe specifies body positions at critical moments.\n *\n * @korean κΈ°μν€νλ μ\n */\nexport interface RecoveryKeyframe {\n /** Frame number (0-indexed) */\n readonly frame: number;\n\n /** Torso rotation (radians) */\n readonly torsoRotation: { x: number; y: number; z: number };\n\n /** Center of mass vertical position (0-1, 1=standing, 0=ground) */\n readonly centerOfMassHeight: number;\n\n /** Description of this keyframe */\n readonly description: {\n readonly korean: string;\n readonly english: string;\n };\n\n /** Whether player is vulnerable at this frame */\n readonly vulnerable: boolean;\n}\n\n/**\n * Prone stand-up keyframes (μλλ¦° κΈ°μ)\n *\n * 30 frames (500ms) sequence:\n * - Frames 0-8: Push up with hands, torso lifts\n * - Frames 9-18: Legs swing under body, kneeling position\n * - Frames 19-24: Rise from kneeling to standing (vulnerable)\n * - Frames 25-29: Final stance adjustment (interruptible)\n *\n * @korean μλλ¦°κΈ°μν€νλ μ\n */\nexport const RECOVERY_PRONE_KEYFRAMES: readonly RecoveryKeyframe[] = [\n {\n frame: 0,\n torsoRotation: { x: 1.57, y: 0, z: 0 }, // Face down (90Β° forward)\n centerOfMassHeight: 0.05,\n description: {\n korean: \"μλλ¦° μμΈ\",\n english: \"Prone position\",\n },\n vulnerable: true,\n },\n {\n frame: 8,\n torsoRotation: { x: 1.2, y: 0, z: 0 }, // Hands pushing, torso lifting\n centerOfMassHeight: 0.2,\n description: {\n korean: \"μμΌλ‘ λ°μ΄ μ¬λ¦¬κΈ°\",\n english: \"Hands push up torso\",\n },\n vulnerable: true,\n },\n {\n frame: 18,\n torsoRotation: { x: 0.7, y: 0, z: 0 }, // Kneeling position\n centerOfMassHeight: 0.5,\n description: {\n korean: \"λ¬΄λ¦ κΏκΈ°\",\n english: \"Kneeling position\",\n },\n vulnerable: true,\n },\n {\n frame: 24,\n torsoRotation: { x: 0.2, y: 0, z: 0 }, // Rising to standing\n centerOfMassHeight: 0.75,\n description: {\n korean: \"μΌμ΄μκΈ°\",\n english: \"Rising to standing\",\n },\n vulnerable: false, // Last 6 frames (24-30) entering safe zone\n },\n {\n frame: 29,\n torsoRotation: { x: 0, y: 0, z: 0 }, // Standing (interruptible)\n centerOfMassHeight: 0.9,\n description: {\n korean: \"μ μλ μμΈ\",\n english: \"Standing stance\",\n },\n vulnerable: false, // Last 6 frames (25-30) are not vulnerable\n },\n] as const;\n\n/**\n * Supine stand-up keyframes (λμ΄ κΈ°μ)\n *\n * 36 frames (600ms) sequence:\n * - Frames 0-10: Abs crunch sit-up motion\n * - Frames 11-22: Forward roll onto feet\n * - Frames 23-30: Feet plant, rise to standing (vulnerable)\n * - Frames 31-35: Final stance adjustment (interruptible)\n *\n * @korean λμ΄κΈ°μν€νλ μ\n */\nexport const RECOVERY_SUPINE_KEYFRAMES: readonly RecoveryKeyframe[] = [\n {\n frame: 0,\n torsoRotation: { x: -1.57, y: 0, z: 0 }, // Face up (90Β° back)\n centerOfMassHeight: 0.05,\n description: {\n korean: \"λμ΄ μμΈ\",\n english: \"Supine position\",\n },\n vulnerable: true,\n },\n {\n frame: 10,\n torsoRotation: { x: -0.9, y: 0, z: 0 }, // Sit-up motion\n centerOfMassHeight: 0.3,\n description: {\n korean: \"μλͺΈ μΌμΌν€κΈ°\",\n english: \"Sit-up motion\",\n },\n vulnerable: true,\n },\n {\n frame: 22,\n torsoRotation: { x: 0.4, y: 0, z: 0 }, // Forward roll\n centerOfMassHeight: 0.4,\n description: {\n korean: \"μ λ°© ꡬλ₯΄κΈ°\",\n english: \"Forward roll\",\n },\n vulnerable: true,\n },\n {\n frame: 30,\n torsoRotation: { x: 0.2, y: 0, z: 0 }, // Feet planted, rising\n centerOfMassHeight: 0.7,\n description: {\n korean: \"λ° λλκ³ μΌμ΄μκΈ°\",\n english: \"Feet planted, rising\",\n },\n vulnerable: false, // Last 6 frames (30-36) entering safe zone\n },\n {\n frame: 35,\n torsoRotation: { x: 0, y: 0, z: 0 }, // Standing (interruptible)\n centerOfMassHeight: 0.9,\n description: {\n korean: \"μ μλ μμΈ\",\n english: \"Standing stance\",\n },\n vulnerable: false, // Last 6 frames (30-36) are not vulnerable\n },\n] as const;\n\n/**\n * Roll recovery keyframes (νμ κΈ°μ)\n *\n * 24 frames (400ms) sequence - FAST recovery\n * - Frames 0-6: Roll to side, momentum building\n * - Frames 7-14: Spring to feet with explosive movement\n * - Frames 15-18: Quick stance (vulnerable)\n * - Frames 19-23: Combat ready (interruptible)\n *\n * Costs 20 stamina for speed advantage.\n *\n * @korean νμ κΈ°μν€νλ μ\n */\nexport const RECOVERY_ROLL_KEYFRAMES: readonly RecoveryKeyframe[] = [\n {\n frame: 0,\n torsoRotation: { x: 0, y: 1.57, z: 1.57 }, // Side position (90Β° roll)\n centerOfMassHeight: 0.05,\n description: {\n korean: \"μΈ‘λ©΄ μμΈ\",\n english: \"Side position\",\n },\n vulnerable: true,\n },\n {\n frame: 6,\n torsoRotation: { x: 0.3, y: 0.8, z: 0.9 }, // Rolling motion\n centerOfMassHeight: 0.25,\n description: {\n korean: \"ꡬλ₯΄κΈ° μμ§μ\",\n english: \"Rolling motion\",\n },\n vulnerable: true,\n },\n {\n frame: 14,\n torsoRotation: { x: 0.4, y: 0, z: 0 }, // Springing to feet\n centerOfMassHeight: 0.6,\n description: {\n korean: \"λ°λ‘ νμ΄μ€λ₯΄κΈ°\",\n english: \"Spring to feet\",\n },\n vulnerable: true,\n },\n {\n frame: 18,\n torsoRotation: { x: 0.1, y: 0, z: 0 }, // Quick stance\n centerOfMassHeight: 0.85,\n description: {\n korean: \"λΉ λ₯Έ μμΈ\",\n english: \"Quick stance\",\n },\n vulnerable: false, // Last 6 frames (18-24) entering safe zone\n },\n {\n frame: 23,\n torsoRotation: { x: 0, y: 0, z: 0 }, // Combat ready (interruptible)\n centerOfMassHeight: 0.9,\n description: {\n korean: \"μ ν¬ μ€λΉ\",\n english: \"Combat ready\",\n },\n vulnerable: false, // Last 6 frames (18-24) are not vulnerable\n },\n] as const;\n\n/**\n * Defensive getup keyframes (λ°©μ΄κΈ°μ)\n *\n * 42 frames (700ms) sequence - SLOW but protected\n * - Frames 0-14: Slow rise with arms guarding head/torso\n * - Frames 15-28: Gradual stand with maintained guard\n * - Frames 29-36: Stance formation with guard (50% damage reduction)\n * - Frames 37-41: Ready stance (interruptible)\n *\n * Provides 50% damage reduction throughout animation.\n *\n * @korean λ°©μ΄κΈ°μν€νλ μ\n */\nexport const RECOVERY_DEFENSIVE_KEYFRAMES: readonly RecoveryKeyframe[] = [\n {\n frame: 0,\n torsoRotation: { x: 1.2, y: 0, z: 0 }, // Grounded, arms up\n centerOfMassHeight: 0.05,\n description: {\n korean: \"μ§λ©΄μμ ν μ¬λ¦¬κΈ°\",\n english: \"Grounded, arms up\",\n },\n vulnerable: true, // 50% damage reduction applies\n },\n {\n frame: 14,\n torsoRotation: { x: 0.9, y: 0, z: 0 }, // Slow rise, guard maintained\n centerOfMassHeight: 0.3,\n description: {\n korean: \"μ²μ²ν μΌμ΄λλ©° λ°©μ΄\",\n english: \"Slow rise, guarded\",\n },\n vulnerable: true, // 50% damage reduction applies\n },\n {\n frame: 28,\n torsoRotation: { x: 0.5, y: 0, z: 0 }, // Gradual stand, guard up\n centerOfMassHeight: 0.6,\n description: {\n korean: \"μ μ°¨ μλ©° λ°©μ΄ μ μ§\",\n english: \"Gradual stand, guard up\",\n },\n vulnerable: true, // 50% damage reduction applies\n },\n {\n frame: 36,\n torsoRotation: { x: 0.2, y: 0, z: 0 }, // Stance formation, guarded\n centerOfMassHeight: 0.8,\n description: {\n korean: \"μμΈ νμ±, λ°©μ΄ μν\",\n english: \"Stance formation, guarded\",\n },\n vulnerable: false, // Last 6 frames (36-42) entering safe zone (still 50% reduction)\n },\n {\n frame: 41,\n torsoRotation: { x: 0, y: 0, z: 0 }, // Ready stance (interruptible)\n centerOfMassHeight: 0.9,\n description: {\n korean: \"μ€λΉ μμΈ\",\n english: \"Ready stance\",\n },\n vulnerable: false, // Last 6 frames (36-42) are not vulnerable\n },\n] as const;\n\n/**\n * Get keyframes for a specific recovery type\n *\n * @param recoveryType - Type of recovery animation\n * @returns Array of keyframes for that recovery type\n *\n * @public\n * @korean κΈ°μν€νλ μκ°μ Έμ€κΈ°\n */\nexport function getRecoveryKeyframes(\n recoveryType: RecoveryAnimationType\n): readonly RecoveryKeyframe[] {\n switch (recoveryType) {\n case \"prone_standup\":\n return RECOVERY_PRONE_KEYFRAMES;\n case \"supine_standup\":\n return RECOVERY_SUPINE_KEYFRAMES;\n case \"roll_recovery\":\n return RECOVERY_ROLL_KEYFRAMES;\n case \"defensive_getup\":\n return RECOVERY_DEFENSIVE_KEYFRAMES;\n default:\n return RECOVERY_ROLL_KEYFRAMES;\n }\n}\n\n/**\n * Check if a frame in a recovery animation is vulnerable\n *\n * Vulnerability is determined by keyframe data. The last 6 frames\n * of each recovery animation are interruptible and not vulnerable.\n *\n * @param recoveryType - Type of recovery animation\n * @param frame - Current frame number (0-indexed)\n * @returns True if player is vulnerable at this frame\n *\n * @public\n * @korean μ·¨μ½νλ μνμΈ\n */\nexport function isVulnerableFrame(\n recoveryType: RecoveryAnimationType,\n frame: number\n): boolean {\n const keyframes = getRecoveryKeyframes(recoveryType);\n\n // Find the keyframe for this frame or the previous keyframe\n let currentKeyframe = keyframes[0];\n for (const kf of keyframes) {\n if (kf.frame <= frame) {\n currentKeyframe = kf;\n } else {\n break;\n }\n }\n\n return currentKeyframe.vulnerable;\n}\n\n/**\n * Determine appropriate recovery animation from ground state\n *\n * Uses ground state to select default recovery animation.\n * Side positions default to roll recovery for dynamic movement.\n *\n * @param groundState - Current ground position\n * @returns Default recovery animation type\n *\n * @example\n * ```typescript\n * const recoveryType = determineRecoveryType(\"prone\");\n * // Returns: \"prone_standup\"\n *\n * const sideRecovery = determineRecoveryType(\"side_left\");\n * // Returns: \"roll_recovery\" (default for side positions)\n * ```\n *\n * @public\n * @korean κΈ°μμ νκ²°μ \n */\nexport function determineRecoveryType(\n groundState: GroundState\n): RecoveryAnimationType {\n return GROUND_STATE_TO_RECOVERY[groundState];\n}\n\n/**\n * Get recovery animation state from recovery type\n *\n * @param recoveryType - Recovery animation type\n * @returns Animation state name\n *\n * @public\n * @korean κΈ°μμ λλ©μ΄μ
μν\n */\nexport function getRecoveryAnimationState(\n recoveryType: RecoveryAnimationType\n): string {\n return RECOVERY_TYPE_TO_ANIMATION[recoveryType];\n}\n\n/**\n * Recovery animation configuration\n *\n * Additional properties for recovery animations beyond base AnimationConfig.\n *\n * @korean κΈ°μμ€μ \n */\nexport interface RecoveryConfig {\n /** Recovery animation type */\n readonly type: RecoveryAnimationType;\n\n /** Stamina cost to execute (0 for normal recoveries) */\n readonly staminaCost: number;\n\n /** Damage reduction percentage during animation (0-1) */\n readonly damageReduction: number;\n\n /** Number of initial vulnerable frames (first N frames are vulnerable to damage) */\n readonly vulnerableFrames: number;\n\n /** Frame when player becomes interruptible (last 6 frames typically) */\n readonly interruptibleFrame: number;\n}\n\n/**\n * Recovery animation configurations\n *\n * Defines stamina costs, damage reduction, and vulnerability windows.\n *\n * @korean κΈ°μμ€μ λ§΅\n */\nexport const RECOVERY_CONFIGS: Record<RecoveryAnimationType, RecoveryConfig> = {\n prone_standup: {\n type: \"prone_standup\",\n staminaCost: 0,\n damageReduction: 0,\n vulnerableFrames: 24, // Vulnerable for first 24 frames (80%)\n interruptibleFrame: 24, // Last 6 frames (25-30) are interruptible\n },\n supine_standup: {\n type: \"supine_standup\",\n staminaCost: 0,\n damageReduction: 0,\n vulnerableFrames: 30, // Vulnerable for first 30 frames (83%)\n interruptibleFrame: 30, // Last 6 frames (30-36) are interruptible\n },\n roll_recovery: {\n type: \"roll_recovery\",\n staminaCost: 20, // Costs stamina for speed\n damageReduction: 0,\n vulnerableFrames: 18, // Vulnerable for first 18 frames (75%)\n interruptibleFrame: 18, // Last 6 frames (18-24) are interruptible\n },\n defensive_getup: {\n type: \"defensive_getup\",\n staminaCost: 0,\n damageReduction: 0.5, // 50% damage reduction throughout\n vulnerableFrames: 36, // Vulnerable for first 36 frames (86%)\n interruptibleFrame: 36, // Last 6 frames (36-42) are interruptible\n },\n};\n\n/**\n * Get recovery configuration\n *\n * @param recoveryType - Recovery animation type\n * @returns Recovery configuration\n *\n * @public\n * @korean κΈ°μμ€μ κ°μ Έμ€κΈ°\n */\nexport function getRecoveryConfig(\n recoveryType: RecoveryAnimationType\n): RecoveryConfig {\n return RECOVERY_CONFIGS[recoveryType];\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RecoveryAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/RecoveryAnimations.ts"],"sourcesContent":["/**\n * Recovery Animation System for Black Trigram\n *\n * Implements realistic recovery animations for standing up from fallen states.\n * Based on Korean martial arts recovery techniques (κΈ°μ - Gisang).\n *\n * @module systems/animation/RecoveryAnimations\n * @category Animation\n * @korean κΈ°μμ λλ©μ΄μ
\n */\n\nimport type { GroundState, RecoveryAnimationType } from \"../core/types\";\nimport {\n GROUND_STATE_TO_RECOVERY,\n RECOVERY_TYPE_TO_ANIMATION,\n} from \"../core/types\";\n\n/**\n * Recovery animation keyframe data structure\n *\n * Defines key poses during recovery animations for skeletal rendering.\n * Each keyframe specifies body positions at critical moments.\n *\n * @korean κΈ°μν€νλ μ\n */\nexport interface RecoveryKeyframe {\n /** Frame number (0-indexed) */\n readonly frame: number;\n\n /** Torso rotation (radians) */\n readonly torsoRotation: { x: number; y: number; z: number };\n\n /** Center of mass vertical position (0-1, 1=standing, 0=ground) */\n readonly centerOfMassHeight: number;\n\n /** Description of this keyframe */\n readonly description: {\n readonly korean: string;\n readonly english: string;\n };\n\n /** Whether player is vulnerable at this frame */\n readonly vulnerable: boolean;\n}\n\n/**\n * Prone stand-up keyframes (μλλ¦° κΈ°μ)\n *\n * 30 frames (500ms) sequence:\n * - Frames 0-8: Push up with hands, torso lifts\n * - Frames 9-18: Legs swing under body, kneeling position\n * - Frames 19-24: Rise from kneeling to standing (vulnerable)\n * - Frames 25-29: Final stance adjustment (interruptible)\n *\n * @korean μλλ¦°κΈ°μν€νλ μ\n */\nexport const RECOVERY_PRONE_KEYFRAMES: readonly RecoveryKeyframe[] = [\n {\n frame: 0,\n torsoRotation: { x: 1.57, y: 0, z: 0 }, // Face down (90Β° forward)\n centerOfMassHeight: 0.05,\n description: {\n korean: \"μλλ¦° μμΈ\",\n english: \"Prone position\",\n },\n vulnerable: true,\n },\n {\n frame: 8,\n torsoRotation: { x: 1.2, y: 0, z: 0 }, // Hands pushing, torso lifting\n centerOfMassHeight: 0.2,\n description: {\n korean: \"μμΌλ‘ λ°μ΄ μ¬λ¦¬κΈ°\",\n english: \"Hands push up torso\",\n },\n vulnerable: true,\n },\n {\n frame: 18,\n torsoRotation: { x: 0.7, y: 0, z: 0 }, // Kneeling position\n centerOfMassHeight: 0.5,\n description: {\n korean: \"λ¬΄λ¦ κΏκΈ°\",\n english: \"Kneeling position\",\n },\n vulnerable: true,\n },\n {\n frame: 24,\n torsoRotation: { x: 0.2, y: 0, z: 0 }, // Rising to standing\n centerOfMassHeight: 0.75,\n description: {\n korean: \"μΌμ΄μκΈ°\",\n english: \"Rising to standing\",\n },\n vulnerable: false, // Last 6 frames (24-30) entering safe zone\n },\n {\n frame: 29,\n torsoRotation: { x: 0, y: 0, z: 0 }, // Standing (interruptible)\n centerOfMassHeight: 0.9,\n description: {\n korean: \"μ μλ μμΈ\",\n english: \"Standing stance\",\n },\n vulnerable: false, // Last 6 frames (25-30) are not vulnerable\n },\n] as const;\n\n/**\n * Supine stand-up keyframes (λμ΄ κΈ°μ)\n *\n * 36 frames (600ms) sequence:\n * - Frames 0-10: Abs crunch sit-up motion\n * - Frames 11-22: Forward roll onto feet\n * - Frames 23-30: Feet plant, rise to standing (vulnerable)\n * - Frames 31-35: Final stance adjustment (interruptible)\n *\n * @korean λμ΄κΈ°μν€νλ μ\n */\nexport const RECOVERY_SUPINE_KEYFRAMES: readonly RecoveryKeyframe[] = [\n {\n frame: 0,\n torsoRotation: { x: -1.57, y: 0, z: 0 }, // Face up (90Β° back)\n centerOfMassHeight: 0.05,\n description: {\n korean: \"λμ΄ μμΈ\",\n english: \"Supine position\",\n },\n vulnerable: true,\n },\n {\n frame: 10,\n torsoRotation: { x: -0.9, y: 0, z: 0 }, // Sit-up motion\n centerOfMassHeight: 0.3,\n description: {\n korean: \"μλͺΈ μΌμΌν€κΈ°\",\n english: \"Sit-up motion\",\n },\n vulnerable: true,\n },\n {\n frame: 22,\n torsoRotation: { x: 0.4, y: 0, z: 0 }, // Forward roll\n centerOfMassHeight: 0.4,\n description: {\n korean: \"μ λ°© ꡬλ₯΄κΈ°\",\n english: \"Forward roll\",\n },\n vulnerable: true,\n },\n {\n frame: 30,\n torsoRotation: { x: 0.2, y: 0, z: 0 }, // Feet planted, rising\n centerOfMassHeight: 0.7,\n description: {\n korean: \"λ° λλκ³ μΌμ΄μκΈ°\",\n english: \"Feet planted, rising\",\n },\n vulnerable: false, // Last 6 frames (30-36) entering safe zone\n },\n {\n frame: 35,\n torsoRotation: { x: 0, y: 0, z: 0 }, // Standing (interruptible)\n centerOfMassHeight: 0.9,\n description: {\n korean: \"μ μλ μμΈ\",\n english: \"Standing stance\",\n },\n vulnerable: false, // Last 6 frames (30-36) are not vulnerable\n },\n] as const;\n\n/**\n * Roll recovery keyframes (νμ κΈ°μ)\n *\n * 24 frames (400ms) sequence - FAST recovery\n * - Frames 0-6: Roll to side, momentum building\n * - Frames 7-14: Spring to feet with explosive movement\n * - Frames 15-18: Quick stance (vulnerable)\n * - Frames 19-23: Combat ready (interruptible)\n *\n * Costs 20 stamina for speed advantage.\n *\n * @korean νμ κΈ°μν€νλ μ\n */\nexport const RECOVERY_ROLL_KEYFRAMES: readonly RecoveryKeyframe[] = [\n {\n frame: 0,\n torsoRotation: { x: 0, y: 1.57, z: 1.57 }, // Side position (90Β° roll)\n centerOfMassHeight: 0.05,\n description: {\n korean: \"μΈ‘λ©΄ μμΈ\",\n english: \"Side position\",\n },\n vulnerable: true,\n },\n {\n frame: 6,\n torsoRotation: { x: 0.3, y: 0.8, z: 0.9 }, // Rolling motion\n centerOfMassHeight: 0.25,\n description: {\n korean: \"ꡬλ₯΄κΈ° μμ§μ\",\n english: \"Rolling motion\",\n },\n vulnerable: true,\n },\n {\n frame: 14,\n torsoRotation: { x: 0.4, y: 0, z: 0 }, // Springing to feet\n centerOfMassHeight: 0.6,\n description: {\n korean: \"λ°λ‘ νμ΄μ€λ₯΄κΈ°\",\n english: \"Spring to feet\",\n },\n vulnerable: true,\n },\n {\n frame: 18,\n torsoRotation: { x: 0.1, y: 0, z: 0 }, // Quick stance\n centerOfMassHeight: 0.85,\n description: {\n korean: \"λΉ λ₯Έ μμΈ\",\n english: \"Quick stance\",\n },\n vulnerable: false, // Last 6 frames (18-24) entering safe zone\n },\n {\n frame: 23,\n torsoRotation: { x: 0, y: 0, z: 0 }, // Combat ready (interruptible)\n centerOfMassHeight: 0.9,\n description: {\n korean: \"μ ν¬ μ€λΉ\",\n english: \"Combat ready\",\n },\n vulnerable: false, // Last 6 frames (18-24) are not vulnerable\n },\n] as const;\n\n/**\n * Defensive getup keyframes (λ°©μ΄κΈ°μ)\n *\n * 42 frames (700ms) sequence - SLOW but protected\n * - Frames 0-14: Slow rise with arms guarding head/torso\n * - Frames 15-28: Gradual stand with maintained guard\n * - Frames 29-36: Stance formation with guard (50% damage reduction)\n * - Frames 37-41: Ready stance (interruptible)\n *\n * Provides 50% damage reduction throughout animation.\n *\n * @korean λ°©μ΄κΈ°μν€νλ μ\n */\nexport const RECOVERY_DEFENSIVE_KEYFRAMES: readonly RecoveryKeyframe[] = [\n {\n frame: 0,\n torsoRotation: { x: 1.2, y: 0, z: 0 }, // Grounded, arms up\n centerOfMassHeight: 0.05,\n description: {\n korean: \"μ§λ©΄μμ ν μ¬λ¦¬κΈ°\",\n english: \"Grounded, arms up\",\n },\n vulnerable: true, // 50% damage reduction applies\n },\n {\n frame: 14,\n torsoRotation: { x: 0.9, y: 0, z: 0 }, // Slow rise, guard maintained\n centerOfMassHeight: 0.3,\n description: {\n korean: \"μ²μ²ν μΌμ΄λλ©° λ°©μ΄\",\n english: \"Slow rise, guarded\",\n },\n vulnerable: true, // 50% damage reduction applies\n },\n {\n frame: 28,\n torsoRotation: { x: 0.5, y: 0, z: 0 }, // Gradual stand, guard up\n centerOfMassHeight: 0.6,\n description: {\n korean: \"μ μ°¨ μλ©° λ°©μ΄ μ μ§\",\n english: \"Gradual stand, guard up\",\n },\n vulnerable: true, // 50% damage reduction applies\n },\n {\n frame: 36,\n torsoRotation: { x: 0.2, y: 0, z: 0 }, // Stance formation, guarded\n centerOfMassHeight: 0.8,\n description: {\n korean: \"μμΈ νμ±, λ°©μ΄ μν\",\n english: \"Stance formation, guarded\",\n },\n vulnerable: false, // Last 6 frames (36-42) entering safe zone (still 50% reduction)\n },\n {\n frame: 41,\n torsoRotation: { x: 0, y: 0, z: 0 }, // Ready stance (interruptible)\n centerOfMassHeight: 0.9,\n description: {\n korean: \"μ€λΉ μμΈ\",\n english: \"Ready stance\",\n },\n vulnerable: false, // Last 6 frames (36-42) are not vulnerable\n },\n] as const;\n\n/**\n * Get keyframes for a specific recovery type\n *\n * @param recoveryType - Type of recovery animation\n * @returns Array of keyframes for that recovery type\n *\n * @public\n * @korean κΈ°μν€νλ μκ°μ Έμ€κΈ°\n */\nexport function getRecoveryKeyframes(\n recoveryType: RecoveryAnimationType\n): readonly RecoveryKeyframe[] {\n switch (recoveryType) {\n case \"prone_standup\":\n return RECOVERY_PRONE_KEYFRAMES;\n case \"supine_standup\":\n return RECOVERY_SUPINE_KEYFRAMES;\n case \"roll_recovery\":\n return RECOVERY_ROLL_KEYFRAMES;\n case \"defensive_getup\":\n return RECOVERY_DEFENSIVE_KEYFRAMES;\n default:\n return RECOVERY_ROLL_KEYFRAMES;\n }\n}\n\n/**\n * Check if a frame in a recovery animation is vulnerable\n *\n * Vulnerability is determined by keyframe data. The last 6 frames\n * of each recovery animation are interruptible and not vulnerable.\n *\n * @param recoveryType - Type of recovery animation\n * @param frame - Current frame number (0-indexed)\n * @returns True if player is vulnerable at this frame\n *\n * @public\n * @korean μ·¨μ½νλ μνμΈ\n */\nexport function isVulnerableFrame(\n recoveryType: RecoveryAnimationType,\n frame: number\n): boolean {\n const keyframes = getRecoveryKeyframes(recoveryType);\n\n // Find the keyframe for this frame or the previous keyframe\n let currentKeyframe = keyframes[0];\n for (const kf of keyframes) {\n if (kf.frame <= frame) {\n currentKeyframe = kf;\n } else {\n break;\n }\n }\n\n return currentKeyframe.vulnerable;\n}\n\n/**\n * Determine appropriate recovery animation from ground state\n *\n * Uses ground state to select default recovery animation.\n * Side positions default to roll recovery for dynamic movement.\n *\n * @param groundState - Current ground position\n * @returns Default recovery animation type\n *\n * @example\n * ```typescript\n * const recoveryType = determineRecoveryType(\"prone\");\n * // Returns: \"prone_standup\"\n *\n * const sideRecovery = determineRecoveryType(\"side_left\");\n * // Returns: \"roll_recovery\" (default for side positions)\n * ```\n *\n * @public\n * @korean κΈ°μμ νκ²°μ \n */\nexport function determineRecoveryType(\n groundState: GroundState\n): RecoveryAnimationType {\n return GROUND_STATE_TO_RECOVERY[groundState];\n}\n\n/**\n * Get recovery animation state from recovery type\n *\n * @param recoveryType - Recovery animation type\n * @returns Animation state name\n *\n * @public\n * @korean κΈ°μμ λλ©μ΄μ
μν\n */\nexport function getRecoveryAnimationState(\n recoveryType: RecoveryAnimationType\n): string {\n return RECOVERY_TYPE_TO_ANIMATION[recoveryType];\n}\n\n/**\n * Recovery animation configuration\n *\n * Additional properties for recovery animations beyond base AnimationConfig.\n *\n * @korean κΈ°μμ€μ \n */\nexport interface RecoveryConfig {\n /** Recovery animation type */\n readonly type: RecoveryAnimationType;\n\n /** Stamina cost to execute (0 for normal recoveries) */\n readonly staminaCost: number;\n\n /** Damage reduction percentage during animation (0-1) */\n readonly damageReduction: number;\n\n /** Number of initial vulnerable frames (first N frames are vulnerable to damage) */\n readonly vulnerableFrames: number;\n\n /** Frame when player becomes interruptible (last 6 frames typically) */\n readonly interruptibleFrame: number;\n}\n\n/**\n * Recovery animation configurations\n *\n * Defines stamina costs, damage reduction, and vulnerability windows.\n *\n * @korean κΈ°μμ€μ λ§΅\n */\nexport const RECOVERY_CONFIGS: Record<RecoveryAnimationType, RecoveryConfig> = {\n prone_standup: {\n type: \"prone_standup\",\n staminaCost: 0,\n damageReduction: 0,\n vulnerableFrames: 24, // Vulnerable for first 24 frames (80%)\n interruptibleFrame: 24, // Last 6 frames (25-30) are interruptible\n },\n supine_standup: {\n type: \"supine_standup\",\n staminaCost: 0,\n damageReduction: 0,\n vulnerableFrames: 30, // Vulnerable for first 30 frames (83%)\n interruptibleFrame: 30, // Last 6 frames (30-36) are interruptible\n },\n roll_recovery: {\n type: \"roll_recovery\",\n staminaCost: 20, // Costs stamina for speed\n damageReduction: 0,\n vulnerableFrames: 18, // Vulnerable for first 18 frames (75%)\n interruptibleFrame: 18, // Last 6 frames (18-24) are interruptible\n },\n defensive_getup: {\n type: \"defensive_getup\",\n staminaCost: 0,\n damageReduction: 0.5, // 50% damage reduction throughout\n vulnerableFrames: 36, // Vulnerable for first 36 frames (86%)\n interruptibleFrame: 36, // Last 6 frames (36-42) are interruptible\n },\n};\n\n/**\n * Get recovery configuration\n *\n * @param recoveryType - Recovery animation type\n * @returns Recovery configuration\n *\n * @public\n * @korean κΈ°μμ€μ κ°μ Έμ€κΈ°\n */\nexport function getRecoveryConfig(\n recoveryType: RecoveryAnimationType\n): RecoveryConfig {\n return RECOVERY_CONFIGS[recoveryType];\n}\n"],"mappings":"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"}
|