blacktrigram 0.7.45 → 0.7.48
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 +22 -11
- package/lib/components/screens/combat/CombatScreen3D.js.map +1 -1
- package/lib/components/screens/combat/components/controls/CombatButtons.js.map +1 -1
- package/lib/components/screens/combat/components/controls/CombatControlsPanel.js.map +1 -1
- package/lib/components/screens/combat/components/controls/ControlsGuide.js.map +1 -1
- package/lib/components/screens/combat/components/controls/KeyboardHints.js.map +1 -1
- package/lib/components/screens/combat/components/controls/PauseMenu.js.map +1 -1
- package/lib/components/screens/combat/components/controls/PauseMenuButton.js.map +1 -1
- package/lib/components/screens/combat/components/controls/QuickSettings.js.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodDecals3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodLossOverlayHtml.js.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodParticles3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodViscosity3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/CombatParticleEffects3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/ConsciousnessBlur.js.map +1 -1
- package/lib/components/screens/combat/components/effects/InternalDamage3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/PainVignette.js.map +1 -1
- package/lib/components/screens/combat/components/effects/ParticleAudio3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/TraumaOverlay3D.js.map +1 -1
- package/lib/components/screens/combat/components/feedback/MatchCountdown.js.map +1 -1
- package/lib/components/screens/combat/components/feedback/RoundAnnouncementOverlayHtml.js.map +1 -1
- package/lib/components/screens/combat/components/feedback/RoundDisplayStatus.js.map +1 -1
- package/lib/components/screens/combat/components/feedback/RoundStartAnnouncementOverlayHtml.js.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatBottomHUD.js.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatLeftHUD.js.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatPortraitStatusStrip.js.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatRightHUD.js.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatTopHUD.js.map +1 -1
- package/lib/components/screens/combat/components/hud/DifficultyIndicator.js.map +1 -1
- package/lib/components/screens/combat/components/hud/FPSMonitor.js.map +1 -1
- package/lib/components/screens/combat/components/hud/MobileControlsWrapper.js.map +1 -1
- package/lib/components/screens/combat/components/hud/PlayerStateOverlayHtml.js.map +1 -1
- package/lib/components/screens/combat/components/indicators/BalanceIndicator.js.map +1 -1
- package/lib/components/screens/combat/components/indicators/InputBufferDisplay.js.map +1 -1
- package/lib/components/screens/combat/components/indicators/StaminaWarning.js.map +1 -1
- package/lib/components/screens/combat/components/indicators/TechniqueNameDisplay.js.map +1 -1
- package/lib/components/screens/combat/helpers/AnimationUpdater.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.js.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatState.js.map +1 -1
- package/lib/components/screens/controls/ControlsScreen3D.js.map +1 -1
- package/lib/components/screens/controls/components/ControlBindingsOverlayHtml.js.map +1 -1
- package/lib/components/screens/controls/components/ControlCategoryTabsOverlayHtml.js.map +1 -1
- package/lib/components/screens/controls/components/GamepadVisualization3D.js.map +1 -1
- package/lib/components/screens/controls/components/InteractiveControlDemoOverlayHtml.js.map +1 -1
- package/lib/components/screens/controls/components/Key3D.js.map +1 -1
- package/lib/components/screens/controls/components/VisualKeyboard3D.js.map +1 -1
- package/lib/components/screens/controls/constants/ControlsConstants.js.map +1 -1
- package/lib/components/screens/controls/hooks/useControlsState.js.map +1 -1
- package/lib/components/screens/endscreen/EndScreen3D.js.map +1 -1
- package/lib/components/screens/endscreen/components/DefeatAnimation3D.js.map +1 -1
- package/lib/components/screens/endscreen/components/MatchStatisticsDisplayOverlayHtml.js.map +1 -1
- package/lib/components/screens/endscreen/components/NavigationButtonsOverlayHtml.js.map +1 -1
- package/lib/components/screens/endscreen/components/PerformanceBreakdownOverlayHtml.js.map +1 -1
- package/lib/components/screens/endscreen/components/PerformanceRatingOverlayHtml.js.map +1 -1
- package/lib/components/screens/endscreen/components/VictoryAnimation3D.js.map +1 -1
- package/lib/components/screens/endscreen/components/WinnerDisplayOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/IntroScreen3D.js +1 -1
- package/lib/components/screens/intro/IntroScreen3D.js.map +1 -1
- package/lib/components/screens/intro/components/AbilityListOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/ArchetypeCardGridOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/ArchetypeCardOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/ArchetypeDisplayOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/EnhancedArchetypeDisplayOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/MenuButtonsOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/MenuSectionOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/StatBarOverlayHtml.js.map +1 -1
- package/lib/components/screens/philosophy/PhilosophyScreen3D.js.map +1 -1
- package/lib/components/screens/training/TrainingScreen3D.d.ts.map +1 -1
- package/lib/components/screens/training/TrainingScreen3D.js +1 -0
- package/lib/components/screens/training/TrainingScreen3D.js.map +1 -1
- package/lib/components/screens/training/components/AnatomyControlsOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/AnatomyOverlay3D.js.map +1 -1
- package/lib/components/screens/training/components/FootPlacementMarkers3D.js.map +1 -1
- package/lib/components/screens/training/components/FootworkDrillsOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/HitFeedbackEffect3D.js.map +1 -1
- package/lib/components/screens/training/components/TrainingButtonsOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/TrainingControlsOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/TrainingDummy3D.js.map +1 -1
- package/lib/components/screens/training/components/TrainingFeedbackOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/TrainingModeSelectorOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/TrainingStatsOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/VitalPointMarker3D.js.map +1 -1
- package/lib/components/screens/training/components/VitalPointTrainingOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/hud/TrainingBottomHUD.js.map +1 -1
- package/lib/components/screens/training/components/hud/TrainingLeftHUD.js.map +1 -1
- package/lib/components/screens/training/components/hud/TrainingRightHUD.js.map +1 -1
- package/lib/components/screens/training/components/hud/TrainingTopHUD.js.map +1 -1
- package/lib/components/screens/training/hooks/useAttackMovement.js.map +1 -1
- package/lib/components/screens/training/hooks/useTrainingActions.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.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.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.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.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 +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StanceIdleAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/StanceIdleAnimations.ts"],"sourcesContent":["/**\n * Trigram Stance Idle Animations - Enhanced Breathing & Weight Shift System\n *\n * Defines complete idle animations for all 8 trigram stances (팔괘) with:\n * - Multi-keyframe breathing cycles (4-6 frames per stance)\n * - Subtle weight shifts for natural movement\n * - Stance-specific rhythms reflecting martial philosophy\n * - Proper guard positions from StanceGuardPoses\n *\n * Each trigram idle is the starting point for all techniques in that stance.\n * The breathing and weight shifts reflect the elemental nature:\n * - ☰ 건 (Heaven): Powerful, expansive chest breathing\n * - ☱ 태 (Lake): Fluid, rippling breath flow\n * - ☲ 리 (Fire): Sharp, controlled precision breathing\n * - ☳ 진 (Thunder): Deep coiled power breathing\n * - ☴ 손 (Wind): Rhythmic continuous flow\n * - ☵ 감 (Water): Deep flowing diaphragm breathing\n * - ☶ 간 (Mountain): Minimal steady breathing\n * - ☷ 곤 (Earth): Deep grounded diaphragm breathing\n *\n * @module systems/animation/catalogs/StanceIdleAnimations\n * @category Animation System\n * @korean 팔괘자세대기애니메이션\n */\n\nimport { TrigramStance } from \"@/types/common\";\nimport type { SkeletalAnimation, StanceGuardPose } from \"@/types/skeletal\";\nimport { BoneName } from \"@/types/skeletal\";\nimport type { KeyframeConfig } from \"../builders/KeyframeConfig\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\nimport {\n GAM_WATER_GUARD_POSE,\n GAN_MOUNTAIN_GUARD_POSE,\n GEON_HIGH_GUARD_POSE,\n GON_EARTH_GUARD_POSE,\n JIN_THUNDER_GUARD_POSE,\n LI_FIRE_GUARD_POSE,\n SON_WIND_GUARD_POSE,\n STANCE_GUARD_CONFIGS,\n TAE_FLUID_GUARD_POSE,\n} from \"./StanceGuardPoses\";\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ANIMATION TIMING CONSTANTS (애니메이션 타이밍 상수)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Breathing cycle durations per stance (in seconds)\n * Each stance has characteristic breathing rhythm\n *\n * @korean 호흡주기지속시간\n */\nconst BREATHING_DURATIONS = {\n GEON: 2.4, // Powerful slow breathing\n TAE: 2.8, // Fluid flowing breath\n LI: 1.8, // Sharp controlled breathing\n JIN: 2.2, // Explosive ready breath\n SON: 2.0, // Rhythmic continuous flow\n GAM: 3.0, // Deep flowing breath\n GAN: 2.6, // Steady controlled breath\n GON: 2.6, // Grounded diaphragm breath\n} as const;\n\n/**\n * Weight shift amplitudes per stance (percentage of base)\n * Reflects stability vs. mobility of each stance\n * RESTORED to original values for better visual feedback and natural movement\n *\n * @korean 체중이동진폭\n */\nconst WEIGHT_SHIFT_AMPLITUDES = {\n GEON: 0.04, // Visible forward rocking - mobile power stance (파워 흔들림)\n TAE: 0.05, // Fluid flowing shifts clearly visible (유동적 흐름)\n LI: 0.02, // Small but visible - precision stance (정밀 제어)\n JIN: 0.06, // Large coiled spring bounce (폭발적 준비)\n SON: 0.045, // Rhythmic lateral shifts (연속 흐름)\n GAM: 0.055, // Flowing water adaptation (물 흐름)\n GAN: 0.015, // Minimal - mountain solid (산악 안정)\n GON: 0.03, // Grounded but visible shifts (대지 흔들림)\n} as const;\n\n// ═══════════════════════════════════════════════════════════════════════════\n// BREATHING ANIMATION HELPERS (호흡 애니메이션 헬퍼)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Calculates breathing scale at a given phase\n *\n * @param phase - Breathing phase (0-1, where 0.5 is peak inhale)\n * @param min - Minimum scale (exhale)\n * @param max - Maximum scale (inhale peak)\n * @returns Scale factor for chest/torso\n */\nfunction calculateBreathingScale(\n phase: number,\n min: number,\n max: number,\n): number {\n // Use cosine-based wave for natural breathing rhythm\n // Phase 0 = peak inhale, 0.5 = peak exhale\n const breathPhase = Math.cos(phase * Math.PI * 2);\n const amplitude = (max - min) / 2;\n const center = (max + min) / 2;\n return center + breathPhase * amplitude;\n}\n\n/**\n * Calculates torso expansion for breathing effect\n *\n * @param breathingScale - Current breathing scale (0.96-1.04)\n * @returns Torso rotation adjustment for breathing\n */\nfunction calculateTorsoBreathingOffset(breathingScale: number): number {\n // Chest expands forward more visibly on inhale\n // Multiplier 1.5 for clearly visible breathing (가슴 확장 시각화)\n return (breathingScale - 1) * 1.5;\n}\n\n/**\n * Calculates subtle knee bounce offset at a given phase\n *\n * DESIGN: Idle animations should have visible knee bounce for natural movement feel\n * - no pelvis position movement which creates a \"walking in place\" appearance.\n *\n * @param phase - Breathing/bounce phase (0-1)\n * @param amplitude - Maximum bounce amount (knee bend adjustment)\n * @returns Knee rotation adjustment for natural bounce\n */\nfunction calculateKneeBounce(phase: number, amplitude: number): number {\n // Visible knee flex synchronized with breathing for natural alive feel\n // Two bounces per breath cycle (one per inhale/exhale)\n // 호흡과 동기화된 무릎 굽힘으로 자연스러운 움직임\n const bouncePhase = Math.sin(phase * Math.PI * 4);\n return bouncePhase * amplitude * 0.5;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// GUARD POSE APPLICATION HELPERS (방어자세적용헬퍼)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Applies a complete guard pose to a KeyframeConfig with breathing and knee bounce\n *\n * DESIGN: Idle animations should only have:\n * - Chest breathing (torso expansion)\n * - Subtle knee bounce (slight knee flex variation)\n * NO pelvis X/Z position movement (causes \"walking in place\" appearance)\n *\n * @param kf - KeyframeConfig to apply pose to\n * @param pose - Guard pose to apply\n * @param breathingOffset - Torso breathing offset\n * @param kneeBounce - Subtle knee flex adjustment for bounce effect\n */\nfunction applyGuardPoseToKeyframe(\n kf: KeyframeConfig,\n pose: StanceGuardPose,\n breathingOffset: number,\n kneeBounce: number = 0,\n): void {\n // === ARM POSITIONS (팔 위치) ===\n // IMPORTANT: Use SHOULDER_L/R, ELBOW_L/R, WRIST_L/R bone names\n // NOT UPPER_ARM, FOREARM, HAND - those are different bones in the hierarchy!\n\n // Left arm - shoulder controls arm lift/rotation\n kf.rotate(\n BoneName.SHOULDER_L,\n pose.leftArm.shoulder.x,\n pose.leftArm.shoulder.y,\n pose.leftArm.shoulder.z,\n );\n // Elbow controls forearm bend\n kf.rotate(\n BoneName.ELBOW_L,\n pose.leftArm.elbow.x,\n pose.leftArm.elbow.y,\n pose.leftArm.elbow.z,\n );\n // Wrist controls hand rotation\n kf.rotate(\n BoneName.WRIST_L,\n pose.leftArm.wrist.x,\n pose.leftArm.wrist.y,\n pose.leftArm.wrist.z,\n );\n\n // Right arm - mirror bone hierarchy\n kf.rotate(\n BoneName.SHOULDER_R,\n pose.rightArm.shoulder.x,\n pose.rightArm.shoulder.y,\n pose.rightArm.shoulder.z,\n );\n kf.rotate(\n BoneName.ELBOW_R,\n pose.rightArm.elbow.x,\n pose.rightArm.elbow.y,\n pose.rightArm.elbow.z,\n );\n kf.rotate(\n BoneName.WRIST_R,\n pose.rightArm.wrist.x,\n pose.rightArm.wrist.y,\n pose.rightArm.wrist.z,\n );\n\n // === TORSO (몸통) - Full spine chain for proper rotation ===\n // SPINE_LOWER: Base torso twist (inherits from pelvis)\n kf.rotate(\n BoneName.SPINE_LOWER,\n pose.torso.x * 0.3,\n pose.torso.y * 0.4,\n pose.torso.z * 0.3,\n );\n // SPINE_MIDDLE: Mid-torso twist\n kf.rotate(\n BoneName.SPINE_MIDDLE,\n pose.torso.x * 0.3,\n pose.torso.y * 0.3,\n pose.torso.z * 0.3,\n );\n // SPINE_UPPER: Upper chest with breathing - gets most of the rotation\n kf.rotate(\n BoneName.SPINE_UPPER,\n pose.torso.x * 0.4 + breathingOffset,\n pose.torso.y * 0.3,\n pose.torso.z * 0.4,\n );\n\n // === LEG POSITIONS (다리 위치) ===\n // IMPORTANT: Use HIP_L/R for hip rotation, not THIGH!\n // HIP bone controls the leg's root rotation\n\n // Left leg - HIP controls leg lift/rotation at socket\n kf.rotate(\n BoneName.HIP_L,\n pose.leftLeg.hip.x,\n pose.leftLeg.hip.y,\n pose.leftLeg.hip.z,\n );\n // KNEE controls lower leg bend (primarily X axis flex)\n // Add subtle knee bounce for natural idle movement\n kf.rotate(\n BoneName.KNEE_L,\n pose.leftLeg.knee.x + kneeBounce,\n pose.leftLeg.knee.y,\n pose.leftLeg.knee.z,\n );\n // FOOT controls ankle rotation\n kf.rotate(\n BoneName.FOOT_L,\n pose.leftLeg.ankle.x,\n pose.leftLeg.ankle.y,\n pose.leftLeg.ankle.z,\n );\n\n // Right leg - mirror bone hierarchy\n kf.rotate(\n BoneName.HIP_R,\n pose.rightLeg.hip.x,\n pose.rightLeg.hip.y,\n pose.rightLeg.hip.z,\n );\n kf.rotate(\n BoneName.KNEE_R,\n pose.rightLeg.knee.x + kneeBounce,\n pose.rightLeg.knee.y,\n pose.rightLeg.knee.z,\n );\n kf.rotate(\n BoneName.FOOT_R,\n pose.rightLeg.ankle.x,\n pose.rightLeg.ankle.y,\n pose.rightLeg.ankle.z,\n );\n\n // === PELVIS (골반) - Root of entire body ===\n // Controls overall body rotation and position\n kf.rotate(BoneName.PELVIS, pose.pelvis.x, pose.pelvis.y, pose.pelvis.z);\n // Pelvis position: ONLY stance height drop (Y)\n // NO X/Z offset - this prevents \"walking in place\" appearance\n const pelvisHeight = pose.pelvisHeight ?? 0;\n kf.position(BoneName.PELVIS, 0, pelvisHeight, 0);\n\n // === FOOT POSITIONING (발 위치) ===\n // Position feet for stance width and depth\n const stanceDepth = pose.stanceDepth ?? 0;\n // Left foot: negative X (left side), negative Z (front for forward stances)\n kf.position(BoneName.FOOT_L, -pose.stanceWidth / 2, 0, -stanceDepth / 2);\n // Right foot: positive X (right side), positive Z (back for forward stances)\n kf.position(BoneName.FOOT_R, pose.stanceWidth / 2, 0, stanceDepth / 2);\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☰ GEON HEAVEN IDLE (건 하늘 대기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Creates Geon idle animation with breathing and subtle knee bounce\n * NO pelvis position movement - only breathing and knee flex\n */\nfunction createGeonIdleAnimation(): SkeletalAnimation {\n const pose = GEON_HIGH_GUARD_POSE;\n const { min, max } = pose.breathingRange;\n const duration = BREATHING_DURATIONS.GEON;\n const amplitude = WEIGHT_SHIFT_AMPLITUDES.GEON;\n const frames = STANCE_GUARD_CONFIGS.geon.breathingFrames;\n\n const builder = MartialArtsAnimationBuilder.create(\n \"stance_geon\",\n \"건 대기\",\n ).asIdle(duration, true);\n\n // Generate keyframes with breathing and subtle knee bounce\n for (let i = 0; i <= frames; i++) {\n const phase = i / frames;\n const frameTime = phase * duration;\n const breathingScale = calculateBreathingScale(phase, min, max);\n const breathingOffset = calculateTorsoBreathingOffset(breathingScale);\n const kneeBounce = calculateKneeBounce(phase, amplitude);\n\n const kf = builder.at(frameTime);\n applyGuardPoseToKeyframe(kf, pose, breathingOffset, kneeBounce);\n kf.done<MartialArtsAnimationBuilder>();\n }\n\n return builder.build();\n}\n\n/**\n * ☰ 건 (Geon) Heaven Idle Animation\n *\n * Powerful high guard stance with expansive chest breathing.\n * Boxing-style guard protecting chin and temples.\n *\n * **Breathing**: Slow powerful expansion (2.4s cycle)\n * **Weight**: Subtle forward shift for aggression\n * **Philosophy**: Heaven's creative force, direct power\n *\n * @korean 건하늘대기애니메이션\n */\nexport const GEON_IDLE_ANIMATION: SkeletalAnimation = createGeonIdleAnimation();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☱ TAE LAKE IDLE (태 연못 대기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Creates Tae idle animation with breathing and subtle knee bounce\n * NO pelvis position movement - only breathing and knee flex\n */\nfunction createTaeIdleAnimation(): SkeletalAnimation {\n const pose = TAE_FLUID_GUARD_POSE;\n const { min, max } = pose.breathingRange;\n const duration = BREATHING_DURATIONS.TAE;\n const amplitude = WEIGHT_SHIFT_AMPLITUDES.TAE;\n const frames = STANCE_GUARD_CONFIGS.tae.breathingFrames;\n\n const builder = MartialArtsAnimationBuilder.create(\n \"stance_tae\",\n \"태 대기\",\n ).asIdle(duration, true);\n\n for (let i = 0; i <= frames; i++) {\n const phase = i / frames;\n const frameTime = phase * duration;\n const breathingScale = calculateBreathingScale(phase, min, max);\n const breathingOffset = calculateTorsoBreathingOffset(breathingScale);\n const kneeBounce = calculateKneeBounce(phase, amplitude);\n\n const kf = builder.at(frameTime);\n applyGuardPoseToKeyframe(kf, pose, breathingOffset, kneeBounce);\n kf.done<MartialArtsAnimationBuilder>();\n }\n\n return builder.build();\n}\n\n/**\n * ☱ 태 (Tae) Lake Idle Animation\n *\n * Fluid mid-guard stance with flowing breath rhythm.\n * Lead hand ready for parrying, rear protects chin.\n *\n * **Breathing**: Flowing waves (2.8s cycle)\n * **Weight**: Circular flowing shifts\n * **Philosophy**: Lake's adaptability, fluid technique\n *\n * @korean 태연못대기애니메이션\n */\nexport const TAE_IDLE_ANIMATION: SkeletalAnimation = createTaeIdleAnimation();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☲ LI FIRE IDLE (리 불 대기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Creates Li idle animation with breathing and subtle knee bounce\n * NO pelvis position movement - only breathing and knee flex\n */\nfunction createLiIdleAnimation(): SkeletalAnimation {\n const pose = LI_FIRE_GUARD_POSE;\n const { min, max } = pose.breathingRange;\n const duration = BREATHING_DURATIONS.LI;\n const amplitude = WEIGHT_SHIFT_AMPLITUDES.LI;\n const frames = STANCE_GUARD_CONFIGS.li.breathingFrames;\n\n const builder = MartialArtsAnimationBuilder.create(\n \"stance_li\",\n \"리 대기\",\n ).asIdle(duration, true);\n\n for (let i = 0; i <= frames; i++) {\n const phase = i / frames;\n const frameTime = phase * duration;\n const breathingScale = calculateBreathingScale(phase, min, max);\n const breathingOffset = calculateTorsoBreathingOffset(breathingScale);\n const kneeBounce = calculateKneeBounce(phase, amplitude);\n\n const kf = builder.at(frameTime);\n applyGuardPoseToKeyframe(kf, pose, breathingOffset, kneeBounce);\n kf.done<MartialArtsAnimationBuilder>();\n }\n\n return builder.build();\n}\n\n/**\n * ☲ 리 (Li) Fire Idle Animation\n *\n * Aggressive peekaboo guard with sharp controlled breathing.\n * Both hands high protecting face for precision striking.\n *\n * **Breathing**: Sharp controlled (1.8s cycle)\n * **Weight**: Minimal movement for precision\n * **Philosophy**: Fire's precision, vital point targeting\n *\n * @korean 리불대기애니메이션\n */\nexport const LI_IDLE_ANIMATION: SkeletalAnimation = createLiIdleAnimation();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☳ JIN THUNDER IDLE (진 천둥 대기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Creates Jin idle animation with breathing and subtle knee bounce\n * NO pelvis position movement - only breathing and knee flex\n */\nfunction createJinIdleAnimation(): SkeletalAnimation {\n const pose = JIN_THUNDER_GUARD_POSE;\n const { min, max } = pose.breathingRange;\n const duration = BREATHING_DURATIONS.JIN;\n const amplitude = WEIGHT_SHIFT_AMPLITUDES.JIN;\n const frames = STANCE_GUARD_CONFIGS.jin.breathingFrames;\n\n const builder = MartialArtsAnimationBuilder.create(\n \"stance_jin\",\n \"진 대기\",\n ).asIdle(duration, true);\n\n for (let i = 0; i <= frames; i++) {\n const phase = i / frames;\n const frameTime = phase * duration;\n const breathingScale = calculateBreathingScale(phase, min, max);\n const breathingOffset = calculateTorsoBreathingOffset(breathingScale);\n // Jin uses slightly larger bounce (coiled spring ready)\n const kneeBounce = calculateKneeBounce(phase, amplitude);\n\n const kf = builder.at(frameTime);\n applyGuardPoseToKeyframe(kf, pose, breathingOffset, kneeBounce);\n kf.done<MartialArtsAnimationBuilder>();\n }\n\n return builder.build();\n}\n\n/**\n * ☳ 진 (Jin) Thunder Idle Animation\n *\n * Chambered explosive stance with deep power breathing.\n * Fists at ribs, coiled spring ready for explosive release.\n *\n * **Breathing**: Deep coiled power (2.2s cycle)\n * **Weight**: Back-loaded with subtle forward pulse\n * **Philosophy**: Thunder's explosive force, shocking power\n *\n * @korean 진천둥대기애니메이션\n */\nexport const JIN_IDLE_ANIMATION: SkeletalAnimation = createJinIdleAnimation();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☴ SON WIND IDLE (손 바람 대기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Creates Son idle animation with breathing and subtle knee bounce\n * NO pelvis position movement - only breathing and knee flex\n */\nfunction createSonIdleAnimation(): SkeletalAnimation {\n const pose = SON_WIND_GUARD_POSE;\n const { min, max } = pose.breathingRange;\n const duration = BREATHING_DURATIONS.SON;\n const amplitude = WEIGHT_SHIFT_AMPLITUDES.SON;\n const frames = STANCE_GUARD_CONFIGS.son.breathingFrames;\n\n const builder = MartialArtsAnimationBuilder.create(\n \"stance_son\",\n \"손 대기\",\n ).asIdle(duration, true);\n\n for (let i = 0; i <= frames; i++) {\n const phase = i / frames;\n const frameTime = phase * duration;\n const breathingScale = calculateBreathingScale(phase, min, max);\n const breathingOffset = calculateTorsoBreathingOffset(breathingScale);\n const kneeBounce = calculateKneeBounce(phase, amplitude);\n\n const kf = builder.at(frameTime);\n applyGuardPoseToKeyframe(kf, pose, breathingOffset, kneeBounce);\n kf.done<MartialArtsAnimationBuilder>();\n }\n\n return builder.build();\n}\n\n/**\n * ☴ 손 (Son) Wind Idle Animation\n *\n * Staggered flowing guard with rhythmic continuous breathing.\n * Lead hand extended, rear at chin for combo readiness.\n *\n * **Breathing**: Rhythmic flowing (2.0s cycle)\n * **Weight**: Lateral rhythmic shifts for mobility\n * **Philosophy**: Wind's continuous pressure, flowing attack\n *\n * @korean 손바람대기애니메이션\n */\nexport const SON_IDLE_ANIMATION: SkeletalAnimation = createSonIdleAnimation();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☵ GAM WATER IDLE (감 물 대기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Creates Gam idle animation with breathing and subtle knee bounce\n * NO pelvis position movement - only breathing and knee flex\n */\nfunction createGamIdleAnimation(): SkeletalAnimation {\n const pose = GAM_WATER_GUARD_POSE;\n const { min, max } = pose.breathingRange;\n const duration = BREATHING_DURATIONS.GAM;\n const amplitude = WEIGHT_SHIFT_AMPLITUDES.GAM;\n const frames = STANCE_GUARD_CONFIGS.gam.breathingFrames;\n\n const builder = MartialArtsAnimationBuilder.create(\n \"stance_gam\",\n \"감 대기\",\n ).asIdle(duration, true);\n\n for (let i = 0; i <= frames; i++) {\n const phase = i / frames;\n const frameTime = phase * duration;\n const breathingScale = calculateBreathingScale(phase, min, max);\n const breathingOffset = calculateTorsoBreathingOffset(breathingScale);\n const kneeBounce = calculateKneeBounce(phase, amplitude);\n\n const kf = builder.at(frameTime);\n applyGuardPoseToKeyframe(kf, pose, breathingOffset, kneeBounce);\n kf.done<MartialArtsAnimationBuilder>();\n }\n\n return builder.build();\n}\n\n/**\n * ☵ 감 (Gam) Water Idle Animation\n *\n * Mid-level parrying guard with deep flowing breathing.\n * Hands ready at solar plexus for redirecting and countering.\n *\n * **Breathing**: Deep flowing diaphragm (3.0s cycle)\n * **Weight**: Circular flowing adaptation\n * **Philosophy**: Water's adaptation, flow-into-counter\n *\n * @korean 감물대기애니메이션\n */\nexport const GAM_IDLE_ANIMATION: SkeletalAnimation = createGamIdleAnimation();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☶ GAN MOUNTAIN IDLE (간 산 대기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Creates Gan idle animation with breathing and subtle knee bounce\n * NO pelvis position movement - only breathing and knee flex\n */\nfunction createGanIdleAnimation(): SkeletalAnimation {\n const pose = GAN_MOUNTAIN_GUARD_POSE;\n const { min, max } = pose.breathingRange;\n const duration = BREATHING_DURATIONS.GAN;\n const amplitude = WEIGHT_SHIFT_AMPLITUDES.GAN;\n const frames = STANCE_GUARD_CONFIGS.gan.breathingFrames;\n\n const builder = MartialArtsAnimationBuilder.create(\n \"stance_gan\",\n \"간 대기\",\n ).asIdle(duration, true);\n\n for (let i = 0; i <= frames; i++) {\n const phase = i / frames;\n const frameTime = phase * duration;\n const breathingScale = calculateBreathingScale(phase, min, max);\n const breathingOffset = calculateTorsoBreathingOffset(breathingScale);\n // Gan uses minimal bounce (mountain stability)\n const kneeBounce = calculateKneeBounce(phase, amplitude);\n\n const kf = builder.at(frameTime);\n applyGuardPoseToKeyframe(kf, pose, breathingOffset, kneeBounce);\n kf.done<MartialArtsAnimationBuilder>();\n }\n\n return builder.build();\n}\n\n/**\n * ☶ 간 (Gan) Mountain Idle Animation\n *\n * High cover defensive guard with steady controlled breathing.\n * Forearms crossed protecting face, immovable stance.\n *\n * **Breathing**: Steady minimal (2.6s cycle)\n * **Weight**: Minimal - mountain solid\n * **Philosophy**: Mountain's immovability, defensive mastery\n *\n * @korean 간산대기애니메이션\n */\nexport const GAN_IDLE_ANIMATION: SkeletalAnimation = createGanIdleAnimation();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☷ GON EARTH IDLE (곤 땅 대기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Creates Gon idle animation with breathing and subtle knee bounce\n * NO pelvis position movement - only breathing and knee flex\n */\nfunction createGonIdleAnimation(): SkeletalAnimation {\n const pose = GON_EARTH_GUARD_POSE;\n const { min, max } = pose.breathingRange;\n const duration = BREATHING_DURATIONS.GON;\n const amplitude = WEIGHT_SHIFT_AMPLITUDES.GON;\n const frames = STANCE_GUARD_CONFIGS.gon.breathingFrames;\n\n const builder = MartialArtsAnimationBuilder.create(\n \"stance_gon\",\n \"곤 대기\",\n ).asIdle(duration, true);\n\n for (let i = 0; i <= frames; i++) {\n const phase = i / frames;\n const frameTime = phase * duration;\n const breathingScale = calculateBreathingScale(phase, min, max);\n const breathingOffset = calculateTorsoBreathingOffset(breathingScale);\n // Gon uses grounded knee bounce (wrestling ready)\n const kneeBounce = calculateKneeBounce(phase, amplitude);\n\n const kf = builder.at(frameTime);\n applyGuardPoseToKeyframe(kf, pose, breathingOffset, kneeBounce);\n kf.done<MartialArtsAnimationBuilder>();\n }\n\n return builder.build();\n}\n\n/**\n * ☷ 곤 (Gon) Earth Idle Animation\n *\n * Low underhook wrestling guard with grounded breathing.\n * Hands at hip level, elbows protecting ribs for ground control.\n *\n * **Breathing**: Deep diaphragm (2.6s cycle)\n * **Weight**: Grounded subtle shifts\n * **Philosophy**: Earth's stability, grounding and takedowns\n *\n * @korean 곤땅대기애니메이션\n */\nexport const GON_IDLE_ANIMATION: SkeletalAnimation = createGonIdleAnimation();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// TRIGRAM IDLE ANIMATION MAP (팔괘대기애니메이션맵)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Map of all 8 trigram stance idle animations\n *\n * Use this map for efficient lookup of stance-specific idle animations.\n * Each animation includes proper guard position, breathing, and weight shifts.\n *\n * @korean 팔괘대기애니메이션맵\n */\nexport const TRIGRAM_IDLE_ANIMATIONS: ReadonlyMap<\n TrigramStance,\n SkeletalAnimation\n> = new Map([\n [TrigramStance.GEON, GEON_IDLE_ANIMATION],\n [TrigramStance.TAE, TAE_IDLE_ANIMATION],\n [TrigramStance.LI, LI_IDLE_ANIMATION],\n [TrigramStance.JIN, JIN_IDLE_ANIMATION],\n [TrigramStance.SON, SON_IDLE_ANIMATION],\n [TrigramStance.GAM, GAM_IDLE_ANIMATION],\n [TrigramStance.GAN, GAN_IDLE_ANIMATION],\n [TrigramStance.GON, GON_IDLE_ANIMATION],\n]);\n\n/**\n * Map of all 8 trigram stance idle animations by string name\n *\n * This map provides string-keyed access to idle animations for registry integration.\n * Animation names match the pattern \"stance_X\" used in useSkeletalAnimation.\n *\n * @korean 팔괘대기애니메이션문자열맵\n */\nexport const TRIGRAM_IDLE_ANIMATIONS_BY_NAME: ReadonlyMap<\n string,\n SkeletalAnimation\n> = new Map([\n [\"stance_geon\", GEON_IDLE_ANIMATION],\n [\"stance_tae\", TAE_IDLE_ANIMATION],\n [\"stance_li\", LI_IDLE_ANIMATION],\n [\"stance_jin\", JIN_IDLE_ANIMATION],\n [\"stance_son\", SON_IDLE_ANIMATION],\n [\"stance_gam\", GAM_IDLE_ANIMATION],\n [\"stance_gan\", GAN_IDLE_ANIMATION],\n [\"stance_gon\", GON_IDLE_ANIMATION],\n]);\n\n/**\n * Get idle animation for a specific trigram stance\n *\n * @param stance - Trigram stance identifier\n * @returns Stance-specific idle animation with breathing and weight shifts\n *\n * @example\n * ```typescript\n * const geonIdle = getTrigramIdleAnimation(TrigramStance.GEON);\n * // Returns GEON_IDLE_ANIMATION with high guard, forward breathing\n *\n * const gamIdle = getTrigramIdleAnimation(TrigramStance.GAM);\n * // Returns GAM_IDLE_ANIMATION with flowing parry guard\n * ```\n *\n * @korean 팔괘대기애니메이션가져오기\n */\nexport function getTrigramIdleAnimation(\n stance: TrigramStance,\n): SkeletalAnimation | undefined {\n return TRIGRAM_IDLE_ANIMATIONS.get(stance);\n}\n\n/**\n * Get idle animation by stance name string\n *\n * Convenient accessor for string-based stance lookups.\n *\n * @param stanceName - Stance name (e.g., \"geon\", \"tae\", \"li\")\n * @returns Stance-specific idle animation or undefined\n *\n * @korean 문자열로대기애니메이션가져오기\n */\nexport function getTrigramIdleByName(\n stanceName: string,\n): SkeletalAnimation | undefined {\n const normalizedName = stanceName.toLowerCase();\n\n for (const [stance, animation] of TRIGRAM_IDLE_ANIMATIONS) {\n if (stance === normalizedName) {\n return animation;\n }\n }\n\n return undefined;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ANIMATION COLLECTION (애니메이션모음)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Array of all trigram idle animations for iteration\n *\n * @korean 모든팔괘대기애니메이션\n */\nexport const ALL_TRIGRAM_IDLE_ANIMATIONS: readonly SkeletalAnimation[] = [\n GEON_IDLE_ANIMATION,\n TAE_IDLE_ANIMATION,\n LI_IDLE_ANIMATION,\n JIN_IDLE_ANIMATION,\n SON_IDLE_ANIMATION,\n GAM_IDLE_ANIMATION,\n GAN_IDLE_ANIMATION,\n GON_IDLE_ANIMATION,\n];\n\n/**\n * Idle animation metadata for debugging and introspection\n *\n * @korean 대기애니메이션메타데이터\n */\nexport const TRIGRAM_IDLE_METADATA = {\n GEON: {\n name: \"stance_geon\",\n korean: \"건 대기\",\n english: \"Heaven Idle\",\n breathingDuration: BREATHING_DURATIONS.GEON,\n weightShiftType: \"forward\" as const,\n philosophy: \"Creative force, direct power\",\n },\n TAE: {\n name: \"stance_tae\",\n korean: \"태 대기\",\n english: \"Lake Idle\",\n breathingDuration: BREATHING_DURATIONS.TAE,\n weightShiftType: \"circular\" as const,\n philosophy: \"Adaptability, fluid technique\",\n },\n LI: {\n name: \"stance_li\",\n korean: \"리 대기\",\n english: \"Fire Idle\",\n breathingDuration: BREATHING_DURATIONS.LI,\n weightShiftType: \"lateral\" as const,\n philosophy: \"Precision, vital point targeting\",\n },\n JIN: {\n name: \"stance_jin\",\n korean: \"진 대기\",\n english: \"Thunder Idle\",\n breathingDuration: BREATHING_DURATIONS.JIN,\n weightShiftType: \"forward\" as const,\n philosophy: \"Explosive force, shocking power\",\n },\n SON: {\n name: \"stance_son\",\n korean: \"손 대기\",\n english: \"Wind Idle\",\n breathingDuration: BREATHING_DURATIONS.SON,\n weightShiftType: \"lateral\" as const,\n philosophy: \"Continuous pressure, flowing attack\",\n },\n GAM: {\n name: \"stance_gam\",\n korean: \"감 대기\",\n english: \"Water Idle\",\n breathingDuration: BREATHING_DURATIONS.GAM,\n weightShiftType: \"circular\" as const,\n philosophy: \"Adaptation, flow-into-counter\",\n },\n GAN: {\n name: \"stance_gan\",\n korean: \"간 대기\",\n english: \"Mountain Idle\",\n breathingDuration: BREATHING_DURATIONS.GAN,\n weightShiftType: \"lateral\" as const,\n philosophy: \"Immovability, defensive mastery\",\n },\n GON: {\n name: \"stance_gon\",\n korean: \"곤 대기\",\n english: \"Earth Idle\",\n breathingDuration: BREATHING_DURATIONS.GON,\n weightShiftType: \"forward\" as const,\n philosophy: \"Stability, grounding and takedowns\",\n },\n} as const;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"StanceIdleAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/StanceIdleAnimations.ts"],"sourcesContent":["/**\n * Trigram Stance Idle Animations - Enhanced Breathing & Weight Shift System\n *\n * Defines complete idle animations for all 8 trigram stances (팔괘) with:\n * - Multi-keyframe breathing cycles (4-6 frames per stance)\n * - Subtle weight shifts for natural movement\n * - Stance-specific rhythms reflecting martial philosophy\n * - Proper guard positions from StanceGuardPoses\n *\n * Each trigram idle is the starting point for all techniques in that stance.\n * The breathing and weight shifts reflect the elemental nature:\n * - ☰ 건 (Heaven): Powerful, expansive chest breathing\n * - ☱ 태 (Lake): Fluid, rippling breath flow\n * - ☲ 리 (Fire): Sharp, controlled precision breathing\n * - ☳ 진 (Thunder): Deep coiled power breathing\n * - ☴ 손 (Wind): Rhythmic continuous flow\n * - ☵ 감 (Water): Deep flowing diaphragm breathing\n * - ☶ 간 (Mountain): Minimal steady breathing\n * - ☷ 곤 (Earth): Deep grounded diaphragm breathing\n *\n * @module systems/animation/catalogs/StanceIdleAnimations\n * @category Animation System\n * @korean 팔괘자세대기애니메이션\n */\n\nimport { TrigramStance } from \"@/types/common\";\nimport type { SkeletalAnimation, StanceGuardPose } from \"@/types/skeletal\";\nimport { BoneName } from \"@/types/skeletal\";\nimport type { KeyframeConfig } from \"../builders/KeyframeConfig\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\nimport {\n GAM_WATER_GUARD_POSE,\n GAN_MOUNTAIN_GUARD_POSE,\n GEON_HIGH_GUARD_POSE,\n GON_EARTH_GUARD_POSE,\n JIN_THUNDER_GUARD_POSE,\n LI_FIRE_GUARD_POSE,\n SON_WIND_GUARD_POSE,\n STANCE_GUARD_CONFIGS,\n TAE_FLUID_GUARD_POSE,\n} from \"./StanceGuardPoses\";\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ANIMATION TIMING CONSTANTS (애니메이션 타이밍 상수)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Breathing cycle durations per stance (in seconds)\n * Each stance has characteristic breathing rhythm\n *\n * @korean 호흡주기지속시간\n */\nconst BREATHING_DURATIONS = {\n GEON: 2.4, // Powerful slow breathing\n TAE: 2.8, // Fluid flowing breath\n LI: 1.8, // Sharp controlled breathing\n JIN: 2.2, // Explosive ready breath\n SON: 2.0, // Rhythmic continuous flow\n GAM: 3.0, // Deep flowing breath\n GAN: 2.6, // Steady controlled breath\n GON: 2.6, // Grounded diaphragm breath\n} as const;\n\n/**\n * Weight shift amplitudes per stance (percentage of base)\n * Reflects stability vs. mobility of each stance\n * RESTORED to original values for better visual feedback and natural movement\n *\n * @korean 체중이동진폭\n */\nconst WEIGHT_SHIFT_AMPLITUDES = {\n GEON: 0.04, // Visible forward rocking - mobile power stance (파워 흔들림)\n TAE: 0.05, // Fluid flowing shifts clearly visible (유동적 흐름)\n LI: 0.02, // Small but visible - precision stance (정밀 제어)\n JIN: 0.06, // Large coiled spring bounce (폭발적 준비)\n SON: 0.045, // Rhythmic lateral shifts (연속 흐름)\n GAM: 0.055, // Flowing water adaptation (물 흐름)\n GAN: 0.015, // Minimal - mountain solid (산악 안정)\n GON: 0.03, // Grounded but visible shifts (대지 흔들림)\n} as const;\n\n// ═══════════════════════════════════════════════════════════════════════════\n// BREATHING ANIMATION HELPERS (호흡 애니메이션 헬퍼)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Calculates breathing scale at a given phase\n *\n * @param phase - Breathing phase (0-1, where 0.5 is peak inhale)\n * @param min - Minimum scale (exhale)\n * @param max - Maximum scale (inhale peak)\n * @returns Scale factor for chest/torso\n */\nfunction calculateBreathingScale(\n phase: number,\n min: number,\n max: number,\n): number {\n // Use cosine-based wave for natural breathing rhythm\n // Phase 0 = peak inhale, 0.5 = peak exhale\n const breathPhase = Math.cos(phase * Math.PI * 2);\n const amplitude = (max - min) / 2;\n const center = (max + min) / 2;\n return center + breathPhase * amplitude;\n}\n\n/**\n * Calculates torso expansion for breathing effect\n *\n * @param breathingScale - Current breathing scale (0.96-1.04)\n * @returns Torso rotation adjustment for breathing\n */\nfunction calculateTorsoBreathingOffset(breathingScale: number): number {\n // Chest expands forward more visibly on inhale\n // Multiplier 1.5 for clearly visible breathing (가슴 확장 시각화)\n return (breathingScale - 1) * 1.5;\n}\n\n/**\n * Calculates subtle knee bounce offset at a given phase\n *\n * DESIGN: Idle animations should have visible knee bounce for natural movement feel\n * - no pelvis position movement which creates a \"walking in place\" appearance.\n *\n * @param phase - Breathing/bounce phase (0-1)\n * @param amplitude - Maximum bounce amount (knee bend adjustment)\n * @returns Knee rotation adjustment for natural bounce\n */\nfunction calculateKneeBounce(phase: number, amplitude: number): number {\n // Visible knee flex synchronized with breathing for natural alive feel\n // Two bounces per breath cycle (one per inhale/exhale)\n // 호흡과 동기화된 무릎 굽힘으로 자연스러운 움직임\n const bouncePhase = Math.sin(phase * Math.PI * 4);\n return bouncePhase * amplitude * 0.5;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// GUARD POSE APPLICATION HELPERS (방어자세적용헬퍼)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Applies a complete guard pose to a KeyframeConfig with breathing and knee bounce\n *\n * DESIGN: Idle animations should only have:\n * - Chest breathing (torso expansion)\n * - Subtle knee bounce (slight knee flex variation)\n * NO pelvis X/Z position movement (causes \"walking in place\" appearance)\n *\n * @param kf - KeyframeConfig to apply pose to\n * @param pose - Guard pose to apply\n * @param breathingOffset - Torso breathing offset\n * @param kneeBounce - Subtle knee flex adjustment for bounce effect\n */\nfunction applyGuardPoseToKeyframe(\n kf: KeyframeConfig,\n pose: StanceGuardPose,\n breathingOffset: number,\n kneeBounce: number = 0,\n): void {\n // === ARM POSITIONS (팔 위치) ===\n // IMPORTANT: Use SHOULDER_L/R, ELBOW_L/R, WRIST_L/R bone names\n // NOT UPPER_ARM, FOREARM, HAND - those are different bones in the hierarchy!\n\n // Left arm - shoulder controls arm lift/rotation\n kf.rotate(\n BoneName.SHOULDER_L,\n pose.leftArm.shoulder.x,\n pose.leftArm.shoulder.y,\n pose.leftArm.shoulder.z,\n );\n // Elbow controls forearm bend\n kf.rotate(\n BoneName.ELBOW_L,\n pose.leftArm.elbow.x,\n pose.leftArm.elbow.y,\n pose.leftArm.elbow.z,\n );\n // Wrist controls hand rotation\n kf.rotate(\n BoneName.WRIST_L,\n pose.leftArm.wrist.x,\n pose.leftArm.wrist.y,\n pose.leftArm.wrist.z,\n );\n\n // Right arm - mirror bone hierarchy\n kf.rotate(\n BoneName.SHOULDER_R,\n pose.rightArm.shoulder.x,\n pose.rightArm.shoulder.y,\n pose.rightArm.shoulder.z,\n );\n kf.rotate(\n BoneName.ELBOW_R,\n pose.rightArm.elbow.x,\n pose.rightArm.elbow.y,\n pose.rightArm.elbow.z,\n );\n kf.rotate(\n BoneName.WRIST_R,\n pose.rightArm.wrist.x,\n pose.rightArm.wrist.y,\n pose.rightArm.wrist.z,\n );\n\n // === TORSO (몸통) - Full spine chain for proper rotation ===\n // SPINE_LOWER: Base torso twist (inherits from pelvis)\n kf.rotate(\n BoneName.SPINE_LOWER,\n pose.torso.x * 0.3,\n pose.torso.y * 0.4,\n pose.torso.z * 0.3,\n );\n // SPINE_MIDDLE: Mid-torso twist\n kf.rotate(\n BoneName.SPINE_MIDDLE,\n pose.torso.x * 0.3,\n pose.torso.y * 0.3,\n pose.torso.z * 0.3,\n );\n // SPINE_UPPER: Upper chest with breathing - gets most of the rotation\n kf.rotate(\n BoneName.SPINE_UPPER,\n pose.torso.x * 0.4 + breathingOffset,\n pose.torso.y * 0.3,\n pose.torso.z * 0.4,\n );\n\n // === LEG POSITIONS (다리 위치) ===\n // IMPORTANT: Use HIP_L/R for hip rotation, not THIGH!\n // HIP bone controls the leg's root rotation\n\n // Left leg - HIP controls leg lift/rotation at socket\n kf.rotate(\n BoneName.HIP_L,\n pose.leftLeg.hip.x,\n pose.leftLeg.hip.y,\n pose.leftLeg.hip.z,\n );\n // KNEE controls lower leg bend (primarily X axis flex)\n // Add subtle knee bounce for natural idle movement\n kf.rotate(\n BoneName.KNEE_L,\n pose.leftLeg.knee.x + kneeBounce,\n pose.leftLeg.knee.y,\n pose.leftLeg.knee.z,\n );\n // FOOT controls ankle rotation\n kf.rotate(\n BoneName.FOOT_L,\n pose.leftLeg.ankle.x,\n pose.leftLeg.ankle.y,\n pose.leftLeg.ankle.z,\n );\n\n // Right leg - mirror bone hierarchy\n kf.rotate(\n BoneName.HIP_R,\n pose.rightLeg.hip.x,\n pose.rightLeg.hip.y,\n pose.rightLeg.hip.z,\n );\n kf.rotate(\n BoneName.KNEE_R,\n pose.rightLeg.knee.x + kneeBounce,\n pose.rightLeg.knee.y,\n pose.rightLeg.knee.z,\n );\n kf.rotate(\n BoneName.FOOT_R,\n pose.rightLeg.ankle.x,\n pose.rightLeg.ankle.y,\n pose.rightLeg.ankle.z,\n );\n\n // === PELVIS (골반) - Root of entire body ===\n // Controls overall body rotation and position\n kf.rotate(BoneName.PELVIS, pose.pelvis.x, pose.pelvis.y, pose.pelvis.z);\n // Pelvis position: ONLY stance height drop (Y)\n // NO X/Z offset - this prevents \"walking in place\" appearance\n const pelvisHeight = pose.pelvisHeight ?? 0;\n kf.position(BoneName.PELVIS, 0, pelvisHeight, 0);\n\n // === FOOT POSITIONING (발 위치) ===\n // Position feet for stance width and depth\n const stanceDepth = pose.stanceDepth ?? 0;\n // Left foot: negative X (left side), negative Z (front for forward stances)\n kf.position(BoneName.FOOT_L, -pose.stanceWidth / 2, 0, -stanceDepth / 2);\n // Right foot: positive X (right side), positive Z (back for forward stances)\n kf.position(BoneName.FOOT_R, pose.stanceWidth / 2, 0, stanceDepth / 2);\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☰ GEON HEAVEN IDLE (건 하늘 대기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Creates Geon idle animation with breathing and subtle knee bounce\n * NO pelvis position movement - only breathing and knee flex\n */\nfunction createGeonIdleAnimation(): SkeletalAnimation {\n const pose = GEON_HIGH_GUARD_POSE;\n const { min, max } = pose.breathingRange;\n const duration = BREATHING_DURATIONS.GEON;\n const amplitude = WEIGHT_SHIFT_AMPLITUDES.GEON;\n const frames = STANCE_GUARD_CONFIGS.geon.breathingFrames;\n\n const builder = MartialArtsAnimationBuilder.create(\n \"stance_geon\",\n \"건 대기\",\n ).asIdle(duration, true);\n\n // Generate keyframes with breathing and subtle knee bounce\n for (let i = 0; i <= frames; i++) {\n const phase = i / frames;\n const frameTime = phase * duration;\n const breathingScale = calculateBreathingScale(phase, min, max);\n const breathingOffset = calculateTorsoBreathingOffset(breathingScale);\n const kneeBounce = calculateKneeBounce(phase, amplitude);\n\n const kf = builder.at(frameTime);\n applyGuardPoseToKeyframe(kf, pose, breathingOffset, kneeBounce);\n kf.done<MartialArtsAnimationBuilder>();\n }\n\n return builder.build();\n}\n\n/**\n * ☰ 건 (Geon) Heaven Idle Animation\n *\n * Powerful high guard stance with expansive chest breathing.\n * Boxing-style guard protecting chin and temples.\n *\n * **Breathing**: Slow powerful expansion (2.4s cycle)\n * **Weight**: Subtle forward shift for aggression\n * **Philosophy**: Heaven's creative force, direct power\n *\n * @korean 건하늘대기애니메이션\n */\nexport const GEON_IDLE_ANIMATION: SkeletalAnimation = createGeonIdleAnimation();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☱ TAE LAKE IDLE (태 연못 대기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Creates Tae idle animation with breathing and subtle knee bounce\n * NO pelvis position movement - only breathing and knee flex\n */\nfunction createTaeIdleAnimation(): SkeletalAnimation {\n const pose = TAE_FLUID_GUARD_POSE;\n const { min, max } = pose.breathingRange;\n const duration = BREATHING_DURATIONS.TAE;\n const amplitude = WEIGHT_SHIFT_AMPLITUDES.TAE;\n const frames = STANCE_GUARD_CONFIGS.tae.breathingFrames;\n\n const builder = MartialArtsAnimationBuilder.create(\n \"stance_tae\",\n \"태 대기\",\n ).asIdle(duration, true);\n\n for (let i = 0; i <= frames; i++) {\n const phase = i / frames;\n const frameTime = phase * duration;\n const breathingScale = calculateBreathingScale(phase, min, max);\n const breathingOffset = calculateTorsoBreathingOffset(breathingScale);\n const kneeBounce = calculateKneeBounce(phase, amplitude);\n\n const kf = builder.at(frameTime);\n applyGuardPoseToKeyframe(kf, pose, breathingOffset, kneeBounce);\n kf.done<MartialArtsAnimationBuilder>();\n }\n\n return builder.build();\n}\n\n/**\n * ☱ 태 (Tae) Lake Idle Animation\n *\n * Fluid mid-guard stance with flowing breath rhythm.\n * Lead hand ready for parrying, rear protects chin.\n *\n * **Breathing**: Flowing waves (2.8s cycle)\n * **Weight**: Circular flowing shifts\n * **Philosophy**: Lake's adaptability, fluid technique\n *\n * @korean 태연못대기애니메이션\n */\nexport const TAE_IDLE_ANIMATION: SkeletalAnimation = createTaeIdleAnimation();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☲ LI FIRE IDLE (리 불 대기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Creates Li idle animation with breathing and subtle knee bounce\n * NO pelvis position movement - only breathing and knee flex\n */\nfunction createLiIdleAnimation(): SkeletalAnimation {\n const pose = LI_FIRE_GUARD_POSE;\n const { min, max } = pose.breathingRange;\n const duration = BREATHING_DURATIONS.LI;\n const amplitude = WEIGHT_SHIFT_AMPLITUDES.LI;\n const frames = STANCE_GUARD_CONFIGS.li.breathingFrames;\n\n const builder = MartialArtsAnimationBuilder.create(\n \"stance_li\",\n \"리 대기\",\n ).asIdle(duration, true);\n\n for (let i = 0; i <= frames; i++) {\n const phase = i / frames;\n const frameTime = phase * duration;\n const breathingScale = calculateBreathingScale(phase, min, max);\n const breathingOffset = calculateTorsoBreathingOffset(breathingScale);\n const kneeBounce = calculateKneeBounce(phase, amplitude);\n\n const kf = builder.at(frameTime);\n applyGuardPoseToKeyframe(kf, pose, breathingOffset, kneeBounce);\n kf.done<MartialArtsAnimationBuilder>();\n }\n\n return builder.build();\n}\n\n/**\n * ☲ 리 (Li) Fire Idle Animation\n *\n * Aggressive peekaboo guard with sharp controlled breathing.\n * Both hands high protecting face for precision striking.\n *\n * **Breathing**: Sharp controlled (1.8s cycle)\n * **Weight**: Minimal movement for precision\n * **Philosophy**: Fire's precision, vital point targeting\n *\n * @korean 리불대기애니메이션\n */\nexport const LI_IDLE_ANIMATION: SkeletalAnimation = createLiIdleAnimation();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☳ JIN THUNDER IDLE (진 천둥 대기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Creates Jin idle animation with breathing and subtle knee bounce\n * NO pelvis position movement - only breathing and knee flex\n */\nfunction createJinIdleAnimation(): SkeletalAnimation {\n const pose = JIN_THUNDER_GUARD_POSE;\n const { min, max } = pose.breathingRange;\n const duration = BREATHING_DURATIONS.JIN;\n const amplitude = WEIGHT_SHIFT_AMPLITUDES.JIN;\n const frames = STANCE_GUARD_CONFIGS.jin.breathingFrames;\n\n const builder = MartialArtsAnimationBuilder.create(\n \"stance_jin\",\n \"진 대기\",\n ).asIdle(duration, true);\n\n for (let i = 0; i <= frames; i++) {\n const phase = i / frames;\n const frameTime = phase * duration;\n const breathingScale = calculateBreathingScale(phase, min, max);\n const breathingOffset = calculateTorsoBreathingOffset(breathingScale);\n // Jin uses slightly larger bounce (coiled spring ready)\n const kneeBounce = calculateKneeBounce(phase, amplitude);\n\n const kf = builder.at(frameTime);\n applyGuardPoseToKeyframe(kf, pose, breathingOffset, kneeBounce);\n kf.done<MartialArtsAnimationBuilder>();\n }\n\n return builder.build();\n}\n\n/**\n * ☳ 진 (Jin) Thunder Idle Animation\n *\n * Chambered explosive stance with deep power breathing.\n * Fists at ribs, coiled spring ready for explosive release.\n *\n * **Breathing**: Deep coiled power (2.2s cycle)\n * **Weight**: Back-loaded with subtle forward pulse\n * **Philosophy**: Thunder's explosive force, shocking power\n *\n * @korean 진천둥대기애니메이션\n */\nexport const JIN_IDLE_ANIMATION: SkeletalAnimation = createJinIdleAnimation();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☴ SON WIND IDLE (손 바람 대기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Creates Son idle animation with breathing and subtle knee bounce\n * NO pelvis position movement - only breathing and knee flex\n */\nfunction createSonIdleAnimation(): SkeletalAnimation {\n const pose = SON_WIND_GUARD_POSE;\n const { min, max } = pose.breathingRange;\n const duration = BREATHING_DURATIONS.SON;\n const amplitude = WEIGHT_SHIFT_AMPLITUDES.SON;\n const frames = STANCE_GUARD_CONFIGS.son.breathingFrames;\n\n const builder = MartialArtsAnimationBuilder.create(\n \"stance_son\",\n \"손 대기\",\n ).asIdle(duration, true);\n\n for (let i = 0; i <= frames; i++) {\n const phase = i / frames;\n const frameTime = phase * duration;\n const breathingScale = calculateBreathingScale(phase, min, max);\n const breathingOffset = calculateTorsoBreathingOffset(breathingScale);\n const kneeBounce = calculateKneeBounce(phase, amplitude);\n\n const kf = builder.at(frameTime);\n applyGuardPoseToKeyframe(kf, pose, breathingOffset, kneeBounce);\n kf.done<MartialArtsAnimationBuilder>();\n }\n\n return builder.build();\n}\n\n/**\n * ☴ 손 (Son) Wind Idle Animation\n *\n * Staggered flowing guard with rhythmic continuous breathing.\n * Lead hand extended, rear at chin for combo readiness.\n *\n * **Breathing**: Rhythmic flowing (2.0s cycle)\n * **Weight**: Lateral rhythmic shifts for mobility\n * **Philosophy**: Wind's continuous pressure, flowing attack\n *\n * @korean 손바람대기애니메이션\n */\nexport const SON_IDLE_ANIMATION: SkeletalAnimation = createSonIdleAnimation();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☵ GAM WATER IDLE (감 물 대기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Creates Gam idle animation with breathing and subtle knee bounce\n * NO pelvis position movement - only breathing and knee flex\n */\nfunction createGamIdleAnimation(): SkeletalAnimation {\n const pose = GAM_WATER_GUARD_POSE;\n const { min, max } = pose.breathingRange;\n const duration = BREATHING_DURATIONS.GAM;\n const amplitude = WEIGHT_SHIFT_AMPLITUDES.GAM;\n const frames = STANCE_GUARD_CONFIGS.gam.breathingFrames;\n\n const builder = MartialArtsAnimationBuilder.create(\n \"stance_gam\",\n \"감 대기\",\n ).asIdle(duration, true);\n\n for (let i = 0; i <= frames; i++) {\n const phase = i / frames;\n const frameTime = phase * duration;\n const breathingScale = calculateBreathingScale(phase, min, max);\n const breathingOffset = calculateTorsoBreathingOffset(breathingScale);\n const kneeBounce = calculateKneeBounce(phase, amplitude);\n\n const kf = builder.at(frameTime);\n applyGuardPoseToKeyframe(kf, pose, breathingOffset, kneeBounce);\n kf.done<MartialArtsAnimationBuilder>();\n }\n\n return builder.build();\n}\n\n/**\n * ☵ 감 (Gam) Water Idle Animation\n *\n * Mid-level parrying guard with deep flowing breathing.\n * Hands ready at solar plexus for redirecting and countering.\n *\n * **Breathing**: Deep flowing diaphragm (3.0s cycle)\n * **Weight**: Circular flowing adaptation\n * **Philosophy**: Water's adaptation, flow-into-counter\n *\n * @korean 감물대기애니메이션\n */\nexport const GAM_IDLE_ANIMATION: SkeletalAnimation = createGamIdleAnimation();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☶ GAN MOUNTAIN IDLE (간 산 대기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Creates Gan idle animation with breathing and subtle knee bounce\n * NO pelvis position movement - only breathing and knee flex\n */\nfunction createGanIdleAnimation(): SkeletalAnimation {\n const pose = GAN_MOUNTAIN_GUARD_POSE;\n const { min, max } = pose.breathingRange;\n const duration = BREATHING_DURATIONS.GAN;\n const amplitude = WEIGHT_SHIFT_AMPLITUDES.GAN;\n const frames = STANCE_GUARD_CONFIGS.gan.breathingFrames;\n\n const builder = MartialArtsAnimationBuilder.create(\n \"stance_gan\",\n \"간 대기\",\n ).asIdle(duration, true);\n\n for (let i = 0; i <= frames; i++) {\n const phase = i / frames;\n const frameTime = phase * duration;\n const breathingScale = calculateBreathingScale(phase, min, max);\n const breathingOffset = calculateTorsoBreathingOffset(breathingScale);\n // Gan uses minimal bounce (mountain stability)\n const kneeBounce = calculateKneeBounce(phase, amplitude);\n\n const kf = builder.at(frameTime);\n applyGuardPoseToKeyframe(kf, pose, breathingOffset, kneeBounce);\n kf.done<MartialArtsAnimationBuilder>();\n }\n\n return builder.build();\n}\n\n/**\n * ☶ 간 (Gan) Mountain Idle Animation\n *\n * High cover defensive guard with steady controlled breathing.\n * Forearms crossed protecting face, immovable stance.\n *\n * **Breathing**: Steady minimal (2.6s cycle)\n * **Weight**: Minimal - mountain solid\n * **Philosophy**: Mountain's immovability, defensive mastery\n *\n * @korean 간산대기애니메이션\n */\nexport const GAN_IDLE_ANIMATION: SkeletalAnimation = createGanIdleAnimation();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☷ GON EARTH IDLE (곤 땅 대기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Creates Gon idle animation with breathing and subtle knee bounce\n * NO pelvis position movement - only breathing and knee flex\n */\nfunction createGonIdleAnimation(): SkeletalAnimation {\n const pose = GON_EARTH_GUARD_POSE;\n const { min, max } = pose.breathingRange;\n const duration = BREATHING_DURATIONS.GON;\n const amplitude = WEIGHT_SHIFT_AMPLITUDES.GON;\n const frames = STANCE_GUARD_CONFIGS.gon.breathingFrames;\n\n const builder = MartialArtsAnimationBuilder.create(\n \"stance_gon\",\n \"곤 대기\",\n ).asIdle(duration, true);\n\n for (let i = 0; i <= frames; i++) {\n const phase = i / frames;\n const frameTime = phase * duration;\n const breathingScale = calculateBreathingScale(phase, min, max);\n const breathingOffset = calculateTorsoBreathingOffset(breathingScale);\n // Gon uses grounded knee bounce (wrestling ready)\n const kneeBounce = calculateKneeBounce(phase, amplitude);\n\n const kf = builder.at(frameTime);\n applyGuardPoseToKeyframe(kf, pose, breathingOffset, kneeBounce);\n kf.done<MartialArtsAnimationBuilder>();\n }\n\n return builder.build();\n}\n\n/**\n * ☷ 곤 (Gon) Earth Idle Animation\n *\n * Low underhook wrestling guard with grounded breathing.\n * Hands at hip level, elbows protecting ribs for ground control.\n *\n * **Breathing**: Deep diaphragm (2.6s cycle)\n * **Weight**: Grounded subtle shifts\n * **Philosophy**: Earth's stability, grounding and takedowns\n *\n * @korean 곤땅대기애니메이션\n */\nexport const GON_IDLE_ANIMATION: SkeletalAnimation = createGonIdleAnimation();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// TRIGRAM IDLE ANIMATION MAP (팔괘대기애니메이션맵)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Map of all 8 trigram stance idle animations\n *\n * Use this map for efficient lookup of stance-specific idle animations.\n * Each animation includes proper guard position, breathing, and weight shifts.\n *\n * @korean 팔괘대기애니메이션맵\n */\nexport const TRIGRAM_IDLE_ANIMATIONS: ReadonlyMap<\n TrigramStance,\n SkeletalAnimation\n> = new Map([\n [TrigramStance.GEON, GEON_IDLE_ANIMATION],\n [TrigramStance.TAE, TAE_IDLE_ANIMATION],\n [TrigramStance.LI, LI_IDLE_ANIMATION],\n [TrigramStance.JIN, JIN_IDLE_ANIMATION],\n [TrigramStance.SON, SON_IDLE_ANIMATION],\n [TrigramStance.GAM, GAM_IDLE_ANIMATION],\n [TrigramStance.GAN, GAN_IDLE_ANIMATION],\n [TrigramStance.GON, GON_IDLE_ANIMATION],\n]);\n\n/**\n * Map of all 8 trigram stance idle animations by string name\n *\n * This map provides string-keyed access to idle animations for registry integration.\n * Animation names match the pattern \"stance_X\" used in useSkeletalAnimation.\n *\n * @korean 팔괘대기애니메이션문자열맵\n */\nexport const TRIGRAM_IDLE_ANIMATIONS_BY_NAME: ReadonlyMap<\n string,\n SkeletalAnimation\n> = new Map([\n [\"stance_geon\", GEON_IDLE_ANIMATION],\n [\"stance_tae\", TAE_IDLE_ANIMATION],\n [\"stance_li\", LI_IDLE_ANIMATION],\n [\"stance_jin\", JIN_IDLE_ANIMATION],\n [\"stance_son\", SON_IDLE_ANIMATION],\n [\"stance_gam\", GAM_IDLE_ANIMATION],\n [\"stance_gan\", GAN_IDLE_ANIMATION],\n [\"stance_gon\", GON_IDLE_ANIMATION],\n]);\n\n/**\n * Get idle animation for a specific trigram stance\n *\n * @param stance - Trigram stance identifier\n * @returns Stance-specific idle animation with breathing and weight shifts\n *\n * @example\n * ```typescript\n * const geonIdle = getTrigramIdleAnimation(TrigramStance.GEON);\n * // Returns GEON_IDLE_ANIMATION with high guard, forward breathing\n *\n * const gamIdle = getTrigramIdleAnimation(TrigramStance.GAM);\n * // Returns GAM_IDLE_ANIMATION with flowing parry guard\n * ```\n *\n * @korean 팔괘대기애니메이션가져오기\n */\nexport function getTrigramIdleAnimation(\n stance: TrigramStance,\n): SkeletalAnimation | undefined {\n return TRIGRAM_IDLE_ANIMATIONS.get(stance);\n}\n\n/**\n * Get idle animation by stance name string\n *\n * Convenient accessor for string-based stance lookups.\n *\n * @param stanceName - Stance name (e.g., \"geon\", \"tae\", \"li\")\n * @returns Stance-specific idle animation or undefined\n *\n * @korean 문자열로대기애니메이션가져오기\n */\nexport function getTrigramIdleByName(\n stanceName: string,\n): SkeletalAnimation | undefined {\n const normalizedName = stanceName.toLowerCase();\n\n for (const [stance, animation] of TRIGRAM_IDLE_ANIMATIONS) {\n if (stance === normalizedName) {\n return animation;\n }\n }\n\n return undefined;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ANIMATION COLLECTION (애니메이션모음)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Array of all trigram idle animations for iteration\n *\n * @korean 모든팔괘대기애니메이션\n */\nexport const ALL_TRIGRAM_IDLE_ANIMATIONS: readonly SkeletalAnimation[] = [\n GEON_IDLE_ANIMATION,\n TAE_IDLE_ANIMATION,\n LI_IDLE_ANIMATION,\n JIN_IDLE_ANIMATION,\n SON_IDLE_ANIMATION,\n GAM_IDLE_ANIMATION,\n GAN_IDLE_ANIMATION,\n GON_IDLE_ANIMATION,\n];\n\n/**\n * Idle animation metadata for debugging and introspection\n *\n * @korean 대기애니메이션메타데이터\n */\nexport const TRIGRAM_IDLE_METADATA = {\n GEON: {\n name: \"stance_geon\",\n korean: \"건 대기\",\n english: \"Heaven Idle\",\n breathingDuration: BREATHING_DURATIONS.GEON,\n weightShiftType: \"forward\" as const,\n philosophy: \"Creative force, direct power\",\n },\n TAE: {\n name: \"stance_tae\",\n korean: \"태 대기\",\n english: \"Lake Idle\",\n breathingDuration: BREATHING_DURATIONS.TAE,\n weightShiftType: \"circular\" as const,\n philosophy: \"Adaptability, fluid technique\",\n },\n LI: {\n name: \"stance_li\",\n korean: \"리 대기\",\n english: \"Fire Idle\",\n breathingDuration: BREATHING_DURATIONS.LI,\n weightShiftType: \"lateral\" as const,\n philosophy: \"Precision, vital point targeting\",\n },\n JIN: {\n name: \"stance_jin\",\n korean: \"진 대기\",\n english: \"Thunder Idle\",\n breathingDuration: BREATHING_DURATIONS.JIN,\n weightShiftType: \"forward\" as const,\n philosophy: \"Explosive force, shocking power\",\n },\n SON: {\n name: \"stance_son\",\n korean: \"손 대기\",\n english: \"Wind Idle\",\n breathingDuration: BREATHING_DURATIONS.SON,\n weightShiftType: \"lateral\" as const,\n philosophy: \"Continuous pressure, flowing attack\",\n },\n GAM: {\n name: \"stance_gam\",\n korean: \"감 대기\",\n english: \"Water Idle\",\n breathingDuration: BREATHING_DURATIONS.GAM,\n weightShiftType: \"circular\" as const,\n philosophy: \"Adaptation, flow-into-counter\",\n },\n GAN: {\n name: \"stance_gan\",\n korean: \"간 대기\",\n english: \"Mountain Idle\",\n breathingDuration: BREATHING_DURATIONS.GAN,\n weightShiftType: \"lateral\" as const,\n philosophy: \"Immovability, defensive mastery\",\n },\n GON: {\n name: \"stance_gon\",\n korean: \"곤 대기\",\n english: \"Earth Idle\",\n breathingDuration: BREATHING_DURATIONS.GON,\n weightShiftType: \"forward\" as const,\n philosophy: \"Stability, grounding and takedowns\",\n },\n} as const;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StanceLocomotionAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/StanceLocomotionAnimations.ts"],"sourcesContent":["/**\n * Stance-Specific Locomotion Animations Module\n *\n * Trigram-specific walk and run animations for each of the eight stances.\n * Each trigram has unique movement characteristics reflecting its philosophy:\n *\n * ☰ Geon (Heaven): Direct, powerful movements\n * ☱ Tae (Lake): Fluid, adaptive movements\n * ☲ Li (Fire): Quick, precise movements\n * ☳ Jin (Thunder): Explosive, sudden movements\n * ☴ Son (Wind): Continuous, flowing movements\n * ☵ Gam (Water): Adaptive, redirecting movements\n * ☶ Gan (Mountain): Stable, grounded movements\n * ☷ Gon (Earth): Heavy, rooted movements\n *\n * DESIGN PRINCIPLES:\n * - Fighters MAINTAIN GUARD during locomotion (no arm swing)\n * - Arms/torso/pelvis use withTrigramGuard() from builder\n * - Legs blend trigram base position + locomotion motion\n * - Each stance has distinct leg mechanics (stance width, knee bend, weight)\n *\n * @module systems/animation/StanceLocomotionAnimations\n * @korean 자세별이동애니메이션\n */\n\nimport { TrigramStance } from \"@/types/common\";\nimport type { SkeletalAnimation } from \"@/types/skeletal\";\nimport { BoneName } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\nimport { KOREAN_STANCE_BIOMECHANICS } from \"../builders/MartialArtsConstants\";\nimport { TRIGRAM_GUARD_POSES } from \"../builders/TrigramGuardApplicator\";\n\n// ═══════════════════════════════════════════════════════════════════════════\n// CONSTANTS\n// ═══════════════════════════════════════════════════════════════════════════\n\n/** Default shoulder width for stance locomotion animations (cm) */\nconst DEFAULT_SHOULDER_WIDTH_CM = 46;\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ARM SWING HELPERS - Apply guard pose with locomotion swing offset\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Get arm positions with walk swing for a trigram stance\n *\n * Combines the trigram's guard arm position with a forward/back swing offset.\n * The elbow position from the guard is preserved to maintain proper guard shape.\n *\n * @param stance - Trigram stance\n * @param leftSwing - Left shoulder forward swing (positive = forward)\n * @param rightSwing - Right shoulder forward swing (positive = forward)\n * @returns Arm rotation values to apply\n *\n * @korean 걷기팔스윙가져오기\n */\nfunction getWalkArmSwing(\n stance: TrigramStance,\n leftSwing: number,\n rightSwing: number,\n): {\n leftShoulder: [number, number, number];\n leftElbow: [number, number, number];\n rightShoulder: [number, number, number];\n rightElbow: [number, number, number];\n} {\n const guard = TRIGRAM_GUARD_POSES[stance];\n\n return {\n // Add swing to X rotation, preserve Y and Z from guard\n leftShoulder: [\n guard.leftArm.shoulder.x + leftSwing,\n guard.leftArm.shoulder.y,\n guard.leftArm.shoulder.z,\n ],\n leftElbow: [\n guard.leftArm.elbow.x,\n guard.leftArm.elbow.y,\n guard.leftArm.elbow.z,\n ],\n rightShoulder: [\n guard.rightArm.shoulder.x + rightSwing,\n guard.rightArm.shoulder.y,\n guard.rightArm.shoulder.z,\n ],\n rightElbow: [\n guard.rightArm.elbow.x,\n guard.rightArm.elbow.y,\n guard.rightArm.elbow.z,\n ],\n };\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// SINGLE STEP WALK DESIGN (단일 보행 설계)\n// ═══════════════════════════════════════════════════════════════════════════\n/**\n * WALK ANIMATION DESIGN PHILOSOPHY:\n *\n * Walk animations are SINGLE STEPS that change foot laterality.\n * Each walk animation:\n * 1. Starts with one foot forward (e.g., left foot front)\n * 2. Steps forward with the rear foot\n * 3. Ends with the other foot forward (e.g., right foot front)\n *\n * This is NOT a continuous walk cycle - it's a discrete step that\n * transitions between two stable idle poses with opposite foot laterality.\n *\n * The animation should:\n * - Duration: 0.4-0.6s for a single step (longer = more deliberate)\n * - NOT loop (loops: false)\n * - End in a stable stance ready for another action\n * - Maintain guard position throughout (no wild arm swings)\n *\n * RUN ANIMATION DESIGN PHILOSOPHY:\n *\n * Run animations are CONTINUOUS LOOPING cycles.\n * Trained fighters maintain guard pose during running:\n * - Arms stay in guard position (NO arm swing)\n * - Only legs show running motion\n * - This allows immediate combat readiness\n *\n * @korean 단일보행설계철학\n */\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☰ GEON (건) - HEAVEN: Direct, Powerful Movements\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Geon Walk - 건보법\n * SINGLE STEP: Powerful authoritative stride, changes foot laterality\n *\n * Start: Left foot forward, right foot back\n * End: Right foot forward, left foot back (reversed laterality)\n *\n * Maintains high guard throughout the step\n */\nexport const GEON_WALK_ANIMATION: SkeletalAnimation = (() => {\n const arms = getWalkArmSwing(TrigramStance.GEON, 0, 0); // Guard position maintained\n\n return (\n MartialArtsAnimationBuilder.create(\"walk_geon\", \"건보법\")\n .asMovement(0.5, false) // Single step, NOT looping\n // Start: Left foot forward (standard stance laterality)\n .at(0.0, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.1, 0.05, 0)\n .rotate(BoneName.HIP_L, 0.35, 0, 0) // Left forward\n .rotate(BoneName.KNEE_L, -0.25, 0, 0)\n .rotate(BoneName.HIP_R, -0.25, 0, 0) // Right back\n .rotate(BoneName.KNEE_R, -0.15, 0, 0)\n // Arms maintain guard\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.05, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GEON_HEAVEN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // Mid: Passing phase (feet together, weight shifting)\n .at(0.25, \"linear\")\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.HIP_L, 0, 0, 0) // Feet passing\n .rotate(BoneName.KNEE_L, -0.5, 0, 0) // Lift rear foot\n .rotate(BoneName.HIP_R, 0.2, 0, 0) // Stepping forward\n .rotate(BoneName.KNEE_R, -0.6, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .position(BoneName.PELVIS, 0, 0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GEON_HEAVEN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // End: Right foot forward (reversed laterality)\n .at(0.5, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.1, -0.05, 0)\n .rotate(BoneName.HIP_R, 0.35, 0, 0) // Right now forward\n .rotate(BoneName.KNEE_R, -0.25, 0, 0)\n .rotate(BoneName.HIP_L, -0.25, 0, 0) // Left now back\n .rotate(BoneName.KNEE_L, -0.15, 0, 0)\n // Arms maintain guard\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GEON_HEAVEN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n/**\n * Geon Run - 건질주\n * Powerful forward charge with aggressive posture\n * Stance width: 1.35x shoulder width maintained during run\n *\n * Uses GEON_HIGH_GUARD_POSE arm positions with enhanced run swing\n */\nexport const GEON_RUN_ANIMATION: SkeletalAnimation = (() => {\n // Trained fighters maintain guard pose - no arm swing\n const arms = getWalkArmSwing(TrigramStance.GEON, 0, 0);\n\n return (\n MartialArtsAnimationBuilder.create(\"run_geon\", \"건질주\")\n .asMovement(0.45, true)\n .at(0.0, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.2, 0.08, 0)\n .rotate(BoneName.HIP_L, -0.5, 0, 0)\n .rotate(BoneName.KNEE_L, -0.2, 0, 0)\n .rotate(BoneName.HIP_R, 0.7, 0, 0)\n .rotate(BoneName.KNEE_R, -1.0, 0, 0)\n // Arms maintain guard pose throughout\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.15, 0, 0)\n .position(BoneName.PELVIS, 0, 0.05, 0.05)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GEON_HEAVEN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.225, \"linear\")\n .rotate(BoneName.PELVIS, 0.15, 0, 0)\n .rotate(BoneName.HIP_L, 0.2, 0, 0)\n .rotate(BoneName.KNEE_L, -1.2, 0, 0)\n .rotate(BoneName.HIP_R, -0.3, 0, 0)\n .rotate(BoneName.KNEE_R, -0.3, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.08, 0.05)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GEON_HEAVEN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.45, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.2, -0.08, 0)\n .rotate(BoneName.HIP_R, -0.5, 0, 0)\n .rotate(BoneName.KNEE_R, -0.2, 0, 0)\n .rotate(BoneName.HIP_L, 0.7, 0, 0)\n .rotate(BoneName.KNEE_L, -1.0, 0, 0)\n // Arms maintain guard pose throughout\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.05, 0.05)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GEON_HEAVEN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☱ TAE (태) - LAKE: Fluid, Adaptive Movements\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Tae Walk - 태보법\n * SINGLE STEP: Light cat-like step with 90/10 weight on back foot\n *\n * Start: Left foot forward\n * End: Right foot forward (reversed laterality)\n *\n * Maintains fluid guard throughout\n */\nexport const TAE_WALK_ANIMATION: SkeletalAnimation = (() => {\n const arms = getWalkArmSwing(TrigramStance.TAE, 0, 0);\n\n return (\n MartialArtsAnimationBuilder.create(\"walk_tae\", \"태보법\")\n .asMovement(0.55, false) // Single step, NOT looping\n // Start: Left foot forward (cat stance)\n .at(0.0, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.05, 0.08, 0)\n .rotate(BoneName.HIP_L, 0.2, 0, -0.1) // Left forward\n .rotate(BoneName.KNEE_L, -0.1, 0, 0)\n .rotate(BoneName.FOOT_L, 0.2, 0, 0)\n .rotate(BoneName.HIP_R, -0.15, 0, 0.1) // Right back (weight)\n .rotate(BoneName.KNEE_R, -0.4, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0, 0.05, 0)\n .position(BoneName.PELVIS, 0, -0.02, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.TAE_LAKE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // Mid: Passing phase\n .at(0.275, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.03, 0, 0)\n .rotate(BoneName.HIP_L, -0.1, 0, 0)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0)\n .rotate(BoneName.HIP_R, 0.15, 0, 0)\n .rotate(BoneName.KNEE_R, -0.5, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .position(BoneName.PELVIS, 0, 0.01, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.TAE_LAKE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // End: Right foot forward (reversed laterality)\n .at(0.55, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.05, -0.08, 0)\n .rotate(BoneName.HIP_R, 0.2, 0, 0.1) // Right now forward\n .rotate(BoneName.KNEE_R, -0.1, 0, 0)\n .rotate(BoneName.FOOT_R, 0.2, 0, 0)\n .rotate(BoneName.HIP_L, -0.15, 0, -0.1) // Left now back\n .rotate(BoneName.KNEE_L, -0.4, 0, 0)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SPINE_UPPER, 0, -0.05, 0)\n .position(BoneName.PELVIS, 0, -0.02, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.TAE_LAKE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n/**\n * Tae Run - 태질주\n * Flowing, evasive run with quick direction changes\n *\n * Uses TAE_FLUID_GUARD_POSE arm positions with run swing\n */\nexport const TAE_RUN_ANIMATION: SkeletalAnimation = (() => {\n // Trained fighters maintain guard pose - no arm swing\n const arms = getWalkArmSwing(TrigramStance.TAE, 0, 0);\n\n return MartialArtsAnimationBuilder.create(\"run_tae\", \"태질주\")\n .asMovement(0.5, true)\n .at(0.0, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.12, 0.1, 0)\n .rotate(BoneName.HIP_L, -0.4, 0, 0)\n .rotate(BoneName.KNEE_L, -0.3, 0, 0)\n .rotate(BoneName.HIP_R, 0.6, 0, 0)\n .rotate(BoneName.KNEE_R, -0.8, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.05, 0.05, 0)\n .position(BoneName.PELVIS, 0, 0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.TAE_LAKE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.25, \"linear\")\n .rotate(BoneName.PELVIS, 0.1, 0, 0)\n .rotate(BoneName.HIP_L, 0.3, 0, 0)\n .rotate(BoneName.KNEE_L, -1.0, 0, 0)\n .rotate(BoneName.HIP_R, -0.2, 0, 0)\n .rotate(BoneName.KNEE_R, -0.25, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.06, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.TAE_LAKE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.5, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.12, -0.1, 0)\n .rotate(BoneName.HIP_R, -0.4, 0, 0)\n .rotate(BoneName.KNEE_R, -0.3, 0, 0)\n .rotate(BoneName.HIP_L, 0.6, 0, 0)\n .rotate(BoneName.KNEE_L, -0.8, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.05, -0.05, 0)\n .position(BoneName.PELVIS, 0, 0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.TAE_LAKE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build();\n})();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☲ LI (리) - FIRE: Quick, Precise Movements\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Li Walk - 리보법\n * SINGLE STEP: Quick precise step with minimal movement\n *\n * Start: Left foot forward\n * End: Right foot forward (reversed laterality)\n *\n * Maintains peekaboo guard throughout\n */\nexport const LI_WALK_ANIMATION: SkeletalAnimation = (() => {\n const arms = getWalkArmSwing(TrigramStance.LI, 0, 0);\n\n return (\n MartialArtsAnimationBuilder.create(\"walk_li\", \"리보법\")\n .asMovement(0.45, false) // Single step, fast and precise\n // Start: Left foot forward\n .at(0.0, \"linear\")\n .rotate(BoneName.PELVIS, 0.08, 0.06, 0)\n .rotate(BoneName.HIP_L, 0.3, 0, 0) // Left forward\n .rotate(BoneName.KNEE_L, -0.2, 0, 0)\n .rotate(BoneName.HIP_R, -0.2, 0, 0) // Right back\n .rotate(BoneName.KNEE_R, -0.15, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.03, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.LI_FIRE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // Mid: Passing phase (quick)\n .at(0.225, \"linear\")\n .rotate(BoneName.PELVIS, 0.05, 0, 0)\n .rotate(BoneName.HIP_L, -0.1, 0, 0)\n .rotate(BoneName.KNEE_L, -0.12, 0, 0)\n .rotate(BoneName.HIP_R, 0.1, 0, 0)\n .rotate(BoneName.KNEE_R, -0.5, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .position(BoneName.PELVIS, 0, 0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.LI_FIRE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // End: Right foot forward\n .at(0.45, \"linear\")\n .rotate(BoneName.PELVIS, 0.08, -0.06, 0)\n .rotate(BoneName.HIP_R, 0.3, 0, 0) // Right now forward\n .rotate(BoneName.KNEE_R, -0.2, 0, 0)\n .rotate(BoneName.HIP_L, -0.2, 0, 0) // Left now back\n .rotate(BoneName.KNEE_L, -0.15, 0, 0)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.LI_FIRE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n/**\n * Li Run - 리질주\n * Explosive sprint with precision footwork\n *\n * Uses LI_FIRE_GUARD_POSE arm positions with run swing\n */\nexport const LI_RUN_ANIMATION: SkeletalAnimation = (() => {\n // Trained fighters maintain guard pose - no arm swing\n const arms = getWalkArmSwing(TrigramStance.LI, 0, 0);\n\n return MartialArtsAnimationBuilder.create(\"run_li\", \"리질주\")\n .asMovement(0.4, true)\n .at(0.0, \"linear\")\n .rotate(BoneName.PELVIS, 0.18, 0.08, 0)\n .rotate(BoneName.HIP_L, -0.45, 0, 0)\n .rotate(BoneName.KNEE_L, -0.25, 0, 0)\n .rotate(BoneName.HIP_R, 0.65, 0, 0)\n .rotate(BoneName.KNEE_R, -0.95, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.12, 0, 0)\n .position(BoneName.PELVIS, 0, 0.06, 0.04)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.LI_FIRE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.2, \"linear\")\n .rotate(BoneName.PELVIS, 0.12, 0, 0)\n .rotate(BoneName.HIP_L, 0.25, 0, 0)\n .rotate(BoneName.KNEE_L, -1.15, 0, 0)\n .rotate(BoneName.HIP_R, -0.25, 0, 0)\n .rotate(BoneName.KNEE_R, -0.25, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.09, 0.04)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.LI_FIRE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.4, \"linear\")\n .rotate(BoneName.PELVIS, 0.18, -0.08, 0)\n .rotate(BoneName.HIP_R, -0.45, 0, 0)\n .rotate(BoneName.KNEE_R, -0.25, 0, 0)\n .rotate(BoneName.HIP_L, 0.65, 0, 0)\n .rotate(BoneName.KNEE_L, -0.95, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.06, 0.04)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.LI_FIRE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build();\n})();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☳ JIN (진) - THUNDER: Explosive, Sudden Movements\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Jin Walk - 진보법\n * Explosive step-and-ready walk, prepared to strike\n *\n * Uses JIN_THUNDER_GUARD_POSE arm positions with walk swing\n */\nexport const JIN_WALK_ANIMATION: SkeletalAnimation = (() => {\n const arms = getWalkArmSwing(TrigramStance.JIN, 0, 0);\n\n return (\n MartialArtsAnimationBuilder.create(\"walk_jin\", \"진보법\")\n .asMovement(0.5, false) // Single step, coiled energy\n // Start: Left foot forward\n .at(0.0, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.12, 0.06, 0)\n .rotate(BoneName.HIP_L, 0.4, 0, 0) // Left forward\n .rotate(BoneName.KNEE_L, -0.3, 0, 0)\n .rotate(BoneName.HIP_R, -0.3, 0, 0) // Right back\n .rotate(BoneName.KNEE_R, -0.2, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.08, 0, 0)\n .rotate(BoneName.SPINE_LOWER, 0.05, 0, 0)\n .position(BoneName.PELVIS, 0, -0.01, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.JIN_THUNDER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // Mid: Passing phase\n .at(0.25, \"ease-in\")\n .rotate(BoneName.PELVIS, 0.08, 0, 0)\n .rotate(BoneName.HIP_L, -0.15, 0, 0)\n .rotate(BoneName.KNEE_L, -0.2, 0, 0)\n .rotate(BoneName.HIP_R, 0.15, 0, 0)\n .rotate(BoneName.KNEE_R, -0.6, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.02, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.JIN_THUNDER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // End: Right foot forward\n .at(0.5, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.12, -0.06, 0)\n .rotate(BoneName.HIP_R, 0.4, 0, 0) // Right now forward\n .rotate(BoneName.KNEE_R, -0.3, 0, 0)\n .rotate(BoneName.HIP_L, -0.3, 0, 0) // Left now back\n .rotate(BoneName.KNEE_L, -0.2, 0, 0)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .position(BoneName.PELVIS, 0, -0.01, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.JIN_THUNDER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n/**\n * Jin Run - 진질주\n * Thunderous charge with explosive power\n *\n * Uses JIN_THUNDER_GUARD_POSE arm positions with run swing\n */\nexport const JIN_RUN_ANIMATION: SkeletalAnimation = (() => {\n // Trained fighters maintain guard pose - no arm swing\n const arms = getWalkArmSwing(TrigramStance.JIN, 0, 0);\n\n return MartialArtsAnimationBuilder.create(\"run_jin\", \"진질주\")\n .asMovement(0.42, true)\n .at(0.0, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.22, 0.1, 0)\n .rotate(BoneName.HIP_L, -0.55, 0, 0)\n .rotate(BoneName.KNEE_L, -0.3, 0, 0)\n .rotate(BoneName.HIP_R, 0.75, 0, 0)\n .rotate(BoneName.KNEE_R, -1.1, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.18, 0, 0)\n .rotate(BoneName.SPINE_LOWER, 0.1, 0, 0)\n .position(BoneName.PELVIS, 0, 0.04, 0.06)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.JIN_THUNDER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.21, \"linear\")\n .rotate(BoneName.PELVIS, 0.16, 0, 0)\n .rotate(BoneName.HIP_L, 0.3, 0, 0)\n .rotate(BoneName.KNEE_L, -1.25, 0, 0)\n .rotate(BoneName.HIP_R, -0.35, 0, 0)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.08, 0.06)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.JIN_THUNDER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.42, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.22, -0.1, 0)\n .rotate(BoneName.HIP_R, -0.55, 0, 0)\n .rotate(BoneName.KNEE_R, -0.3, 0, 0)\n .rotate(BoneName.HIP_L, 0.75, 0, 0)\n .rotate(BoneName.KNEE_L, -1.1, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.04, 0.06)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.JIN_THUNDER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build();\n})();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☴ SON (손) - WIND: Continuous, Flowing Movements\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Son Walk - 손보법\n * SINGLE STEP: Gentle flowing step like wind through trees\n *\n * Start: Left foot forward\n * End: Right foot forward (reversed laterality)\n */\nexport const SON_WALK_ANIMATION: SkeletalAnimation = (() => {\n const arms = getWalkArmSwing(TrigramStance.SON, 0, 0);\n\n return (\n MartialArtsAnimationBuilder.create(\"walk_son\", \"손보법\")\n .asMovement(0.55, false) // Single flowing step\n // Start: Left foot forward\n .at(0.0, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.06, 0.04, 0)\n .rotate(BoneName.HIP_L, 0.25, 0, 0) // Left forward\n .rotate(BoneName.KNEE_L, -0.15, 0, 0)\n .rotate(BoneName.HIP_R, -0.18, 0, 0) // Right back\n .rotate(BoneName.KNEE_R, -0.12, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.02, 0.03, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.SON_WIND.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // Mid: Passing phase\n .at(0.275, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.04, 0, 0)\n .rotate(BoneName.HIP_L, -0.08, 0, 0)\n .rotate(BoneName.KNEE_L, -0.1, 0, 0)\n .rotate(BoneName.HIP_R, 0.1, 0, 0)\n .rotate(BoneName.KNEE_R, -0.4, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.02, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.SON_WIND.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // End: Right foot forward\n .at(0.55, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.06, -0.04, 0)\n .rotate(BoneName.HIP_R, 0.25, 0, 0) // Right now forward\n .rotate(BoneName.KNEE_R, -0.15, 0, 0)\n .rotate(BoneName.HIP_L, -0.18, 0, 0) // Left now back\n .rotate(BoneName.KNEE_L, -0.12, 0, 0)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SPINE_UPPER, 0.02, -0.03, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.SON_WIND.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n/**\n * Son Run - 손질주\n * Swift, gliding run like wind rushing\n *\n * Uses SON_WIND_GUARD_POSE arm positions with run swing\n */\nexport const SON_RUN_ANIMATION: SkeletalAnimation = (() => {\n // Trained fighters maintain guard pose - no arm swing\n const arms = getWalkArmSwing(TrigramStance.SON, 0, 0);\n\n return MartialArtsAnimationBuilder.create(\"run_son\", \"손질주\")\n .asMovement(0.48, true)\n .at(0.0, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.14, 0.08, 0)\n .rotate(BoneName.HIP_L, -0.4, 0, 0)\n .rotate(BoneName.KNEE_L, -0.25, 0, 0)\n .rotate(BoneName.HIP_R, 0.6, 0, 0)\n .rotate(BoneName.KNEE_R, -0.85, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.08, 0.04, 0)\n .position(BoneName.PELVIS, 0, 0.04, 0.02)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.SON_WIND.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.24, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.1, 0, 0)\n .rotate(BoneName.HIP_L, 0.2, 0, 0)\n .rotate(BoneName.KNEE_L, -1.0, 0, 0)\n .rotate(BoneName.HIP_R, -0.2, 0, 0)\n .rotate(BoneName.KNEE_R, -0.2, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.07, 0.02)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.SON_WIND.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.48, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.14, -0.08, 0)\n .rotate(BoneName.HIP_R, -0.4, 0, 0)\n .rotate(BoneName.KNEE_R, -0.25, 0, 0)\n .rotate(BoneName.HIP_L, 0.6, 0, 0)\n .rotate(BoneName.KNEE_L, -0.85, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.08, -0.04, 0)\n .position(BoneName.PELVIS, 0, 0.04, 0.02)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.SON_WIND.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build();\n})();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☵ GAM (감) - WATER: Adaptive, Redirecting Movements\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gam Walk - 감보법\n * SINGLE STEP: Flowing adaptive step that flows around obstacles\n *\n * Start: Left foot forward\n * End: Right foot forward (reversed laterality)\n */\nexport const GAM_WALK_ANIMATION: SkeletalAnimation = (() => {\n const arms = getWalkArmSwing(TrigramStance.GAM, 0, 0);\n\n return (\n MartialArtsAnimationBuilder.create(\"walk_gam\", \"감보법\")\n .asMovement(0.55, false) // Single flowing step\n // Start: Left foot forward\n .at(0.0, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.05, 0.06, 0.02)\n .rotate(BoneName.HIP_L, 0.28, 0, -0.05) // Left forward\n .rotate(BoneName.KNEE_L, -0.18, 0, 0)\n .rotate(BoneName.HIP_R, -0.2, 0, 0.05) // Right back\n .rotate(BoneName.KNEE_R, -0.15, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0, 0.04, 0.02)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAM_WATER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // Mid: Passing phase\n .at(0.275, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.03, 0, 0)\n .rotate(BoneName.HIP_L, -0.1, 0, 0)\n .rotate(BoneName.KNEE_L, -0.12, 0, 0)\n .rotate(BoneName.HIP_R, 0.12, 0, 0)\n .rotate(BoneName.KNEE_R, -0.45, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .position(BoneName.PELVIS, 0, 0.02, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAM_WATER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // End: Right foot forward\n .at(0.55, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.05, -0.06, -0.02)\n .rotate(BoneName.HIP_R, 0.28, 0, 0.05) // Right now forward\n .rotate(BoneName.KNEE_R, -0.18, 0, 0)\n .rotate(BoneName.HIP_L, -0.2, 0, -0.05) // Left now back\n .rotate(BoneName.KNEE_L, -0.15, 0, 0)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SPINE_UPPER, 0, -0.04, -0.02)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAM_WATER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n/**\n * Gam Run - 감질주\n * Fluid run that flows like water around obstacles\n *\n * Uses GAM_WATER_GUARD_POSE arm positions with run swing\n */\nexport const GAM_RUN_ANIMATION: SkeletalAnimation = (() => {\n // Trained fighters maintain guard pose - no arm swing\n const arms = getWalkArmSwing(TrigramStance.GAM, 0, 0);\n\n return MartialArtsAnimationBuilder.create(\"run_gam\", \"감질주\")\n .asMovement(0.52, true)\n .at(0.0, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.12, 0.1, 0.03)\n .rotate(BoneName.HIP_L, -0.38, 0, 0)\n .rotate(BoneName.KNEE_L, -0.28, 0, 0)\n .rotate(BoneName.HIP_R, 0.58, 0, 0)\n .rotate(BoneName.KNEE_R, -0.82, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.06, 0.05, 0.02)\n .position(BoneName.PELVIS, 0.02, 0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAM_WATER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.26, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.08, 0, 0)\n .rotate(BoneName.HIP_L, 0.22, 0, 0)\n .rotate(BoneName.KNEE_L, -0.95, 0, 0)\n .rotate(BoneName.HIP_R, -0.18, 0, 0)\n .rotate(BoneName.KNEE_R, -0.22, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.06, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAM_WATER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.52, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.12, -0.1, -0.03)\n .rotate(BoneName.HIP_R, -0.38, 0, 0)\n .rotate(BoneName.KNEE_R, -0.28, 0, 0)\n .rotate(BoneName.HIP_L, 0.58, 0, 0)\n .rotate(BoneName.KNEE_L, -0.82, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.06, -0.05, -0.02)\n .position(BoneName.PELVIS, -0.02, 0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAM_WATER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build();\n})();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☶ GAN (간) - MOUNTAIN: Stable, Grounded Movements\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gan Walk - 간보법\n * SINGLE STEP: Solid immovable step with defensive posture\n *\n * Start: Left foot forward\n * End: Right foot forward (reversed laterality)\n */\nexport const GAN_WALK_ANIMATION: SkeletalAnimation = (() => {\n const arms = getWalkArmSwing(TrigramStance.GAN, 0, 0);\n\n return (\n MartialArtsAnimationBuilder.create(\"walk_gan\", \"간보법\")\n .asMovement(0.6, false) // Single grounded step\n // Start: Left foot forward\n .at(0.0, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.08, 0.04, 0)\n .rotate(BoneName.HIP_L, 0.3, 0, 0) // Left forward\n .rotate(BoneName.KNEE_L, -0.28, 0, 0)\n .rotate(BoneName.HIP_R, -0.22, 0, 0) // Right back\n .rotate(BoneName.KNEE_R, -0.25, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.04, 0, 0)\n .rotate(BoneName.SPINE_LOWER, 0.06, 0, 0)\n .position(BoneName.PELVIS, 0, -0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAN_MOUNTAIN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // Mid: Passing phase (deliberate)\n .at(0.3, \"linear\")\n .rotate(BoneName.PELVIS, 0.06, 0, 0)\n .rotate(BoneName.HIP_L, -0.05, 0, 0)\n .rotate(BoneName.KNEE_L, -0.2, 0, 0)\n .rotate(BoneName.HIP_R, 0.08, 0, 0)\n .rotate(BoneName.KNEE_R, -0.5, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, -0.01, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAN_MOUNTAIN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // End: Right foot forward\n .at(0.6, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.08, -0.04, 0)\n .rotate(BoneName.HIP_R, 0.3, 0, 0) // Right now forward\n .rotate(BoneName.KNEE_R, -0.28, 0, 0)\n .rotate(BoneName.HIP_L, -0.22, 0, 0) // Left now back\n .rotate(BoneName.KNEE_L, -0.25, 0, 0)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .position(BoneName.PELVIS, 0, -0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAN_MOUNTAIN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n/**\n * Gan Run - 간질주\n * Heavy, unstoppable charge like an avalanche\n *\n * Uses GAN_MOUNTAIN_GUARD_POSE arm positions with run swing\n */\nexport const GAN_RUN_ANIMATION: SkeletalAnimation = (() => {\n // Trained fighters maintain guard pose - no arm swing\n const arms = getWalkArmSwing(TrigramStance.GAN, 0, 0);\n\n return MartialArtsAnimationBuilder.create(\"run_gan\", \"간질주\")\n .asMovement(0.55, true)\n .at(0.0, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.18, 0.08, 0)\n .rotate(BoneName.HIP_L, -0.45, 0, 0)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0)\n .rotate(BoneName.HIP_R, 0.65, 0, 0)\n .rotate(BoneName.KNEE_R, -0.9, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.12, 0, 0)\n .rotate(BoneName.SPINE_LOWER, 0.1, 0, 0)\n .position(BoneName.PELVIS, 0, 0.02, 0.04)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAN_MOUNTAIN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.275, \"linear\")\n .rotate(BoneName.PELVIS, 0.14, 0, 0)\n .rotate(BoneName.HIP_L, 0.2, 0, 0)\n .rotate(BoneName.KNEE_L, -1.05, 0, 0)\n .rotate(BoneName.HIP_R, -0.25, 0, 0)\n .rotate(BoneName.KNEE_R, -0.3, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.05, 0.04)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAN_MOUNTAIN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.55, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.18, -0.08, 0)\n .rotate(BoneName.HIP_R, -0.45, 0, 0)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0)\n .rotate(BoneName.HIP_L, 0.65, 0, 0)\n .rotate(BoneName.KNEE_L, -0.9, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.02, 0.04)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAN_MOUNTAIN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build();\n})();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☷ GON (곤) - EARTH: Heavy, Rooted Movements\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gon Walk - 곤보법\n * SINGLE STEP: Heavy rooted step with low center of gravity\n *\n * Start: Left foot forward\n * End: Right foot forward (reversed laterality)\n */\nexport const GON_WALK_ANIMATION: SkeletalAnimation = (() => {\n const arms = getWalkArmSwing(TrigramStance.GON, 0, 0);\n\n return (\n MartialArtsAnimationBuilder.create(\"walk_gon\", \"곤보법\")\n .asMovement(0.65, false) // Single heavy step\n // Start: Left foot forward\n .at(0.0, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.1, 0.05, 0)\n .rotate(BoneName.HIP_L, 0.35, 0, -0.08) // Left forward\n .rotate(BoneName.KNEE_L, -0.38, 0, 0)\n .rotate(BoneName.HIP_R, -0.25, 0, 0.08) // Right back\n .rotate(BoneName.KNEE_R, -0.35, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.06, 0, 0)\n .rotate(BoneName.SPINE_LOWER, 0.1, 0, 0)\n .position(BoneName.PELVIS, 0, -0.06, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GON_EARTH.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // Mid: Passing phase (heavy)\n .at(0.325, \"linear\")\n .rotate(BoneName.PELVIS, 0.08, 0, 0)\n .rotate(BoneName.HIP_L, -0.08, 0, 0)\n .rotate(BoneName.KNEE_L, -0.28, 0, 0)\n .rotate(BoneName.HIP_R, 0.1, 0, 0)\n .rotate(BoneName.KNEE_R, -0.55, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, -0.04, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GON_EARTH.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // End: Right foot forward\n .at(0.65, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.1, -0.05, 0)\n .rotate(BoneName.HIP_R, 0.35, 0, 0.08) // Right now forward\n .rotate(BoneName.KNEE_R, -0.38, 0, 0)\n .rotate(BoneName.HIP_L, -0.25, 0, -0.08) // Left now back\n .rotate(BoneName.KNEE_L, -0.35, 0, 0)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .position(BoneName.PELVIS, 0, -0.06, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GON_EARTH.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n/**\n * Gon Run - 곤질주\n * Powerful, earthshaking run\n *\n * Trained fighters maintain guard pose throughout\n */\nexport const GON_RUN_ANIMATION: SkeletalAnimation = (() => {\n // Trained fighters maintain guard pose - no arm swing\n const arms = getWalkArmSwing(TrigramStance.GON, 0, 0);\n\n return MartialArtsAnimationBuilder.create(\"run_gon\", \"곤질주\")\n .asMovement(0.58, true)\n .at(0.0, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.2, 0.1, 0)\n .rotate(BoneName.HIP_L, -0.5, 0, 0)\n .rotate(BoneName.KNEE_L, -0.4, 0, 0)\n .rotate(BoneName.HIP_R, 0.7, 0, 0)\n .rotate(BoneName.KNEE_R, -0.95, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.14, 0, 0)\n .rotate(BoneName.SPINE_LOWER, 0.12, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0.05)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GON_EARTH.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.29, \"linear\")\n .rotate(BoneName.PELVIS, 0.16, 0, 0)\n .rotate(BoneName.HIP_L, 0.25, 0, 0)\n .rotate(BoneName.KNEE_L, -1.1, 0, 0)\n .rotate(BoneName.HIP_R, -0.3, 0, 0)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.04, 0.05)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GON_EARTH.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.58, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.2, -0.1, 0)\n .rotate(BoneName.HIP_R, -0.5, 0, 0)\n .rotate(BoneName.KNEE_R, -0.4, 0, 0)\n .rotate(BoneName.HIP_L, 0.7, 0, 0)\n .rotate(BoneName.KNEE_L, -0.95, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0, 0.05)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GON_EARTH.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build();\n})();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ANIMATION MAPS\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Map of all stance-specific walk animations\n * @korean 자세별걷기애니메이션맵\n */\nexport const STANCE_WALK_ANIMATIONS: ReadonlyMap<string, SkeletalAnimation> =\n new Map([\n [\"walk_geon\", GEON_WALK_ANIMATION],\n [\"walk_tae\", TAE_WALK_ANIMATION],\n [\"walk_li\", LI_WALK_ANIMATION],\n [\"walk_jin\", JIN_WALK_ANIMATION],\n [\"walk_son\", SON_WALK_ANIMATION],\n [\"walk_gam\", GAM_WALK_ANIMATION],\n [\"walk_gan\", GAN_WALK_ANIMATION],\n [\"walk_gon\", GON_WALK_ANIMATION],\n ]);\n\n/**\n * Map of all stance-specific run animations\n * @korean 자세별달리기애니메이션맵\n */\nexport const STANCE_RUN_ANIMATIONS: ReadonlyMap<string, SkeletalAnimation> =\n new Map([\n [\"run_geon\", GEON_RUN_ANIMATION],\n [\"run_tae\", TAE_RUN_ANIMATION],\n [\"run_li\", LI_RUN_ANIMATION],\n [\"run_jin\", JIN_RUN_ANIMATION],\n [\"run_son\", SON_RUN_ANIMATION],\n [\"run_gam\", GAM_RUN_ANIMATION],\n [\"run_gan\", GAN_RUN_ANIMATION],\n [\"run_gon\", GON_RUN_ANIMATION],\n ]);\n\n/**\n * Combined map of all stance locomotion animations\n * @korean 자세별이동애니메이션통합맵\n */\nexport const STANCE_LOCOMOTION_ANIMATIONS: ReadonlyMap<\n string,\n SkeletalAnimation\n> = new Map([...STANCE_WALK_ANIMATIONS, ...STANCE_RUN_ANIMATIONS]);\n\n/**\n * Get stance-specific walk animation\n * @param stance - Trigram stance name (geon, tae, li, etc.)\n * @returns Walk animation for that stance\n */\nexport function getStanceWalkAnimation(\n stance: string,\n): SkeletalAnimation | undefined {\n return STANCE_WALK_ANIMATIONS.get(`walk_${stance}`);\n}\n\n/**\n * Get stance-specific run animation\n * @param stance - Trigram stance name (geon, tae, li, etc.)\n * @returns Run animation for that stance\n */\nexport function getStanceRunAnimation(\n stance: string,\n): SkeletalAnimation | undefined {\n return STANCE_RUN_ANIMATIONS.get(`run_${stance}`);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"StanceLocomotionAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/StanceLocomotionAnimations.ts"],"sourcesContent":["/**\n * Stance-Specific Locomotion Animations Module\n *\n * Trigram-specific walk and run animations for each of the eight stances.\n * Each trigram has unique movement characteristics reflecting its philosophy:\n *\n * ☰ Geon (Heaven): Direct, powerful movements\n * ☱ Tae (Lake): Fluid, adaptive movements\n * ☲ Li (Fire): Quick, precise movements\n * ☳ Jin (Thunder): Explosive, sudden movements\n * ☴ Son (Wind): Continuous, flowing movements\n * ☵ Gam (Water): Adaptive, redirecting movements\n * ☶ Gan (Mountain): Stable, grounded movements\n * ☷ Gon (Earth): Heavy, rooted movements\n *\n * DESIGN PRINCIPLES:\n * - Fighters MAINTAIN GUARD during locomotion (no arm swing)\n * - Arms/torso/pelvis use withTrigramGuard() from builder\n * - Legs blend trigram base position + locomotion motion\n * - Each stance has distinct leg mechanics (stance width, knee bend, weight)\n *\n * @module systems/animation/StanceLocomotionAnimations\n * @korean 자세별이동애니메이션\n */\n\nimport { TrigramStance } from \"@/types/common\";\nimport type { SkeletalAnimation } from \"@/types/skeletal\";\nimport { BoneName } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\nimport { KOREAN_STANCE_BIOMECHANICS } from \"../builders/MartialArtsConstants\";\nimport { TRIGRAM_GUARD_POSES } from \"../builders/TrigramGuardApplicator\";\n\n// ═══════════════════════════════════════════════════════════════════════════\n// CONSTANTS\n// ═══════════════════════════════════════════════════════════════════════════\n\n/** Default shoulder width for stance locomotion animations (cm) */\nconst DEFAULT_SHOULDER_WIDTH_CM = 46;\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ARM SWING HELPERS - Apply guard pose with locomotion swing offset\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Get arm positions with walk swing for a trigram stance\n *\n * Combines the trigram's guard arm position with a forward/back swing offset.\n * The elbow position from the guard is preserved to maintain proper guard shape.\n *\n * @param stance - Trigram stance\n * @param leftSwing - Left shoulder forward swing (positive = forward)\n * @param rightSwing - Right shoulder forward swing (positive = forward)\n * @returns Arm rotation values to apply\n *\n * @korean 걷기팔스윙가져오기\n */\nfunction getWalkArmSwing(\n stance: TrigramStance,\n leftSwing: number,\n rightSwing: number,\n): {\n leftShoulder: [number, number, number];\n leftElbow: [number, number, number];\n rightShoulder: [number, number, number];\n rightElbow: [number, number, number];\n} {\n const guard = TRIGRAM_GUARD_POSES[stance];\n\n return {\n // Add swing to X rotation, preserve Y and Z from guard\n leftShoulder: [\n guard.leftArm.shoulder.x + leftSwing,\n guard.leftArm.shoulder.y,\n guard.leftArm.shoulder.z,\n ],\n leftElbow: [\n guard.leftArm.elbow.x,\n guard.leftArm.elbow.y,\n guard.leftArm.elbow.z,\n ],\n rightShoulder: [\n guard.rightArm.shoulder.x + rightSwing,\n guard.rightArm.shoulder.y,\n guard.rightArm.shoulder.z,\n ],\n rightElbow: [\n guard.rightArm.elbow.x,\n guard.rightArm.elbow.y,\n guard.rightArm.elbow.z,\n ],\n };\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// SINGLE STEP WALK DESIGN (단일 보행 설계)\n// ═══════════════════════════════════════════════════════════════════════════\n/**\n * WALK ANIMATION DESIGN PHILOSOPHY:\n *\n * Walk animations are SINGLE STEPS that change foot laterality.\n * Each walk animation:\n * 1. Starts with one foot forward (e.g., left foot front)\n * 2. Steps forward with the rear foot\n * 3. Ends with the other foot forward (e.g., right foot front)\n *\n * This is NOT a continuous walk cycle - it's a discrete step that\n * transitions between two stable idle poses with opposite foot laterality.\n *\n * The animation should:\n * - Duration: 0.4-0.6s for a single step (longer = more deliberate)\n * - NOT loop (loops: false)\n * - End in a stable stance ready for another action\n * - Maintain guard position throughout (no wild arm swings)\n *\n * RUN ANIMATION DESIGN PHILOSOPHY:\n *\n * Run animations are CONTINUOUS LOOPING cycles.\n * Trained fighters maintain guard pose during running:\n * - Arms stay in guard position (NO arm swing)\n * - Only legs show running motion\n * - This allows immediate combat readiness\n *\n * @korean 단일보행설계철학\n */\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☰ GEON (건) - HEAVEN: Direct, Powerful Movements\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Geon Walk - 건보법\n * SINGLE STEP: Powerful authoritative stride, changes foot laterality\n *\n * Start: Left foot forward, right foot back\n * End: Right foot forward, left foot back (reversed laterality)\n *\n * Maintains high guard throughout the step\n */\nexport const GEON_WALK_ANIMATION: SkeletalAnimation = (() => {\n const arms = getWalkArmSwing(TrigramStance.GEON, 0, 0); // Guard position maintained\n\n return (\n MartialArtsAnimationBuilder.create(\"walk_geon\", \"건보법\")\n .asMovement(0.5, false) // Single step, NOT looping\n // Start: Left foot forward (standard stance laterality)\n .at(0.0, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.1, 0.05, 0)\n .rotate(BoneName.HIP_L, 0.35, 0, 0) // Left forward\n .rotate(BoneName.KNEE_L, -0.25, 0, 0)\n .rotate(BoneName.HIP_R, -0.25, 0, 0) // Right back\n .rotate(BoneName.KNEE_R, -0.15, 0, 0)\n // Arms maintain guard\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.05, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GEON_HEAVEN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // Mid: Passing phase (feet together, weight shifting)\n .at(0.25, \"linear\")\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.HIP_L, 0, 0, 0) // Feet passing\n .rotate(BoneName.KNEE_L, -0.5, 0, 0) // Lift rear foot\n .rotate(BoneName.HIP_R, 0.2, 0, 0) // Stepping forward\n .rotate(BoneName.KNEE_R, -0.6, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .position(BoneName.PELVIS, 0, 0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GEON_HEAVEN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // End: Right foot forward (reversed laterality)\n .at(0.5, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.1, -0.05, 0)\n .rotate(BoneName.HIP_R, 0.35, 0, 0) // Right now forward\n .rotate(BoneName.KNEE_R, -0.25, 0, 0)\n .rotate(BoneName.HIP_L, -0.25, 0, 0) // Left now back\n .rotate(BoneName.KNEE_L, -0.15, 0, 0)\n // Arms maintain guard\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GEON_HEAVEN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n/**\n * Geon Run - 건질주\n * Powerful forward charge with aggressive posture\n * Stance width: 1.35x shoulder width maintained during run\n *\n * Uses GEON_HIGH_GUARD_POSE arm positions with enhanced run swing\n */\nexport const GEON_RUN_ANIMATION: SkeletalAnimation = (() => {\n // Trained fighters maintain guard pose - no arm swing\n const arms = getWalkArmSwing(TrigramStance.GEON, 0, 0);\n\n return (\n MartialArtsAnimationBuilder.create(\"run_geon\", \"건질주\")\n .asMovement(0.45, true)\n .at(0.0, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.2, 0.08, 0)\n .rotate(BoneName.HIP_L, -0.5, 0, 0)\n .rotate(BoneName.KNEE_L, -0.2, 0, 0)\n .rotate(BoneName.HIP_R, 0.7, 0, 0)\n .rotate(BoneName.KNEE_R, -1.0, 0, 0)\n // Arms maintain guard pose throughout\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.15, 0, 0)\n .position(BoneName.PELVIS, 0, 0.05, 0.05)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GEON_HEAVEN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.225, \"linear\")\n .rotate(BoneName.PELVIS, 0.15, 0, 0)\n .rotate(BoneName.HIP_L, 0.2, 0, 0)\n .rotate(BoneName.KNEE_L, -1.2, 0, 0)\n .rotate(BoneName.HIP_R, -0.3, 0, 0)\n .rotate(BoneName.KNEE_R, -0.3, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.08, 0.05)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GEON_HEAVEN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.45, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.2, -0.08, 0)\n .rotate(BoneName.HIP_R, -0.5, 0, 0)\n .rotate(BoneName.KNEE_R, -0.2, 0, 0)\n .rotate(BoneName.HIP_L, 0.7, 0, 0)\n .rotate(BoneName.KNEE_L, -1.0, 0, 0)\n // Arms maintain guard pose throughout\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.05, 0.05)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GEON_HEAVEN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☱ TAE (태) - LAKE: Fluid, Adaptive Movements\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Tae Walk - 태보법\n * SINGLE STEP: Light cat-like step with 90/10 weight on back foot\n *\n * Start: Left foot forward\n * End: Right foot forward (reversed laterality)\n *\n * Maintains fluid guard throughout\n */\nexport const TAE_WALK_ANIMATION: SkeletalAnimation = (() => {\n const arms = getWalkArmSwing(TrigramStance.TAE, 0, 0);\n\n return (\n MartialArtsAnimationBuilder.create(\"walk_tae\", \"태보법\")\n .asMovement(0.55, false) // Single step, NOT looping\n // Start: Left foot forward (cat stance)\n .at(0.0, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.05, 0.08, 0)\n .rotate(BoneName.HIP_L, 0.2, 0, -0.1) // Left forward\n .rotate(BoneName.KNEE_L, -0.1, 0, 0)\n .rotate(BoneName.FOOT_L, 0.2, 0, 0)\n .rotate(BoneName.HIP_R, -0.15, 0, 0.1) // Right back (weight)\n .rotate(BoneName.KNEE_R, -0.4, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0, 0.05, 0)\n .position(BoneName.PELVIS, 0, -0.02, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.TAE_LAKE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // Mid: Passing phase\n .at(0.275, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.03, 0, 0)\n .rotate(BoneName.HIP_L, -0.1, 0, 0)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0)\n .rotate(BoneName.HIP_R, 0.15, 0, 0)\n .rotate(BoneName.KNEE_R, -0.5, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .position(BoneName.PELVIS, 0, 0.01, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.TAE_LAKE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // End: Right foot forward (reversed laterality)\n .at(0.55, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.05, -0.08, 0)\n .rotate(BoneName.HIP_R, 0.2, 0, 0.1) // Right now forward\n .rotate(BoneName.KNEE_R, -0.1, 0, 0)\n .rotate(BoneName.FOOT_R, 0.2, 0, 0)\n .rotate(BoneName.HIP_L, -0.15, 0, -0.1) // Left now back\n .rotate(BoneName.KNEE_L, -0.4, 0, 0)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SPINE_UPPER, 0, -0.05, 0)\n .position(BoneName.PELVIS, 0, -0.02, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.TAE_LAKE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n/**\n * Tae Run - 태질주\n * Flowing, evasive run with quick direction changes\n *\n * Uses TAE_FLUID_GUARD_POSE arm positions with run swing\n */\nexport const TAE_RUN_ANIMATION: SkeletalAnimation = (() => {\n // Trained fighters maintain guard pose - no arm swing\n const arms = getWalkArmSwing(TrigramStance.TAE, 0, 0);\n\n return MartialArtsAnimationBuilder.create(\"run_tae\", \"태질주\")\n .asMovement(0.5, true)\n .at(0.0, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.12, 0.1, 0)\n .rotate(BoneName.HIP_L, -0.4, 0, 0)\n .rotate(BoneName.KNEE_L, -0.3, 0, 0)\n .rotate(BoneName.HIP_R, 0.6, 0, 0)\n .rotate(BoneName.KNEE_R, -0.8, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.05, 0.05, 0)\n .position(BoneName.PELVIS, 0, 0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.TAE_LAKE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.25, \"linear\")\n .rotate(BoneName.PELVIS, 0.1, 0, 0)\n .rotate(BoneName.HIP_L, 0.3, 0, 0)\n .rotate(BoneName.KNEE_L, -1.0, 0, 0)\n .rotate(BoneName.HIP_R, -0.2, 0, 0)\n .rotate(BoneName.KNEE_R, -0.25, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.06, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.TAE_LAKE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.5, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.12, -0.1, 0)\n .rotate(BoneName.HIP_R, -0.4, 0, 0)\n .rotate(BoneName.KNEE_R, -0.3, 0, 0)\n .rotate(BoneName.HIP_L, 0.6, 0, 0)\n .rotate(BoneName.KNEE_L, -0.8, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.05, -0.05, 0)\n .position(BoneName.PELVIS, 0, 0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.TAE_LAKE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build();\n})();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☲ LI (리) - FIRE: Quick, Precise Movements\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Li Walk - 리보법\n * SINGLE STEP: Quick precise step with minimal movement\n *\n * Start: Left foot forward\n * End: Right foot forward (reversed laterality)\n *\n * Maintains peekaboo guard throughout\n */\nexport const LI_WALK_ANIMATION: SkeletalAnimation = (() => {\n const arms = getWalkArmSwing(TrigramStance.LI, 0, 0);\n\n return (\n MartialArtsAnimationBuilder.create(\"walk_li\", \"리보법\")\n .asMovement(0.45, false) // Single step, fast and precise\n // Start: Left foot forward\n .at(0.0, \"linear\")\n .rotate(BoneName.PELVIS, 0.08, 0.06, 0)\n .rotate(BoneName.HIP_L, 0.3, 0, 0) // Left forward\n .rotate(BoneName.KNEE_L, -0.2, 0, 0)\n .rotate(BoneName.HIP_R, -0.2, 0, 0) // Right back\n .rotate(BoneName.KNEE_R, -0.15, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.03, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.LI_FIRE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // Mid: Passing phase (quick)\n .at(0.225, \"linear\")\n .rotate(BoneName.PELVIS, 0.05, 0, 0)\n .rotate(BoneName.HIP_L, -0.1, 0, 0)\n .rotate(BoneName.KNEE_L, -0.12, 0, 0)\n .rotate(BoneName.HIP_R, 0.1, 0, 0)\n .rotate(BoneName.KNEE_R, -0.5, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .position(BoneName.PELVIS, 0, 0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.LI_FIRE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // End: Right foot forward\n .at(0.45, \"linear\")\n .rotate(BoneName.PELVIS, 0.08, -0.06, 0)\n .rotate(BoneName.HIP_R, 0.3, 0, 0) // Right now forward\n .rotate(BoneName.KNEE_R, -0.2, 0, 0)\n .rotate(BoneName.HIP_L, -0.2, 0, 0) // Left now back\n .rotate(BoneName.KNEE_L, -0.15, 0, 0)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.LI_FIRE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n/**\n * Li Run - 리질주\n * Explosive sprint with precision footwork\n *\n * Uses LI_FIRE_GUARD_POSE arm positions with run swing\n */\nexport const LI_RUN_ANIMATION: SkeletalAnimation = (() => {\n // Trained fighters maintain guard pose - no arm swing\n const arms = getWalkArmSwing(TrigramStance.LI, 0, 0);\n\n return MartialArtsAnimationBuilder.create(\"run_li\", \"리질주\")\n .asMovement(0.4, true)\n .at(0.0, \"linear\")\n .rotate(BoneName.PELVIS, 0.18, 0.08, 0)\n .rotate(BoneName.HIP_L, -0.45, 0, 0)\n .rotate(BoneName.KNEE_L, -0.25, 0, 0)\n .rotate(BoneName.HIP_R, 0.65, 0, 0)\n .rotate(BoneName.KNEE_R, -0.95, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.12, 0, 0)\n .position(BoneName.PELVIS, 0, 0.06, 0.04)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.LI_FIRE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.2, \"linear\")\n .rotate(BoneName.PELVIS, 0.12, 0, 0)\n .rotate(BoneName.HIP_L, 0.25, 0, 0)\n .rotate(BoneName.KNEE_L, -1.15, 0, 0)\n .rotate(BoneName.HIP_R, -0.25, 0, 0)\n .rotate(BoneName.KNEE_R, -0.25, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.09, 0.04)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.LI_FIRE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.4, \"linear\")\n .rotate(BoneName.PELVIS, 0.18, -0.08, 0)\n .rotate(BoneName.HIP_R, -0.45, 0, 0)\n .rotate(BoneName.KNEE_R, -0.25, 0, 0)\n .rotate(BoneName.HIP_L, 0.65, 0, 0)\n .rotate(BoneName.KNEE_L, -0.95, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.06, 0.04)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.LI_FIRE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build();\n})();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☳ JIN (진) - THUNDER: Explosive, Sudden Movements\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Jin Walk - 진보법\n * Explosive step-and-ready walk, prepared to strike\n *\n * Uses JIN_THUNDER_GUARD_POSE arm positions with walk swing\n */\nexport const JIN_WALK_ANIMATION: SkeletalAnimation = (() => {\n const arms = getWalkArmSwing(TrigramStance.JIN, 0, 0);\n\n return (\n MartialArtsAnimationBuilder.create(\"walk_jin\", \"진보법\")\n .asMovement(0.5, false) // Single step, coiled energy\n // Start: Left foot forward\n .at(0.0, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.12, 0.06, 0)\n .rotate(BoneName.HIP_L, 0.4, 0, 0) // Left forward\n .rotate(BoneName.KNEE_L, -0.3, 0, 0)\n .rotate(BoneName.HIP_R, -0.3, 0, 0) // Right back\n .rotate(BoneName.KNEE_R, -0.2, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.08, 0, 0)\n .rotate(BoneName.SPINE_LOWER, 0.05, 0, 0)\n .position(BoneName.PELVIS, 0, -0.01, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.JIN_THUNDER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // Mid: Passing phase\n .at(0.25, \"ease-in\")\n .rotate(BoneName.PELVIS, 0.08, 0, 0)\n .rotate(BoneName.HIP_L, -0.15, 0, 0)\n .rotate(BoneName.KNEE_L, -0.2, 0, 0)\n .rotate(BoneName.HIP_R, 0.15, 0, 0)\n .rotate(BoneName.KNEE_R, -0.6, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.02, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.JIN_THUNDER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // End: Right foot forward\n .at(0.5, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.12, -0.06, 0)\n .rotate(BoneName.HIP_R, 0.4, 0, 0) // Right now forward\n .rotate(BoneName.KNEE_R, -0.3, 0, 0)\n .rotate(BoneName.HIP_L, -0.3, 0, 0) // Left now back\n .rotate(BoneName.KNEE_L, -0.2, 0, 0)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .position(BoneName.PELVIS, 0, -0.01, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.JIN_THUNDER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n/**\n * Jin Run - 진질주\n * Thunderous charge with explosive power\n *\n * Uses JIN_THUNDER_GUARD_POSE arm positions with run swing\n */\nexport const JIN_RUN_ANIMATION: SkeletalAnimation = (() => {\n // Trained fighters maintain guard pose - no arm swing\n const arms = getWalkArmSwing(TrigramStance.JIN, 0, 0);\n\n return MartialArtsAnimationBuilder.create(\"run_jin\", \"진질주\")\n .asMovement(0.42, true)\n .at(0.0, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.22, 0.1, 0)\n .rotate(BoneName.HIP_L, -0.55, 0, 0)\n .rotate(BoneName.KNEE_L, -0.3, 0, 0)\n .rotate(BoneName.HIP_R, 0.75, 0, 0)\n .rotate(BoneName.KNEE_R, -1.1, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.18, 0, 0)\n .rotate(BoneName.SPINE_LOWER, 0.1, 0, 0)\n .position(BoneName.PELVIS, 0, 0.04, 0.06)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.JIN_THUNDER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.21, \"linear\")\n .rotate(BoneName.PELVIS, 0.16, 0, 0)\n .rotate(BoneName.HIP_L, 0.3, 0, 0)\n .rotate(BoneName.KNEE_L, -1.25, 0, 0)\n .rotate(BoneName.HIP_R, -0.35, 0, 0)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.08, 0.06)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.JIN_THUNDER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.42, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.22, -0.1, 0)\n .rotate(BoneName.HIP_R, -0.55, 0, 0)\n .rotate(BoneName.KNEE_R, -0.3, 0, 0)\n .rotate(BoneName.HIP_L, 0.75, 0, 0)\n .rotate(BoneName.KNEE_L, -1.1, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.04, 0.06)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.JIN_THUNDER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build();\n})();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☴ SON (손) - WIND: Continuous, Flowing Movements\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Son Walk - 손보법\n * SINGLE STEP: Gentle flowing step like wind through trees\n *\n * Start: Left foot forward\n * End: Right foot forward (reversed laterality)\n */\nexport const SON_WALK_ANIMATION: SkeletalAnimation = (() => {\n const arms = getWalkArmSwing(TrigramStance.SON, 0, 0);\n\n return (\n MartialArtsAnimationBuilder.create(\"walk_son\", \"손보법\")\n .asMovement(0.55, false) // Single flowing step\n // Start: Left foot forward\n .at(0.0, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.06, 0.04, 0)\n .rotate(BoneName.HIP_L, 0.25, 0, 0) // Left forward\n .rotate(BoneName.KNEE_L, -0.15, 0, 0)\n .rotate(BoneName.HIP_R, -0.18, 0, 0) // Right back\n .rotate(BoneName.KNEE_R, -0.12, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.02, 0.03, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.SON_WIND.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // Mid: Passing phase\n .at(0.275, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.04, 0, 0)\n .rotate(BoneName.HIP_L, -0.08, 0, 0)\n .rotate(BoneName.KNEE_L, -0.1, 0, 0)\n .rotate(BoneName.HIP_R, 0.1, 0, 0)\n .rotate(BoneName.KNEE_R, -0.4, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.02, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.SON_WIND.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // End: Right foot forward\n .at(0.55, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.06, -0.04, 0)\n .rotate(BoneName.HIP_R, 0.25, 0, 0) // Right now forward\n .rotate(BoneName.KNEE_R, -0.15, 0, 0)\n .rotate(BoneName.HIP_L, -0.18, 0, 0) // Left now back\n .rotate(BoneName.KNEE_L, -0.12, 0, 0)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SPINE_UPPER, 0.02, -0.03, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.SON_WIND.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n/**\n * Son Run - 손질주\n * Swift, gliding run like wind rushing\n *\n * Uses SON_WIND_GUARD_POSE arm positions with run swing\n */\nexport const SON_RUN_ANIMATION: SkeletalAnimation = (() => {\n // Trained fighters maintain guard pose - no arm swing\n const arms = getWalkArmSwing(TrigramStance.SON, 0, 0);\n\n return MartialArtsAnimationBuilder.create(\"run_son\", \"손질주\")\n .asMovement(0.48, true)\n .at(0.0, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.14, 0.08, 0)\n .rotate(BoneName.HIP_L, -0.4, 0, 0)\n .rotate(BoneName.KNEE_L, -0.25, 0, 0)\n .rotate(BoneName.HIP_R, 0.6, 0, 0)\n .rotate(BoneName.KNEE_R, -0.85, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.08, 0.04, 0)\n .position(BoneName.PELVIS, 0, 0.04, 0.02)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.SON_WIND.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.24, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.1, 0, 0)\n .rotate(BoneName.HIP_L, 0.2, 0, 0)\n .rotate(BoneName.KNEE_L, -1.0, 0, 0)\n .rotate(BoneName.HIP_R, -0.2, 0, 0)\n .rotate(BoneName.KNEE_R, -0.2, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.07, 0.02)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.SON_WIND.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.48, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.14, -0.08, 0)\n .rotate(BoneName.HIP_R, -0.4, 0, 0)\n .rotate(BoneName.KNEE_R, -0.25, 0, 0)\n .rotate(BoneName.HIP_L, 0.6, 0, 0)\n .rotate(BoneName.KNEE_L, -0.85, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.08, -0.04, 0)\n .position(BoneName.PELVIS, 0, 0.04, 0.02)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.SON_WIND.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build();\n})();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☵ GAM (감) - WATER: Adaptive, Redirecting Movements\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gam Walk - 감보법\n * SINGLE STEP: Flowing adaptive step that flows around obstacles\n *\n * Start: Left foot forward\n * End: Right foot forward (reversed laterality)\n */\nexport const GAM_WALK_ANIMATION: SkeletalAnimation = (() => {\n const arms = getWalkArmSwing(TrigramStance.GAM, 0, 0);\n\n return (\n MartialArtsAnimationBuilder.create(\"walk_gam\", \"감보법\")\n .asMovement(0.55, false) // Single flowing step\n // Start: Left foot forward\n .at(0.0, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.05, 0.06, 0.02)\n .rotate(BoneName.HIP_L, 0.28, 0, -0.05) // Left forward\n .rotate(BoneName.KNEE_L, -0.18, 0, 0)\n .rotate(BoneName.HIP_R, -0.2, 0, 0.05) // Right back\n .rotate(BoneName.KNEE_R, -0.15, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0, 0.04, 0.02)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAM_WATER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // Mid: Passing phase\n .at(0.275, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.03, 0, 0)\n .rotate(BoneName.HIP_L, -0.1, 0, 0)\n .rotate(BoneName.KNEE_L, -0.12, 0, 0)\n .rotate(BoneName.HIP_R, 0.12, 0, 0)\n .rotate(BoneName.KNEE_R, -0.45, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .position(BoneName.PELVIS, 0, 0.02, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAM_WATER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // End: Right foot forward\n .at(0.55, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.05, -0.06, -0.02)\n .rotate(BoneName.HIP_R, 0.28, 0, 0.05) // Right now forward\n .rotate(BoneName.KNEE_R, -0.18, 0, 0)\n .rotate(BoneName.HIP_L, -0.2, 0, -0.05) // Left now back\n .rotate(BoneName.KNEE_L, -0.15, 0, 0)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SPINE_UPPER, 0, -0.04, -0.02)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAM_WATER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n/**\n * Gam Run - 감질주\n * Fluid run that flows like water around obstacles\n *\n * Uses GAM_WATER_GUARD_POSE arm positions with run swing\n */\nexport const GAM_RUN_ANIMATION: SkeletalAnimation = (() => {\n // Trained fighters maintain guard pose - no arm swing\n const arms = getWalkArmSwing(TrigramStance.GAM, 0, 0);\n\n return MartialArtsAnimationBuilder.create(\"run_gam\", \"감질주\")\n .asMovement(0.52, true)\n .at(0.0, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.12, 0.1, 0.03)\n .rotate(BoneName.HIP_L, -0.38, 0, 0)\n .rotate(BoneName.KNEE_L, -0.28, 0, 0)\n .rotate(BoneName.HIP_R, 0.58, 0, 0)\n .rotate(BoneName.KNEE_R, -0.82, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.06, 0.05, 0.02)\n .position(BoneName.PELVIS, 0.02, 0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAM_WATER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.26, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.08, 0, 0)\n .rotate(BoneName.HIP_L, 0.22, 0, 0)\n .rotate(BoneName.KNEE_L, -0.95, 0, 0)\n .rotate(BoneName.HIP_R, -0.18, 0, 0)\n .rotate(BoneName.KNEE_R, -0.22, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.06, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAM_WATER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.52, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.12, -0.1, -0.03)\n .rotate(BoneName.HIP_R, -0.38, 0, 0)\n .rotate(BoneName.KNEE_R, -0.28, 0, 0)\n .rotate(BoneName.HIP_L, 0.58, 0, 0)\n .rotate(BoneName.KNEE_L, -0.82, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.06, -0.05, -0.02)\n .position(BoneName.PELVIS, -0.02, 0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAM_WATER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build();\n})();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☶ GAN (간) - MOUNTAIN: Stable, Grounded Movements\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gan Walk - 간보법\n * SINGLE STEP: Solid immovable step with defensive posture\n *\n * Start: Left foot forward\n * End: Right foot forward (reversed laterality)\n */\nexport const GAN_WALK_ANIMATION: SkeletalAnimation = (() => {\n const arms = getWalkArmSwing(TrigramStance.GAN, 0, 0);\n\n return (\n MartialArtsAnimationBuilder.create(\"walk_gan\", \"간보법\")\n .asMovement(0.6, false) // Single grounded step\n // Start: Left foot forward\n .at(0.0, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.08, 0.04, 0)\n .rotate(BoneName.HIP_L, 0.3, 0, 0) // Left forward\n .rotate(BoneName.KNEE_L, -0.28, 0, 0)\n .rotate(BoneName.HIP_R, -0.22, 0, 0) // Right back\n .rotate(BoneName.KNEE_R, -0.25, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.04, 0, 0)\n .rotate(BoneName.SPINE_LOWER, 0.06, 0, 0)\n .position(BoneName.PELVIS, 0, -0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAN_MOUNTAIN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // Mid: Passing phase (deliberate)\n .at(0.3, \"linear\")\n .rotate(BoneName.PELVIS, 0.06, 0, 0)\n .rotate(BoneName.HIP_L, -0.05, 0, 0)\n .rotate(BoneName.KNEE_L, -0.2, 0, 0)\n .rotate(BoneName.HIP_R, 0.08, 0, 0)\n .rotate(BoneName.KNEE_R, -0.5, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, -0.01, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAN_MOUNTAIN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // End: Right foot forward\n .at(0.6, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.08, -0.04, 0)\n .rotate(BoneName.HIP_R, 0.3, 0, 0) // Right now forward\n .rotate(BoneName.KNEE_R, -0.28, 0, 0)\n .rotate(BoneName.HIP_L, -0.22, 0, 0) // Left now back\n .rotate(BoneName.KNEE_L, -0.25, 0, 0)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .position(BoneName.PELVIS, 0, -0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAN_MOUNTAIN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n/**\n * Gan Run - 간질주\n * Heavy, unstoppable charge like an avalanche\n *\n * Uses GAN_MOUNTAIN_GUARD_POSE arm positions with run swing\n */\nexport const GAN_RUN_ANIMATION: SkeletalAnimation = (() => {\n // Trained fighters maintain guard pose - no arm swing\n const arms = getWalkArmSwing(TrigramStance.GAN, 0, 0);\n\n return MartialArtsAnimationBuilder.create(\"run_gan\", \"간질주\")\n .asMovement(0.55, true)\n .at(0.0, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.18, 0.08, 0)\n .rotate(BoneName.HIP_L, -0.45, 0, 0)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0)\n .rotate(BoneName.HIP_R, 0.65, 0, 0)\n .rotate(BoneName.KNEE_R, -0.9, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.12, 0, 0)\n .rotate(BoneName.SPINE_LOWER, 0.1, 0, 0)\n .position(BoneName.PELVIS, 0, 0.02, 0.04)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAN_MOUNTAIN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.275, \"linear\")\n .rotate(BoneName.PELVIS, 0.14, 0, 0)\n .rotate(BoneName.HIP_L, 0.2, 0, 0)\n .rotate(BoneName.KNEE_L, -1.05, 0, 0)\n .rotate(BoneName.HIP_R, -0.25, 0, 0)\n .rotate(BoneName.KNEE_R, -0.3, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.05, 0.04)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAN_MOUNTAIN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.55, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.18, -0.08, 0)\n .rotate(BoneName.HIP_R, -0.45, 0, 0)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0)\n .rotate(BoneName.HIP_L, 0.65, 0, 0)\n .rotate(BoneName.KNEE_L, -0.9, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.02, 0.04)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAN_MOUNTAIN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build();\n})();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☷ GON (곤) - EARTH: Heavy, Rooted Movements\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gon Walk - 곤보법\n * SINGLE STEP: Heavy rooted step with low center of gravity\n *\n * Start: Left foot forward\n * End: Right foot forward (reversed laterality)\n */\nexport const GON_WALK_ANIMATION: SkeletalAnimation = (() => {\n const arms = getWalkArmSwing(TrigramStance.GON, 0, 0);\n\n return (\n MartialArtsAnimationBuilder.create(\"walk_gon\", \"곤보법\")\n .asMovement(0.65, false) // Single heavy step\n // Start: Left foot forward\n .at(0.0, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.1, 0.05, 0)\n .rotate(BoneName.HIP_L, 0.35, 0, -0.08) // Left forward\n .rotate(BoneName.KNEE_L, -0.38, 0, 0)\n .rotate(BoneName.HIP_R, -0.25, 0, 0.08) // Right back\n .rotate(BoneName.KNEE_R, -0.35, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.06, 0, 0)\n .rotate(BoneName.SPINE_LOWER, 0.1, 0, 0)\n .position(BoneName.PELVIS, 0, -0.06, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GON_EARTH.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // Mid: Passing phase (heavy)\n .at(0.325, \"linear\")\n .rotate(BoneName.PELVIS, 0.08, 0, 0)\n .rotate(BoneName.HIP_L, -0.08, 0, 0)\n .rotate(BoneName.KNEE_L, -0.28, 0, 0)\n .rotate(BoneName.HIP_R, 0.1, 0, 0)\n .rotate(BoneName.KNEE_R, -0.55, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, -0.04, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GON_EARTH.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // End: Right foot forward\n .at(0.65, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.1, -0.05, 0)\n .rotate(BoneName.HIP_R, 0.35, 0, 0.08) // Right now forward\n .rotate(BoneName.KNEE_R, -0.38, 0, 0)\n .rotate(BoneName.HIP_L, -0.25, 0, -0.08) // Left now back\n .rotate(BoneName.KNEE_L, -0.35, 0, 0)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .position(BoneName.PELVIS, 0, -0.06, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GON_EARTH.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n/**\n * Gon Run - 곤질주\n * Powerful, earthshaking run\n *\n * Trained fighters maintain guard pose throughout\n */\nexport const GON_RUN_ANIMATION: SkeletalAnimation = (() => {\n // Trained fighters maintain guard pose - no arm swing\n const arms = getWalkArmSwing(TrigramStance.GON, 0, 0);\n\n return MartialArtsAnimationBuilder.create(\"run_gon\", \"곤질주\")\n .asMovement(0.58, true)\n .at(0.0, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.2, 0.1, 0)\n .rotate(BoneName.HIP_L, -0.5, 0, 0)\n .rotate(BoneName.KNEE_L, -0.4, 0, 0)\n .rotate(BoneName.HIP_R, 0.7, 0, 0)\n .rotate(BoneName.KNEE_R, -0.95, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.14, 0, 0)\n .rotate(BoneName.SPINE_LOWER, 0.12, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0.05)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GON_EARTH.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.29, \"linear\")\n .rotate(BoneName.PELVIS, 0.16, 0, 0)\n .rotate(BoneName.HIP_L, 0.25, 0, 0)\n .rotate(BoneName.KNEE_L, -1.1, 0, 0)\n .rotate(BoneName.HIP_R, -0.3, 0, 0)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.04, 0.05)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GON_EARTH.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.58, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.2, -0.1, 0)\n .rotate(BoneName.HIP_R, -0.5, 0, 0)\n .rotate(BoneName.KNEE_R, -0.4, 0, 0)\n .rotate(BoneName.HIP_L, 0.7, 0, 0)\n .rotate(BoneName.KNEE_L, -0.95, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0, 0.05)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GON_EARTH.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build();\n})();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ANIMATION MAPS\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Map of all stance-specific walk animations\n * @korean 자세별걷기애니메이션맵\n */\nexport const STANCE_WALK_ANIMATIONS: ReadonlyMap<string, SkeletalAnimation> =\n new Map([\n [\"walk_geon\", GEON_WALK_ANIMATION],\n [\"walk_tae\", TAE_WALK_ANIMATION],\n [\"walk_li\", LI_WALK_ANIMATION],\n [\"walk_jin\", JIN_WALK_ANIMATION],\n [\"walk_son\", SON_WALK_ANIMATION],\n [\"walk_gam\", GAM_WALK_ANIMATION],\n [\"walk_gan\", GAN_WALK_ANIMATION],\n [\"walk_gon\", GON_WALK_ANIMATION],\n ]);\n\n/**\n * Map of all stance-specific run animations\n * @korean 자세별달리기애니메이션맵\n */\nexport const STANCE_RUN_ANIMATIONS: ReadonlyMap<string, SkeletalAnimation> =\n new Map([\n [\"run_geon\", GEON_RUN_ANIMATION],\n [\"run_tae\", TAE_RUN_ANIMATION],\n [\"run_li\", LI_RUN_ANIMATION],\n [\"run_jin\", JIN_RUN_ANIMATION],\n [\"run_son\", SON_RUN_ANIMATION],\n [\"run_gam\", GAM_RUN_ANIMATION],\n [\"run_gan\", GAN_RUN_ANIMATION],\n [\"run_gon\", GON_RUN_ANIMATION],\n ]);\n\n/**\n * Combined map of all stance locomotion animations\n * @korean 자세별이동애니메이션통합맵\n */\nexport const STANCE_LOCOMOTION_ANIMATIONS: ReadonlyMap<\n string,\n SkeletalAnimation\n> = new Map([...STANCE_WALK_ANIMATIONS, ...STANCE_RUN_ANIMATIONS]);\n\n/**\n * Get stance-specific walk animation\n * @param stance - Trigram stance name (geon, tae, li, etc.)\n * @returns Walk animation for that stance\n */\nexport function getStanceWalkAnimation(\n stance: string,\n): SkeletalAnimation | undefined {\n return STANCE_WALK_ANIMATIONS.get(`walk_${stance}`);\n}\n\n/**\n * Get stance-specific run animation\n * @param stance - Trigram stance name (geon, tae, li, etc.)\n * @returns Run animation for that stance\n */\nexport function getStanceRunAnimation(\n stance: string,\n): SkeletalAnimation | undefined {\n return STANCE_RUN_ANIMATIONS.get(`run_${stance}`);\n}\n"],"mappings":"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"}
|