blacktrigram 0.7.47 → 0.7.49
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.d.ts.map +1 -1
- package/lib/components/screens/combat/CombatScreen3D.js +29 -25
- 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.d.ts.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatBottomHUD.js +2 -2
- 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 +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.d.ts.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatTopHUD.js +2 -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.d.ts.map +1 -1
- package/lib/components/screens/combat/helpers/AnimationUpdater.js +4 -2
- 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.d.ts.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatLayout.js +11 -5
- 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 +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 +1 -1
- package/lib/components/screens/philosophy/PhilosophyScreen3D.js.map +1 -1
- package/lib/components/screens/training/TrainingScreen3D.d.ts.map +1 -1
- package/lib/components/screens/training/TrainingScreen3D.js +3 -11
- 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.d.ts.map +1 -1
- package/lib/components/screens/training/components/hud/TrainingBottomHUD.js +2 -2
- 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.d.ts +1 -0
- package/lib/components/screens/training/hooks/useTrainingActions.d.ts.map +1 -1
- package/lib/components/screens/training/hooks/useTrainingActions.js +6 -4
- package/lib/components/screens/training/hooks/useTrainingActions.js.map +1 -1
- package/lib/components/screens/training/hooks/useTrainingLayout.d.ts.map +1 -1
- package/lib/components/screens/training/hooks/useTrainingLayout.js +11 -5
- 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.d.ts.map +1 -1
- package/lib/components/shared/three/models/SkeletalPlayer3D.js +7 -5
- 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.d.ts.map +1 -1
- package/lib/hooks/useHUDLayout.js +3 -2
- 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.d.ts.map +1 -1
- package/lib/hooks/useSkeletalAnimation.js +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 +16 -16
- 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.map +1 -1
- package/lib/systems/animation/builders/KickPhaseApplicator.d.ts +6 -0
- package/lib/systems/animation/builders/KickPhaseApplicator.d.ts.map +1 -1
- package/lib/systems/animation/builders/KickPhaseApplicator.js +16 -9
- package/lib/systems/animation/builders/KickPhaseApplicator.js.map +1 -1
- package/lib/systems/animation/builders/KoreanGuardPositions.d.ts +4 -4
- package/lib/systems/animation/builders/KoreanGuardPositions.js.map +1 -1
- package/lib/systems/animation/builders/MartialArtsAnimationBuilder.d.ts +1 -1
- package/lib/systems/animation/builders/MartialArtsAnimationBuilder.d.ts.map +1 -1
- package/lib/systems/animation/builders/MartialArtsAnimationBuilder.js +5 -5
- package/lib/systems/animation/builders/MartialArtsAnimationBuilder.js.map +1 -1
- package/lib/systems/animation/builders/MartialArtsConstants.d.ts +112 -71
- package/lib/systems/animation/builders/MartialArtsConstants.d.ts.map +1 -1
- package/lib/systems/animation/builders/MartialArtsConstants.js +113 -72
- 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/AttackAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/BasicAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/ComboAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/DarkOpsAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/DefensiveAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/ElbowKneeAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/EnhancedAttackAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/EnhancedElbowKneeAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/FootworkSkeletalAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/GamRedirectionAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/GamStanceAnimations.js +21 -0
- package/lib/systems/animation/catalogs/GamStanceAnimations.js.map +1 -0
- package/lib/systems/animation/catalogs/GamTechniqueAnimations.js +34 -2
- package/lib/systems/animation/catalogs/GamTechniqueAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/GanStanceAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/GanTechniqueAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/GeonStanceAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/GonTechniqueAnimations.d.ts +9 -0
- package/lib/systems/animation/catalogs/GonTechniqueAnimations.d.ts.map +1 -1
- package/lib/systems/animation/catalogs/GonTechniqueAnimations.js +288 -0
- package/lib/systems/animation/catalogs/GonTechniqueAnimations.js.map +1 -0
- package/lib/systems/animation/catalogs/GrapplingAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/JinStanceAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/JinTechniqueAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/KickAnimations.d.ts +2 -2
- package/lib/systems/animation/catalogs/KickAnimations.js +2 -2
- package/lib/systems/animation/catalogs/KickAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/LiStanceAnimations.js +14 -1
- package/lib/systems/animation/catalogs/LiStanceAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/LiTechniqueAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/MovementAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/PunchAnimations.d.ts +1 -1
- package/lib/systems/animation/catalogs/PunchAnimations.js +1 -1
- package/lib/systems/animation/catalogs/PunchAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/RecoveryAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/SonStanceAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/SonTechniqueAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/SpecializedPunchAnimations.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.d.ts +6 -6
- package/lib/systems/animation/catalogs/StanceGuardPoses.js +36 -36
- 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/catalogs/TaeJointLockAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/TaeStanceAnimations.js.map +1 -1
- package/lib/systems/animation/constants/AnatomicalLimits.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 +15 -15
- package/lib/systems/animation/core/AnimationPriority.js.map +1 -1
- package/lib/systems/animation/core/AnimationRegistry.d.ts +30 -0
- package/lib/systems/animation/core/AnimationRegistry.d.ts.map +1 -1
- package/lib/systems/animation/core/AnimationRegistry.js +74 -12
- package/lib/systems/animation/core/AnimationRegistry.js.map +1 -1
- package/lib/systems/animation/core/AnimationStateMachine.js +16 -16
- package/lib/systems/animation/core/AnimationStateMachine.js.map +1 -1
- package/lib/systems/animation/core/AnimationTransitions.d.ts.map +1 -1
- package/lib/systems/animation/core/AnimationTransitions.js +34 -0
- 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/index.d.ts +1 -1
- package/lib/systems/animation/core/index.d.ts.map +1 -1
- package/lib/systems/animation/core/types.d.ts +24 -0
- package/lib/systems/animation/core/types.d.ts.map +1 -1
- package/lib/systems/animation/core/types.js +27 -11
- 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 +19 -19
- 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 +19 -19
- package/lib/systems/combat/BalanceSystem.js.map +1 -1
- package/lib/systems/combat/BreakingStatusEffects.js.map +1 -1
- package/lib/systems/combat/CombatStateSystem.js +17 -17
- package/lib/systems/combat/CombatStateSystem.js.map +1 -1
- package/lib/systems/combat/ConsciousnessSystem.js +24 -24
- 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 +21 -21
- 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 +6 -6
- 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/GeonTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/GonTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/JinTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/LiTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/SonTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/TaeTechniques.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/systems/vitalpoint/VitalPointsData.js.map +1 -1
- package/lib/types/AccessibilityTypes.js.map +1 -1
- package/lib/types/LayoutTypes.js.map +1 -1
- package/lib/types/PhysicsTypes.js.map +1 -1
- package/lib/types/common.js.map +1 -1
- package/lib/types/constants/animations.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/index.js.map +1 -1
- package/lib/types/constants/layout.d.ts +21 -0
- package/lib/types/constants/layout.d.ts.map +1 -1
- package/lib/types/constants/layout.js +22 -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/constants/ui.js.map +1 -1
- package/lib/types/facial.js +19 -19
- 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/muscle.js.map +1 -1
- package/lib/types/physics.js.map +1 -1
- package/lib/types/physicsConstants.js.map +1 -1
- package/lib/types/player-visual.d.ts +1 -1
- package/lib/types/player-visual.d.ts.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 +6 -7
- 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.d.ts +7 -0
- package/lib/utils/responsiveLayoutHelpers.d.ts.map +1 -1
- package/lib/utils/responsiveLayoutHelpers.js +16 -2
- 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 +7 -7
|
@@ -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":";;;;;;;;;;;;;;;;;;;AAmDA,IAAa,mCACX,4BAA4B,OAAO,0BAA0B,QAAQ,CAClE,WAAW,GAAI,CACf,GAAG,GAAG,SAAS,CACf,SAAS,SAAS,QAAQ,GAAG,GAAG,EAAE,CAClC,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,MAAmC,CAEnC,GAAG,IAAK,WAAW,CACnB,SAAS,SAAS,QAAQ,MAAO,MAAO,IAAK,CAC7C,OAAO,SAAS,QAAQ,GAAG,UAAU,EAAE,EAAE,UAAU,EAAE,CAAC,CACtD,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,MAAmC,CAEnC,GAAG,IAAK,SAAS,CACjB,SAAS,SAAS,QAAQ,KAAM,GAAG,IAAK,CACxC,OAAO,SAAS,QAAQ,GAAG,UAAU,EAAE,EAAE,UAAU,EAAE,CAAC,CACtD,OAAO,SAAS,aAAa,GAAG,UAAU,GAAG,EAAE,EAAE,CACjD,MAAmC,CAEnC,GAAG,IAAK,UAAU,CAClB,SAAS,SAAS,QAAQ,MAAO,GAAG,GAAI,CACxC,OAAO,SAAS,QAAQ,GAAG,GAAG,EAAE,CAChC,OAAO,SAAS,aAAa,GAAG,GAAG,EAAE,CACrC,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,YAAY,KAAM,IAAK,GAAI,CAC3C,OAAO,SAAS,SAAS,GAAG,GAAG,KAAK,CACpC,OAAO,SAAS,YAAY,KAAM,KAAM,IAAK,CAC7C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,CACnC,MAAmC,CACnC,OAAO;;;;;;;;;;AAWZ,IAAa,oCACX,4BAA4B,OAAO,2BAA2B,QAAQ,CACnE,WAAW,GAAI,CACf,GAAG,GAAG,SAAS,CACf,SAAS,SAAS,QAAQ,GAAG,GAAG,EAAE,CAClC,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,MAAmC,CAEnC,GAAG,IAAK,WAAW,CACnB,SAAS,SAAS,QAAQ,KAAM,MAAO,IAAK,CAC5C,OAAO,SAAS,QAAQ,GAAG,UAAU,GAAG,EAAE,UAAU,GAAG,CAAC,CACxD,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,MAAmC,CAEnC,GAAG,IAAK,SAAS,CACjB,SAAS,SAAS,QAAQ,IAAK,GAAG,IAAK,CACvC,OAAO,SAAS,QAAQ,GAAG,UAAU,GAAG,EAAE,UAAU,GAAG,CAAC,CACxD,OAAO,SAAS,aAAa,GAAG,UAAU,EAAE,EAAE,EAAE,CAChD,MAAmC,CAEnC,GAAG,IAAK,UAAU,CAClB,SAAS,SAAS,QAAQ,KAAM,GAAG,GAAI,CACvC,OAAO,SAAS,QAAQ,GAAG,GAAG,EAAE,CAChC,OAAO,SAAS,aAAa,GAAG,GAAG,EAAE,CACrC,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,YAAY,KAAM,IAAK,GAAI,CAC3C,OAAO,SAAS,SAAS,GAAG,GAAG,KAAK,CACpC,OAAO,SAAS,YAAY,KAAM,KAAM,IAAK,CAC7C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,CACnC,MAAmC,CACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;;AA4BZ,IAAa,mCACX,4BAA4B,OAAO,0BAA0B,SAAS,CACnE,WAAW,GAAI,CAEf,GAAG,GAAG,SAAS,CACf,SAAS,SAAS,QAAQ,GAAG,GAAG,EAAE,CAClC,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,MAAmC,CAEnC,GAAG,KAAM,WAAW,CACpB,SAAS,SAAS,QAAQ,KAAM,GAAG,IAAK,CACxC,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,MAAmC,CAEnC,GAAG,KAAM,SAAS,CAClB,SAAS,SAAS,QAAQ,KAAM,MAAO,IAAK,CAC5C,OAAO,SAAS,OAAO,UAAU,IAAI,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,MAAmC,CAEnC,GAAG,KAAM,UAAU,CACnB,SAAS,SAAS,QAAQ,GAAG,OAAQ,GAAI,CACzC,OAAO,SAAS,OAAO,UAAU,IAAI,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,QAAQ,UAAU,EAAE,EAAE,GAAG,EAAE,CAC3C,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,MAAmC,CAEnC,GAAG,IAAK,UAAU,CAClB,SAAS,SAAS,QAAQ,GAAG,GAAG,GAAI,CACpC,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,YAAY,KAAM,IAAK,GAAI,CAC3C,OAAO,SAAS,SAAS,GAAG,GAAG,KAAK,CACpC,OAAO,SAAS,YAAY,KAAM,KAAM,IAAK,CAC7C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,CACnC,MAAmC,CACnC,OAAO;;;;;;;;;;;;;;;;;AAkBZ,IAAa,gCACX,4BAA4B,OAAO,uBAAuB,SAAS,CAChE,WAAW,GAAI,CACf,GAAG,GAAG,SAAS,CACf,SAAS,SAAS,QAAQ,GAAG,GAAG,EAAE,CAClC,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,MAAmC,CAEnC,GAAG,KAAM,WAAW,CACpB,SAAS,SAAS,QAAQ,MAAO,GAAG,KAAM,CAC1C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,MAAmC,CAEnC,GAAG,KAAM,SAAS,CAClB,SAAS,SAAS,QAAQ,MAAO,MAAO,KAAM,CAC9C,OAAO,SAAS,OAAO,UAAU,GAAG,EAAE,GAAG,EAAE,CAC3C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,MAAmC,CAEnC,GAAG,KAAM,UAAU,CACnB,SAAS,SAAS,QAAQ,GAAG,OAAQ,IAAK,CAC1C,OAAO,SAAS,OAAO,UAAU,EAAE,EAAE,GAAG,EAAE,CAC1C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,MAAmC,CAEnC,GAAG,IAAK,UAAU,CAClB,SAAS,SAAS,QAAQ,GAAG,GAAG,IAAK,CACrC,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,YAAY,KAAM,IAAK,GAAI,CAC3C,OAAO,SAAS,SAAS,GAAG,GAAG,KAAK,CACpC,OAAO,SAAS,YAAY,KAAM,KAAM,IAAK,CAC7C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,CACnC,MAAmC,CACnC,OAAO;;;;;;;;;;;;;;;;AAqBZ,IAAa,gCACX,4BAA4B,OAAO,uBAAuB,SAAS,CAChE,WAAW,GAAI,CACf,GAAG,GAAG,SAAS,CACf,SAAS,SAAS,QAAQ,GAAG,GAAG,EAAE,CAClC,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,MAAmC,CAEnC,GAAG,KAAM,WAAW,CACpB,SAAS,SAAS,QAAQ,KAAM,GAAG,EAAE,CACrC,OAAO,SAAS,QAAQ,GAAG,GAAG,UAAU,EAAE,CAAC,CAC3C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,MAAmC,CAEnC,GAAG,IAAK,SAAS,CACjB,SAAS,SAAS,QAAQ,MAAO,MAAO,EAAE,CAC1C,OAAO,SAAS,QAAQ,GAAG,UAAU,EAAE,EAAE,UAAU,EAAE,CAAC,CACtD,OAAO,SAAS,aAAa,GAAG,UAAU,GAAG,EAAE,EAAE,CACjD,MAAmC,CAEnC,GAAG,KAAM,UAAU,CACnB,SAAS,SAAS,QAAQ,KAAM,GAAG,EAAE,CACrC,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,MAAmC,CAEnC,GAAG,IAAK,UAAU,CAClB,SAAS,SAAS,QAAQ,MAAO,GAAG,EAAE,CACtC,OAAO,SAAS,QAAQ,GAAG,GAAG,EAAE,CAChC,OAAO,SAAS,aAAa,GAAG,GAAG,EAAE,CACrC,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,YAAY,KAAM,IAAK,GAAI,CAC3C,OAAO,SAAS,SAAS,GAAG,GAAG,KAAK,CACpC,OAAO,SAAS,YAAY,KAAM,KAAM,IAAK,CAC7C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,CACnC,MAAmC,CACnC,OAAO;;;;;;;;;;AAWZ,IAAa,iCACX,4BAA4B,OAAO,wBAAwB,SAAS,CACjE,WAAW,GAAI,CACf,GAAG,GAAG,SAAS,CACf,SAAS,SAAS,QAAQ,GAAG,GAAG,EAAE,CAClC,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,MAAmC,CAEnC,GAAG,KAAM,WAAW,CACpB,SAAS,SAAS,QAAQ,MAAO,GAAG,EAAE,CACtC,OAAO,SAAS,QAAQ,GAAG,GAAG,UAAU,GAAG,CAAC,CAC5C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,MAAmC,CAEnC,GAAG,IAAK,SAAS,CACjB,SAAS,SAAS,QAAQ,KAAM,MAAO,EAAE,CACzC,OAAO,SAAS,QAAQ,GAAG,UAAU,GAAG,EAAE,UAAU,GAAG,CAAC,CACxD,OAAO,SAAS,aAAa,GAAG,UAAU,EAAE,EAAE,EAAE,CAChD,MAAmC,CAEnC,GAAG,KAAM,UAAU,CACnB,SAAS,SAAS,QAAQ,IAAK,GAAG,EAAE,CACpC,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,MAAmC,CAEnC,GAAG,IAAK,UAAU,CAClB,SAAS,SAAS,QAAQ,KAAM,GAAG,EAAE,CACrC,OAAO,SAAS,QAAQ,GAAG,GAAG,EAAE,CAChC,OAAO,SAAS,aAAa,GAAG,GAAG,EAAE,CACrC,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,YAAY,KAAM,IAAK,GAAI,CAC3C,OAAO,SAAS,SAAS,GAAG,GAAG,KAAK,CACpC,OAAO,SAAS,YAAY,KAAM,KAAM,IAAK,CAC7C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,CACnC,MAAmC,CACnC,OAAO;AA0BV,4BAA4B,OAAO,wBAAwB,SAAS,CACjE,WAAW,IAAK,CAEhB,GAAG,GAAG,SAAS,CACf,SAAS,SAAS,QAAQ,GAAG,GAAG,EAAE,CAClC,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,MAAmC,CAEnC,GAAG,KAAM,WAAW,CACpB,SAAS,SAAS,QAAQ,GAAG,MAAO,EAAE,CACtC,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,MAAmC,CAEnC,GAAG,IAAK,WAAW,CACnB,SAAS,SAAS,QAAQ,GAAG,KAAM,EAAE,CACrC,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,OAAO,UAAU,EAAE,EAAE,GAAG,EAAE,CAC1C,OAAO,SAAS,OAAO,UAAU,GAAG,EAAE,GAAG,EAAE,CAC3C,MAAmC,CAEnC,GAAG,KAAM,SAAS,CAClB,SAAS,SAAS,QAAQ,GAAG,KAAM,EAAE,CACrC,OAAO,SAAS,QAAQ,GAAG,UAAU,GAAG,EAAE,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,MAAmC,CAEnC,GAAG,IAAK,UAAU,CAClB,SAAS,SAAS,QAAQ,GAAG,MAAO,EAAE,CACtC,OAAO,SAAS,QAAQ,GAAG,UAAU,GAAG,EAAE,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,MAAmC,CAEnC,GAAG,KAAM,UAAU,CACnB,SAAS,SAAS,QAAQ,GAAG,MAAO,EAAE,CACtC,OAAO,SAAS,QAAQ,GAAG,UAAU,GAAG,EAAE,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,MAAmC,CAEnC,GAAG,KAAM,UAAU,CACnB,SAAS,SAAS,QAAQ,GAAG,GAAG,EAAE,CAClC,OAAO,SAAS,QAAQ,GAAG,UAAU,GAAG,EAAE,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,YAAY,KAAM,IAAK,GAAI,CAC3C,OAAO,SAAS,SAAS,GAAG,GAAG,KAAK,CACpC,OAAO,SAAS,YAAY,KAAM,KAAM,IAAK,CAC7C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,CACnC,MAAmC,CACnC,OAAO;AA8BV,4BAA4B,OAAO,wBAAwB,SAAS,CACjE,WAAW,GAAI,CAEf,GAAG,GAAG,SAAS,CACf,SAAS,SAAS,QAAQ,GAAG,KAAM,EAAE,CACrC,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,MAAmC,CAEnC,GAAG,KAAM,UAAU,CACnB,SAAS,SAAS,QAAQ,GAAG,MAAO,EAAE,CACtC,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,MAAmC,CAEnC,GAAG,KAAM,WAAW,CACpB,SAAS,SAAS,QAAQ,GAAG,KAAM,IAAK,CACxC,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,MAAmC,CAEnC,GAAG,KAAM,UAAU,CACnB,SAAS,SAAS,QAAQ,GAAG,MAAO,IAAK,CACzC,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,MAAmC,CAEnC,GAAG,KAAM,WAAW,CACpB,SAAS,SAAS,QAAQ,GAAG,KAAM,IAAK,CACxC,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,MAAmC,CAEnC,GAAG,IAAK,UAAU,CAClB,SAAS,SAAS,QAAQ,GAAG,KAAM,IAAK,CACxC,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,YAAY,KAAM,IAAK,GAAI,CAC3C,OAAO,SAAS,SAAS,GAAG,GAAG,KAAK,CACpC,OAAO,SAAS,YAAY,KAAM,KAAM,IAAK,CAC7C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,CACnC,MAAmC,CACnC,OAAO;AA6BV,4BAA4B,OAAO,qBAAqB,QAAQ,CAC7D,WAAW,IAAK,CAEhB,GAAG,GAAG,SAAS,CACf,SAAS,SAAS,QAAQ,GAAG,GAAG,EAAE,CAClC,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,MAAmC,CAEnC,GAAG,KAAM,WAAW,CACpB,SAAS,SAAS,QAAQ,MAAO,MAAO,IAAK,CAC7C,OAAO,SAAS,QAAQ,GAAG,UAAU,IAAI,EAAE,EAAE,CAC7C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,MAAmC,CAEnC,GAAG,KAAM,SAAS,CAClB,SAAS,SAAS,QAAQ,MAAO,OAAQ,IAAK,CAC9C,OAAO,SAAS,QAAQ,GAAG,UAAU,IAAI,EAAE,EAAE,CAC7C,OAAO,SAAS,aAAa,GAAG,UAAU,GAAG,EAAE,EAAE,CACjD,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,MAAmC,CAEnC,GAAG,IAAK,UAAU,CAClB,SAAS,SAAS,QAAQ,MAAO,MAAO,IAAK,CAC7C,OAAO,SAAS,QAAQ,GAAG,UAAU,IAAI,EAAE,EAAE,CAC7C,OAAO,SAAS,aAAa,GAAG,UAAU,GAAG,EAAE,EAAE,CACjD,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,MAAmC,CAEnC,GAAG,KAAM,UAAU,CACnB,SAAS,SAAS,QAAQ,KAAM,GAAG,GAAI,CACvC,OAAO,SAAS,QAAQ,GAAG,UAAU,IAAI,EAAE,EAAE,CAC7C,OAAO,SAAS,aAAa,GAAG,GAAG,EAAE,CACrC,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,YAAY,KAAM,IAAK,GAAI,CAC3C,OAAO,SAAS,SAAS,GAAG,GAAG,KAAK,CACpC,OAAO,SAAS,YAAY,KAAM,KAAM,IAAK,CAC7C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,CACnC,MAAmC,CACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;AA2BZ,IAAa,gCACX,4BAA4B,OAAO,uBAAuB,SAAS,CAChE,WAAW,IAAK,CAEhB,GAAG,GAAG,SAAS,CACf,SAAS,SAAS,QAAQ,GAAG,GAAG,EAAE,CAClC,OAAO,SAAS,QAAQ,GAAG,GAAG,EAAE,CAChC,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,MAAmC,CAEnC,GAAG,KAAM,WAAW,CACpB,SAAS,SAAS,QAAQ,MAAO,MAAO,EAAE,CAC1C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,MAAmC,CAEnC,GAAG,KAAM,SAAS,CAClB,SAAS,SAAS,QAAQ,MAAO,OAAQ,EAAE,CAC3C,OAAO,SAAS,QAAQ,GAAG,UAAU,IAAI,EAAE,EAAE,CAC7C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,OAAO,UAAU,EAAE,EAAE,GAAG,EAAE,CAC1C,MAAmC,CAEnC,GAAG,KAAM,SAAS,CAClB,SAAS,SAAS,QAAQ,MAAO,MAAO,EAAE,CAC1C,OAAO,SAAS,QAAQ,GAAG,UAAU,IAAI,EAAE,EAAE,CAC7C,OAAO,SAAS,aAAa,GAAG,UAAU,EAAE,EAAE,EAAE,CAChD,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,MAAmC,CAEnC,GAAG,IAAK,UAAU,CAClB,SAAS,SAAS,QAAQ,GAAG,OAAQ,EAAE,CACvC,OAAO,SAAS,QAAQ,GAAG,UAAU,IAAI,EAAE,EAAE,CAC7C,OAAO,SAAS,aAAa,GAAG,GAAG,EAAE,CACrC,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,MAAmC,CAEnC,GAAG,KAAM,UAAU,CACnB,SAAS,SAAS,QAAQ,GAAG,GAAG,EAAE,CAClC,OAAO,SAAS,QAAQ,GAAG,UAAU,IAAI,EAAE,EAAE,CAC7C,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,QAAQ,GAAG,GAAG,EAAE,CAChC,OAAO,SAAS,YAAY,KAAM,IAAK,GAAI,CAC3C,OAAO,SAAS,SAAS,GAAG,GAAG,KAAK,CACpC,OAAO,SAAS,YAAY,KAAM,KAAM,IAAK,CAC7C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,CACnC,MAAmC,CACnC,OAAO;;;;;;;;;;;AAYZ,IAAa,iCACX,4BAA4B,OAAO,wBAAwB,SAAS,CACjE,WAAW,IAAK,CAChB,GAAG,GAAG,SAAS,CACf,SAAS,SAAS,QAAQ,GAAG,GAAG,EAAE,CAClC,OAAO,SAAS,QAAQ,GAAG,GAAG,EAAE,CAChC,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,MAAmC,CAEnC,GAAG,KAAM,WAAW,CACpB,SAAS,SAAS,QAAQ,MAAO,MAAO,EAAE,CAC1C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,MAAmC,CAEnC,GAAG,KAAM,SAAS,CAClB,SAAS,SAAS,QAAQ,MAAO,OAAQ,EAAE,CAC3C,OAAO,SAAS,QAAQ,GAAG,UAAU,GAAG,EAAE,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,OAAO,UAAU,EAAE,EAAE,GAAG,EAAE,CAC1C,MAAmC,CAEnC,GAAG,KAAM,SAAS,CAClB,SAAS,SAAS,QAAQ,MAAO,MAAO,EAAE,CAC1C,OAAO,SAAS,QAAQ,GAAG,UAAU,GAAG,EAAE,EAAE,CAC5C,OAAO,SAAS,aAAa,GAAG,UAAU,GAAG,EAAE,EAAE,CACjD,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,MAAmC,CAEnC,GAAG,IAAK,UAAU,CAClB,SAAS,SAAS,QAAQ,GAAG,OAAQ,EAAE,CACvC,OAAO,SAAS,QAAQ,GAAG,UAAU,GAAG,EAAE,EAAE,CAC5C,OAAO,SAAS,aAAa,GAAG,GAAG,EAAE,CACrC,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,MAAmC,CAEnC,GAAG,KAAM,UAAU,CACnB,SAAS,SAAS,QAAQ,GAAG,GAAG,EAAE,CAClC,OAAO,SAAS,QAAQ,GAAG,UAAU,GAAG,EAAE,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,QAAQ,GAAG,GAAG,EAAE,CAChC,OAAO,SAAS,YAAY,KAAM,IAAK,GAAI,CAC3C,OAAO,SAAS,SAAS,GAAG,GAAG,KAAK,CACpC,OAAO,SAAS,YAAY,KAAM,KAAM,IAAK,CAC7C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,CACnC,MAAmC,CACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BZ,IAAa,6BACX,4BAA4B,OAAO,oBAAoB,MAAM,CAC1D,WAAW,GAAI,CAEf,GAAG,GAAG,SAAS,CACf,SAAS,SAAS,QAAQ,GAAG,GAAG,EAAE,CAClC,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,MAAmC,CAEnC,GAAG,KAAM,WAAW,CACpB,SAAS,SAAS,QAAQ,GAAG,OAAQ,EAAE,CACvC,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,MAAmC,CAEnC,GAAG,KAAM,SAAS,CAClB,SAAS,SAAS,QAAQ,GAAG,MAAO,GAAI,CACxC,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,MAAmC,CAEnC,GAAG,IAAK,UAAU,CAClB,SAAS,SAAS,QAAQ,GAAG,GAAG,GAAI,CACpC,OAAO,SAAS,QAAQ,UAAU,GAAG,EAAE,GAAG,EAAE,CAC5C,OAAO,SAAS,QAAQ,UAAU,IAAI,EAAE,GAAG,EAAE,CAC7C,OAAO,SAAS,YAAY,KAAM,IAAK,GAAI,CAC3C,OAAO,SAAS,SAAS,GAAG,GAAG,KAAK,CACpC,OAAO,SAAS,YAAY,KAAM,KAAM,IAAK,CAC7C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,CACnC,MAAmC,CACnC,OAAO;;;;;;;;;;;;;;AAmBZ,IAAa,sBAAsB,IAAI,IAA+B;CAEpE,CAAC,0BAA0B,iCAAiC;CAC5D,CAAC,2BAA2B,kCAAkC;CAG9D,CAAC,0BAA0B,iCAAiC;CAC5D,CAAC,uBAAuB,8BAA8B;CACtD,CAAC,uBAAuB,8BAA8B;CACtD,CAAC,wBAAwB,+BAA+B;CAGxD,CAAC,uBAAuB,8BAA8B;CACtD,CAAC,wBAAwB,+BAA+B;CAGxD,CAAC,oBAAoB,2BAA2B;CACjD,CAAC;;;;;;;;AASF,SAAgB,qBACd,eAC+B;CAC/B,OAAO,oBAAoB,IAAI,cAAc"}
|
|
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":"GamRedirectionAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/GamRedirectionAnimations.ts"],"sourcesContent":["import type { SkeletalAnimation } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\n\n// ═══════════════════════════════════════════════════════════════════════════\n// GAM TRIGRAM (감) - WATER: REDIRECTION & FLOW (유수/방향전환)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Flowing River Strike - 유수타격\n *\n * Signature Gam technique that flows like water around defenses.\n * Unlike direct strikes, this follows a curved path to bypass guards.\n *\n * Target: Face/Neck via curved trajectory\n * Principle: Flow (Yu)\n *\n * Phases:\n * 1. Flow Entry (유입): Circular wind-up\n * 2. Curve (곡선): Arcing strike path\n * 3. Impact (타격): Fluid impact\n * 4. Continue (지속): Follow-through like flowing water\n *\n * @korean 유수타격애니메이션\n */\nexport const GAM_FLOWING_RIVER_STRIKE: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"flowing_river_strike\", \"유수타격\")\n .asAttack(0.7)\n .stance()\n .parry(0.2) // Initial defensive flow\n .hookPunch(0.3) // Curved strike execution (using hook primitive for curve)\n .recover(0.2) // Flow back\n .build();\n\n/**\n * Redirection Counter - 방향전환반격\n *\n * Using the opponent's momentum against them.\n * Catching an attack and redirecting it while striking.\n *\n * Principle: Redirection (Banghyang Jeonhwan)\n *\n * @korean 방향전환반격애니메이션\n */\nexport const GAM_REDIRECTION_COUNTER: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"redirection_counter\", \"방향전환반격\")\n .asDefense(0.6)\n .parry(0.15) // Catch/Deflect\n .wristTwist(0.15) // Redirect vector\n .palmStrike(0.15) // Simultaneous counter\n .recover(0.15)\n .build();\n\n/**\n * Tidal Wave Palm - 해일장\n *\n * A heavy, crashing palm strike that mimics a tidal wave.\n * Builds energy from the ground up through a fluid body wave.\n *\n * Target: Chest/Solar Plexus\n * Principle: Heavy Flow (Jungrryu)\n *\n * @korean 해일장애니메이션\n */\nexport const GAM_TIDAL_WAVE_PALM: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"tidal_wave_palm\", \"해일장\")\n .asAttack(0.8)\n .stance()\n .punchWindup(0.25) // Deep gathering like drawing water\n .palmStrike(0.3) // Heavy crashing extension\n .recover(0.25)\n .build();\n\n/**\n * Whirlpool Counter - 소용돌이반격\n *\n * Circular defensive movement that traps the opponent's limb.\n *\n * Principle: Vortex (Soyongdori)\n *\n * @korean 소용돌이반격애니메이션\n */\nexport const GAM_WHIRLPOOL_COUNTER: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"whirlpool_counter\", \"소용돌이반격\")\n .asDefense(0.7)\n .parry(0.15) // Outer deflection\n .wristTwist(0.2) // Circular trap\n .jointLock(0.2) // Lock in the center\n .recover(0.15)\n .build();\n\n/**\n * Flowing Block - 유수막기 (Gam Water-Style Flowing Deflection)\n *\n * Soft blocking technique that absorbs and redirects force like water flowing around a rock.\n * Circular, continuous motion that yields rather than resists.\n *\n * Duration: 450ms (Slower, flowing defensive motion)\n *\n * @korean 유수막기애니메이션\n */\nexport const GAM_FLOWING_BLOCK: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"gam_flowing_block\", \"유수막기\")\n .asDefense(0.45)\n .shift(0.1, \"ease-out\") // Initial yielding motion\n .parry(0.15, \"linear\") // Continuous flowing deflection\n .shift(0.1, \"linear\") // Body flows with the deflection\n .recover(0.1)\n .build();\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAwBA,IAAa,2BACX,4BAA4B,OAAO,wBAAwB,
|
|
1
|
+
{"version":3,"file":"GamRedirectionAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/GamRedirectionAnimations.ts"],"sourcesContent":["import type { SkeletalAnimation } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\n\n// ═══════════════════════════════════════════════════════════════════════════\n// GAM TRIGRAM (감) - WATER: REDIRECTION & FLOW (유수/방향전환)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Flowing River Strike - 유수타격\n *\n * Signature Gam technique that flows like water around defenses.\n * Unlike direct strikes, this follows a curved path to bypass guards.\n *\n * Target: Face/Neck via curved trajectory\n * Principle: Flow (Yu)\n *\n * Phases:\n * 1. Flow Entry (유입): Circular wind-up\n * 2. Curve (곡선): Arcing strike path\n * 3. Impact (타격): Fluid impact\n * 4. Continue (지속): Follow-through like flowing water\n *\n * @korean 유수타격애니메이션\n */\nexport const GAM_FLOWING_RIVER_STRIKE: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"flowing_river_strike\", \"유수타격\")\n .asAttack(0.7)\n .stance()\n .parry(0.2) // Initial defensive flow\n .hookPunch(0.3) // Curved strike execution (using hook primitive for curve)\n .recover(0.2) // Flow back\n .build();\n\n/**\n * Redirection Counter - 방향전환반격\n *\n * Using the opponent's momentum against them.\n * Catching an attack and redirecting it while striking.\n *\n * Principle: Redirection (Banghyang Jeonhwan)\n *\n * @korean 방향전환반격애니메이션\n */\nexport const GAM_REDIRECTION_COUNTER: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"redirection_counter\", \"방향전환반격\")\n .asDefense(0.6)\n .parry(0.15) // Catch/Deflect\n .wristTwist(0.15) // Redirect vector\n .palmStrike(0.15) // Simultaneous counter\n .recover(0.15)\n .build();\n\n/**\n * Tidal Wave Palm - 해일장\n *\n * A heavy, crashing palm strike that mimics a tidal wave.\n * Builds energy from the ground up through a fluid body wave.\n *\n * Target: Chest/Solar Plexus\n * Principle: Heavy Flow (Jungrryu)\n *\n * @korean 해일장애니메이션\n */\nexport const GAM_TIDAL_WAVE_PALM: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"tidal_wave_palm\", \"해일장\")\n .asAttack(0.8)\n .stance()\n .punchWindup(0.25) // Deep gathering like drawing water\n .palmStrike(0.3) // Heavy crashing extension\n .recover(0.25)\n .build();\n\n/**\n * Whirlpool Counter - 소용돌이반격\n *\n * Circular defensive movement that traps the opponent's limb.\n *\n * Principle: Vortex (Soyongdori)\n *\n * @korean 소용돌이반격애니메이션\n */\nexport const GAM_WHIRLPOOL_COUNTER: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"whirlpool_counter\", \"소용돌이반격\")\n .asDefense(0.7)\n .parry(0.15) // Outer deflection\n .wristTwist(0.2) // Circular trap\n .jointLock(0.2) // Lock in the center\n .recover(0.15)\n .build();\n\n/**\n * Flowing Block - 유수막기 (Gam Water-Style Flowing Deflection)\n *\n * Soft blocking technique that absorbs and redirects force like water flowing around a rock.\n * Circular, continuous motion that yields rather than resists.\n *\n * Duration: 450ms (Slower, flowing defensive motion)\n *\n * @korean 유수막기애니메이션\n */\nexport const GAM_FLOWING_BLOCK: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"gam_flowing_block\", \"유수막기\")\n .asDefense(0.45)\n .shift(0.1, \"ease-out\") // Initial yielding motion\n .parry(0.15, \"linear\") // Continuous flowing deflection\n .shift(0.1, \"linear\") // Body flows with the deflection\n .recover(0.1)\n .build();\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAwBA,IAAa,2BACX,4BAA4B,OAAO,wBAAwB,MAAM,EAC9D,SAAS,EAAG,EACZ,OAAO,EACP,MAAM,EAAG,EACT,UAAU,EAAG,EACb,QAAQ,EAAG,EACX,MAAM;;;;;;;;;;;AAYX,IAAa,0BACX,4BAA4B,OAAO,uBAAuB,QAAQ,EAC/D,UAAU,EAAG,EACb,MAAM,GAAI,EACV,WAAW,GAAI,EACf,WAAW,GAAI,EACf,QAAQ,GAAI,EACZ,MAAM;;;;;;;;;;;;AAaX,IAAa,sBACX,4BAA4B,OAAO,mBAAmB,KAAK,EACxD,SAAS,EAAG,EACZ,OAAO,EACP,YAAY,GAAI,EAChB,WAAW,EAAG,EACd,QAAQ,GAAI,EACZ,MAAM;;;;;;;;;;AAWX,IAAa,wBACX,4BAA4B,OAAO,qBAAqB,QAAQ,EAC7D,UAAU,EAAG,EACb,MAAM,GAAI,EACV,WAAW,EAAG,EACd,UAAU,EAAG,EACb,QAAQ,GAAI,EACZ,MAAM;;;;;;;;;;;AAYX,IAAa,oBACX,4BAA4B,OAAO,qBAAqB,MAAM,EAC3D,UAAU,GAAI,EACd,MAAM,IAAK,UAAU,EACrB,MAAM,KAAM,QAAQ,EACpB,MAAM,IAAK,QAAQ,EACnB,QAAQ,EAAG,EACX,MAAM"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { BoneName } from "../../../types/skeletal.js";
|
|
2
|
+
import { MartialArtsAnimationBuilder } from "../builders/MartialArtsAnimationBuilder.js";
|
|
3
|
+
import { GAM_FLOWING_TAKEDOWN, GAM_WATER_FLOW_COUNTER_ANIMATION } from "./GamTechniqueAnimations.js";
|
|
4
|
+
/**
|
|
5
|
+
* All Gam stance animations for idle, movement, and combat techniques
|
|
6
|
+
*/
|
|
7
|
+
var GAM_STANCE_ANIMATIONS = {
|
|
8
|
+
idle: MartialArtsAnimationBuilder.create("gam_idle_flowing", "감괘 흐름 자세").asIdle(2.5, true).at(0).rotate(BoneName.PELVIS, 0, 0, 0).rotate(BoneName.SPINE_UPPER, 0, 0, 0).rotate(BoneName.SHOULDER_L, .09, .14, -.17).rotate(BoneName.SHOULDER_R, .09, -.14, .17).rotate(BoneName.ELBOW_L, 0, 0, -.52).rotate(BoneName.ELBOW_R, 0, 0, .52).rotate(BoneName.WRIST_L, -.09, 0, -.05).rotate(BoneName.WRIST_R, -.09, 0, .05).rotate(BoneName.HEAD, 0, 0, 0).position(BoneName.PELVIS, 0, 0, 0).done().at(.625).rotate(BoneName.PELVIS, 0, 0, -.0349).rotate(BoneName.SPINE_UPPER, 0, -.0349, 0).rotate(BoneName.SHOULDER_L, .1, .17, -.21).rotate(BoneName.SHOULDER_R, .07, -.1, .14).rotate(BoneName.WRIST_L, -.05, 0, -.09).rotate(BoneName.WRIST_R, -.12, 0, .02).position(BoneName.PELVIS, -.01, 0, 0).done().at(1.25).rotate(BoneName.PELVIS, 0, 0, 0).rotate(BoneName.SPINE_UPPER, 0, 0, 0).rotate(BoneName.SHOULDER_L, .09, .14, -.17).rotate(BoneName.SHOULDER_R, .09, -.14, .17).rotate(BoneName.WRIST_L, -.09, 0, -.05).rotate(BoneName.WRIST_R, -.09, 0, .05).position(BoneName.PELVIS, 0, 0, 0).done().at(1.875).rotate(BoneName.PELVIS, 0, 0, .0349).rotate(BoneName.SPINE_UPPER, 0, .0349, 0).rotate(BoneName.SHOULDER_L, .07, .1, -.14).rotate(BoneName.SHOULDER_R, .1, -.17, .21).rotate(BoneName.WRIST_L, -.12, 0, -.02).rotate(BoneName.WRIST_R, -.05, 0, .09).position(BoneName.PELVIS, .01, 0, 0).done().at(2.5).rotate(BoneName.PELVIS, 0, 0, 0).rotate(BoneName.SPINE_UPPER, 0, 0, 0).rotate(BoneName.SHOULDER_L, .09, .14, -.17).rotate(BoneName.SHOULDER_R, .09, -.14, .17).rotate(BoneName.ELBOW_L, 0, 0, -.52).rotate(BoneName.ELBOW_R, 0, 0, .52).rotate(BoneName.WRIST_L, -.09, 0, -.05).rotate(BoneName.WRIST_R, -.09, 0, .05).position(BoneName.PELVIS, 0, 0, 0).done().build(),
|
|
9
|
+
movement: {
|
|
10
|
+
yieldingSidestep: MartialArtsAnimationBuilder.create("gam_yielding_sidestep", "물의 양보").asMovement(.583, false).at(0).rotate(BoneName.PELVIS, 0, -.09, 0).rotate(BoneName.SPINE_UPPER, 0, -.05, 0).rotate(BoneName.KNEE_L, -.26, 0, 0).rotate(BoneName.KNEE_R, -.35, 0, 0).rotate(BoneName.SHOULDER_L, .09, .14, -.17).rotate(BoneName.SHOULDER_R, .09, -.14, .17).position(BoneName.PELVIS, 0, 0, 0).done().at(.283).rotate(BoneName.PELVIS, 0, -.14, 0).rotate(BoneName.SPINE_UPPER, 0, -.03, 0).rotate(BoneName.KNEE_L, -.17, 0, 0).rotate(BoneName.KNEE_R, -.44, 0, 0).rotate(BoneName.SHOULDER_L, .1, .17, -.14).rotate(BoneName.SHOULDER_R, .08, -.1, .14).position(BoneName.PELVIS, -.12, .01, 0).done().at(.583).rotate(BoneName.PELVIS, 0, -.1, 0).rotate(BoneName.SPINE_UPPER, 0, -.02, 0).rotate(BoneName.KNEE_L, -.26, 0, 0).rotate(BoneName.KNEE_R, -.35, 0, 0).rotate(BoneName.SHOULDER_L, .09, .14, -.17).rotate(BoneName.SHOULDER_R, .09, -.14, .17).position(BoneName.PELVIS, -.2, 0, 0).done().build(),
|
|
11
|
+
flowingRetreat: MartialArtsAnimationBuilder.create("gam_flowing_retreat_step", "수류 후퇴").asMovement(.75, false).at(0).rotate(BoneName.PELVIS, -.05, 0, 0).rotate(BoneName.SPINE_UPPER, -.03, 0, 0).rotate(BoneName.KNEE_L, -.35, 0, 0).rotate(BoneName.KNEE_R, -.26, 0, 0).rotate(BoneName.SHOULDER_L, .05, .17, -.14).rotate(BoneName.SHOULDER_R, .05, -.17, .14).rotate(BoneName.ELBOW_L, 0, 0, -.7).rotate(BoneName.ELBOW_R, 0, 0, .7).position(BoneName.PELVIS, 0, 0, 0).done().at(.367).rotate(BoneName.PELVIS, -.09, 0, 0).rotate(BoneName.SPINE_UPPER, -.05, 0, 0).rotate(BoneName.KNEE_L, -.17, 0, 0).rotate(BoneName.KNEE_R, -.44, 0, 0).rotate(BoneName.SHOULDER_L, .07, .21, -.17).rotate(BoneName.SHOULDER_R, .07, -.21, .17).rotate(BoneName.ELBOW_L, 0, 0, -.87).rotate(BoneName.ELBOW_R, 0, 0, .87).position(BoneName.PELVIS, 0, -.02, -.25).done().at(.75).rotate(BoneName.PELVIS, -.07, 0, 0).rotate(BoneName.SPINE_UPPER, -.03, 0, 0).rotate(BoneName.KNEE_L, -.26, 0, 0).rotate(BoneName.KNEE_R, -.35, 0, 0).rotate(BoneName.SHOULDER_L, .09, .17, -.14).rotate(BoneName.SHOULDER_R, .09, -.17, .14).rotate(BoneName.ELBOW_L, 0, 0, -.52).rotate(BoneName.ELBOW_R, 0, 0, .52).position(BoneName.PELVIS, 0, 0, -.4).done().build()
|
|
12
|
+
},
|
|
13
|
+
techniques: {
|
|
14
|
+
waterFlowCounter: GAM_WATER_FLOW_COUNTER_ANIMATION,
|
|
15
|
+
flowingTakedown: GAM_FLOWING_TAKEDOWN
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
//#endregion
|
|
19
|
+
export { GAM_STANCE_ANIMATIONS };
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=GamStanceAnimations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GamStanceAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/GamStanceAnimations.ts"],"sourcesContent":["/**\n * ☵ Gam (Water) Stance-Specific Animations\n *\n * Specialized idle, movement, guard, and adaptive counter animations for the Gam (감/Water) trigram.\n * Embodies adaptive flow and redirection from Hapkido techniques with water-like yielding principles.\n *\n * **Korean Martial Arts Context:**\n * - **무술**: 합기도 적응 기술 (Hapkido Adaptive Techniques)\n * - **특성**: 혈류 차단 (Blood Flow Disruption), 양보와 방향 전환 (Yielding and Redirecting)\n * - **철학**: 물의 적응력 (Water's Adaptability), 흐름의 지혜 (Flowing Wisdom)\n * - **대표 기술**: 수류반격 (Water Flow Counter/Adaptive Redirection)\n *\n * Animation Philosophy:\n * - **물처럼 흘러라** (Flow Like Water) - No resistance, only adaptation\n * - **적의 힘을 이용** (Use Enemy's Force) - Redirection over blocking\n * - **완전한 이완** (Complete Relaxation) - No tension in movements\n * - **끊임없는 적응** (Endless Adaptation) - Constant readiness to adjust\n *\n * @module systems/animation/catalogs/GamStanceAnimations\n * @category Animation\n * @korean 감괘자세애니메이션\n */\n\nimport { BoneName } from \"@/types/skeletal\";\nimport type { SkeletalAnimation } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\n\n// Import Gam Water adaptive techniques (감괘 적응 기술)\nimport {\n GAM_WATER_FLOW_COUNTER_ANIMATION,\n GAM_FLOWING_TAKEDOWN,\n} from \"./GamTechniqueAnimations\";\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☵ GAM IDLE FLOWING ANIMATION (감괘 흐름 자세)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gam Idle Flowing Animation\n *\n * **Korean**: 감괘 흐름 자세 (Gam-gwae Heureum Jase)\n * **Philosophy**: Water's adaptability through relaxed readiness\n *\n * Characteristics:\n * - Complete relaxation with no tension\n * - Subtle weight shifts demonstrating adaptability\n * - Shoulders completely loose and low\n * - Hands open and ready to receive force\n * - Breathing deep and flowing like water\n *\n * Animation Cycle:\n * - 0ms: Neutral relaxed position\n * - 625ms: Subtle weight shift left (물의 호흡)\n * - 1250ms: Return to center\n * - 1875ms: Subtle weight shift right\n * - 2500ms: Complete cycle\n *\n * @korean 감괘흐름자세\n * @duration 2500ms (2.5 second cycle)\n * @category Idle Animation\n */\nexport const GAM_IDLE_FLOWING: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"gam_idle_flowing\",\n \"감괘 흐름 자세\"\n )\n .asIdle(2.5, true)\n // Keyframe 0ms: Neutral relaxed position (baseline)\n .at(0)\n .rotate(BoneName.PELVIS, 0, 0, 0) // Neutral pelvis\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0) // Neutral spine\n .rotate(BoneName.SHOULDER_L, 0.09, 0.14, -0.17) // ~5°, ~8°, ~-10° (relaxed low)\n .rotate(BoneName.SHOULDER_R, 0.09, -0.14, 0.17) // ~5°, ~-8°, ~10°\n .rotate(BoneName.ELBOW_L, 0, 0, -0.52) // -30° (soft bend)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.52) // 30° (soft bend)\n .rotate(BoneName.WRIST_L, -0.09, 0, -0.05) // -5°, 0°, -3° (relaxed wrists)\n .rotate(BoneName.WRIST_R, -0.09, 0, 0.05) // -5°, 0°, 3°\n .rotate(BoneName.HEAD, 0, 0, 0) // Head neutral, aware\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Keyframe 625ms: Subtle weight shift left (물의 호흡)\n .at(0.625)\n .rotate(BoneName.PELVIS, 0, 0, -0.0349) // 0°, 0°, -2° (minimal shift)\n .rotate(BoneName.SPINE_UPPER, 0, -0.0349, 0) // 0°, -2°, 0° (flowing with weight)\n .rotate(BoneName.SHOULDER_L, 0.10, 0.17, -0.21) // 6°, 10°, -12° (left rises slightly)\n .rotate(BoneName.SHOULDER_R, 0.07, -0.10, 0.14) // 4°, -6°, 8° (right lowers)\n .rotate(BoneName.WRIST_L, -0.05, 0, -0.09) // -3°, 0°, -5° (subtle flow)\n .rotate(BoneName.WRIST_R, -0.12, 0, 0.02) // -7°, 0°, 1°\n .position(BoneName.PELVIS, -0.01, 0, 0) // Minimal lateral shift left\n .done<MartialArtsAnimationBuilder>()\n // Keyframe 1250ms: Return to center\n .at(1.25)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .rotate(BoneName.SHOULDER_L, 0.09, 0.14, -0.17)\n .rotate(BoneName.SHOULDER_R, 0.09, -0.14, 0.17)\n .rotate(BoneName.WRIST_L, -0.09, 0, -0.05)\n .rotate(BoneName.WRIST_R, -0.09, 0, 0.05)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Keyframe 1875ms: Subtle weight shift right\n .at(1.875)\n .rotate(BoneName.PELVIS, 0, 0, 0.0349) // 0°, 0°, 2° (minimal shift)\n .rotate(BoneName.SPINE_UPPER, 0, 0.0349, 0) // 0°, 2°, 0°\n .rotate(BoneName.SHOULDER_L, 0.07, 0.10, -0.14) // 4°, 6°, -8° (left lowers)\n .rotate(BoneName.SHOULDER_R, 0.10, -0.17, 0.21) // 6°, -10°, 12° (right rises)\n .rotate(BoneName.WRIST_L, -0.12, 0, -0.02) // -7°, 0°, -1°\n .rotate(BoneName.WRIST_R, -0.05, 0, 0.09) // -3°, 0°, 5°\n .position(BoneName.PELVIS, 0.01, 0, 0) // Minimal lateral shift right\n .done<MartialArtsAnimationBuilder>()\n // Keyframe 2500ms: Return to start (complete cycle)\n .at(2.5)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .rotate(BoneName.SHOULDER_L, 0.09, 0.14, -0.17)\n .rotate(BoneName.SHOULDER_R, 0.09, -0.14, 0.17)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.52)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.52)\n .rotate(BoneName.WRIST_L, -0.09, 0, -0.05)\n .rotate(BoneName.WRIST_R, -0.09, 0, 0.05)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☵ GAM YIELDING SIDESTEP (물의 양보)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gam Yielding Sidestep Animation\n *\n * **Korean**: 물의 양보 (Mul-ui Yangbo) - Water's Yielding\n * **Technique**: Lateral movement yielding to opponent's force\n *\n * Characteristics:\n * - Weight transfer follows natural flow\n * - Upper body remains centered and relaxed\n * - Feet glide rather than step\n * - No resistance, only adaptation\n * - Seamless transition to counter position\n *\n * Animation Phases:\n * - 0-167ms: Initial weight shift (양보 시작)\n * - 167-400ms: Gliding lateral movement (흐름)\n * - 400-583ms: Landing and settling (정착)\n *\n * @korean 물의양보\n * @frames 10 frames (58.3ms per frame at 60fps, total 583ms)\n * @duration 583ms\n * @category Movement Animation\n */\nexport const GAM_YIELDING_SIDESTEP: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"gam_yielding_sidestep\",\n \"물의 양보\"\n )\n .asMovement(0.583, false)\n // Phase 1: Initial weight shift (0ms)\n .at(0)\n .rotate(BoneName.PELVIS, 0, -0.09, 0) // 0°, -5° (weight begins shift)\n .rotate(BoneName.SPINE_UPPER, 0, -0.05, 0) // Upper body stays centered\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (left leg loads)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20° (right leg ready to glide)\n .rotate(BoneName.SHOULDER_L, 0.09, 0.14, -0.17) // Relaxed guard maintained\n .rotate(BoneName.SHOULDER_R, 0.09, -0.14, 0.17)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Gliding lateral movement (283ms - midpoint)\n .at(0.283)\n .rotate(BoneName.PELVIS, 0, -0.14, 0) // 0°, -8° (flowing lateral)\n .rotate(BoneName.SPINE_UPPER, 0, -0.03, 0) // Minimal rotation\n .rotate(BoneName.KNEE_L, -0.17, 0, 0) // -10° (left leg extends)\n .rotate(BoneName.KNEE_R, -0.44, 0, 0) // -25° (right leg glides)\n .rotate(BoneName.SHOULDER_L, 0.10, 0.17, -0.14) // Slight adjustment\n .rotate(BoneName.SHOULDER_R, 0.08, -0.10, 0.14)\n .position(BoneName.PELVIS, -0.12, 0.01, 0) // Lateral with slight rise\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Landing and settling (583ms)\n .at(0.583)\n .rotate(BoneName.PELVIS, 0, -0.10, 0) // 0°, -6° (settled)\n .rotate(BoneName.SPINE_UPPER, 0, -0.02, 0) // Return to center\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20° (grounded)\n .rotate(BoneName.SHOULDER_L, 0.09, 0.14, -0.17) // Guard restored\n .rotate(BoneName.SHOULDER_R, 0.09, -0.14, 0.17)\n .position(BoneName.PELVIS, -0.20, 0, 0) // Final lateral position\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☵ GAM FLOWING RETREAT STEP (수류 후퇴)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gam Flowing Retreat Step Animation\n *\n * **Korean**: 수류 후퇴 (Suryu Hutoe) - Water Flow Retreat\n * **Technique**: Backward movement with no resistance\n *\n * Characteristics:\n * - Body flows with opponent's momentum\n * - Hands stay forward to maintain contact\n * - No breaking of flow, continuous movement\n * - Seamless transition to counter position\n * - Weight shifts smoothly backward\n *\n * Animation Phases:\n * - 0-200ms: Initial backward flow (후퇴 시작)\n * - 200-533ms: Continuous backward glide (지속 흐름)\n * - 533-750ms: Settling in counter position (반격 준비)\n *\n * @korean 수류후퇴\n * @frames 13 frames (57.7ms per frame at 60fps, total 750ms)\n * @duration 750ms\n * @category Movement Animation\n */\nexport const GAM_FLOWING_RETREAT_STEP: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"gam_flowing_retreat_step\",\n \"수류 후퇴\"\n )\n .asMovement(0.75, false)\n // Phase 1: Initial backward flow (0ms)\n .at(0)\n .rotate(BoneName.PELVIS, -0.05, 0, 0) // -3° (lean back begins)\n .rotate(BoneName.SPINE_UPPER, -0.03, 0, 0) // Slight backward lean\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° (front leg ready)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (back leg loads)\n .rotate(BoneName.SHOULDER_L, 0.05, 0.17, -0.14) // 3°, 10°, -8° (hands forward)\n .rotate(BoneName.SHOULDER_R, 0.05, -0.17, 0.14) // Maintain contact position\n .rotate(BoneName.ELBOW_L, 0, 0, -0.70) // -40° (arms extending forward)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.70) // To maintain contact\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Continuous backward glide (367ms - midpoint)\n .at(0.367)\n .rotate(BoneName.PELVIS, -0.09, 0, 0) // -5° (flowing back)\n .rotate(BoneName.SPINE_UPPER, -0.05, 0, 0) // Maintain forward contact\n .rotate(BoneName.KNEE_L, -0.17, 0, 0) // -10° (front leg extends)\n .rotate(BoneName.KNEE_R, -0.44, 0, 0) // -25° (back leg absorbs)\n .rotate(BoneName.SHOULDER_L, 0.07, 0.21, -0.17) // Arms extend to maintain\n .rotate(BoneName.SHOULDER_R, 0.07, -0.21, 0.17)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.87) // -50° (maximum extension)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.87)\n .position(BoneName.PELVIS, 0, -0.02, -0.25) // Back and slightly down\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Settling in counter position (750ms)\n .at(0.75)\n .rotate(BoneName.PELVIS, -0.07, 0, 0) // -4° (settled back)\n .rotate(BoneName.SPINE_UPPER, -0.03, 0, 0) // Upright but ready\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable front)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20° (grounded back)\n .rotate(BoneName.SHOULDER_L, 0.09, 0.17, -0.14) // Return to guard\n .rotate(BoneName.SHOULDER_R, 0.09, -0.17, 0.14)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.52) // -30° (guard position)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.52)\n .position(BoneName.PELVIS, 0, 0, -0.40) // Final backward position\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// EXPORTS\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * All Gam stance animations for idle, movement, and combat techniques\n */\nexport const GAM_STANCE_ANIMATIONS = {\n idle: GAM_IDLE_FLOWING,\n movement: {\n yieldingSidestep: GAM_YIELDING_SIDESTEP,\n flowingRetreat: GAM_FLOWING_RETREAT_STEP,\n },\n // Water Adaptive Counter Techniques (감괘 적응 기술)\n techniques: {\n waterFlowCounter: GAM_WATER_FLOW_COUNTER_ANIMATION,\n flowingTakedown: GAM_FLOWING_TAKEDOWN,\n },\n} as const;\n"],"mappings":"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"}
|
|
@@ -48,8 +48,40 @@ import { MartialArtsAnimationBuilder } from "../builders/MartialArtsAnimationBui
|
|
|
48
48
|
* @category Counter Animation
|
|
49
49
|
*/
|
|
50
50
|
var GAM_WATER_FLOW_COUNTER_ANIMATION = MartialArtsAnimationBuilder.create("gam_water_flow_counter", "수류반격").asAttack(1.4).at(0).rotate(BoneName.PELVIS, 0, 0, 0).rotate(BoneName.SPINE_UPPER, 0, 0, 0).rotate(BoneName.SHOULDER_L, .17, .26, -.17).rotate(BoneName.SHOULDER_R, .09, -.14, .17).rotate(BoneName.ELBOW_L, 0, 0, -.7).rotate(BoneName.ELBOW_R, 0, 0, .52).rotate(BoneName.WRIST_L, 0, 0, -.17).rotate(BoneName.WRIST_R, 0, 0, 0).position(BoneName.PELVIS, 0, 0, 0).done().at(.35).rotate(BoneName.PELVIS, 0, -.14, -.05).rotate(BoneName.SPINE_UPPER, 0, -.17, 0).rotate(BoneName.SHOULDER_L, .26, .35, -.21).rotate(BoneName.SHOULDER_R, .12, -.17, .21).rotate(BoneName.ELBOW_L, 0, 0, -.87).rotate(BoneName.ELBOW_R, 0, 0, .7).rotate(BoneName.WRIST_L, .09, 0, -.26).rotate(BoneName.WRIST_R, .05, 0, .09).rotate(BoneName.KNEE_L, -.35, 0, 0).rotate(BoneName.KNEE_R, -.26, 0, 0).position(BoneName.PELVIS, -.03, -.01, -.02).done().at(.65).rotate(BoneName.PELVIS, 0, -.26, -.09).rotate(BoneName.SPINE_UPPER, 0, -.35, 0).rotate(BoneName.SHOULDER_L, .44, .52, -.26).rotate(BoneName.SHOULDER_R, .35, -.17, .17).rotate(BoneName.ELBOW_L, 0, .26, -1.05).rotate(BoneName.ELBOW_R, 0, 0, .7).rotate(BoneName.WRIST_L, .17, .09, -.35).rotate(BoneName.WRIST_R, .09, -.05, .14).rotate(BoneName.KNEE_L, -.26, 0, 0).rotate(BoneName.KNEE_R, -.35, 0, 0).position(BoneName.PELVIS, -.05, -.01, -.03).done().at(.95).rotate(BoneName.PELVIS, 0, -.35, -.12).rotate(BoneName.SPINE_UPPER, 0, -.44, 0).rotate(BoneName.SHOULDER_L, .52, .61, -.31).rotate(BoneName.SHOULDER_R, .44, -.26, .21).rotate(BoneName.ELBOW_L, 0, .35, -1.22).rotate(BoneName.ELBOW_R, 0, .17, .87).rotate(BoneName.WRIST_L, .21, .12, -.4).rotate(BoneName.WRIST_R, .14, -.09, .17).rotate(BoneName.KNEE_L, -.26, 0, 0).rotate(BoneName.KNEE_R, -.35, 0, 0).position(BoneName.PELVIS, -.06, -.01, -.04).done().at(1.15).rotate(BoneName.PELVIS, 0, .17, .09).rotate(BoneName.SPINE_UPPER, 0, .17, 0).rotate(BoneName.SHOULDER_L, .61, .35, -.17).rotate(BoneName.SHOULDER_R, .7, -.35, .14).rotate(BoneName.ELBOW_L, 0, 0, -.52).rotate(BoneName.ELBOW_R, 0, 0, .44).rotate(BoneName.WRIST_L, .14, .05, -.17).rotate(BoneName.WRIST_R, .12, -.07, .14).rotate(BoneName.KNEE_L, -.35, 0, 0).rotate(BoneName.KNEE_R, -.26, 0, 0).position(BoneName.PELVIS, -.03, 0, -.02).done().at(1.4).rotate(BoneName.PELVIS, 0, .314, .105).rotate(BoneName.SPINE_UPPER, 0, .35, 0).rotate(BoneName.SHOULDER_L, .7, .26, -.14).rotate(BoneName.SHOULDER_R, .79, -.314, .17).rotate(BoneName.ELBOW_L, 0, 0, -.44).rotate(BoneName.ELBOW_R, 0, 0, .35).rotate(BoneName.WRIST_L, .17, .07, -.12).rotate(BoneName.WRIST_R, .14, -.09, .17).rotate(BoneName.KNEE_L, -.26, 0, 0).rotate(BoneName.KNEE_R, -.35, 0, 0).position(BoneName.PELVIS, 0, 0, 0).done().build();
|
|
51
|
-
|
|
51
|
+
/**
|
|
52
|
+
* Gam Flowing Takedown Animation
|
|
53
|
+
*
|
|
54
|
+
* **Korean**: 수류 넘어뜨리기 (Suryu Neomeotteurigi) - Water Flow Takedown
|
|
55
|
+
* **Technique**: Blend, off-balance, flowing takedown using minimum force
|
|
56
|
+
*
|
|
57
|
+
* This technique demonstrates water's ability to overcome through adaptation:
|
|
58
|
+
* - Blend with opponent's movement (no resistance)
|
|
59
|
+
* - Subtle shift to break balance (minimal force)
|
|
60
|
+
* - Flowing takedown following natural gravity
|
|
61
|
+
*
|
|
62
|
+
* Animation Phases (Total: 1517ms):
|
|
63
|
+
* - Blend Phase (0-444ms): Match opponent's movement
|
|
64
|
+
* - Off-Balance Phase (444-889ms): Subtle balance disruption
|
|
65
|
+
* - Takedown Phase (889-1517ms): Flowing descent to ground
|
|
66
|
+
*
|
|
67
|
+
* Biomechanics:
|
|
68
|
+
* - Blend: Arms wrap and match movement, spine neutral
|
|
69
|
+
* - Off-balance: Small hip shift (-3°), opponent's structure compromised
|
|
70
|
+
* - Takedown: Controlled descent, maintaining contact throughout
|
|
71
|
+
*
|
|
72
|
+
* @korean 수류넘어뜨리기
|
|
73
|
+
* @duration 1517ms (blend 444ms + off-balance 445ms + takedown 628ms)
|
|
74
|
+
* @category Throw Animation
|
|
75
|
+
*/
|
|
76
|
+
var GAM_FLOWING_TAKEDOWN = MartialArtsAnimationBuilder.create("gam_flowing_takedown", "수류 넘어뜨리기").asAttack(1.517).at(0).rotate(BoneName.PELVIS, 0, -.09, 0).rotate(BoneName.SPINE_UPPER, 0, -.05, 0).rotate(BoneName.SHOULDER_L, .26, .44, -.09).rotate(BoneName.SHOULDER_R, .17, -.26, .14).rotate(BoneName.ELBOW_L, 0, 0, -.87).rotate(BoneName.ELBOW_R, 0, 0, .87).rotate(BoneName.WRIST_L, 0, .09, -.09).rotate(BoneName.WRIST_R, 0, -.09, .09).position(BoneName.PELVIS, 0, 0, 0).done().at(.444).rotate(BoneName.PELVIS, 0, -.14, 0).rotate(BoneName.SPINE_UPPER, 0, -.09, 0).rotate(BoneName.SHOULDER_L, .35, .52, -.14).rotate(BoneName.SHOULDER_R, .26, -.35, .17).rotate(BoneName.ELBOW_L, 0, .14, -1.05).rotate(BoneName.ELBOW_R, 0, -.14, 1.05).rotate(BoneName.WRIST_L, .09, .17, -.14).rotate(BoneName.WRIST_R, .09, -.17, .14).rotate(BoneName.KNEE_L, -.26, 0, 0).rotate(BoneName.KNEE_R, -.26, 0, 0).position(BoneName.PELVIS, -.02, 0, -.01).done().at(.667).rotate(BoneName.PELVIS, -.03, -.17, -.05).rotate(BoneName.SPINE_UPPER, -.05, -.12, 0).rotate(BoneName.SHOULDER_L, .44, .61, -.17).rotate(BoneName.SHOULDER_R, .35, -.44, .21).rotate(BoneName.ELBOW_L, 0, .21, -1.14).rotate(BoneName.ELBOW_R, 0, -.21, 1.14).rotate(BoneName.WRIST_L, .12, .21, -.17).rotate(BoneName.WRIST_R, .12, -.21, .17).rotate(BoneName.KNEE_L, -.35, 0, 0).rotate(BoneName.KNEE_R, -.26, 0, 0).position(BoneName.PELVIS, -.04, -.01, -.02).done().at(.889).rotate(BoneName.PELVIS, -.05, -.21, -.07).rotate(BoneName.SPINE_UPPER, -.09, -.17, 0).rotate(BoneName.SHOULDER_L, .52, .7, -.21).rotate(BoneName.SHOULDER_R, .44, -.52, .26).rotate(BoneName.ELBOW_L, 0, .26, -1.22).rotate(BoneName.ELBOW_R, 0, -.26, 1.22).rotate(BoneName.WRIST_L, .14, .26, -.21).rotate(BoneName.WRIST_R, .14, -.26, .21).rotate(BoneName.KNEE_L, -.44, 0, 0).rotate(BoneName.KNEE_R, -.35, 0, 0).position(BoneName.PELVIS, -.05, -.02, -.03).done().at(1.167).rotate(BoneName.PELVIS, -.12, -.26, -.09).rotate(BoneName.SPINE_UPPER, -.17, -.21, 0).rotate(BoneName.SHOULDER_L, .61, .79, -.26).rotate(BoneName.SHOULDER_R, .52, -.61, .31).rotate(BoneName.ELBOW_L, 0, .31, -1.31).rotate(BoneName.ELBOW_R, 0, -.31, 1.31).rotate(BoneName.WRIST_L, .17, .31, -.26).rotate(BoneName.WRIST_R, .17, -.31, .26).rotate(BoneName.KNEE_L, -.7, 0, 0).rotate(BoneName.KNEE_R, -.61, 0, 0).position(BoneName.PELVIS, -.06, -.1, -.05).done().at(1.517).rotate(BoneName.PELVIS, -.17, -.31, -.12).rotate(BoneName.SPINE_UPPER, -.26, -.26, 0).rotate(BoneName.SHOULDER_L, .7, .87, -.31).rotate(BoneName.SHOULDER_R, .61, -.7, .35).rotate(BoneName.ELBOW_L, 0, .35, -1.4).rotate(BoneName.ELBOW_R, 0, -.35, 1.4).rotate(BoneName.WRIST_L, .21, .35, -.31).rotate(BoneName.WRIST_R, .21, -.35, .31).rotate(BoneName.KNEE_L, -.87, 0, 0).rotate(BoneName.KNEE_R, -.79, 0, 0).position(BoneName.PELVIS, -.07, -.2, -.06).done().build();
|
|
77
|
+
/**
|
|
78
|
+
* All Gam technique combat animations
|
|
79
|
+
*/
|
|
80
|
+
var GAM_TECHNIQUE_ANIMATIONS = {
|
|
81
|
+
counter: GAM_WATER_FLOW_COUNTER_ANIMATION,
|
|
82
|
+
takedown: GAM_FLOWING_TAKEDOWN
|
|
83
|
+
};
|
|
52
84
|
//#endregion
|
|
53
|
-
export { GAM_WATER_FLOW_COUNTER_ANIMATION };
|
|
85
|
+
export { GAM_FLOWING_TAKEDOWN, GAM_TECHNIQUE_ANIMATIONS, GAM_WATER_FLOW_COUNTER_ANIMATION };
|
|
54
86
|
|
|
55
87
|
//# sourceMappingURL=GamTechniqueAnimations.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GamTechniqueAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/GamTechniqueAnimations.ts"],"sourcesContent":["/**\n * ☵ Gam (Water) Technique Combat Animations\n *\n * Advanced combat technique animations for the Gam (감/Water) trigram focusing on\n * adaptive counters, flowing redirection, and takedown techniques from Hapkido.\n *\n * **Korean Martial Arts Context:**\n * - **기술 유형**: 반격 기술 (Counter Techniques), 넘어뜨리기 (Takedowns)\n * - **원리**: 적응과 흐름 (Adaptation and Flow), 상대의 힘 이용 (Using Opponent's Force)\n * - **철학**: 물처럼 흘러 적의 힘을 이용하라 (Flow like water and use enemy's force)\n *\n * Technique Categories:\n * - **수류반격** (Water Flow Counter) - Receive, redirect, counter sequence\n * - **흐르는 넘어뜨리기** (Flowing Takedown) - Blend, off-balance, takedown\n *\n * @module systems/animation/catalogs/GamTechniqueAnimations\n * @category Animation\n * @korean 감괘기술애니메이션\n */\n\nimport { BoneName } from \"@/types/skeletal\";\nimport type { SkeletalAnimation } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☵ GAM WATER FLOW COUNTER (수류반격)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gam Water Flow Counter Animation\n *\n * **Korean**: 수류반격 (Suryu Bangyeok)\n * **Technique**: Yielding redirection into flowing counter\n * **Target Points**: Balance disruption, blood flow restriction\n *\n * This is the signature Gam technique demonstrating complete water philosophy:\n * - Accept opponent's force with yielding motion (receive)\n * - Guide force in circular path away from center (redirect)\n * - Flow into takedown or strike with opponent's momentum (counter)\n * - Return to adaptive guard maintaining contact (recovery)\n *\n * Animation Phases (Total: 1400ms):\n * - Receive Phase (0-350ms): Accept incoming attack with yield\n * - Redirect Phase (350-950ms): Circular redirection of force\n * - Counter Phase (950-1400ms): Flow into counter with opponent's momentum\n *\n * Biomechanics:\n * - Initial yield: Spine rotates away (-20°), hips shift (-5°)\n * - Redirection: Maximum spine rotation (-25°), arms guide in circle\n * - Counter: Spine reverses (+20°), both hands push/pull\n *\n * @korean 수류반격\n * @duration 1400ms (receive 350ms + redirect 600ms + counter 450ms)\n * @category Counter Animation\n */\nexport const GAM_WATER_FLOW_COUNTER_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"gam_water_flow_counter\",\n \"수류반격\"\n )\n .asAttack(1.4)\n \n // ═══════════════════════════════════════════════════════════════════════\n // RECEIVE PHASE (수용 단계) - 0-350ms, frames 0-6\n // Accept opponent's attack with yielding motion\n // ═══════════════════════════════════════════════════════════════════════\n \n // Frame 0: Guard position, receiving incoming attack\n .at(0)\n .rotate(BoneName.PELVIS, 0, 0, 0) // Neutral pelvis\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0) // Upright spine\n .rotate(BoneName.SHOULDER_L, 0.17, 0.26, -0.17) // ~10°, ~15°, ~-10° (receiving position)\n .rotate(BoneName.SHOULDER_R, 0.09, -0.14, 0.17) // Ready to yield\n .rotate(BoneName.ELBOW_L, 0, 0, -0.70) // -40° (arm extended to receive)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.52) // -30° (support position)\n .rotate(BoneName.WRIST_L, 0, 0, -0.17) // Palm open to receive\n .rotate(BoneName.WRIST_R, 0, 0, 0) // Neutral\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n \n // Frame 6 (350ms): Maximum yield - accept force\n .at(0.35)\n .rotate(BoneName.PELVIS, 0, -0.14, -0.05) // 0°, -8°, -3° (weight shifts away)\n .rotate(BoneName.SPINE_UPPER, 0, -0.17, 0) // 0°, ~-10°, 0° (spine yields away)\n .rotate(BoneName.SHOULDER_L, 0.26, 0.35, -0.21) // 15°, 20°, -12° (accept force)\n .rotate(BoneName.SHOULDER_R, 0.12, -0.17, 0.21) // Supporting position\n .rotate(BoneName.ELBOW_L, 0, 0, -0.87) // -50° (arm absorbs)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.70) // -40° (support absorbs)\n .rotate(BoneName.WRIST_L, 0.09, 0, -0.26) // 5°, 0°, -15° (palm guides)\n .rotate(BoneName.WRIST_R, 0.05, 0, 0.09) // Slight adjustment\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° (legs absorb)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15°\n .position(BoneName.PELVIS, -0.03, -0.01, -0.02) // Slight yield back\n .done<MartialArtsAnimationBuilder>()\n \n // ═══════════════════════════════════════════════════════════════════════\n // REDIRECT PHASE (전환 단계) - 350-950ms, frames 7-16\n // Circular redirection of opponent's force\n // ═══════════════════════════════════════════════════════════════════════\n \n // Frame 11 (650ms): Begin circular redirection\n .at(0.65)\n .rotate(BoneName.PELVIS, 0, -0.26, -0.09) // 0°, -15°, -5° (circular motion begins)\n .rotate(BoneName.SPINE_UPPER, 0, -0.35, 0) // 0°, -20°, 0° (circular redirection)\n .rotate(BoneName.SHOULDER_L, 0.44, 0.52, -0.26) // 25°, 30°, -15° (guide in circle)\n .rotate(BoneName.SHOULDER_R, 0.35, -0.17, 0.17) // 20°, -10°, 10° (right hand joins)\n .rotate(BoneName.ELBOW_L, 0, 0.26, -1.05) // 0°, 15°, -60° (circular control)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.70) // -40° (support control)\n .rotate(BoneName.WRIST_L, 0.17, 0.09, -0.35) // 10°, 5°, -20° (palm controls)\n .rotate(BoneName.WRIST_R, 0.09, -0.05, 0.14) // Guiding motion\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (legs stable)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20°\n .position(BoneName.PELVIS, -0.05, -0.01, -0.03) // Continue circular path\n .done<MartialArtsAnimationBuilder>()\n \n // Frame 16 (950ms): Maximum redirection - force fully redirected\n .at(0.95)\n .rotate(BoneName.PELVIS, 0, -0.35, -0.12) // 0°, -20°, -7° (maximum rotation)\n .rotate(BoneName.SPINE_UPPER, 0, -0.44, 0) // 0°, -25°, 0° (maximum redirection)\n .rotate(BoneName.SHOULDER_L, 0.52, 0.61, -0.31) // 30°, 35°, -18° (maximum control)\n .rotate(BoneName.SHOULDER_R, 0.44, -0.26, 0.21) // 25°, -15°, 12° (both hands control)\n .rotate(BoneName.ELBOW_L, 0, 0.35, -1.22) // 0°, 20°, -70° (full circle)\n .rotate(BoneName.ELBOW_R, 0, 0.17, 0.87) // 0°, 10°, -50° (support engaged)\n .rotate(BoneName.WRIST_L, 0.21, 0.12, -0.40) // Maximum control position\n .rotate(BoneName.WRIST_R, 0.14, -0.09, 0.17)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // Stable base\n .rotate(BoneName.KNEE_R, -0.35, 0, 0)\n .position(BoneName.PELVIS, -0.06, -0.01, -0.04) // Maximum circular position\n .done<MartialArtsAnimationBuilder>()\n \n // ═══════════════════════════════════════════════════════════════════════\n // COUNTER PHASE (반격 단계) - 950-1400ms, frames 17-24\n // Flow into counter using opponent's redirected momentum\n // ═══════════════════════════════════════════════════════════════════════\n \n // Frame 20 (1150ms): Begin counter flow\n .at(1.15)\n .rotate(BoneName.PELVIS, 0, 0.17, 0.09) // 0°, 10°, 5° (reverse to counter)\n .rotate(BoneName.SPINE_UPPER, 0, 0.17, 0) // 0°, 10°, 0° (flow into counter)\n .rotate(BoneName.SHOULDER_L, 0.61, 0.35, -0.17) // 35°, 20°, -10° (push motion)\n .rotate(BoneName.SHOULDER_R, 0.70, -0.35, 0.14) // 40°, -20°, 8° (pull motion)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.52) // -30° (extending for counter)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.44) // -25° (pulling for counter)\n .rotate(BoneName.WRIST_L, 0.14, 0.05, -0.17) // Push/control position\n .rotate(BoneName.WRIST_R, 0.12, -0.07, 0.14)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° (legs drive counter)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15°\n .position(BoneName.PELVIS, -0.03, 0, -0.02) // Return toward center\n .done<MartialArtsAnimationBuilder>()\n \n // Frame 24 (1400ms): Complete counter - opponent off-balance/down\n .at(1.4)\n .rotate(BoneName.PELVIS, 0, 0.314, 0.105) // 0°, ~18°, ~6° (full counter rotation)\n .rotate(BoneName.SPINE_UPPER, 0, 0.35, 0) // 0°, 20°, 0° (complete counter)\n .rotate(BoneName.SHOULDER_L, 0.70, 0.26, -0.14) // 40°, 15°, -8° (counter complete)\n .rotate(BoneName.SHOULDER_R, 0.79, -0.314, 0.17) // 45°, ~-18°, 10° (control maintained)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.44) // -25° (arms control opponent)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.35) // -20°\n .rotate(BoneName.WRIST_L, 0.17, 0.07, -0.12) // Control grip applied\n .rotate(BoneName.WRIST_R, 0.14, -0.09, 0.17)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable finish)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20°\n .position(BoneName.PELVIS, 0, 0, 0) // Return to center\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☵ GAM FLOWING TAKEDOWN (흐르는 넘어뜨리기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gam Flowing Takedown Animation\n *\n * **Korean**: 수류 넘어뜨리기 (Suryu Neomeotteurigi) - Water Flow Takedown\n * **Technique**: Blend, off-balance, flowing takedown using minimum force\n *\n * This technique demonstrates water's ability to overcome through adaptation:\n * - Blend with opponent's movement (no resistance)\n * - Subtle shift to break balance (minimal force)\n * - Flowing takedown following natural gravity\n *\n * Animation Phases (Total: 1517ms):\n * - Blend Phase (0-444ms): Match opponent's movement\n * - Off-Balance Phase (444-889ms): Subtle balance disruption\n * - Takedown Phase (889-1517ms): Flowing descent to ground\n *\n * Biomechanics:\n * - Blend: Arms wrap and match movement, spine neutral\n * - Off-balance: Small hip shift (-3°), opponent's structure compromised\n * - Takedown: Controlled descent, maintaining contact throughout\n *\n * @korean 수류넘어뜨리기\n * @duration 1517ms (blend 444ms + off-balance 445ms + takedown 628ms)\n * @category Throw Animation\n */\nexport const GAM_FLOWING_TAKEDOWN: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"gam_flowing_takedown\",\n \"수류 넘어뜨리기\"\n )\n .asAttack(1.517)\n \n // ═══════════════════════════════════════════════════════════════════════\n // BLEND PHASE (혼합 단계) - 0-444ms, frames 0-8\n // Match opponent's movement with no resistance\n // ═══════════════════════════════════════════════════════════════════════\n \n // Frame 0: Initial contact and blend entry\n .at(0)\n .rotate(BoneName.PELVIS, 0, -0.09, 0) // 0°, -5°, 0° (slight angle to opponent)\n .rotate(BoneName.SPINE_UPPER, 0, -0.05, 0) // Neutral, ready to blend\n .rotate(BoneName.SHOULDER_L, 0.26, 0.44, -0.09) // 15°, 25°, -5° (reaching for contact)\n .rotate(BoneName.SHOULDER_R, 0.17, -0.26, 0.14) // Mirror position\n .rotate(BoneName.ELBOW_L, 0, 0, -0.87) // -50° (arms extending to wrap)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.87) // -50°\n .rotate(BoneName.WRIST_L, 0, 0.09, -0.09) // Hands open for contact\n .rotate(BoneName.WRIST_R, 0, -0.09, 0.09)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n \n // Frame 8 (444ms): Full blend - matching opponent's movement\n .at(0.444)\n .rotate(BoneName.PELVIS, 0, -0.14, 0) // 0°, -8°, 0° (blended angle)\n .rotate(BoneName.SPINE_UPPER, 0, -0.09, 0) // 0°, -5°, 0° (follow opponent)\n .rotate(BoneName.SHOULDER_L, 0.35, 0.52, -0.14) // 20°, 30°, -8° (wrapped position)\n .rotate(BoneName.SHOULDER_R, 0.26, -0.35, 0.17) // Both arms engaged\n .rotate(BoneName.ELBOW_L, 0, 0.14, -1.05) // 0°, 8°, -60° (wrap complete)\n .rotate(BoneName.ELBOW_R, 0, -0.14, 1.05) // Mirror wrap\n .rotate(BoneName.WRIST_L, 0.09, 0.17, -0.14) // Hands in contact\n .rotate(BoneName.WRIST_R, 0.09, -0.17, 0.14)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable base)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15°\n .position(BoneName.PELVIS, -0.02, 0, -0.01) // Slight movement with opponent\n .done<MartialArtsAnimationBuilder>()\n \n // ═══════════════════════════════════════════════════════════════════════\n // OFF-BALANCE PHASE (균형 붕괴) - 444-889ms, frames 9-16\n // Subtle shifts to break opponent's structure\n // ═══════════════════════════════════════════════════════════════════════\n \n // Frame 12 (667ms): Begin off-balancing motion\n .at(0.667)\n .rotate(BoneName.PELVIS, -0.03, -0.17, -0.05) // -2°, -10°, -3° (subtle shift)\n .rotate(BoneName.SPINE_UPPER, -0.05, -0.12, 0) // -3°, -7°, 0° (begin break)\n .rotate(BoneName.SHOULDER_L, 0.44, 0.61, -0.17) // 25°, 35°, -10° (control tightens)\n .rotate(BoneName.SHOULDER_R, 0.35, -0.44, 0.21) // Opposite pressure\n .rotate(BoneName.ELBOW_L, 0, 0.21, -1.14) // 0°, 12°, -65° (leverage applied)\n .rotate(BoneName.ELBOW_R, 0, -0.21, 1.14)\n .rotate(BoneName.WRIST_L, 0.12, 0.21, -0.17) // Control grip\n .rotate(BoneName.WRIST_R, 0.12, -0.21, 0.17)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° (legs drive)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15°\n .position(BoneName.PELVIS, -0.04, -0.01, -0.02) // Shift for off-balance\n .done<MartialArtsAnimationBuilder>()\n \n // Frame 16 (889ms): Opponent's balance fully compromised\n .at(0.889)\n .rotate(BoneName.PELVIS, -0.05, -0.21, -0.07) // -3°, -12°, -4° (maximum shift)\n .rotate(BoneName.SPINE_UPPER, -0.09, -0.17, 0) // -5°, -10°, 0° (structure broken)\n .rotate(BoneName.SHOULDER_L, 0.52, 0.70, -0.21) // 30°, 40°, -12° (full control)\n .rotate(BoneName.SHOULDER_R, 0.44, -0.52, 0.26) // Maximum leverage\n .rotate(BoneName.ELBOW_L, 0, 0.26, -1.22) // 0°, 15°, -70° (maximum leverage)\n .rotate(BoneName.ELBOW_R, 0, -0.26, 1.22)\n .rotate(BoneName.WRIST_L, 0.14, 0.26, -0.21) // Tight control\n .rotate(BoneName.WRIST_R, 0.14, -0.26, 0.21)\n .rotate(BoneName.KNEE_L, -0.44, 0, 0) // -25° (deep bend for takedown)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20°\n .position(BoneName.PELVIS, -0.05, -0.02, -0.03) // Maximum off-balance position\n .done<MartialArtsAnimationBuilder>()\n \n // ═══════════════════════════════════════════════════════════════════════\n // TAKEDOWN PHASE (넘어뜨리기) - 889-1517ms, frames 17-26\n // Flowing descent to ground with opponent\n // ═══════════════════════════════════════════════════════════════════════\n \n // Frame 21 (1167ms): Mid-takedown - descending together\n .at(1.167)\n .rotate(BoneName.PELVIS, -0.12, -0.26, -0.09) // -7°, -15°, -5° (descending)\n .rotate(BoneName.SPINE_UPPER, -0.17, -0.21, 0) // -10°, -12°, 0° (following down)\n .rotate(BoneName.SHOULDER_L, 0.61, 0.79, -0.26) // 35°, 45°, -15° (maintain control)\n .rotate(BoneName.SHOULDER_R, 0.52, -0.61, 0.31) // Control throughout\n .rotate(BoneName.ELBOW_L, 0, 0.31, -1.31) // 0°, 18°, -75° (arms follow)\n .rotate(BoneName.ELBOW_R, 0, -0.31, 1.31)\n .rotate(BoneName.WRIST_L, 0.17, 0.31, -0.26) // Maintain contact\n .rotate(BoneName.WRIST_R, 0.17, -0.31, 0.26)\n .rotate(BoneName.KNEE_L, -0.70, 0, 0) // -40° (deep descent)\n .rotate(BoneName.KNEE_R, -0.61, 0, 0) // -35°\n .position(BoneName.PELVIS, -0.06, -0.10, -0.05) // Descending with opponent\n .done<MartialArtsAnimationBuilder>()\n \n // Frame 26 (1517ms): Takedown complete - opponent on ground\n .at(1.517)\n .rotate(BoneName.PELVIS, -0.17, -0.31, -0.12) // -10°, -18°, -7° (ground position)\n .rotate(BoneName.SPINE_UPPER, -0.26, -0.26, 0) // -15°, -15°, 0° (control maintained)\n .rotate(BoneName.SHOULDER_L, 0.70, 0.87, -0.31) // 40°, 50°, -18° (final control)\n .rotate(BoneName.SHOULDER_R, 0.61, -0.70, 0.35) // Control established\n .rotate(BoneName.ELBOW_L, 0, 0.35, -1.40) // 0°, 20°, -80° (pinning position)\n .rotate(BoneName.ELBOW_R, 0, -0.35, 1.40)\n .rotate(BoneName.WRIST_L, 0.21, 0.35, -0.31) // Ground control\n .rotate(BoneName.WRIST_R, 0.21, -0.35, 0.31)\n .rotate(BoneName.KNEE_L, -0.87, 0, 0) // -50° (kneeling position)\n .rotate(BoneName.KNEE_R, -0.79, 0, 0) // -45°\n .position(BoneName.PELVIS, -0.07, -0.20, -0.06) // Final ground position\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// EXPORTS\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * All Gam technique combat animations\n */\nexport const GAM_TECHNIQUE_ANIMATIONS = {\n counter: GAM_WATER_FLOW_COUNTER_ANIMATION,\n takedown: GAM_FLOWING_TAKEDOWN,\n} as const;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"GamTechniqueAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/GamTechniqueAnimations.ts"],"sourcesContent":["/**\n * ☵ Gam (Water) Technique Combat Animations\n *\n * Advanced combat technique animations for the Gam (감/Water) trigram focusing on\n * adaptive counters, flowing redirection, and takedown techniques from Hapkido.\n *\n * **Korean Martial Arts Context:**\n * - **기술 유형**: 반격 기술 (Counter Techniques), 넘어뜨리기 (Takedowns)\n * - **원리**: 적응과 흐름 (Adaptation and Flow), 상대의 힘 이용 (Using Opponent's Force)\n * - **철학**: 물처럼 흘러 적의 힘을 이용하라 (Flow like water and use enemy's force)\n *\n * Technique Categories:\n * - **수류반격** (Water Flow Counter) - Receive, redirect, counter sequence\n * - **흐르는 넘어뜨리기** (Flowing Takedown) - Blend, off-balance, takedown\n *\n * @module systems/animation/catalogs/GamTechniqueAnimations\n * @category Animation\n * @korean 감괘기술애니메이션\n */\n\nimport { BoneName } from \"@/types/skeletal\";\nimport type { SkeletalAnimation } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☵ GAM WATER FLOW COUNTER (수류반격)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gam Water Flow Counter Animation\n *\n * **Korean**: 수류반격 (Suryu Bangyeok)\n * **Technique**: Yielding redirection into flowing counter\n * **Target Points**: Balance disruption, blood flow restriction\n *\n * This is the signature Gam technique demonstrating complete water philosophy:\n * - Accept opponent's force with yielding motion (receive)\n * - Guide force in circular path away from center (redirect)\n * - Flow into takedown or strike with opponent's momentum (counter)\n * - Return to adaptive guard maintaining contact (recovery)\n *\n * Animation Phases (Total: 1400ms):\n * - Receive Phase (0-350ms): Accept incoming attack with yield\n * - Redirect Phase (350-950ms): Circular redirection of force\n * - Counter Phase (950-1400ms): Flow into counter with opponent's momentum\n *\n * Biomechanics:\n * - Initial yield: Spine rotates away (-20°), hips shift (-5°)\n * - Redirection: Maximum spine rotation (-25°), arms guide in circle\n * - Counter: Spine reverses (+20°), both hands push/pull\n *\n * @korean 수류반격\n * @duration 1400ms (receive 350ms + redirect 600ms + counter 450ms)\n * @category Counter Animation\n */\nexport const GAM_WATER_FLOW_COUNTER_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"gam_water_flow_counter\",\n \"수류반격\"\n )\n .asAttack(1.4)\n \n // ═══════════════════════════════════════════════════════════════════════\n // RECEIVE PHASE (수용 단계) - 0-350ms, frames 0-6\n // Accept opponent's attack with yielding motion\n // ═══════════════════════════════════════════════════════════════════════\n \n // Frame 0: Guard position, receiving incoming attack\n .at(0)\n .rotate(BoneName.PELVIS, 0, 0, 0) // Neutral pelvis\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0) // Upright spine\n .rotate(BoneName.SHOULDER_L, 0.17, 0.26, -0.17) // ~10°, ~15°, ~-10° (receiving position)\n .rotate(BoneName.SHOULDER_R, 0.09, -0.14, 0.17) // Ready to yield\n .rotate(BoneName.ELBOW_L, 0, 0, -0.70) // -40° (arm extended to receive)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.52) // -30° (support position)\n .rotate(BoneName.WRIST_L, 0, 0, -0.17) // Palm open to receive\n .rotate(BoneName.WRIST_R, 0, 0, 0) // Neutral\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n \n // Frame 6 (350ms): Maximum yield - accept force\n .at(0.35)\n .rotate(BoneName.PELVIS, 0, -0.14, -0.05) // 0°, -8°, -3° (weight shifts away)\n .rotate(BoneName.SPINE_UPPER, 0, -0.17, 0) // 0°, ~-10°, 0° (spine yields away)\n .rotate(BoneName.SHOULDER_L, 0.26, 0.35, -0.21) // 15°, 20°, -12° (accept force)\n .rotate(BoneName.SHOULDER_R, 0.12, -0.17, 0.21) // Supporting position\n .rotate(BoneName.ELBOW_L, 0, 0, -0.87) // -50° (arm absorbs)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.70) // -40° (support absorbs)\n .rotate(BoneName.WRIST_L, 0.09, 0, -0.26) // 5°, 0°, -15° (palm guides)\n .rotate(BoneName.WRIST_R, 0.05, 0, 0.09) // Slight adjustment\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° (legs absorb)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15°\n .position(BoneName.PELVIS, -0.03, -0.01, -0.02) // Slight yield back\n .done<MartialArtsAnimationBuilder>()\n \n // ═══════════════════════════════════════════════════════════════════════\n // REDIRECT PHASE (전환 단계) - 350-950ms, frames 7-16\n // Circular redirection of opponent's force\n // ═══════════════════════════════════════════════════════════════════════\n \n // Frame 11 (650ms): Begin circular redirection\n .at(0.65)\n .rotate(BoneName.PELVIS, 0, -0.26, -0.09) // 0°, -15°, -5° (circular motion begins)\n .rotate(BoneName.SPINE_UPPER, 0, -0.35, 0) // 0°, -20°, 0° (circular redirection)\n .rotate(BoneName.SHOULDER_L, 0.44, 0.52, -0.26) // 25°, 30°, -15° (guide in circle)\n .rotate(BoneName.SHOULDER_R, 0.35, -0.17, 0.17) // 20°, -10°, 10° (right hand joins)\n .rotate(BoneName.ELBOW_L, 0, 0.26, -1.05) // 0°, 15°, -60° (circular control)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.70) // -40° (support control)\n .rotate(BoneName.WRIST_L, 0.17, 0.09, -0.35) // 10°, 5°, -20° (palm controls)\n .rotate(BoneName.WRIST_R, 0.09, -0.05, 0.14) // Guiding motion\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (legs stable)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20°\n .position(BoneName.PELVIS, -0.05, -0.01, -0.03) // Continue circular path\n .done<MartialArtsAnimationBuilder>()\n \n // Frame 16 (950ms): Maximum redirection - force fully redirected\n .at(0.95)\n .rotate(BoneName.PELVIS, 0, -0.35, -0.12) // 0°, -20°, -7° (maximum rotation)\n .rotate(BoneName.SPINE_UPPER, 0, -0.44, 0) // 0°, -25°, 0° (maximum redirection)\n .rotate(BoneName.SHOULDER_L, 0.52, 0.61, -0.31) // 30°, 35°, -18° (maximum control)\n .rotate(BoneName.SHOULDER_R, 0.44, -0.26, 0.21) // 25°, -15°, 12° (both hands control)\n .rotate(BoneName.ELBOW_L, 0, 0.35, -1.22) // 0°, 20°, -70° (full circle)\n .rotate(BoneName.ELBOW_R, 0, 0.17, 0.87) // 0°, 10°, -50° (support engaged)\n .rotate(BoneName.WRIST_L, 0.21, 0.12, -0.40) // Maximum control position\n .rotate(BoneName.WRIST_R, 0.14, -0.09, 0.17)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // Stable base\n .rotate(BoneName.KNEE_R, -0.35, 0, 0)\n .position(BoneName.PELVIS, -0.06, -0.01, -0.04) // Maximum circular position\n .done<MartialArtsAnimationBuilder>()\n \n // ═══════════════════════════════════════════════════════════════════════\n // COUNTER PHASE (반격 단계) - 950-1400ms, frames 17-24\n // Flow into counter using opponent's redirected momentum\n // ═══════════════════════════════════════════════════════════════════════\n \n // Frame 20 (1150ms): Begin counter flow\n .at(1.15)\n .rotate(BoneName.PELVIS, 0, 0.17, 0.09) // 0°, 10°, 5° (reverse to counter)\n .rotate(BoneName.SPINE_UPPER, 0, 0.17, 0) // 0°, 10°, 0° (flow into counter)\n .rotate(BoneName.SHOULDER_L, 0.61, 0.35, -0.17) // 35°, 20°, -10° (push motion)\n .rotate(BoneName.SHOULDER_R, 0.70, -0.35, 0.14) // 40°, -20°, 8° (pull motion)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.52) // -30° (extending for counter)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.44) // -25° (pulling for counter)\n .rotate(BoneName.WRIST_L, 0.14, 0.05, -0.17) // Push/control position\n .rotate(BoneName.WRIST_R, 0.12, -0.07, 0.14)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° (legs drive counter)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15°\n .position(BoneName.PELVIS, -0.03, 0, -0.02) // Return toward center\n .done<MartialArtsAnimationBuilder>()\n \n // Frame 24 (1400ms): Complete counter - opponent off-balance/down\n .at(1.4)\n .rotate(BoneName.PELVIS, 0, 0.314, 0.105) // 0°, ~18°, ~6° (full counter rotation)\n .rotate(BoneName.SPINE_UPPER, 0, 0.35, 0) // 0°, 20°, 0° (complete counter)\n .rotate(BoneName.SHOULDER_L, 0.70, 0.26, -0.14) // 40°, 15°, -8° (counter complete)\n .rotate(BoneName.SHOULDER_R, 0.79, -0.314, 0.17) // 45°, ~-18°, 10° (control maintained)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.44) // -25° (arms control opponent)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.35) // -20°\n .rotate(BoneName.WRIST_L, 0.17, 0.07, -0.12) // Control grip applied\n .rotate(BoneName.WRIST_R, 0.14, -0.09, 0.17)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable finish)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20°\n .position(BoneName.PELVIS, 0, 0, 0) // Return to center\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☵ GAM FLOWING TAKEDOWN (흐르는 넘어뜨리기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gam Flowing Takedown Animation\n *\n * **Korean**: 수류 넘어뜨리기 (Suryu Neomeotteurigi) - Water Flow Takedown\n * **Technique**: Blend, off-balance, flowing takedown using minimum force\n *\n * This technique demonstrates water's ability to overcome through adaptation:\n * - Blend with opponent's movement (no resistance)\n * - Subtle shift to break balance (minimal force)\n * - Flowing takedown following natural gravity\n *\n * Animation Phases (Total: 1517ms):\n * - Blend Phase (0-444ms): Match opponent's movement\n * - Off-Balance Phase (444-889ms): Subtle balance disruption\n * - Takedown Phase (889-1517ms): Flowing descent to ground\n *\n * Biomechanics:\n * - Blend: Arms wrap and match movement, spine neutral\n * - Off-balance: Small hip shift (-3°), opponent's structure compromised\n * - Takedown: Controlled descent, maintaining contact throughout\n *\n * @korean 수류넘어뜨리기\n * @duration 1517ms (blend 444ms + off-balance 445ms + takedown 628ms)\n * @category Throw Animation\n */\nexport const GAM_FLOWING_TAKEDOWN: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"gam_flowing_takedown\",\n \"수류 넘어뜨리기\"\n )\n .asAttack(1.517)\n \n // ═══════════════════════════════════════════════════════════════════════\n // BLEND PHASE (혼합 단계) - 0-444ms, frames 0-8\n // Match opponent's movement with no resistance\n // ═══════════════════════════════════════════════════════════════════════\n \n // Frame 0: Initial contact and blend entry\n .at(0)\n .rotate(BoneName.PELVIS, 0, -0.09, 0) // 0°, -5°, 0° (slight angle to opponent)\n .rotate(BoneName.SPINE_UPPER, 0, -0.05, 0) // Neutral, ready to blend\n .rotate(BoneName.SHOULDER_L, 0.26, 0.44, -0.09) // 15°, 25°, -5° (reaching for contact)\n .rotate(BoneName.SHOULDER_R, 0.17, -0.26, 0.14) // Mirror position\n .rotate(BoneName.ELBOW_L, 0, 0, -0.87) // -50° (arms extending to wrap)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.87) // -50°\n .rotate(BoneName.WRIST_L, 0, 0.09, -0.09) // Hands open for contact\n .rotate(BoneName.WRIST_R, 0, -0.09, 0.09)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n \n // Frame 8 (444ms): Full blend - matching opponent's movement\n .at(0.444)\n .rotate(BoneName.PELVIS, 0, -0.14, 0) // 0°, -8°, 0° (blended angle)\n .rotate(BoneName.SPINE_UPPER, 0, -0.09, 0) // 0°, -5°, 0° (follow opponent)\n .rotate(BoneName.SHOULDER_L, 0.35, 0.52, -0.14) // 20°, 30°, -8° (wrapped position)\n .rotate(BoneName.SHOULDER_R, 0.26, -0.35, 0.17) // Both arms engaged\n .rotate(BoneName.ELBOW_L, 0, 0.14, -1.05) // 0°, 8°, -60° (wrap complete)\n .rotate(BoneName.ELBOW_R, 0, -0.14, 1.05) // Mirror wrap\n .rotate(BoneName.WRIST_L, 0.09, 0.17, -0.14) // Hands in contact\n .rotate(BoneName.WRIST_R, 0.09, -0.17, 0.14)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable base)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15°\n .position(BoneName.PELVIS, -0.02, 0, -0.01) // Slight movement with opponent\n .done<MartialArtsAnimationBuilder>()\n \n // ═══════════════════════════════════════════════════════════════════════\n // OFF-BALANCE PHASE (균형 붕괴) - 444-889ms, frames 9-16\n // Subtle shifts to break opponent's structure\n // ═══════════════════════════════════════════════════════════════════════\n \n // Frame 12 (667ms): Begin off-balancing motion\n .at(0.667)\n .rotate(BoneName.PELVIS, -0.03, -0.17, -0.05) // -2°, -10°, -3° (subtle shift)\n .rotate(BoneName.SPINE_UPPER, -0.05, -0.12, 0) // -3°, -7°, 0° (begin break)\n .rotate(BoneName.SHOULDER_L, 0.44, 0.61, -0.17) // 25°, 35°, -10° (control tightens)\n .rotate(BoneName.SHOULDER_R, 0.35, -0.44, 0.21) // Opposite pressure\n .rotate(BoneName.ELBOW_L, 0, 0.21, -1.14) // 0°, 12°, -65° (leverage applied)\n .rotate(BoneName.ELBOW_R, 0, -0.21, 1.14)\n .rotate(BoneName.WRIST_L, 0.12, 0.21, -0.17) // Control grip\n .rotate(BoneName.WRIST_R, 0.12, -0.21, 0.17)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° (legs drive)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15°\n .position(BoneName.PELVIS, -0.04, -0.01, -0.02) // Shift for off-balance\n .done<MartialArtsAnimationBuilder>()\n \n // Frame 16 (889ms): Opponent's balance fully compromised\n .at(0.889)\n .rotate(BoneName.PELVIS, -0.05, -0.21, -0.07) // -3°, -12°, -4° (maximum shift)\n .rotate(BoneName.SPINE_UPPER, -0.09, -0.17, 0) // -5°, -10°, 0° (structure broken)\n .rotate(BoneName.SHOULDER_L, 0.52, 0.70, -0.21) // 30°, 40°, -12° (full control)\n .rotate(BoneName.SHOULDER_R, 0.44, -0.52, 0.26) // Maximum leverage\n .rotate(BoneName.ELBOW_L, 0, 0.26, -1.22) // 0°, 15°, -70° (maximum leverage)\n .rotate(BoneName.ELBOW_R, 0, -0.26, 1.22)\n .rotate(BoneName.WRIST_L, 0.14, 0.26, -0.21) // Tight control\n .rotate(BoneName.WRIST_R, 0.14, -0.26, 0.21)\n .rotate(BoneName.KNEE_L, -0.44, 0, 0) // -25° (deep bend for takedown)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20°\n .position(BoneName.PELVIS, -0.05, -0.02, -0.03) // Maximum off-balance position\n .done<MartialArtsAnimationBuilder>()\n \n // ═══════════════════════════════════════════════════════════════════════\n // TAKEDOWN PHASE (넘어뜨리기) - 889-1517ms, frames 17-26\n // Flowing descent to ground with opponent\n // ═══════════════════════════════════════════════════════════════════════\n \n // Frame 21 (1167ms): Mid-takedown - descending together\n .at(1.167)\n .rotate(BoneName.PELVIS, -0.12, -0.26, -0.09) // -7°, -15°, -5° (descending)\n .rotate(BoneName.SPINE_UPPER, -0.17, -0.21, 0) // -10°, -12°, 0° (following down)\n .rotate(BoneName.SHOULDER_L, 0.61, 0.79, -0.26) // 35°, 45°, -15° (maintain control)\n .rotate(BoneName.SHOULDER_R, 0.52, -0.61, 0.31) // Control throughout\n .rotate(BoneName.ELBOW_L, 0, 0.31, -1.31) // 0°, 18°, -75° (arms follow)\n .rotate(BoneName.ELBOW_R, 0, -0.31, 1.31)\n .rotate(BoneName.WRIST_L, 0.17, 0.31, -0.26) // Maintain contact\n .rotate(BoneName.WRIST_R, 0.17, -0.31, 0.26)\n .rotate(BoneName.KNEE_L, -0.70, 0, 0) // -40° (deep descent)\n .rotate(BoneName.KNEE_R, -0.61, 0, 0) // -35°\n .position(BoneName.PELVIS, -0.06, -0.10, -0.05) // Descending with opponent\n .done<MartialArtsAnimationBuilder>()\n \n // Frame 26 (1517ms): Takedown complete - opponent on ground\n .at(1.517)\n .rotate(BoneName.PELVIS, -0.17, -0.31, -0.12) // -10°, -18°, -7° (ground position)\n .rotate(BoneName.SPINE_UPPER, -0.26, -0.26, 0) // -15°, -15°, 0° (control maintained)\n .rotate(BoneName.SHOULDER_L, 0.70, 0.87, -0.31) // 40°, 50°, -18° (final control)\n .rotate(BoneName.SHOULDER_R, 0.61, -0.70, 0.35) // Control established\n .rotate(BoneName.ELBOW_L, 0, 0.35, -1.40) // 0°, 20°, -80° (pinning position)\n .rotate(BoneName.ELBOW_R, 0, -0.35, 1.40)\n .rotate(BoneName.WRIST_L, 0.21, 0.35, -0.31) // Ground control\n .rotate(BoneName.WRIST_R, 0.21, -0.35, 0.31)\n .rotate(BoneName.KNEE_L, -0.87, 0, 0) // -50° (kneeling position)\n .rotate(BoneName.KNEE_R, -0.79, 0, 0) // -45°\n .position(BoneName.PELVIS, -0.07, -0.20, -0.06) // Final ground position\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// EXPORTS\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * All Gam technique combat animations\n */\nexport const GAM_TECHNIQUE_ANIMATIONS = {\n counter: GAM_WATER_FLOW_COUNTER_ANIMATION,\n takedown: GAM_FLOWING_TAKEDOWN,\n} as const;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuDA,IAAa,mCACX,4BAA4B,OAC1B,0BACA,MACF,EACG,SAAS,GAAG,EAQZ,GAAG,CAAC,EACJ,OAAO,SAAS,QAAQ,GAAG,GAAG,CAAC,EAC/B,OAAO,SAAS,aAAa,GAAG,GAAG,CAAC,EACpC,OAAO,SAAS,YAAY,KAAM,KAAM,IAAK,EAC7C,OAAO,SAAS,YAAY,KAAM,MAAO,GAAI,EAC7C,OAAO,SAAS,SAAS,GAAG,GAAG,GAAK,EACpC,OAAO,SAAS,SAAS,GAAG,GAAG,GAAI,EACnC,OAAO,SAAS,SAAS,GAAG,GAAG,IAAK,EACpC,OAAO,SAAS,SAAS,GAAG,GAAG,CAAC,EAChC,SAAS,SAAS,QAAQ,GAAG,GAAG,CAAC,EACjC,KAAkC,EAGlC,GAAG,GAAI,EACP,OAAO,SAAS,QAAQ,GAAG,MAAO,IAAK,EACvC,OAAO,SAAS,aAAa,GAAG,MAAO,CAAC,EACxC,OAAO,SAAS,YAAY,KAAM,KAAM,IAAK,EAC7C,OAAO,SAAS,YAAY,KAAM,MAAO,GAAI,EAC7C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAK,EACpC,OAAO,SAAS,SAAS,GAAG,GAAG,EAAI,EACnC,OAAO,SAAS,SAAS,KAAM,GAAG,IAAK,EACvC,OAAO,SAAS,SAAS,KAAM,GAAG,GAAI,EACtC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,SAAS,SAAS,QAAQ,MAAO,MAAO,IAAK,EAC7C,KAAkC,EAQlC,GAAG,GAAI,EACP,OAAO,SAAS,QAAQ,GAAG,MAAO,IAAK,EACvC,OAAO,SAAS,aAAa,GAAG,MAAO,CAAC,EACxC,OAAO,SAAS,YAAY,KAAM,KAAM,IAAK,EAC7C,OAAO,SAAS,YAAY,KAAM,MAAO,GAAI,EAC7C,OAAO,SAAS,SAAS,GAAG,KAAM,KAAK,EACvC,OAAO,SAAS,SAAS,GAAG,GAAG,EAAI,EACnC,OAAO,SAAS,SAAS,KAAM,KAAM,IAAK,EAC1C,OAAO,SAAS,SAAS,KAAM,MAAO,GAAI,EAC1C,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,SAAS,SAAS,QAAQ,MAAO,MAAO,IAAK,EAC7C,KAAkC,EAGlC,GAAG,GAAI,EACP,OAAO,SAAS,QAAQ,GAAG,MAAO,IAAK,EACvC,OAAO,SAAS,aAAa,GAAG,MAAO,CAAC,EACxC,OAAO,SAAS,YAAY,KAAM,KAAM,IAAK,EAC7C,OAAO,SAAS,YAAY,KAAM,MAAO,GAAI,EAC7C,OAAO,SAAS,SAAS,GAAG,KAAM,KAAK,EACvC,OAAO,SAAS,SAAS,GAAG,KAAM,GAAI,EACtC,OAAO,SAAS,SAAS,KAAM,KAAM,GAAK,EAC1C,OAAO,SAAS,SAAS,KAAM,MAAO,GAAI,EAC1C,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,SAAS,SAAS,QAAQ,MAAO,MAAO,IAAK,EAC7C,KAAkC,EAQlC,GAAG,IAAI,EACP,OAAO,SAAS,QAAQ,GAAG,KAAM,GAAI,EACrC,OAAO,SAAS,aAAa,GAAG,KAAM,CAAC,EACvC,OAAO,SAAS,YAAY,KAAM,KAAM,IAAK,EAC7C,OAAO,SAAS,YAAY,IAAM,MAAO,GAAI,EAC7C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAK,EACpC,OAAO,SAAS,SAAS,GAAG,GAAG,GAAI,EACnC,OAAO,SAAS,SAAS,KAAM,KAAM,IAAK,EAC1C,OAAO,SAAS,SAAS,KAAM,MAAO,GAAI,EAC1C,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,SAAS,SAAS,QAAQ,MAAO,GAAG,IAAK,EACzC,KAAkC,EAGlC,GAAG,GAAG,EACN,OAAO,SAAS,QAAQ,GAAG,MAAO,IAAK,EACvC,OAAO,SAAS,aAAa,GAAG,KAAM,CAAC,EACvC,OAAO,SAAS,YAAY,IAAM,KAAM,IAAK,EAC7C,OAAO,SAAS,YAAY,KAAM,OAAQ,GAAI,EAC9C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAK,EACpC,OAAO,SAAS,SAAS,GAAG,GAAG,GAAI,EACnC,OAAO,SAAS,SAAS,KAAM,KAAM,IAAK,EAC1C,OAAO,SAAS,SAAS,KAAM,MAAO,GAAI,EAC1C,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,SAAS,SAAS,QAAQ,GAAG,GAAG,CAAC,EACjC,KAAkC,EAClC,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BX,IAAa,uBACX,4BAA4B,OAC1B,wBACA,UACF,EACG,SAAS,KAAK,EAQd,GAAG,CAAC,EACJ,OAAO,SAAS,QAAQ,GAAG,MAAO,CAAC,EACnC,OAAO,SAAS,aAAa,GAAG,MAAO,CAAC,EACxC,OAAO,SAAS,YAAY,KAAM,KAAM,IAAK,EAC7C,OAAO,SAAS,YAAY,KAAM,MAAO,GAAI,EAC7C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAK,EACpC,OAAO,SAAS,SAAS,GAAG,GAAG,GAAI,EACnC,OAAO,SAAS,SAAS,GAAG,KAAM,IAAK,EACvC,OAAO,SAAS,SAAS,GAAG,MAAO,GAAI,EACvC,SAAS,SAAS,QAAQ,GAAG,GAAG,CAAC,EACjC,KAAkC,EAGlC,GAAG,IAAK,EACR,OAAO,SAAS,QAAQ,GAAG,MAAO,CAAC,EACnC,OAAO,SAAS,aAAa,GAAG,MAAO,CAAC,EACxC,OAAO,SAAS,YAAY,KAAM,KAAM,IAAK,EAC7C,OAAO,SAAS,YAAY,KAAM,MAAO,GAAI,EAC7C,OAAO,SAAS,SAAS,GAAG,KAAM,KAAK,EACvC,OAAO,SAAS,SAAS,GAAG,MAAO,IAAI,EACvC,OAAO,SAAS,SAAS,KAAM,KAAM,IAAK,EAC1C,OAAO,SAAS,SAAS,KAAM,MAAO,GAAI,EAC1C,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,SAAS,SAAS,QAAQ,MAAO,GAAG,IAAK,EACzC,KAAkC,EAQlC,GAAG,IAAK,EACR,OAAO,SAAS,QAAQ,MAAO,MAAO,IAAK,EAC3C,OAAO,SAAS,aAAa,MAAO,MAAO,CAAC,EAC5C,OAAO,SAAS,YAAY,KAAM,KAAM,IAAK,EAC7C,OAAO,SAAS,YAAY,KAAM,MAAO,GAAI,EAC7C,OAAO,SAAS,SAAS,GAAG,KAAM,KAAK,EACvC,OAAO,SAAS,SAAS,GAAG,MAAO,IAAI,EACvC,OAAO,SAAS,SAAS,KAAM,KAAM,IAAK,EAC1C,OAAO,SAAS,SAAS,KAAM,MAAO,GAAI,EAC1C,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,SAAS,SAAS,QAAQ,MAAO,MAAO,IAAK,EAC7C,KAAkC,EAGlC,GAAG,IAAK,EACR,OAAO,SAAS,QAAQ,MAAO,MAAO,IAAK,EAC3C,OAAO,SAAS,aAAa,MAAO,MAAO,CAAC,EAC5C,OAAO,SAAS,YAAY,KAAM,IAAM,IAAK,EAC7C,OAAO,SAAS,YAAY,KAAM,MAAO,GAAI,EAC7C,OAAO,SAAS,SAAS,GAAG,KAAM,KAAK,EACvC,OAAO,SAAS,SAAS,GAAG,MAAO,IAAI,EACvC,OAAO,SAAS,SAAS,KAAM,KAAM,IAAK,EAC1C,OAAO,SAAS,SAAS,KAAM,MAAO,GAAI,EAC1C,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,SAAS,SAAS,QAAQ,MAAO,MAAO,IAAK,EAC7C,KAAkC,EAQlC,GAAG,KAAK,EACR,OAAO,SAAS,QAAQ,MAAO,MAAO,IAAK,EAC3C,OAAO,SAAS,aAAa,MAAO,MAAO,CAAC,EAC5C,OAAO,SAAS,YAAY,KAAM,KAAM,IAAK,EAC7C,OAAO,SAAS,YAAY,KAAM,MAAO,GAAI,EAC7C,OAAO,SAAS,SAAS,GAAG,KAAM,KAAK,EACvC,OAAO,SAAS,SAAS,GAAG,MAAO,IAAI,EACvC,OAAO,SAAS,SAAS,KAAM,KAAM,IAAK,EAC1C,OAAO,SAAS,SAAS,KAAM,MAAO,GAAI,EAC1C,OAAO,SAAS,QAAQ,KAAO,GAAG,CAAC,EACnC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,SAAS,SAAS,QAAQ,MAAO,KAAO,IAAK,EAC7C,KAAkC,EAGlC,GAAG,KAAK,EACR,OAAO,SAAS,QAAQ,MAAO,MAAO,IAAK,EAC3C,OAAO,SAAS,aAAa,MAAO,MAAO,CAAC,EAC5C,OAAO,SAAS,YAAY,IAAM,KAAM,IAAK,EAC7C,OAAO,SAAS,YAAY,KAAM,KAAO,GAAI,EAC7C,OAAO,SAAS,SAAS,GAAG,KAAM,IAAK,EACvC,OAAO,SAAS,SAAS,GAAG,MAAO,GAAI,EACvC,OAAO,SAAS,SAAS,KAAM,KAAM,IAAK,EAC1C,OAAO,SAAS,SAAS,KAAM,MAAO,GAAI,EAC1C,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,SAAS,SAAS,QAAQ,MAAO,KAAO,IAAK,EAC7C,KAAkC,EAClC,MAAM;;;;AASX,IAAa,2BAA2B;CACtC,SAAS;CACT,UAAU;AACZ"}
|