blacktrigram 0.7.47 → 0.7.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/App2.js.map +1 -1
- package/lib/audio/AudioAssetLoader.js.map +1 -1
- package/lib/audio/AudioAssetRegistry.js.map +1 -1
- package/lib/audio/AudioCache.js.map +1 -1
- package/lib/audio/AudioManager.js.map +1 -1
- package/lib/audio/AudioMonitor.js.map +1 -1
- package/lib/audio/AudioPool.js.map +1 -1
- package/lib/audio/AudioProvider.js.map +1 -1
- package/lib/audio/AudioUtils.js.map +1 -1
- package/lib/audio/BoneImpactAudioMap.js.map +1 -1
- package/lib/audio/VariantSelector.js.map +1 -1
- package/lib/audio/types.js.map +1 -1
- package/lib/components/screens/combat/CombatScreen3D.d.ts.map +1 -1
- package/lib/components/screens/combat/CombatScreen3D.js +29 -25
- package/lib/components/screens/combat/CombatScreen3D.js.map +1 -1
- package/lib/components/screens/combat/components/controls/CombatButtons.js.map +1 -1
- package/lib/components/screens/combat/components/controls/CombatControlsPanel.js.map +1 -1
- package/lib/components/screens/combat/components/controls/ControlsGuide.js.map +1 -1
- package/lib/components/screens/combat/components/controls/KeyboardHints.js.map +1 -1
- package/lib/components/screens/combat/components/controls/PauseMenu.js.map +1 -1
- package/lib/components/screens/combat/components/controls/PauseMenuButton.js.map +1 -1
- package/lib/components/screens/combat/components/controls/QuickSettings.js.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodDecals3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodLossOverlayHtml.js.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodParticles3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodViscosity3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/CombatParticleEffects3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/ConsciousnessBlur.js.map +1 -1
- package/lib/components/screens/combat/components/effects/InternalDamage3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/PainVignette.js.map +1 -1
- package/lib/components/screens/combat/components/effects/ParticleAudio3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/TraumaOverlay3D.js.map +1 -1
- package/lib/components/screens/combat/components/feedback/MatchCountdown.js.map +1 -1
- package/lib/components/screens/combat/components/feedback/RoundAnnouncementOverlayHtml.js.map +1 -1
- package/lib/components/screens/combat/components/feedback/RoundDisplayStatus.js.map +1 -1
- package/lib/components/screens/combat/components/feedback/RoundStartAnnouncementOverlayHtml.js.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatBottomHUD.d.ts.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatBottomHUD.js +2 -2
- package/lib/components/screens/combat/components/hud/CombatBottomHUD.js.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatLeftHUD.js.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatPortraitStatusStrip.js +1 -1
- package/lib/components/screens/combat/components/hud/CombatPortraitStatusStrip.js.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatRightHUD.js.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatTopHUD.d.ts.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatTopHUD.js +2 -1
- package/lib/components/screens/combat/components/hud/CombatTopHUD.js.map +1 -1
- package/lib/components/screens/combat/components/hud/DifficultyIndicator.js.map +1 -1
- package/lib/components/screens/combat/components/hud/FPSMonitor.js.map +1 -1
- package/lib/components/screens/combat/components/hud/MobileControlsWrapper.js.map +1 -1
- package/lib/components/screens/combat/components/hud/PlayerStateOverlayHtml.js.map +1 -1
- package/lib/components/screens/combat/components/indicators/BalanceIndicator.js.map +1 -1
- package/lib/components/screens/combat/components/indicators/InputBufferDisplay.js.map +1 -1
- package/lib/components/screens/combat/components/indicators/StaminaWarning.js.map +1 -1
- package/lib/components/screens/combat/components/indicators/TechniqueNameDisplay.js.map +1 -1
- package/lib/components/screens/combat/helpers/AnimationUpdater.d.ts.map +1 -1
- package/lib/components/screens/combat/helpers/AnimationUpdater.js +4 -2
- package/lib/components/screens/combat/helpers/AnimationUpdater.js.map +1 -1
- package/lib/components/screens/combat/helpers/combatHelpers.js.map +1 -1
- package/lib/components/screens/combat/hooks/useAICombat.js.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatActions.js.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatAttackMovement.js.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatAudio.js.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatLayout.d.ts.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatLayout.js +11 -5
- package/lib/components/screens/combat/hooks/useCombatLayout.js.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatState.js.map +1 -1
- package/lib/components/screens/controls/ControlsScreen3D.js +1 -1
- package/lib/components/screens/controls/ControlsScreen3D.js.map +1 -1
- package/lib/components/screens/controls/components/ControlBindingsOverlayHtml.js.map +1 -1
- package/lib/components/screens/controls/components/ControlCategoryTabsOverlayHtml.js.map +1 -1
- package/lib/components/screens/controls/components/GamepadVisualization3D.js.map +1 -1
- package/lib/components/screens/controls/components/InteractiveControlDemoOverlayHtml.js.map +1 -1
- package/lib/components/screens/controls/components/Key3D.js.map +1 -1
- package/lib/components/screens/controls/components/VisualKeyboard3D.js.map +1 -1
- package/lib/components/screens/controls/constants/ControlsConstants.js.map +1 -1
- package/lib/components/screens/controls/hooks/useControlsState.js.map +1 -1
- package/lib/components/screens/endscreen/EndScreen3D.js.map +1 -1
- package/lib/components/screens/endscreen/components/DefeatAnimation3D.js.map +1 -1
- package/lib/components/screens/endscreen/components/MatchStatisticsDisplayOverlayHtml.js.map +1 -1
- package/lib/components/screens/endscreen/components/NavigationButtonsOverlayHtml.js.map +1 -1
- package/lib/components/screens/endscreen/components/PerformanceBreakdownOverlayHtml.js.map +1 -1
- package/lib/components/screens/endscreen/components/PerformanceRatingOverlayHtml.js.map +1 -1
- package/lib/components/screens/endscreen/components/VictoryAnimation3D.js.map +1 -1
- package/lib/components/screens/endscreen/components/WinnerDisplayOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/IntroScreen3D.js +1 -1
- package/lib/components/screens/intro/IntroScreen3D.js.map +1 -1
- package/lib/components/screens/intro/components/AbilityListOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/ArchetypeCardGridOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/ArchetypeCardOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/ArchetypeDisplayOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/EnhancedArchetypeDisplayOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/MenuButtonsOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/MenuSectionOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/StatBarOverlayHtml.js.map +1 -1
- package/lib/components/screens/philosophy/PhilosophyScreen3D.js +1 -1
- package/lib/components/screens/philosophy/PhilosophyScreen3D.js.map +1 -1
- package/lib/components/screens/training/TrainingScreen3D.d.ts.map +1 -1
- package/lib/components/screens/training/TrainingScreen3D.js +3 -11
- package/lib/components/screens/training/TrainingScreen3D.js.map +1 -1
- package/lib/components/screens/training/components/AnatomyControlsOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/AnatomyOverlay3D.js.map +1 -1
- package/lib/components/screens/training/components/FootPlacementMarkers3D.js.map +1 -1
- package/lib/components/screens/training/components/FootworkDrillsOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/HitFeedbackEffect3D.js.map +1 -1
- package/lib/components/screens/training/components/TrainingButtonsOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/TrainingControlsOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/TrainingDummy3D.js.map +1 -1
- package/lib/components/screens/training/components/TrainingFeedbackOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/TrainingModeSelectorOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/TrainingStatsOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/VitalPointMarker3D.js.map +1 -1
- package/lib/components/screens/training/components/VitalPointTrainingOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/hud/TrainingBottomHUD.d.ts.map +1 -1
- package/lib/components/screens/training/components/hud/TrainingBottomHUD.js +2 -2
- package/lib/components/screens/training/components/hud/TrainingBottomHUD.js.map +1 -1
- package/lib/components/screens/training/components/hud/TrainingLeftHUD.js.map +1 -1
- package/lib/components/screens/training/components/hud/TrainingRightHUD.js.map +1 -1
- package/lib/components/screens/training/components/hud/TrainingTopHUD.js.map +1 -1
- package/lib/components/screens/training/hooks/useAttackMovement.js.map +1 -1
- package/lib/components/screens/training/hooks/useTrainingActions.d.ts +1 -0
- package/lib/components/screens/training/hooks/useTrainingActions.d.ts.map +1 -1
- package/lib/components/screens/training/hooks/useTrainingActions.js +6 -4
- package/lib/components/screens/training/hooks/useTrainingActions.js.map +1 -1
- package/lib/components/screens/training/hooks/useTrainingLayout.d.ts.map +1 -1
- package/lib/components/screens/training/hooks/useTrainingLayout.js +11 -5
- package/lib/components/screens/training/hooks/useTrainingLayout.js.map +1 -1
- package/lib/components/screens/training/hooks/useTrainingState.js.map +1 -1
- package/lib/components/shared/base/BaseButton.js.map +1 -1
- package/lib/components/shared/base/BaseButtonOverlayHtml.js.map +1 -1
- package/lib/components/shared/base/BasePanel.js.map +1 -1
- package/lib/components/shared/base/BaseText.js.map +1 -1
- package/lib/components/shared/base/useKoreanTheme.js.map +1 -1
- package/lib/components/shared/debug/PerformanceDebugOverlayHtml.js.map +1 -1
- package/lib/components/shared/mobile/ActionButtons.js.map +1 -1
- package/lib/components/shared/mobile/GestureRecognizerPure.js.map +1 -1
- package/lib/components/shared/mobile/HapticController.js.map +1 -1
- package/lib/components/shared/mobile/MobileControlsPure.js.map +1 -1
- package/lib/components/shared/mobile/StanceWheelPure.js.map +1 -1
- package/lib/components/shared/mobile/TouchOptimizer.js.map +1 -1
- package/lib/components/shared/mobile/VirtualDPad.js.map +1 -1
- package/lib/components/shared/three/anatomy/BodySurface.js.map +1 -1
- package/lib/components/shared/three/anatomy/BoneAttachedMuscles.js.map +1 -1
- package/lib/components/shared/three/anatomy/BoneClothing.js.map +1 -1
- package/lib/components/shared/three/anatomy/BoneRenderer.js.map +1 -1
- package/lib/components/shared/three/anatomy/Face3D.js.map +1 -1
- package/lib/components/shared/three/anatomy/Foot3D.js.map +1 -1
- package/lib/components/shared/three/anatomy/Hand3D.js.map +1 -1
- package/lib/components/shared/three/effects/ActionFeedback.js.map +1 -1
- package/lib/components/shared/three/effects/DamageNumbers.js.map +1 -1
- package/lib/components/shared/three/effects/HitEffects3D.js.map +1 -1
- package/lib/components/shared/three/effects/PlayerStateIndicators.js.map +1 -1
- package/lib/components/shared/three/effects/StanceSymbol3D.js.map +1 -1
- package/lib/components/shared/three/effects/StanceTransitionEffect.js.map +1 -1
- package/lib/components/shared/three/effects/VitalPointMarkers3D.js.map +1 -1
- package/lib/components/shared/three/indicators/ElementalColorSystem.js.map +1 -1
- package/lib/components/shared/three/indicators/GuardIndicator.js.map +1 -1
- package/lib/components/shared/three/indicators/HapticFeedback.js.map +1 -1
- package/lib/components/shared/three/indicators/StanceChangeIndicator.js.map +1 -1
- package/lib/components/shared/three/models/Player3DWithTransitions.js.map +1 -1
- package/lib/components/shared/three/models/SkeletalPlayer3D.d.ts.map +1 -1
- package/lib/components/shared/three/models/SkeletalPlayer3D.js +7 -5
- package/lib/components/shared/three/models/SkeletalPlayer3D.js.map +1 -1
- package/lib/components/shared/three/optimization/AdaptiveQuality.js.map +1 -1
- package/lib/components/shared/three/scene/AtmosphericParticles3D.js.map +1 -1
- package/lib/components/shared/three/scene/BackgroundScene3D.js.map +1 -1
- package/lib/components/shared/three/scene/CombatArena3D.js.map +1 -1
- package/lib/components/shared/three/scene/KoreanSignage3D.js.map +1 -1
- package/lib/components/shared/three/ui/ArchetypeCard.js.map +1 -1
- package/lib/components/shared/three/ui/BodyPartHealthDisplay.js.map +1 -1
- package/lib/components/shared/three/ui/BreathingIndicator2.js.map +1 -1
- package/lib/components/shared/three/ui/CombatReadinessBar.js.map +1 -1
- package/lib/components/shared/three/ui/ComboCounter.js.map +1 -1
- package/lib/components/shared/three/ui/HealthBar.js.map +1 -1
- package/lib/components/shared/three/ui/KoreanButton.js.map +1 -1
- package/lib/components/shared/three/ui/KoreanPanel.js.map +1 -1
- package/lib/components/shared/three/ui/KoreanText.js.map +1 -1
- package/lib/components/shared/three/ui/MenuList.js.map +1 -1
- package/lib/components/shared/three/ui/PlayerHUD.js.map +1 -1
- package/lib/components/shared/three/ui/ProgressBar.js.map +1 -1
- package/lib/components/shared/three/ui/SpeedIndicatorHUD.js.map +1 -1
- package/lib/components/shared/three/ui/StaminaBar.js.map +1 -1
- package/lib/components/shared/three/ui/TechniqueBar.js.map +1 -1
- package/lib/components/shared/three/ui/TechniqueCard.js.map +1 -1
- package/lib/components/shared/three/ui/VitalPointOverlayControlsHtml.js.map +1 -1
- package/lib/components/shared/ui/BackButton.js.map +1 -1
- package/lib/components/shared/ui/BaseHUDContainer.js.map +1 -1
- package/lib/components/shared/ui/CombatTimer.js.map +1 -1
- package/lib/components/shared/ui/ErrorModal.js.map +1 -1
- package/lib/components/shared/ui/LoadingState.js.map +1 -1
- package/lib/components/shared/ui/SplashScreen.js +2 -2
- package/lib/components/shared/ui/SplashScreen.js.map +1 -1
- package/lib/components/shared/ui/VitalPointOverlayControlsPure.js.map +1 -1
- package/lib/components/shared/ui/VolumeControl.js.map +1 -1
- package/lib/components/shared/ui/shared/ConfirmDialog.js.map +1 -1
- package/lib/components/ui/combat/BalanceIndicatorOverlayHtml.js.map +1 -1
- package/lib/constants/bodyDimensions.js.map +1 -1
- package/lib/constants/bodyRenderingConstants.js.map +1 -1
- package/lib/data/archetypeClothing.js.map +1 -1
- package/lib/data/archetypePhysicalAttributes.js.map +1 -1
- package/lib/data/techniqueMappings.js.map +1 -1
- package/lib/data/techniques.js.map +1 -1
- package/lib/hooks/useActionFeedback.js.map +1 -1
- package/lib/hooks/useBalanceAnimations.js.map +1 -1
- package/lib/hooks/useCombatTimer.js.map +1 -1
- package/lib/hooks/useDebounce.js.map +1 -1
- package/lib/hooks/useHUDLayout.d.ts.map +1 -1
- package/lib/hooks/useHUDLayout.js +3 -2
- package/lib/hooks/useHUDLayout.js.map +1 -1
- package/lib/hooks/useHandPoseTransitions.js.map +1 -1
- package/lib/hooks/useKeyboardControls.js.map +1 -1
- package/lib/hooks/useMatchCountdown.js.map +1 -1
- package/lib/hooks/useMuscleActivation.js.map +1 -1
- package/lib/hooks/usePauseMenu.js.map +1 -1
- package/lib/hooks/usePlayerAnimation.js.map +1 -1
- package/lib/hooks/useResponsiveLayout.js.map +1 -1
- package/lib/hooks/useRoundTransition.js.map +1 -1
- package/lib/hooks/useSkeletalAnimation.d.ts.map +1 -1
- package/lib/hooks/useSkeletalAnimation.js +1 -1
- package/lib/hooks/useSkeletalAnimation.js.map +1 -1
- package/lib/hooks/useTechniqueSelection.js.map +1 -1
- package/lib/hooks/useThrottle.js.map +1 -1
- package/lib/hooks/useTouchControls.js.map +1 -1
- package/lib/hooks/useWebGLContextLossHandler.js.map +1 -1
- package/lib/hooks/useWindowSize.js.map +1 -1
- package/lib/systems/CombatSystem.js.map +1 -1
- package/lib/systems/EffectCalculator.js.map +1 -1
- package/lib/systems/LayoutSystem.js.map +1 -1
- package/lib/systems/PlayerEffectManager.js.map +1 -1
- package/lib/systems/ResponsiveScaling.js.map +1 -1
- package/lib/systems/TrigramSystem.js.map +1 -1
- package/lib/systems/VitalPointSystem.js.map +1 -1
- package/lib/systems/ai/AIPersonality.js.map +1 -1
- package/lib/systems/ai/AdaptiveDifficulty.js +16 -16
- package/lib/systems/ai/AdaptiveDifficulty.js.map +1 -1
- package/lib/systems/ai/ArchetypeEnforcer.js.map +1 -1
- package/lib/systems/ai/ComboSystem.js.map +1 -1
- package/lib/systems/ai/DecisionTree.js.map +1 -1
- package/lib/systems/ai/TrainingAI.js.map +1 -1
- package/lib/systems/ai/types.js.map +1 -1
- package/lib/systems/animation/builders/AnimationBuilder.js.map +1 -1
- package/lib/systems/animation/builders/HandPoseApplicator.js.map +1 -1
- package/lib/systems/animation/builders/HandPoses.js.map +1 -1
- package/lib/systems/animation/builders/KeyframeConfig.js.map +1 -1
- package/lib/systems/animation/builders/KeyframeInterpolation.js.map +1 -1
- package/lib/systems/animation/builders/KickPhaseApplicator.d.ts +6 -0
- package/lib/systems/animation/builders/KickPhaseApplicator.d.ts.map +1 -1
- package/lib/systems/animation/builders/KickPhaseApplicator.js +16 -9
- package/lib/systems/animation/builders/KickPhaseApplicator.js.map +1 -1
- package/lib/systems/animation/builders/KoreanGuardPositions.d.ts +4 -4
- package/lib/systems/animation/builders/KoreanGuardPositions.js.map +1 -1
- package/lib/systems/animation/builders/MartialArtsAnimationBuilder.d.ts +1 -1
- package/lib/systems/animation/builders/MartialArtsAnimationBuilder.d.ts.map +1 -1
- package/lib/systems/animation/builders/MartialArtsAnimationBuilder.js +5 -5
- package/lib/systems/animation/builders/MartialArtsAnimationBuilder.js.map +1 -1
- package/lib/systems/animation/builders/MartialArtsConstants.d.ts +112 -71
- package/lib/systems/animation/builders/MartialArtsConstants.d.ts.map +1 -1
- package/lib/systems/animation/builders/MartialArtsConstants.js +113 -72
- package/lib/systems/animation/builders/MartialArtsConstants.js.map +1 -1
- package/lib/systems/animation/builders/MartialPoseApplicator.js.map +1 -1
- package/lib/systems/animation/builders/PunchPhaseApplicator.js.map +1 -1
- package/lib/systems/animation/builders/SkeletonRig.js.map +1 -1
- package/lib/systems/animation/builders/TrigramGuardApplicator.js.map +1 -1
- package/lib/systems/animation/catalogs/AttackAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/BasicAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/ComboAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/DarkOpsAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/DefensiveAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/ElbowKneeAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/EnhancedAttackAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/EnhancedElbowKneeAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/FootworkSkeletalAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/GamRedirectionAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/GamStanceAnimations.js +21 -0
- package/lib/systems/animation/catalogs/GamStanceAnimations.js.map +1 -0
- package/lib/systems/animation/catalogs/GamTechniqueAnimations.js +34 -2
- package/lib/systems/animation/catalogs/GamTechniqueAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/GanStanceAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/GanTechniqueAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/GeonStanceAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/GonTechniqueAnimations.d.ts +9 -0
- package/lib/systems/animation/catalogs/GonTechniqueAnimations.d.ts.map +1 -1
- package/lib/systems/animation/catalogs/GonTechniqueAnimations.js +288 -0
- package/lib/systems/animation/catalogs/GonTechniqueAnimations.js.map +1 -0
- package/lib/systems/animation/catalogs/GrapplingAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/JinStanceAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/JinTechniqueAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/KickAnimations.d.ts +2 -2
- package/lib/systems/animation/catalogs/KickAnimations.js +2 -2
- package/lib/systems/animation/catalogs/KickAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/LiStanceAnimations.js +14 -1
- package/lib/systems/animation/catalogs/LiStanceAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/LiTechniqueAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/MovementAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/PunchAnimations.d.ts +1 -1
- package/lib/systems/animation/catalogs/PunchAnimations.js +1 -1
- package/lib/systems/animation/catalogs/PunchAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/RecoveryAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/SonStanceAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/SonTechniqueAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/SpecializedPunchAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/StanceAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/StanceAttackAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/StanceGuardPoses.d.ts +6 -6
- package/lib/systems/animation/catalogs/StanceGuardPoses.js +36 -36
- package/lib/systems/animation/catalogs/StanceGuardPoses.js.map +1 -1
- package/lib/systems/animation/catalogs/StanceIdleAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/StanceLocomotionAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/StepSkeletalAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/TaeJointLockAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/TaeStanceAnimations.js.map +1 -1
- package/lib/systems/animation/constants/AnatomicalLimits.js.map +1 -1
- package/lib/systems/animation/core/AnimationHitTiming.js.map +1 -1
- package/lib/systems/animation/core/AnimationOptimizations.js.map +1 -1
- package/lib/systems/animation/core/AnimationPriority.js +15 -15
- package/lib/systems/animation/core/AnimationPriority.js.map +1 -1
- package/lib/systems/animation/core/AnimationRegistry.d.ts +30 -0
- package/lib/systems/animation/core/AnimationRegistry.d.ts.map +1 -1
- package/lib/systems/animation/core/AnimationRegistry.js +74 -12
- package/lib/systems/animation/core/AnimationRegistry.js.map +1 -1
- package/lib/systems/animation/core/AnimationStateMachine.js +16 -16
- package/lib/systems/animation/core/AnimationStateMachine.js.map +1 -1
- package/lib/systems/animation/core/AnimationTransitions.d.ts.map +1 -1
- package/lib/systems/animation/core/AnimationTransitions.js +34 -0
- package/lib/systems/animation/core/AnimationTransitions.js.map +1 -1
- package/lib/systems/animation/core/LateralityTransform.js.map +1 -1
- package/lib/systems/animation/core/RecoveryPhaseEnhancer.js.map +1 -1
- package/lib/systems/animation/core/TechniqueAnimationMapper.js.map +1 -1
- package/lib/systems/animation/core/TechniqueAnimationMapping.js.map +1 -1
- package/lib/systems/animation/core/index.d.ts +1 -1
- package/lib/systems/animation/core/index.d.ts.map +1 -1
- package/lib/systems/animation/core/types.d.ts +24 -0
- package/lib/systems/animation/core/types.d.ts.map +1 -1
- package/lib/systems/animation/core/types.js +27 -11
- package/lib/systems/animation/core/types.js.map +1 -1
- package/lib/systems/animation/systems/AdvancedJointMovements.js.map +1 -1
- package/lib/systems/animation/systems/BodyFacingSystem.js.map +1 -1
- package/lib/systems/animation/systems/FacialExpressions.js.map +1 -1
- package/lib/systems/animation/systems/FallAnimations.js.map +1 -1
- package/lib/systems/animation/systems/MuscleActivation.js.map +1 -1
- package/lib/systems/bodypart/BodyPartDamageIntegration.js.map +1 -1
- package/lib/systems/bodypart/BodyPartHealthSystem.js.map +1 -1
- package/lib/systems/bodypart/BodyPartPositionMapping.js.map +1 -1
- package/lib/systems/bodypart/CombatInjuryIntegration.js.map +1 -1
- package/lib/systems/bodypart/InjuryIntegration.js.map +1 -1
- package/lib/systems/bodypart/InjuryTracker.js.map +1 -1
- package/lib/systems/bodypart/MovementPenaltySystem.js.map +1 -1
- package/lib/systems/bodypart/PlayerInjuryTrackingManager.js.map +1 -1
- package/lib/systems/bodypart/types.js.map +1 -1
- package/lib/systems/breathing/BreathingDisruptionSystem.js +19 -19
- package/lib/systems/breathing/BreathingDisruptionSystem.js.map +1 -1
- package/lib/systems/breathing/feedback.js.map +1 -1
- package/lib/systems/breathing/integration.js.map +1 -1
- package/lib/systems/combat/BalanceSystem.js +19 -19
- package/lib/systems/combat/BalanceSystem.js.map +1 -1
- package/lib/systems/combat/BreakingStatusEffects.js.map +1 -1
- package/lib/systems/combat/CombatStateSystem.js +17 -17
- package/lib/systems/combat/CombatStateSystem.js.map +1 -1
- package/lib/systems/combat/ConsciousnessSystem.js +24 -24
- package/lib/systems/combat/ConsciousnessSystem.js.map +1 -1
- package/lib/systems/combat/FallIntegration.js.map +1 -1
- package/lib/systems/combat/GrappleSystem.js.map +1 -1
- package/lib/systems/combat/LimbExposureSystem.js.map +1 -1
- package/lib/systems/combat/PainResponseSystem.js +21 -21
- package/lib/systems/combat/PainResponseSystem.js.map +1 -1
- package/lib/systems/combat/TrainingCombatSystem.js.map +1 -1
- package/lib/systems/combat/painConsciousnessUtils.js.map +1 -1
- package/lib/systems/combat/typeGuards.js.map +1 -1
- package/lib/systems/effects.js.map +1 -1
- package/lib/systems/game.js.map +1 -1
- package/lib/systems/movement/InjuryMovementModifier.js.map +1 -1
- package/lib/systems/movement/helpers/AccelerationUpdater.js.map +1 -1
- package/lib/systems/movement/helpers/accelerationUtils.js.map +1 -1
- package/lib/systems/movement/integration.js.map +1 -1
- package/lib/systems/physics/AttackMovementPhysics.js.map +1 -1
- package/lib/systems/physics/CollisionDetection.js.map +1 -1
- package/lib/systems/physics/CoordinateMapper.js.map +1 -1
- package/lib/systems/physics/KnockbackPhysics.js.map +1 -1
- package/lib/systems/physics/MovementPhysics.js.map +1 -1
- package/lib/systems/physics/PhysicalReachCalculator.js.map +1 -1
- package/lib/systems/physics/SpeedModifierSystem.js +6 -6
- package/lib/systems/physics/SpeedModifierSystem.js.map +1 -1
- package/lib/systems/trigram/KoreanCulture.js.map +1 -1
- package/lib/systems/trigram/KoreanTechniques.js.map +1 -1
- package/lib/systems/trigram/StanceManager.js.map +1 -1
- package/lib/systems/trigram/TransitionCalculator.js.map +1 -1
- package/lib/systems/trigram/TrigramCalculator.js.map +1 -1
- package/lib/systems/trigram/techniques/DarkOpsTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/GamTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/GanTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/GeonTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/GonTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/JinTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/LiTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/SonTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/TaeTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/TechniqueConfig.js.map +1 -1
- package/lib/systems/trigram/techniques/index.js.map +1 -1
- package/lib/systems/trigram/types/GonTechniqueExtensions.js.map +1 -1
- package/lib/systems/trigram/types.js.map +1 -1
- package/lib/systems/types.js.map +1 -1
- package/lib/systems/vitalpoint/DamageCalculator.js.map +1 -1
- package/lib/systems/vitalpoint/HitDetection.js.map +1 -1
- package/lib/systems/vitalpoint/KoreanAnatomy.js.map +1 -1
- package/lib/systems/vitalpoint/KoreanVitalPoints.js.map +1 -1
- package/lib/systems/vitalpoint/MeridianVitalPointMapping.js.map +1 -1
- package/lib/systems/vitalpoint/VitalPointsData.js.map +1 -1
- package/lib/types/AccessibilityTypes.js.map +1 -1
- package/lib/types/LayoutTypes.js.map +1 -1
- package/lib/types/PhysicsTypes.js.map +1 -1
- package/lib/types/common.js.map +1 -1
- package/lib/types/constants/animations.js.map +1 -1
- package/lib/types/constants/colors.js.map +1 -1
- package/lib/types/constants/designSystem.js.map +1 -1
- package/lib/types/constants/index.js.map +1 -1
- package/lib/types/constants/layout.d.ts +21 -0
- package/lib/types/constants/layout.d.ts.map +1 -1
- package/lib/types/constants/layout.js +22 -1
- package/lib/types/constants/layout.js.map +1 -1
- package/lib/types/constants/performance.js.map +1 -1
- package/lib/types/constants/typography.js.map +1 -1
- package/lib/types/constants/ui.js.map +1 -1
- package/lib/types/facial.js +19 -19
- package/lib/types/facial.js.map +1 -1
- package/lib/types/hand-animation.js.map +1 -1
- package/lib/types/injury.js.map +1 -1
- package/lib/types/muscle.js.map +1 -1
- package/lib/types/physics.js.map +1 -1
- package/lib/types/physicsConstants.js.map +1 -1
- package/lib/types/player-visual.d.ts +1 -1
- package/lib/types/player-visual.d.ts.map +1 -1
- package/lib/types/skeletal.js.map +1 -1
- package/lib/types/techniqueId.js.map +1 -1
- package/lib/utils/accessibility.js.map +1 -1
- package/lib/utils/arenaWorldDimensions.js.map +1 -1
- package/lib/utils/assetConfig.js.map +1 -1
- package/lib/utils/characterScaling.js.map +1 -1
- package/lib/utils/colorHelpers.js.map +1 -1
- package/lib/utils/colorUtils.js.map +1 -1
- package/lib/utils/combatReadiness.js.map +1 -1
- package/lib/utils/controlMapping.js.map +1 -1
- package/lib/utils/deviceDetection.js +6 -7
- package/lib/utils/deviceDetection.js.map +1 -1
- package/lib/utils/effectUtils.js.map +1 -1
- package/lib/utils/fabricTextures.js.map +1 -1
- package/lib/utils/hapticFeedback.js.map +1 -1
- package/lib/utils/haptics.js.map +1 -1
- package/lib/utils/htmlOverlayHelpers.js.map +1 -1
- package/lib/utils/inputSystem.js.map +1 -1
- package/lib/utils/koreanThemeHelpers.js.map +1 -1
- package/lib/utils/math.js.map +1 -1
- package/lib/utils/mobileLayoutHelpers.js.map +1 -1
- package/lib/utils/mobileUIUtils.js.map +1 -1
- package/lib/utils/performance/PerformanceMonitor.js.map +1 -1
- package/lib/utils/performance/PerformanceOverlay3D.js.map +1 -1
- package/lib/utils/performance/usePerformanceMonitor.js.map +1 -1
- package/lib/utils/performanceOptimization.js.map +1 -1
- package/lib/utils/player3DHelpers.js.map +1 -1
- package/lib/utils/playerUtils.js.map +1 -1
- package/lib/utils/responsiveLayout.js.map +1 -1
- package/lib/utils/responsiveLayoutHelpers.d.ts +7 -0
- package/lib/utils/responsiveLayoutHelpers.d.ts.map +1 -1
- package/lib/utils/responsiveLayoutHelpers.js +16 -2
- package/lib/utils/responsiveLayoutHelpers.js.map +1 -1
- package/lib/utils/responsiveOrientationConstants.js.map +1 -1
- package/lib/utils/safeAreaUtils.js.map +1 -1
- package/lib/utils/sharedPhysicsConfig.js.map +1 -1
- package/lib/utils/skeletonScaling.js.map +1 -1
- package/lib/utils/stanceHelpers.js.map +1 -1
- package/lib/utils/threeObjectPool.js.map +1 -1
- package/lib/utils/visualEffects.js.map +1 -1
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PunchAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/PunchAnimations.ts"],"sourcesContent":["/**\n * Punch Animations Module\n *\n * All punch and hand strike animations (주먹 공격) for Korean martial arts.\n * Uses MartialArtsAnimationBuilder for readable, martial arts expert-friendly code.\n *\n * Updated to include proper Korean martial arts biomechanics:\n * - Hip rotation (엉덩이회전) for power generation\n * - Shoulder torque (어깨비틀기) coordination\n * - Fist rotation (주먹회전) from vertical to pronated\n * - Hikite (당기기) - opposite arm pulling for power\n * - Full arm extension (팔완전펴기) at impact\n *\n * 한국 무술 주먹 공격 애니메이션 모듈\n *\n * @module systems/animation/PunchAnimations\n * @korean 주먹애니메이션\n */\n\nimport type { SkeletalAnimation } from \"@/types/skeletal\";\nimport {\n MartialArtsAnimationBuilder,\n TECHNIQUE_TIMING,\n} from \"../builders/MartialArtsAnimationBuilder\";\n\n// ═══════════════════════════════════════════════════════════════════════════\n// JAB (잽) - Quick Straight Punch\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Jab - 잽 (빠른 직권 - Ppareun Jikwon)\n *\n * Fast straight punch with lead hand (left in orthodox stance) using proper Korean martial arts form.\n * Probing attack to gauge distance and set up combinations - the quintessential speed technique.\n *\n * **Korean Martial Arts Biomechanics** (한국 무술 생체역학):\n *\n * **Stance & Weight Distribution** (자세와 체중 분배):\n * - Start: 겨루기 자세 (Gyeorugi Jase) - Fighting stance\n * - Weight: 60/40 forward for quick reach without commitment\n * - Hip rotation: MINIMAL (~5-10°) to preserve speed\n * - Shoulder: Small forward roll (~15°) for reach and head protection\n *\n * **Chamber Phase - 준비 (Junbi)** [100ms]:\n * - Lead fist: Pulls back slightly to hip (엉덩이), palm vertical (세로주먹)\n * - Elbow: Bent ~90° (1.57 rad) tight to ribs for protection\n * - Rear hand: MAINTAINS 중단막기 (Jungdan Makgi) - middle guard at chin\n * - Breathing: Quick inhale through nose (코로 들이마시기)\n * - Eyes: Lock on target - solar plexus or chin (턱)\n *\n * **Extension Phase - 지르기 (Jireugi)** [150ms]:\n * - Arm snaps forward in STRAIGHT LINE (직선) to target\n * - Fist rotation: Vertical → Pronated (~90° wrist rotation = π/2 rad)\n * - Elbow: Nearly full extension ~175° (0.09 rad from straight)\n * - Shoulder: Rolls forward completing protection\n * - Hip: Minimal forward thrust (~10° rotation) for power without telegraphing\n * - Rear hand: STILL protecting chin (턱보호)\n *\n * **Peak Phase - 정점 (Jeongjeom)** [50ms]:\n * - Maximum reach achieved - fist 45-50cm from shoulder\n * - Fist: Fully pronated, knuckles aligned with forearm\n * - Breathing: Sharp exhale (기합 Kihap) \"칫!\" (Chit!)\n * - Impact: First two knuckles (인지, 중지 knuckles) make contact\n * - Body: Weight shifts 65/35 forward at peak extension\n *\n * **Retraction Phase - 회수 (Hoisu)** [100ms]:\n * - Fist SNAPS BACK through same path (같은 경로)\n * - Speed of retraction = speed of extension (방어를 위해)\n * - Return through chamber position at hip\n * - Elbow returns to protective rib position\n *\n * **Recovery Phase - 복귀 (Bokgwi)** [150ms]:\n * - Return to 중단막기 (middle guard) position\n * - Weight settles back to 60/40 fighting stance\n * - Both hands at chin level, ready for next technique\n * - Breathing: Controlled exhale, ready for next inhale\n *\n * **Combat Applications** (전투 응용):\n * - Distance probing (거리 측정)\n * - Set up combinations: 잽-크로스 (Jab-Cross)\n * - Disrupt opponent's rhythm (리듬 방해)\n * - Target: 턱 (chin), 코 (nose), 명치 (solar plexus)\n *\n * **Taekwondo Principle**: \"속도가 힘이다\" (Speed IS Power)\n * Quick retraction prevents counters - the jab that stays out gets hit!\n *\n * Total duration: 550ms (FAST technique)\n *\n * @korean 잽애니메이션\n */\nexport const JAB_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"jab\", \"잽\")\n .asAttack(TECHNIQUE_TIMING.FAST.total)\n .punchChamber(TECHNIQUE_TIMING.FAST.chamber, \"left\") // 준비 - Chamber at hip\n .withKoreanMiddleGuard(\"right\") // Right hand stays in guard\n .punchExtend(TECHNIQUE_TIMING.FAST.extend, \"left\") // 지르기 - Extension with rotation\n .withKoreanMiddleGuard(\"right\") // Right hand stays in guard\n .punchPeak(TECHNIQUE_TIMING.FAST.peak, \"left\") // 정점 - Peak extension\n .withKoreanMiddleGuard(\"right\") // Right hand stays in guard\n .recover(TECHNIQUE_TIMING.FAST.retract + TECHNIQUE_TIMING.FAST.recover) // 복귀 - Return to guard\n .withKoreanMiddleGuard() // Both hands back to middle guard\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// CROSS (크로스) - Power Straight Punch\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Cross - 크로스 (정권지르기 - Jeongwon Jireugi)\n *\n * Powerful straight punch with rear hand using full Korean martial arts biomechanics.\n * The quintessential power punch - generates maximum force through complete body chain.\n *\n * **Korean Martial Arts Biomechanics** (한국 무술 생체역학):\n *\n * **Stance & Weight Distribution** (자세와 체중 분배):\n * - Start: 겨루기 자세 (Gyeorugi Jase) - Fighting stance, 60/40 weight forward\n * - End: 70/30 forward at impact - committing to POWER\n * - Hip rotation: FULL ~25-30° (0.44-0.52 rad) - core of power generation\n * - Rear foot: PIVOTS on ball of foot 45° inward for hip drive\n *\n * **Chamber Phase - 준비 (Junbi)** [150ms]:\n * - Rear fist: COILED at hip (엉덩이), palm vertical (세로주먹)\n * - Elbow: Bent ~110° (1.92 rad), pulled back BEHIND body line\n * - Lead hand: MAINTAINS 중단막기 (middle guard) protecting chin\n * - Shoulders: Rear shoulder pulled back, torso \"wound up\" like spring\n * - Hips: Coiled backward ~10° from neutral, ready to EXPLODE\n * - Breathing: DEEP inhale through nose (코로 깊이 들이마시기)\n * - Legs: Rear leg bent ~135° (2.36 rad), loaded with power\n *\n * **Hip Rotation Phase - 회전 (Hoejeon)** [200ms]:\n * - Hips: BEGIN explosive rotation, rear hip drives FORWARD\n * - Rear foot: Ball pivots inward 45°, heel lifts slightly\n * - Power chain: Ground → Legs → Hips → Core → Shoulders → Fist\n * - Torso: Rotates WITH hips, shoulders follow (~15° lag)\n * - Rear shoulder: Begins forward drive\n * - Lead hand: STILL protecting, doesn't drop\n *\n * **Extension Phase - 지르기 (Jireugi)** [80ms]:\n * - Fist EXPLODES forward in straight line (직선 경로)\n * - Fist rotation: Vertical → Pronated (90° = π/2 rad) for maximum power transfer\n * - Elbow: Extends to ~175° (0.09 rad) - NEARLY straight but not locked\n * - Shoulder: Drives forward completing rotation\n * - Hip rotation: COMPLETES full 25-30° forward\n * - Weight transfer: Shifts to 70/30 forward\n * - Breathing: EXPLOSIVE exhale (기합 Kihap) \"크악!\" (Keuwak!)\n * - Rear heel: Fully lifted, pivoted inward\n *\n * **Peak/Follow-Through - 정점/관통 (Jeongjeom/Gwantong)** [80ms]:\n * - Maximum extension: Fist reaches 55-60cm from shoulder\n * - Full body alignment: Ankle → Knee → Hip → Shoulder → Fist in ONE LINE\n * - Impact: First two knuckles (인지, 중지) strike target\n * - Power transfer: ALL body mass behind punch\n * - Rear leg: Fully extended, heel up\n * - Lead hand: STILL protecting chin (critical defense)\n *\n * **Retraction Phase - 회수 (Hoisu)** [120ms]:\n * - Fist returns along same path\n * - Hip begins counter-rotation back to neutral\n * - Rear foot pivots back to starting position\n * - Weight begins shifting back toward 60/40\n *\n * **Recovery Phase - 복귀 (Bokgwi)** [180ms]:\n * - Return to 중단막기 (middle guard) bilateral protection\n * - Hips settle to neutral fighting position\n * - Weight: 60/40 ready for next technique\n * - Breathing: Controlled return to combat breathing rhythm\n * - Stance: Reset to 겨루기 자세 (fighting ready)\n *\n * **Combat Applications** (전투 응용):\n * - Knockout punch targeting: 턱 (chin), 관자놀이 (temple), 명치 (solar plexus)\n * - Follow-up to jab: Classic 1-2 combo (잽-크로스)\n * - Counter-strike: When opponent over-commits\n * - Liver shot: Angled downward to 간장 (liver)\n *\n * **Taekwondo Principle**: \"힘은 땅에서 나온다\" (Power comes from the ground)\n * The cross demonstrates complete kinetic chain - every link must be strong!\n *\n * **Biomechanical Keys**:\n * - Rear foot pivot = Hip rotation enabler\n * - Hip rotation = Power multiplier (3-4x arm-only punch)\n * - Fist rotation = Penetration and structural alignment\n * - Lead hand guard = Defensive responsibility\n *\n * Total duration: 730ms (MEDIUM technique)\n *\n * @korean 크로스애니메이션\n */\nexport const CROSS_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"cross\", \"크로스\")\n .asAttack(TECHNIQUE_TIMING.MEDIUM.total)\n .punchChamber(TECHNIQUE_TIMING.MEDIUM.chamber, \"right\") // 준비 - Chamber at hip\n .withKoreanMiddleGuard(\"left\") // Left hand stays in guard\n .punchExtend(TECHNIQUE_TIMING.MEDIUM.extend, \"right\") // 지르기 - Extension with full hip rotation\n .withKoreanMiddleGuard(\"left\") // Left hand stays in guard\n .punchPeak(TECHNIQUE_TIMING.MEDIUM.peak, \"right\") // 정점 - Peak impact\n .withKoreanMiddleGuard(\"left\") // Left hand stays in guard\n .recover(TECHNIQUE_TIMING.MEDIUM.retract + TECHNIQUE_TIMING.MEDIUM.recover) // 복귀 - Return to guard\n .withKoreanMiddleGuard() // Both hands back to middle guard\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// PALM STRIKE (장권) - Open Palm Heel Strike\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Palm Strike - 장권\n *\n * Open palm heel strike targeting chin or solar plexus.\n * Traditional Taekwondo technique for close range.\n *\n * Total duration: 730ms (MEDIUM technique)\n *\n * @korean 장권애니메이션\n */\nexport const PALM_STRIKE_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"palm_strike\", \"장권\")\n .asAttack(TECHNIQUE_TIMING.MEDIUM.total)\n .punchWindup(TECHNIQUE_TIMING.MEDIUM.chamber) // 준비 - 150ms\n .palmStrike(TECHNIQUE_TIMING.MEDIUM.extend) // 장권 - 200ms palm heel forward\n .palmStrike(TECHNIQUE_TIMING.MEDIUM.peak) // 정점 - 80ms hold\n .recover(TECHNIQUE_TIMING.MEDIUM.retract + TECHNIQUE_TIMING.MEDIUM.recover) // 복귀 - 300ms\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// HOOK (훅) - Curved Power Punch\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Hook - 훅 (곡권 - Gokwon / 갈고리주먹 - Galgori Jumeok)\n *\n * Curved power punch targeting jaw or temple with circular trajectory.\n * Generates devastating knockout power from hip and shoulder rotation in horizontal plane.\n *\n * **Korean Martial Arts Biomechanics** (한국 무술 생체역학):\n *\n * **Stance & Weight Distribution** (자세와 체중 분배):\n * - Start: 60/40 weight distribution\n * - Peak: 55/45 - MORE BALANCED than cross (circular vs. linear power)\n * - Hip rotation: ~35-40° (0.61-0.70 rad) - MORE than cross!\n * - Pivoting: Lead foot pivots OUT ~30° on ball\n *\n * **Chamber/Wind-Up Phase - 준비 (Junbi)** [150ms]:\n * - Lead arm: Pulls BACK to side, elbow bent 90° (1.57 rad) - CRITICAL angle\n * - Fist position: At shoulder level (어깨 높이), near armpit\n * - Elbow: Points SIDEWAYS (옆으로), not down - horizontal plane strike\n * - Rear hand: PROTECTS chin (턱보호) - non-negotiable defense\n * - Hips: Coil AWAY from target side by ~10-15°\n * - Shoulders: Wind up like baseball bat swing\n * - Breathing: Deep inhale (들이마시기)\n * - Lead foot: Prepares to pivot outward\n *\n * **Rotation & Strike Phase - 회전+타격 (Hoejeon + Tagyeok)** [200ms]:\n * - Hip explosion: Rotates 35-40° toward target (MORE than cross!)\n * - Lead foot: Ball pivots OUT ~30°, heel comes up slightly\n * - Torso: Rotates WITH hips in synchronized motion\n * - Shoulder: Drives around like hammer throw\n * - Elbow: MAINTAINS 90° bend throughout strike - power comes from rotation, NOT extension\n * - Fist: Travels in HORIZONTAL ARC (수평호 - Supyeongho)\n * - Trajectory: Curves AROUND guard to strike side of head\n * - Hand position: Palm faces DOWN at impact (pronated)\n *\n * **Peak Impact - 정점 (Jeongjeom)** [100ms]:\n * - Impact zone: 턱 (jaw), 관자놀이 (temple), 귀 (ear) - knockout targets\n * - Fist alignment: Knuckles perpendicular to target surface\n * - Elbow: STILL bent 90° - rigid arm triangle structure\n * - Hip: Fully rotated, weight 55/45\n * - Breathing: Sharp exhale \"흣!\" (Heut!) with kihap\n * - Body unity: Fist, elbow, shoulder, hip aligned in CIRCULAR chain\n * - Follow-through: Hip continues rotation ~5° past impact\n *\n * **Retraction Phase - 회수 (Hoisu)** [150ms]:\n * - Fist returns via SAME CURVED PATH (same arc backward)\n * - Elbow: Maintains bend, doesn't straighten\n * - Hip: Counter-rotates back toward neutral\n * - Lead foot: Pivots back to starting position\n *\n * **Recovery Phase - 복귀 (Bokgwi)** [200ms]:\n * - Return to 중단막기 (middle guard) protecting chin\n * - Weight: Resets to 60/40 fighting stance\n * - Hips: Neutral position, ready for next technique\n * - Breathing: Controlled recovery breath\n *\n * **Combat Applications** (전투 응용):\n * - Primary target: 턱 (chin) - KNOCKOUT potential\n * - Secondary: 관자놀이 (temple) - brain concussion\n * - Tertiary: 간장 (liver) if angled downward (body hook)\n * - Combinations: After jab opens guard - 잽-훅 (Jab-Hook)\n * - Counter: When opponent ducks straight punches\n *\n * **Biomechanical Principle**: \"팔이 아니라 몸통으로 친다\"\n * (Strike with the torso, not the arm)\n * - 90° elbow angle = RIGID structure transfers rotation power\n * - Hip rotation = 70% of power generation\n * - Shoulder pivot = 20% of power\n * - Arm extension = 10% only (most people do this wrong!)\n *\n * **Common Mistakes** (흔한 실수):\n * - ❌ Extending arm (팔 펴기) - WRONG! Breaks power structure\n * - ❌ Arm-only punch (팔만 사용) - No hip rotation = weak hook\n * - ❌ Dropping rear hand (뒷손 내리기) - Gets countered!\n * - ✅ Correct: Locked 90° elbow + full hip rotation = knockout power\n *\n * **Taekwondo/Boxing Principle**: \"회전이 힘이다\" (Rotation IS power)\n * The hook is a rotational strike, not a pushing strike - physics of angular momentum!\n *\n * Total duration: 800ms (HEAVY_LIGHT technique)\n *\n * @korean 훅애니메이션\n */\nexport const HOOK_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"hook\", \"훅\")\n .asAttack(TECHNIQUE_TIMING.HEAVY_LIGHT.total)\n .hookWindup(TECHNIQUE_TIMING.HEAVY_LIGHT.chamber) // 준비 - 150ms arm pulls back\n .hookPunch(TECHNIQUE_TIMING.HEAVY_LIGHT.extend) // 타격 - 200ms curved strike\n .hookPunch(TECHNIQUE_TIMING.HEAVY_LIGHT.peak) // 정점 - 100ms hold\n .recover(\n TECHNIQUE_TIMING.HEAVY_LIGHT.retract +\n TECHNIQUE_TIMING.HEAVY_LIGHT.recover,\n ) // 복귀 - 350ms\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// LEAD HOOK (리드훅) - Quick Lead Hand Hook\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Lead Hook - 리드훅\n *\n * Fast hook with lead hand.\n * Shorter range but quicker than rear hook.\n *\n * Total duration: 700ms (MEDIUM_LIGHT technique)\n *\n * @korean 리드훅애니메이션\n */\nexport const LEAD_HOOK_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"lead_hook\", \"리드훅\")\n .asAttack(TECHNIQUE_TIMING.MEDIUM_LIGHT.total)\n .hookWindup(TECHNIQUE_TIMING.MEDIUM_LIGHT.chamber, \"left\") // Quick wind-up - 120ms (lead hand)\n .hookPunch(TECHNIQUE_TIMING.MEDIUM_LIGHT.extend, \"left\") // Fast hook - 180ms (lead hand)\n .hookPunch(TECHNIQUE_TIMING.MEDIUM_LIGHT.peak, \"left\") // Peak - 80ms\n .recover(\n TECHNIQUE_TIMING.MEDIUM_LIGHT.retract +\n TECHNIQUE_TIMING.MEDIUM_LIGHT.recover,\n ) // Recover - 320ms\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// UPPERCUT (어퍼컷) - Rising Power Punch\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Uppercut - 어퍼컷 (상승권 - Sangseung Gwon / 올려치기 - Ollyeochigi)\n *\n * Rising punch targeting chin from below using leg drive and upward hip thrust.\n * Devastating close-range knockout technique generating power from ground through vertical chain.\n *\n * **Korean Martial Arts Biomechanics** (한국 무술 생체역학):\n *\n * **Stance & Weight Distribution** (자세와 체중 분배):\n * - Start: 60/40 weight distribution\n * - Crouch: Weight shifts to 65/35 on striking side (loading)\n * - Impact: 70/30 - full commitment to vertical drive\n * - Stance width: SLIGHTLY WIDER for stable base during crouch\n *\n * **Crouch/Chamber Phase - 낮추기 (Najchugi)** [150ms]:\n * - Body: Drops CENTER OF GRAVITY by ~10-15cm (무게중심 낮추기)\n * - Striking leg: Knee bends DEEPER ~100° (1.75 rad) - loading spring\n * - Hip: Tilts backward and DOWN on striking side (~15° pelvic tilt)\n * - Striking fist: Drops to hip level, palm facing INWARD/UPWARD (손바닥 위로)\n * - Elbow: Bent ~110° (1.92 rad), close to ribs\n * - Rear hand: Maintains 중단막기 (chin protection) - critical for counters\n * - Shoulders: Dip slightly on striking side (~10° drop)\n * - Breathing: Quick inhale while loading (준비 호흡)\n * - Weight: Loads onto ball of striking-side foot\n *\n * **Drive/Explosion Phase - 상승 (Sangseung)** [200ms]:\n * - Legs: EXPLOSIVE EXTENSION - knee straightens from 100° → 170° (0.18 rad)\n * - Hip thrust: Drives UPWARD and FORWARD (~20° upward angle)\n * - Power chain: Ground → Legs → Hips → Core → Shoulder → Fist (VERTICAL)\n * - Heel: Lifts off ground as leg extends\n * - Pelvis: Thrusts upward and forward, creating hip drive\n * - Torso: Rises with hip drive, slight forward lean (~10°)\n * - Striking shoulder: Begins upward drive\n * - Fist: Starts vertical ascent along CENTERLINE\n *\n * **Strike/Extension Phase - 타격 (Tagyeok)** [100ms]:\n * - Fist: Rises in VERTICAL PATH from hip to chin level\n * - Fist rotation: Inward palm → Neutral/Pronated (90° rotation)\n * - Elbow: Remains bent ~120° (2.09 rad) throughout - NOT straight punch!\n * - Trajectory: Fist travels UPWARD at ~60-70° angle from horizontal\n * - Shoulder: Completes upward drive, elevating ~15cm\n * - Hip: Full upward thrust completed\n * - Legs: Fully extended, body at maximum height\n * - Breathing: EXPLOSIVE exhale \"우억!\" (Wueok!) - rising kihap\n *\n * **Peak Impact - 정점 (Jeongjeom)** [100ms]:\n * - Target: 턱 (chin) from BELOW - ideal knockout angle\n * - Impact surface: Knuckles facing UPWARD, hitting underside of jaw\n * - Body position: Full vertical extension, heel off ground\n * - Power delivery: ALL body mass driving UPWARD into target\n * - Neck snap: Opponent's head snaps BACKWARD and UP (knockout mechanism)\n * - Weight: 70/30 forward, committed to strike\n * - Rear hand: STILL protecting (never drops!)\n *\n * **Retraction Phase - 회수 (Hoisu)** [150ms]:\n * - Fist: Drops back toward hip via same path\n * - Body: Begins lowering back to normal height\n * - Legs: Bend slightly to absorb return motion\n * - Hip: Settles back to neutral pelvic alignment\n * - Heel: Returns to ground\n *\n * **Recovery Phase - 복귀 (Bokgwi)** [200ms]:\n * - Return to 중단막기 (middle guard) bilateral protection\n * - Center of gravity: Returns to normal fighting height\n * - Weight: Resets to 60/40 distribution\n * - Stance: 겨루기 자세 (fighting stance) restored\n * - Breathing: Controlled recovery, ready for next technique\n *\n * **Combat Applications** (전투 응용):\n * - Primary target: 턱 (chin/jaw) from below - maximum knockout potential\n * - Ideal range: CLOSE combat (0.3-0.5m) - too close for straight punches\n * - Combinations: After body shot brings opponent's hands down\n * - Counter: When opponent ducks or bends forward\n * - Liver targeting: Body uppercut to 간장 (liver) at close range\n *\n * **Biomechanical Keys** (생체역학 핵심):\n * 1. **Leg drive** (다리 추진력): 60% of power comes from legs!\n * 2. **Hip thrust** (엉덩이 밀기): 25% from upward pelvic motion\n * 3. **Shoulder lift** (어깨 들기): 10% from shoulder elevation\n * 4. **Arm** (팔): Only 5% - mostly for targeting!\n *\n * **Physics Principle**: \"상승하는 힘은 중력을 이긴다\"\n * (Rising force defeats gravity)\n * - Vertical strike vector meets horizontal chin = devastating angle\n * - Opponent's neck structure weakest against upward force\n * - Body weight + leg extension = maximum vertical power transfer\n *\n * **Common Mistakes** (흔한 실수):\n * - ❌ Arm-only punch (팔만) - No leg drive = weak uppercut\n * - ❌ Wide arc (넓은 호) - Too telegraphed and slow\n * - ❌ Straight up (수직) - Needs forward component for power\n * - ✅ Correct: Deep crouch + explosive leg extension + upward hip thrust\n *\n * **Taekwondo Principle**: \"땅에서 하늘로\" (From Earth to Heaven)\n * The uppercut exemplifies vertical power generation - like jumping!\n *\n * Total duration: 800ms (HEAVY_LIGHT technique)\n *\n * @korean 어퍼컷애니메이션\n */\nexport const UPPERCUT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"uppercut\", \"어퍼컷\")\n .asAttack(TECHNIQUE_TIMING.HEAVY_LIGHT.total)\n .uppercutCrouch(TECHNIQUE_TIMING.HEAVY_LIGHT.chamber) // 낮추기 - 150ms drop level\n .uppercutPunch(TECHNIQUE_TIMING.HEAVY_LIGHT.extend) // 상권 - 200ms rising strike\n .uppercutPunch(TECHNIQUE_TIMING.HEAVY_LIGHT.peak) // 정점 - 100ms hold\n .recover(\n TECHNIQUE_TIMING.HEAVY_LIGHT.retract +\n TECHNIQUE_TIMING.HEAVY_LIGHT.recover,\n ) // 복귀 - 350ms\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// LEAD UPPERCUT (리드어퍼컷) - Quick Lead Uppercut\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Lead Uppercut - 리드어퍼컷\n *\n * Fast uppercut with lead hand.\n * Good counter when opponent ducks.\n *\n * Total duration: 700ms (MEDIUM_LIGHT technique)\n *\n * @korean 리드어퍼컷애니메이션\n */\nexport const LEAD_UPPERCUT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"lead_uppercut\", \"리드어퍼컷\")\n .asAttack(TECHNIQUE_TIMING.MEDIUM_LIGHT.total)\n .uppercutCrouch(TECHNIQUE_TIMING.MEDIUM_LIGHT.chamber, \"left\") // Quick drop - 120ms (lead hand)\n .uppercutPunch(TECHNIQUE_TIMING.MEDIUM_LIGHT.extend, \"left\") // Fast uppercut - 180ms (lead hand)\n .uppercutPunch(TECHNIQUE_TIMING.MEDIUM_LIGHT.peak, \"left\") // Peak - 80ms\n .recover(\n TECHNIQUE_TIMING.MEDIUM_LIGHT.retract +\n TECHNIQUE_TIMING.MEDIUM_LIGHT.recover,\n ) // Recover - 320ms\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// OVERHAND (오버핸드) - Looping Power Punch\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Overhand - 오버핸드 (천권)\n *\n * Looping punch over opponent's guard.\n * High arc to strike top of head or jaw.\n *\n * Phases:\n * 1. Wind-up (준비): Arm raises high - 200ms\n * 2. Loop (호): Arm loops over - 300ms\n * 3. Strike (타격): Fist crashes down - 120ms\n * 4. Recovery (복귀): Return to guard - 380ms\n *\n * Total duration: 1000ms (HEAVY technique)\n *\n * @korean 오버핸드애니메이션\n */\nexport const OVERHAND_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"overhand\", \"오버핸드\")\n .asAttack(TECHNIQUE_TIMING.HEAVY.total)\n .overhandPunch(\n TECHNIQUE_TIMING.HEAVY.chamber + TECHNIQUE_TIMING.HEAVY.extend,\n ) // 천권 - 500ms looping strike\n .overhandPunch(TECHNIQUE_TIMING.HEAVY.peak) // 정점 - 120ms hold\n .recover(TECHNIQUE_TIMING.HEAVY.retract + TECHNIQUE_TIMING.HEAVY.recover) // 복귀 - 380ms\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// BACKFIST (등주먹) - Spinning Backfist\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Backfist - 등주먹\n *\n * Back of fist whips into target.\n * Can be spinning or direct.\n *\n * Total duration: 700ms (MEDIUM_LIGHT technique)\n *\n * @korean 등주먹애니메이션\n */\nexport const BACKFIST_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"backfist\", \"등주먹\")\n .asAttack(TECHNIQUE_TIMING.MEDIUM_LIGHT.total)\n .punchWindup(TECHNIQUE_TIMING.MEDIUM_LIGHT.chamber) // Pull back - 120ms\n .counterStrike(TECHNIQUE_TIMING.MEDIUM_LIGHT.extend) // Whip motion - 180ms\n .counterStrike(TECHNIQUE_TIMING.MEDIUM_LIGHT.peak) // Peak - 80ms\n .recover(\n TECHNIQUE_TIMING.MEDIUM_LIGHT.retract +\n TECHNIQUE_TIMING.MEDIUM_LIGHT.recover,\n ) // Recover - 320ms\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// SPINNING BACKFIST (회전등주먹) - Full Spin Backfist\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Spinning Backfist - 회전등주먹\n *\n * Full 360° rotation into backfist.\n * High-risk knockout technique.\n *\n * Total duration: 1200ms (SPINNING technique)\n *\n * @korean 회전등주먹애니메이션\n */\nexport const SPINNING_BACKFIST_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"spinning_backfist\", \"회전등주먹\")\n .asAttack(TECHNIQUE_TIMING.SPINNING.total)\n .backKickSpin(TECHNIQUE_TIMING.SPINNING.chamber) // Full spin - 300ms\n .counterStrike(TECHNIQUE_TIMING.SPINNING.extend) // Backfist on completion - 350ms\n .counterStrike(TECHNIQUE_TIMING.SPINNING.peak) // Peak - 120ms\n .spinRecover(\n TECHNIQUE_TIMING.SPINNING.retract + TECHNIQUE_TIMING.SPINNING.recover,\n ) // Complete rotation - 430ms\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// HAMMER FIST (철퇴권) - Downward Hammer Strike\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Hammer Fist - 철퇴권\n *\n * Bottom of fist strikes downward like a hammer.\n * Effective in ground-and-pound.\n *\n * Total duration: 900ms (JUMPING technique timing)\n *\n * @korean 철퇴권애니메이션\n */\nexport const HAMMER_FIST_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"hammer_fist\", \"철퇴권\")\n .asAttack(TECHNIQUE_TIMING.JUMPING.total)\n .overhandPunch(\n TECHNIQUE_TIMING.JUMPING.chamber + TECHNIQUE_TIMING.JUMPING.extend,\n ) // Similar arc to overhand - 400ms\n .overhandPunch(TECHNIQUE_TIMING.JUMPING.peak) // Peak - 80ms\n .recover(\n TECHNIQUE_TIMING.JUMPING.retract + TECHNIQUE_TIMING.JUMPING.recover,\n ) // Recover - 420ms\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// SUPERMAN PUNCH (슈퍼맨펀치) - Flying Cross\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Superman Punch - 슈퍼맨펀치\n *\n * Jumping cross punch for extended range.\n * Fakes kick then throws power punch.\n *\n * Total duration: 1000ms (HEAVY technique)\n *\n * @korean 슈퍼맨펀치애니메이션\n */\nexport const SUPERMAN_PUNCH_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"superman_punch\", \"슈퍼맨펀치\")\n .asAttack(TECHNIQUE_TIMING.HEAVY.total)\n .chamber(TECHNIQUE_TIMING.HEAVY.chamber * 0.75) // Fake kick chamber - 150ms (0.75 × 200ms)\n .punchWindup(TECHNIQUE_TIMING.HEAVY.chamber * 0.75) // Transfer to punch - 150ms\n .crossPunch(TECHNIQUE_TIMING.HEAVY.extend) // Throw cross in air - 300ms\n .crossPunch(TECHNIQUE_TIMING.HEAVY.peak) // Peak - 120ms\n .recover(TECHNIQUE_TIMING.HEAVY.recover + 0.05) // Land and recover - 280ms (230ms + 50ms landing)\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// JAB-CROSS COMBINATION (잽크로스) - 1-2 Combo\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Jab-Cross - 잽크로스\n *\n * Classic 1-2 boxing combination.\n * Lead jab sets up rear cross.\n *\n * Phases (준비, 실행, 회수, 복귀):\n * 1. Jab chamber (잽 준비): 80ms\n * 2. Jab extend (잽 실행): 120ms\n * 3. Cross transition (크로스 전환): 80ms (using peak for transition)\n * 4. Cross extend (크로스 실행): 100ms (using retract)\n * 5. Recovery (복귀): 320ms\n *\n * Total duration: 700ms (COMBO_FAST technique)\n * Sum: 80 + 120 + 80 + 100 + 320 = 700ms ✓\n *\n * @korean 잽크로스애니메이션\n */\nexport const JAB_CROSS_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"jab_cross\", \"잽크로스\")\n .asAttack(TECHNIQUE_TIMING.COMBO_FAST.total)\n .punchWindup(TECHNIQUE_TIMING.COMBO_FAST.chamber, \"left\") // Jab prep - 80ms (lead hand)\n .punchExtend(TECHNIQUE_TIMING.COMBO_FAST.extend, \"left\") // Jab lands - 120ms (lead hand)\n .punchWindup(TECHNIQUE_TIMING.COMBO_FAST.peak) // Cross transition - 80ms (rear hand wind-up)\n .punchExtend(TECHNIQUE_TIMING.COMBO_FAST.retract) // Cross lands - 100ms (rear hand)\n .recover(TECHNIQUE_TIMING.COMBO_FAST.recover) // Recover - 320ms\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// HOOK-HOOK COMBINATION (더블훅) - Double Hook\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Double Hook - 더블훅\n *\n * Left hook followed by right hook.\n * Body rotation carries momentum.\n *\n * Phases (준비, 실행, 회수, 복귀):\n * 1. First hook chamber (첫 훅 준비): 120ms (0.6 × chamber)\n * 2. First hook extend (첫 훅 실행): 180ms (0.6 × extend)\n * 3. Second hook chamber (둘째 훅 준비): 120ms (0.8 × retract)\n * 4. Second hook extend (둘째 훅 실행): 350ms (extend + 50ms)\n * 5. Recovery (복귀): 230ms\n *\n * Total duration: 1000ms (HEAVY technique)\n * Sum: 120 + 180 + 120 + 350 + 230 = 1000ms ✓\n *\n * @korean 더블훅애니메이션\n */\nexport const DOUBLE_HOOK_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"double_hook\", \"더블훅\")\n .asAttack(TECHNIQUE_TIMING.HEAVY.total)\n .hookWindup(TECHNIQUE_TIMING.HEAVY.chamber * 0.6, \"left\") // First hook prep - 120ms (lead hand)\n .hookPunch(TECHNIQUE_TIMING.HEAVY.extend * 0.6, \"left\") // First hook - 180ms (lead hand)\n .hookWindup(TECHNIQUE_TIMING.HEAVY.retract * 0.8) // Second hook prep - 120ms (rear hand)\n .hookPunch(TECHNIQUE_TIMING.HEAVY.extend + 0.05) // Second hook - 350ms (rear hand)\n .recover(TECHNIQUE_TIMING.HEAVY.recover) // Recover - 230ms\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// BODY SHOT (바디샷) - Hook to Body\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Body Shot - 바디샷\n *\n * Hook targeting ribs/liver.\n * Lower trajectory than head hook.\n *\n * Total duration: 750ms (MEDIUM_HEAVY technique)\n *\n * @korean 바디샷애니메이션\n */\nexport const BODY_SHOT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"body_shot\", \"바디샷\")\n .asAttack(TECHNIQUE_TIMING.MEDIUM_HEAVY.total)\n .uppercutCrouch(TECHNIQUE_TIMING.MEDIUM_HEAVY.chamber) // Drop level - 120ms\n .hookPunch(TECHNIQUE_TIMING.MEDIUM_HEAVY.extend) // Hook to body - 200ms\n .hookPunch(TECHNIQUE_TIMING.MEDIUM_HEAVY.peak) // Peak - 80ms\n .recover(\n TECHNIQUE_TIMING.MEDIUM_HEAVY.retract +\n TECHNIQUE_TIMING.MEDIUM_HEAVY.recover,\n ) // Recover - 350ms\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// EXPORT PUNCH ANIMATION MAP\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Map of all punch animations for easy access\n * 주먹 애니메이션 맵\n */\nexport const PUNCH_ANIMATIONS: ReadonlyMap<string, SkeletalAnimation> = new Map(\n [\n [\"jab\", JAB_ANIMATION],\n [\"cross\", CROSS_ANIMATION],\n [\"palm_strike\", PALM_STRIKE_ANIMATION],\n [\"hook\", HOOK_ANIMATION],\n [\"lead_hook\", LEAD_HOOK_ANIMATION],\n [\"uppercut\", UPPERCUT_ANIMATION],\n [\"lead_uppercut\", LEAD_UPPERCUT_ANIMATION],\n [\"overhand\", OVERHAND_ANIMATION],\n [\"backfist\", BACKFIST_ANIMATION],\n [\"spinning_backfist\", SPINNING_BACKFIST_ANIMATION],\n [\"hammer_fist\", HAMMER_FIST_ANIMATION],\n [\"superman_punch\", SUPERMAN_PUNCH_ANIMATION],\n [\"jab_cross\", JAB_CROSS_ANIMATION],\n [\"double_hook\", DOUBLE_HOOK_ANIMATION],\n [\"body_shot\", BODY_SHOT_ANIMATION],\n ],\n);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PunchAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/PunchAnimations.ts"],"sourcesContent":["/**\n * Punch Animations Module\n *\n * All punch and hand strike animations (주먹 공격) for Korean martial arts.\n * Uses MartialArtsAnimationBuilder for readable, martial arts expert-friendly code.\n *\n * Updated to include proper Korean martial arts biomechanics:\n * - Hip rotation (엉덩이회전) for power generation\n * - Shoulder torque (어깨비틀기) coordination\n * - Fist rotation (주먹회전) from vertical to pronated\n * - Hikite (당기기) - opposite arm pulling for power\n * - Full arm extension (팔완전펴기) at impact\n *\n * 한국 무술 주먹 공격 애니메이션 모듈\n *\n * @module systems/animation/PunchAnimations\n * @korean 주먹애니메이션\n */\n\nimport type { SkeletalAnimation } from \"@/types/skeletal\";\nimport {\n MartialArtsAnimationBuilder,\n TECHNIQUE_TIMING,\n} from \"../builders/MartialArtsAnimationBuilder\";\n\n// ═══════════════════════════════════════════════════════════════════════════\n// JAB (잽) - Quick Straight Punch\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Jab - 잽 (빠른 직권 - Ppareun Jikwon)\n *\n * Fast straight punch with lead hand (left in orthodox stance) using proper Korean martial arts form.\n * Probing attack to gauge distance and set up combinations - the quintessential speed technique.\n *\n * **Korean Martial Arts Biomechanics** (한국 무술 생체역학):\n *\n * **Stance & Weight Distribution** (자세와 체중 분배):\n * - Start: 겨루기 자세 (Gyeorugi Jase) - Fighting stance\n * - Weight: 60/40 forward for quick reach without commitment\n * - Hip rotation: MINIMAL (~5-10°) to preserve speed\n * - Shoulder: Small forward roll (~15°) for reach and head protection\n *\n * **Chamber Phase - 준비 (Junbi)** [100ms]:\n * - Lead fist: Pulls back slightly to hip (엉덩이), palm vertical (세로주먹)\n * - Elbow: Bent ~90° (1.57 rad) tight to ribs for protection\n * - Rear hand: MAINTAINS 중단막기 (Jungdan Makgi) - middle guard at chin\n * - Breathing: Quick inhale through nose (코로 들이마시기)\n * - Eyes: Lock on target - solar plexus or chin (턱)\n *\n * **Extension Phase - 지르기 (Jireugi)** [150ms]:\n * - Arm snaps forward in STRAIGHT LINE (직선) to target\n * - Fist rotation: Vertical → Pronated (~90° wrist rotation = π/2 rad)\n * - Elbow: Nearly full extension ~175° (0.09 rad from straight)\n * - Shoulder: Rolls forward completing protection\n * - Hip: Minimal forward thrust (~10° rotation) for power without telegraphing\n * - Rear hand: STILL protecting chin (턱보호)\n *\n * **Peak Phase - 정점 (Jeongjeom)** [50ms]:\n * - Maximum reach achieved - fist 45-50cm from shoulder\n * - Fist: Fully pronated, knuckles aligned with forearm\n * - Breathing: Sharp exhale (기합 Kihap) \"칫!\" (Chit!)\n * - Impact: First two knuckles (인지, 중지 knuckles) make contact\n * - Body: Weight shifts 65/35 forward at peak extension\n *\n * **Retraction Phase - 회수 (Hoisu)** [100ms]:\n * - Fist SNAPS BACK through same path (같은 경로)\n * - Speed of retraction = speed of extension (방어를 위해)\n * - Return through chamber position at hip\n * - Elbow returns to protective rib position\n *\n * **Recovery Phase - 복귀 (Bokgwi)** [150ms]:\n * - Return to 중단막기 (middle guard) position\n * - Weight settles back to 60/40 fighting stance\n * - Both hands at chin level, ready for next technique\n * - Breathing: Controlled exhale, ready for next inhale\n *\n * **Combat Applications** (전투 응용):\n * - Distance probing (거리 측정)\n * - Set up combinations: 잽-크로스 (Jab-Cross)\n * - Disrupt opponent's rhythm (리듬 방해)\n * - Target: 턱 (chin), 코 (nose), 명치 (solar plexus)\n *\n * **Taekwondo Principle**: \"속도가 힘이다\" (Speed IS Power)\n * Quick retraction prevents counters - the jab that stays out gets hit!\n *\n * Total duration: 550ms (FAST technique)\n *\n * @korean 잽애니메이션\n */\nexport const JAB_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"jab\", \"잽\")\n .asAttack(TECHNIQUE_TIMING.FAST.total)\n .punchChamber(TECHNIQUE_TIMING.FAST.chamber, \"left\") // 준비 - Chamber at hip\n .withKoreanMiddleGuard(\"right\") // Right hand stays in guard\n .punchExtend(TECHNIQUE_TIMING.FAST.extend, \"left\") // 지르기 - Extension with rotation\n .withKoreanMiddleGuard(\"right\") // Right hand stays in guard\n .punchPeak(TECHNIQUE_TIMING.FAST.peak, \"left\") // 정점 - Peak extension\n .withKoreanMiddleGuard(\"right\") // Right hand stays in guard\n .recover(TECHNIQUE_TIMING.FAST.retract + TECHNIQUE_TIMING.FAST.recover) // 복귀 - Return to guard\n .withKoreanMiddleGuard() // Both hands back to middle guard\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// CROSS (크로스) - Power Straight Punch\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Cross - 크로스 (정권지르기 - Jeongkwon Jireugi)\n *\n * Powerful straight punch with rear hand using full Korean martial arts biomechanics.\n * The quintessential power punch - generates maximum force through complete body chain.\n *\n * **Korean Martial Arts Biomechanics** (한국 무술 생체역학):\n *\n * **Stance & Weight Distribution** (자세와 체중 분배):\n * - Start: 겨루기 자세 (Gyeorugi Jase) - Fighting stance, 60/40 weight forward\n * - End: 70/30 forward at impact - committing to POWER\n * - Hip rotation: FULL ~25-30° (0.44-0.52 rad) - core of power generation\n * - Rear foot: PIVOTS on ball of foot 45° inward for hip drive\n *\n * **Chamber Phase - 준비 (Junbi)** [150ms]:\n * - Rear fist: COILED at hip (엉덩이), palm vertical (세로주먹)\n * - Elbow: Bent ~110° (1.92 rad), pulled back BEHIND body line\n * - Lead hand: MAINTAINS 중단막기 (middle guard) protecting chin\n * - Shoulders: Rear shoulder pulled back, torso \"wound up\" like spring\n * - Hips: Coiled backward ~10° from neutral, ready to EXPLODE\n * - Breathing: DEEP inhale through nose (코로 깊이 들이마시기)\n * - Legs: Rear leg bent ~135° (2.36 rad), loaded with power\n *\n * **Hip Rotation Phase - 회전 (Hoejeon)** [200ms]:\n * - Hips: BEGIN explosive rotation, rear hip drives FORWARD\n * - Rear foot: Ball pivots inward 45°, heel lifts slightly\n * - Power chain: Ground → Legs → Hips → Core → Shoulders → Fist\n * - Torso: Rotates WITH hips, shoulders follow (~15° lag)\n * - Rear shoulder: Begins forward drive\n * - Lead hand: STILL protecting, doesn't drop\n *\n * **Extension Phase - 지르기 (Jireugi)** [80ms]:\n * - Fist EXPLODES forward in straight line (직선 경로)\n * - Fist rotation: Vertical → Pronated (90° = π/2 rad) for maximum power transfer\n * - Elbow: Extends to ~175° (0.09 rad) - NEARLY straight but not locked\n * - Shoulder: Drives forward completing rotation\n * - Hip rotation: COMPLETES full 25-30° forward\n * - Weight transfer: Shifts to 70/30 forward\n * - Breathing: EXPLOSIVE exhale (기합 Kihap) \"크악!\" (Keuwak!)\n * - Rear heel: Fully lifted, pivoted inward\n *\n * **Peak/Follow-Through - 정점/관통 (Jeongjeom/Gwantong)** [80ms]:\n * - Maximum extension: Fist reaches 55-60cm from shoulder\n * - Full body alignment: Ankle → Knee → Hip → Shoulder → Fist in ONE LINE\n * - Impact: First two knuckles (인지, 중지) strike target\n * - Power transfer: ALL body mass behind punch\n * - Rear leg: Fully extended, heel up\n * - Lead hand: STILL protecting chin (critical defense)\n *\n * **Retraction Phase - 회수 (Hoisu)** [120ms]:\n * - Fist returns along same path\n * - Hip begins counter-rotation back to neutral\n * - Rear foot pivots back to starting position\n * - Weight begins shifting back toward 60/40\n *\n * **Recovery Phase - 복귀 (Bokgwi)** [180ms]:\n * - Return to 중단막기 (middle guard) bilateral protection\n * - Hips settle to neutral fighting position\n * - Weight: 60/40 ready for next technique\n * - Breathing: Controlled return to combat breathing rhythm\n * - Stance: Reset to 겨루기 자세 (fighting ready)\n *\n * **Combat Applications** (전투 응용):\n * - Knockout punch targeting: 턱 (chin), 관자놀이 (temple), 명치 (solar plexus)\n * - Follow-up to jab: Classic 1-2 combo (잽-크로스)\n * - Counter-strike: When opponent over-commits\n * - Liver shot: Angled downward to 간장 (liver)\n *\n * **Taekwondo Principle**: \"힘은 땅에서 나온다\" (Power comes from the ground)\n * The cross demonstrates complete kinetic chain - every link must be strong!\n *\n * **Biomechanical Keys**:\n * - Rear foot pivot = Hip rotation enabler\n * - Hip rotation = Power multiplier (3-4x arm-only punch)\n * - Fist rotation = Penetration and structural alignment\n * - Lead hand guard = Defensive responsibility\n *\n * Total duration: 730ms (MEDIUM technique)\n *\n * @korean 크로스애니메이션\n */\nexport const CROSS_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"cross\", \"크로스\")\n .asAttack(TECHNIQUE_TIMING.MEDIUM.total)\n .punchChamber(TECHNIQUE_TIMING.MEDIUM.chamber, \"right\") // 준비 - Chamber at hip\n .withKoreanMiddleGuard(\"left\") // Left hand stays in guard\n .punchExtend(TECHNIQUE_TIMING.MEDIUM.extend, \"right\") // 지르기 - Extension with full hip rotation\n .withKoreanMiddleGuard(\"left\") // Left hand stays in guard\n .punchPeak(TECHNIQUE_TIMING.MEDIUM.peak, \"right\") // 정점 - Peak impact\n .withKoreanMiddleGuard(\"left\") // Left hand stays in guard\n .recover(TECHNIQUE_TIMING.MEDIUM.retract + TECHNIQUE_TIMING.MEDIUM.recover) // 복귀 - Return to guard\n .withKoreanMiddleGuard() // Both hands back to middle guard\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// PALM STRIKE (장권) - Open Palm Heel Strike\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Palm Strike - 장권\n *\n * Open palm heel strike targeting chin or solar plexus.\n * Traditional Taekwondo technique for close range.\n *\n * Total duration: 730ms (MEDIUM technique)\n *\n * @korean 장권애니메이션\n */\nexport const PALM_STRIKE_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"palm_strike\", \"장권\")\n .asAttack(TECHNIQUE_TIMING.MEDIUM.total)\n .punchWindup(TECHNIQUE_TIMING.MEDIUM.chamber) // 준비 - 150ms\n .palmStrike(TECHNIQUE_TIMING.MEDIUM.extend) // 장권 - 200ms palm heel forward\n .palmStrike(TECHNIQUE_TIMING.MEDIUM.peak) // 정점 - 80ms hold\n .recover(TECHNIQUE_TIMING.MEDIUM.retract + TECHNIQUE_TIMING.MEDIUM.recover) // 복귀 - 300ms\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// HOOK (훅) - Curved Power Punch\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Hook - 훅 (곡권 - Gokwon / 갈고리주먹 - Galgori Jumeok)\n *\n * Curved power punch targeting jaw or temple with circular trajectory.\n * Generates devastating knockout power from hip and shoulder rotation in horizontal plane.\n *\n * **Korean Martial Arts Biomechanics** (한국 무술 생체역학):\n *\n * **Stance & Weight Distribution** (자세와 체중 분배):\n * - Start: 60/40 weight distribution\n * - Peak: 55/45 - MORE BALANCED than cross (circular vs. linear power)\n * - Hip rotation: ~35-40° (0.61-0.70 rad) - MORE than cross!\n * - Pivoting: Lead foot pivots OUT ~30° on ball\n *\n * **Chamber/Wind-Up Phase - 준비 (Junbi)** [150ms]:\n * - Lead arm: Pulls BACK to side, elbow bent 90° (1.57 rad) - CRITICAL angle\n * - Fist position: At shoulder level (어깨 높이), near armpit\n * - Elbow: Points SIDEWAYS (옆으로), not down - horizontal plane strike\n * - Rear hand: PROTECTS chin (턱보호) - non-negotiable defense\n * - Hips: Coil AWAY from target side by ~10-15°\n * - Shoulders: Wind up like baseball bat swing\n * - Breathing: Deep inhale (들이마시기)\n * - Lead foot: Prepares to pivot outward\n *\n * **Rotation & Strike Phase - 회전+타격 (Hoejeon + Tagyeok)** [200ms]:\n * - Hip explosion: Rotates 35-40° toward target (MORE than cross!)\n * - Lead foot: Ball pivots OUT ~30°, heel comes up slightly\n * - Torso: Rotates WITH hips in synchronized motion\n * - Shoulder: Drives around like hammer throw\n * - Elbow: MAINTAINS 90° bend throughout strike - power comes from rotation, NOT extension\n * - Fist: Travels in HORIZONTAL ARC (수평호 - Supyeongho)\n * - Trajectory: Curves AROUND guard to strike side of head\n * - Hand position: Palm faces DOWN at impact (pronated)\n *\n * **Peak Impact - 정점 (Jeongjeom)** [100ms]:\n * - Impact zone: 턱 (jaw), 관자놀이 (temple), 귀 (ear) - knockout targets\n * - Fist alignment: Knuckles perpendicular to target surface\n * - Elbow: STILL bent 90° - rigid arm triangle structure\n * - Hip: Fully rotated, weight 55/45\n * - Breathing: Sharp exhale \"흣!\" (Heut!) with kihap\n * - Body unity: Fist, elbow, shoulder, hip aligned in CIRCULAR chain\n * - Follow-through: Hip continues rotation ~5° past impact\n *\n * **Retraction Phase - 회수 (Hoisu)** [150ms]:\n * - Fist returns via SAME CURVED PATH (same arc backward)\n * - Elbow: Maintains bend, doesn't straighten\n * - Hip: Counter-rotates back toward neutral\n * - Lead foot: Pivots back to starting position\n *\n * **Recovery Phase - 복귀 (Bokgwi)** [200ms]:\n * - Return to 중단막기 (middle guard) protecting chin\n * - Weight: Resets to 60/40 fighting stance\n * - Hips: Neutral position, ready for next technique\n * - Breathing: Controlled recovery breath\n *\n * **Combat Applications** (전투 응용):\n * - Primary target: 턱 (chin) - KNOCKOUT potential\n * - Secondary: 관자놀이 (temple) - brain concussion\n * - Tertiary: 간장 (liver) if angled downward (body hook)\n * - Combinations: After jab opens guard - 잽-훅 (Jab-Hook)\n * - Counter: When opponent ducks straight punches\n *\n * **Biomechanical Principle**: \"팔이 아니라 몸통으로 친다\"\n * (Strike with the torso, not the arm)\n * - 90° elbow angle = RIGID structure transfers rotation power\n * - Hip rotation = 70% of power generation\n * - Shoulder pivot = 20% of power\n * - Arm extension = 10% only (most people do this wrong!)\n *\n * **Common Mistakes** (흔한 실수):\n * - ❌ Extending arm (팔 펴기) - WRONG! Breaks power structure\n * - ❌ Arm-only punch (팔만 사용) - No hip rotation = weak hook\n * - ❌ Dropping rear hand (뒷손 내리기) - Gets countered!\n * - ✅ Correct: Locked 90° elbow + full hip rotation = knockout power\n *\n * **Taekwondo/Boxing Principle**: \"회전이 힘이다\" (Rotation IS power)\n * The hook is a rotational strike, not a pushing strike - physics of angular momentum!\n *\n * Total duration: 800ms (HEAVY_LIGHT technique)\n *\n * @korean 훅애니메이션\n */\nexport const HOOK_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"hook\", \"훅\")\n .asAttack(TECHNIQUE_TIMING.HEAVY_LIGHT.total)\n .hookWindup(TECHNIQUE_TIMING.HEAVY_LIGHT.chamber) // 준비 - 150ms arm pulls back\n .hookPunch(TECHNIQUE_TIMING.HEAVY_LIGHT.extend) // 타격 - 200ms curved strike\n .hookPunch(TECHNIQUE_TIMING.HEAVY_LIGHT.peak) // 정점 - 100ms hold\n .recover(\n TECHNIQUE_TIMING.HEAVY_LIGHT.retract +\n TECHNIQUE_TIMING.HEAVY_LIGHT.recover,\n ) // 복귀 - 350ms\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// LEAD HOOK (리드훅) - Quick Lead Hand Hook\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Lead Hook - 리드훅\n *\n * Fast hook with lead hand.\n * Shorter range but quicker than rear hook.\n *\n * Total duration: 700ms (MEDIUM_LIGHT technique)\n *\n * @korean 리드훅애니메이션\n */\nexport const LEAD_HOOK_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"lead_hook\", \"리드훅\")\n .asAttack(TECHNIQUE_TIMING.MEDIUM_LIGHT.total)\n .hookWindup(TECHNIQUE_TIMING.MEDIUM_LIGHT.chamber, \"left\") // Quick wind-up - 120ms (lead hand)\n .hookPunch(TECHNIQUE_TIMING.MEDIUM_LIGHT.extend, \"left\") // Fast hook - 180ms (lead hand)\n .hookPunch(TECHNIQUE_TIMING.MEDIUM_LIGHT.peak, \"left\") // Peak - 80ms\n .recover(\n TECHNIQUE_TIMING.MEDIUM_LIGHT.retract +\n TECHNIQUE_TIMING.MEDIUM_LIGHT.recover,\n ) // Recover - 320ms\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// UPPERCUT (어퍼컷) - Rising Power Punch\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Uppercut - 어퍼컷 (상승권 - Sangseung Gwon / 올려치기 - Ollyeochigi)\n *\n * Rising punch targeting chin from below using leg drive and upward hip thrust.\n * Devastating close-range knockout technique generating power from ground through vertical chain.\n *\n * **Korean Martial Arts Biomechanics** (한국 무술 생체역학):\n *\n * **Stance & Weight Distribution** (자세와 체중 분배):\n * - Start: 60/40 weight distribution\n * - Crouch: Weight shifts to 65/35 on striking side (loading)\n * - Impact: 70/30 - full commitment to vertical drive\n * - Stance width: SLIGHTLY WIDER for stable base during crouch\n *\n * **Crouch/Chamber Phase - 낮추기 (Najchugi)** [150ms]:\n * - Body: Drops CENTER OF GRAVITY by ~10-15cm (무게중심 낮추기)\n * - Striking leg: Knee bends DEEPER ~100° (1.75 rad) - loading spring\n * - Hip: Tilts backward and DOWN on striking side (~15° pelvic tilt)\n * - Striking fist: Drops to hip level, palm facing INWARD/UPWARD (손바닥 위로)\n * - Elbow: Bent ~110° (1.92 rad), close to ribs\n * - Rear hand: Maintains 중단막기 (chin protection) - critical for counters\n * - Shoulders: Dip slightly on striking side (~10° drop)\n * - Breathing: Quick inhale while loading (준비 호흡)\n * - Weight: Loads onto ball of striking-side foot\n *\n * **Drive/Explosion Phase - 상승 (Sangseung)** [200ms]:\n * - Legs: EXPLOSIVE EXTENSION - knee straightens from 100° → 170° (0.18 rad)\n * - Hip thrust: Drives UPWARD and FORWARD (~20° upward angle)\n * - Power chain: Ground → Legs → Hips → Core → Shoulder → Fist (VERTICAL)\n * - Heel: Lifts off ground as leg extends\n * - Pelvis: Thrusts upward and forward, creating hip drive\n * - Torso: Rises with hip drive, slight forward lean (~10°)\n * - Striking shoulder: Begins upward drive\n * - Fist: Starts vertical ascent along CENTERLINE\n *\n * **Strike/Extension Phase - 타격 (Tagyeok)** [100ms]:\n * - Fist: Rises in VERTICAL PATH from hip to chin level\n * - Fist rotation: Inward palm → Neutral/Pronated (90° rotation)\n * - Elbow: Remains bent ~120° (2.09 rad) throughout - NOT straight punch!\n * - Trajectory: Fist travels UPWARD at ~60-70° angle from horizontal\n * - Shoulder: Completes upward drive, elevating ~15cm\n * - Hip: Full upward thrust completed\n * - Legs: Fully extended, body at maximum height\n * - Breathing: EXPLOSIVE exhale \"우억!\" (Wueok!) - rising kihap\n *\n * **Peak Impact - 정점 (Jeongjeom)** [100ms]:\n * - Target: 턱 (chin) from BELOW - ideal knockout angle\n * - Impact surface: Knuckles facing UPWARD, hitting underside of jaw\n * - Body position: Full vertical extension, heel off ground\n * - Power delivery: ALL body mass driving UPWARD into target\n * - Neck snap: Opponent's head snaps BACKWARD and UP (knockout mechanism)\n * - Weight: 70/30 forward, committed to strike\n * - Rear hand: STILL protecting (never drops!)\n *\n * **Retraction Phase - 회수 (Hoisu)** [150ms]:\n * - Fist: Drops back toward hip via same path\n * - Body: Begins lowering back to normal height\n * - Legs: Bend slightly to absorb return motion\n * - Hip: Settles back to neutral pelvic alignment\n * - Heel: Returns to ground\n *\n * **Recovery Phase - 복귀 (Bokgwi)** [200ms]:\n * - Return to 중단막기 (middle guard) bilateral protection\n * - Center of gravity: Returns to normal fighting height\n * - Weight: Resets to 60/40 distribution\n * - Stance: 겨루기 자세 (fighting stance) restored\n * - Breathing: Controlled recovery, ready for next technique\n *\n * **Combat Applications** (전투 응용):\n * - Primary target: 턱 (chin/jaw) from below - maximum knockout potential\n * - Ideal range: CLOSE combat (0.3-0.5m) - too close for straight punches\n * - Combinations: After body shot brings opponent's hands down\n * - Counter: When opponent ducks or bends forward\n * - Liver targeting: Body uppercut to 간장 (liver) at close range\n *\n * **Biomechanical Keys** (생체역학 핵심):\n * 1. **Leg drive** (다리 추진력): 60% of power comes from legs!\n * 2. **Hip thrust** (엉덩이 밀기): 25% from upward pelvic motion\n * 3. **Shoulder lift** (어깨 들기): 10% from shoulder elevation\n * 4. **Arm** (팔): Only 5% - mostly for targeting!\n *\n * **Physics Principle**: \"상승하는 힘은 중력을 이긴다\"\n * (Rising force defeats gravity)\n * - Vertical strike vector meets horizontal chin = devastating angle\n * - Opponent's neck structure weakest against upward force\n * - Body weight + leg extension = maximum vertical power transfer\n *\n * **Common Mistakes** (흔한 실수):\n * - ❌ Arm-only punch (팔만) - No leg drive = weak uppercut\n * - ❌ Wide arc (넓은 호) - Too telegraphed and slow\n * - ❌ Straight up (수직) - Needs forward component for power\n * - ✅ Correct: Deep crouch + explosive leg extension + upward hip thrust\n *\n * **Taekwondo Principle**: \"땅에서 하늘로\" (From Earth to Heaven)\n * The uppercut exemplifies vertical power generation - like jumping!\n *\n * Total duration: 800ms (HEAVY_LIGHT technique)\n *\n * @korean 어퍼컷애니메이션\n */\nexport const UPPERCUT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"uppercut\", \"어퍼컷\")\n .asAttack(TECHNIQUE_TIMING.HEAVY_LIGHT.total)\n .uppercutCrouch(TECHNIQUE_TIMING.HEAVY_LIGHT.chamber) // 낮추기 - 150ms drop level\n .uppercutPunch(TECHNIQUE_TIMING.HEAVY_LIGHT.extend) // 상권 - 200ms rising strike\n .uppercutPunch(TECHNIQUE_TIMING.HEAVY_LIGHT.peak) // 정점 - 100ms hold\n .recover(\n TECHNIQUE_TIMING.HEAVY_LIGHT.retract +\n TECHNIQUE_TIMING.HEAVY_LIGHT.recover,\n ) // 복귀 - 350ms\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// LEAD UPPERCUT (리드어퍼컷) - Quick Lead Uppercut\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Lead Uppercut - 리드어퍼컷\n *\n * Fast uppercut with lead hand.\n * Good counter when opponent ducks.\n *\n * Total duration: 700ms (MEDIUM_LIGHT technique)\n *\n * @korean 리드어퍼컷애니메이션\n */\nexport const LEAD_UPPERCUT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"lead_uppercut\", \"리드어퍼컷\")\n .asAttack(TECHNIQUE_TIMING.MEDIUM_LIGHT.total)\n .uppercutCrouch(TECHNIQUE_TIMING.MEDIUM_LIGHT.chamber, \"left\") // Quick drop - 120ms (lead hand)\n .uppercutPunch(TECHNIQUE_TIMING.MEDIUM_LIGHT.extend, \"left\") // Fast uppercut - 180ms (lead hand)\n .uppercutPunch(TECHNIQUE_TIMING.MEDIUM_LIGHT.peak, \"left\") // Peak - 80ms\n .recover(\n TECHNIQUE_TIMING.MEDIUM_LIGHT.retract +\n TECHNIQUE_TIMING.MEDIUM_LIGHT.recover,\n ) // Recover - 320ms\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// OVERHAND (오버핸드) - Looping Power Punch\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Overhand - 오버핸드 (천권)\n *\n * Looping punch over opponent's guard.\n * High arc to strike top of head or jaw.\n *\n * Phases:\n * 1. Wind-up (준비): Arm raises high - 200ms\n * 2. Loop (호): Arm loops over - 300ms\n * 3. Strike (타격): Fist crashes down - 120ms\n * 4. Recovery (복귀): Return to guard - 380ms\n *\n * Total duration: 1000ms (HEAVY technique)\n *\n * @korean 오버핸드애니메이션\n */\nexport const OVERHAND_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"overhand\", \"오버핸드\")\n .asAttack(TECHNIQUE_TIMING.HEAVY.total)\n .overhandPunch(\n TECHNIQUE_TIMING.HEAVY.chamber + TECHNIQUE_TIMING.HEAVY.extend,\n ) // 천권 - 500ms looping strike\n .overhandPunch(TECHNIQUE_TIMING.HEAVY.peak) // 정점 - 120ms hold\n .recover(TECHNIQUE_TIMING.HEAVY.retract + TECHNIQUE_TIMING.HEAVY.recover) // 복귀 - 380ms\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// BACKFIST (등주먹) - Spinning Backfist\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Backfist - 등주먹\n *\n * Back of fist whips into target.\n * Can be spinning or direct.\n *\n * Total duration: 700ms (MEDIUM_LIGHT technique)\n *\n * @korean 등주먹애니메이션\n */\nexport const BACKFIST_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"backfist\", \"등주먹\")\n .asAttack(TECHNIQUE_TIMING.MEDIUM_LIGHT.total)\n .punchWindup(TECHNIQUE_TIMING.MEDIUM_LIGHT.chamber) // Pull back - 120ms\n .counterStrike(TECHNIQUE_TIMING.MEDIUM_LIGHT.extend) // Whip motion - 180ms\n .counterStrike(TECHNIQUE_TIMING.MEDIUM_LIGHT.peak) // Peak - 80ms\n .recover(\n TECHNIQUE_TIMING.MEDIUM_LIGHT.retract +\n TECHNIQUE_TIMING.MEDIUM_LIGHT.recover,\n ) // Recover - 320ms\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// SPINNING BACKFIST (회전등주먹) - Full Spin Backfist\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Spinning Backfist - 회전등주먹\n *\n * Full 360° rotation into backfist.\n * High-risk knockout technique.\n *\n * Total duration: 1200ms (SPINNING technique)\n *\n * @korean 회전등주먹애니메이션\n */\nexport const SPINNING_BACKFIST_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"spinning_backfist\", \"회전등주먹\")\n .asAttack(TECHNIQUE_TIMING.SPINNING.total)\n .backKickSpin(TECHNIQUE_TIMING.SPINNING.chamber) // Full spin - 300ms\n .counterStrike(TECHNIQUE_TIMING.SPINNING.extend) // Backfist on completion - 350ms\n .counterStrike(TECHNIQUE_TIMING.SPINNING.peak) // Peak - 120ms\n .spinRecover(\n TECHNIQUE_TIMING.SPINNING.retract + TECHNIQUE_TIMING.SPINNING.recover,\n ) // Complete rotation - 430ms\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// HAMMER FIST (철퇴권) - Downward Hammer Strike\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Hammer Fist - 철퇴권\n *\n * Bottom of fist strikes downward like a hammer.\n * Effective in ground-and-pound.\n *\n * Total duration: 900ms (JUMPING technique timing)\n *\n * @korean 철퇴권애니메이션\n */\nexport const HAMMER_FIST_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"hammer_fist\", \"철퇴권\")\n .asAttack(TECHNIQUE_TIMING.JUMPING.total)\n .overhandPunch(\n TECHNIQUE_TIMING.JUMPING.chamber + TECHNIQUE_TIMING.JUMPING.extend,\n ) // Similar arc to overhand - 400ms\n .overhandPunch(TECHNIQUE_TIMING.JUMPING.peak) // Peak - 80ms\n .recover(\n TECHNIQUE_TIMING.JUMPING.retract + TECHNIQUE_TIMING.JUMPING.recover,\n ) // Recover - 420ms\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// SUPERMAN PUNCH (슈퍼맨펀치) - Flying Cross\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Superman Punch - 슈퍼맨펀치\n *\n * Jumping cross punch for extended range.\n * Fakes kick then throws power punch.\n *\n * Total duration: 1000ms (HEAVY technique)\n *\n * @korean 슈퍼맨펀치애니메이션\n */\nexport const SUPERMAN_PUNCH_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"superman_punch\", \"슈퍼맨펀치\")\n .asAttack(TECHNIQUE_TIMING.HEAVY.total)\n .chamber(TECHNIQUE_TIMING.HEAVY.chamber * 0.75) // Fake kick chamber - 150ms (0.75 × 200ms)\n .punchWindup(TECHNIQUE_TIMING.HEAVY.chamber * 0.75) // Transfer to punch - 150ms\n .crossPunch(TECHNIQUE_TIMING.HEAVY.extend) // Throw cross in air - 300ms\n .crossPunch(TECHNIQUE_TIMING.HEAVY.peak) // Peak - 120ms\n .recover(TECHNIQUE_TIMING.HEAVY.recover + 0.05) // Land and recover - 280ms (230ms + 50ms landing)\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// JAB-CROSS COMBINATION (잽크로스) - 1-2 Combo\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Jab-Cross - 잽크로스\n *\n * Classic 1-2 boxing combination.\n * Lead jab sets up rear cross.\n *\n * Phases (준비, 실행, 회수, 복귀):\n * 1. Jab chamber (잽 준비): 80ms\n * 2. Jab extend (잽 실행): 120ms\n * 3. Cross transition (크로스 전환): 80ms (using peak for transition)\n * 4. Cross extend (크로스 실행): 100ms (using retract)\n * 5. Recovery (복귀): 320ms\n *\n * Total duration: 700ms (COMBO_FAST technique)\n * Sum: 80 + 120 + 80 + 100 + 320 = 700ms ✓\n *\n * @korean 잽크로스애니메이션\n */\nexport const JAB_CROSS_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"jab_cross\", \"잽크로스\")\n .asAttack(TECHNIQUE_TIMING.COMBO_FAST.total)\n .punchWindup(TECHNIQUE_TIMING.COMBO_FAST.chamber, \"left\") // Jab prep - 80ms (lead hand)\n .punchExtend(TECHNIQUE_TIMING.COMBO_FAST.extend, \"left\") // Jab lands - 120ms (lead hand)\n .punchWindup(TECHNIQUE_TIMING.COMBO_FAST.peak) // Cross transition - 80ms (rear hand wind-up)\n .punchExtend(TECHNIQUE_TIMING.COMBO_FAST.retract) // Cross lands - 100ms (rear hand)\n .recover(TECHNIQUE_TIMING.COMBO_FAST.recover) // Recover - 320ms\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// HOOK-HOOK COMBINATION (더블훅) - Double Hook\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Double Hook - 더블훅\n *\n * Left hook followed by right hook.\n * Body rotation carries momentum.\n *\n * Phases (준비, 실행, 회수, 복귀):\n * 1. First hook chamber (첫 훅 준비): 120ms (0.6 × chamber)\n * 2. First hook extend (첫 훅 실행): 180ms (0.6 × extend)\n * 3. Second hook chamber (둘째 훅 준비): 120ms (0.8 × retract)\n * 4. Second hook extend (둘째 훅 실행): 350ms (extend + 50ms)\n * 5. Recovery (복귀): 230ms\n *\n * Total duration: 1000ms (HEAVY technique)\n * Sum: 120 + 180 + 120 + 350 + 230 = 1000ms ✓\n *\n * @korean 더블훅애니메이션\n */\nexport const DOUBLE_HOOK_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"double_hook\", \"더블훅\")\n .asAttack(TECHNIQUE_TIMING.HEAVY.total)\n .hookWindup(TECHNIQUE_TIMING.HEAVY.chamber * 0.6, \"left\") // First hook prep - 120ms (lead hand)\n .hookPunch(TECHNIQUE_TIMING.HEAVY.extend * 0.6, \"left\") // First hook - 180ms (lead hand)\n .hookWindup(TECHNIQUE_TIMING.HEAVY.retract * 0.8) // Second hook prep - 120ms (rear hand)\n .hookPunch(TECHNIQUE_TIMING.HEAVY.extend + 0.05) // Second hook - 350ms (rear hand)\n .recover(TECHNIQUE_TIMING.HEAVY.recover) // Recover - 230ms\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// BODY SHOT (바디샷) - Hook to Body\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Body Shot - 바디샷\n *\n * Hook targeting ribs/liver.\n * Lower trajectory than head hook.\n *\n * Total duration: 750ms (MEDIUM_HEAVY technique)\n *\n * @korean 바디샷애니메이션\n */\nexport const BODY_SHOT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"body_shot\", \"바디샷\")\n .asAttack(TECHNIQUE_TIMING.MEDIUM_HEAVY.total)\n .uppercutCrouch(TECHNIQUE_TIMING.MEDIUM_HEAVY.chamber) // Drop level - 120ms\n .hookPunch(TECHNIQUE_TIMING.MEDIUM_HEAVY.extend) // Hook to body - 200ms\n .hookPunch(TECHNIQUE_TIMING.MEDIUM_HEAVY.peak) // Peak - 80ms\n .recover(\n TECHNIQUE_TIMING.MEDIUM_HEAVY.retract +\n TECHNIQUE_TIMING.MEDIUM_HEAVY.recover,\n ) // Recover - 350ms\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// EXPORT PUNCH ANIMATION MAP\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Map of all punch animations for easy access\n * 주먹 애니메이션 맵\n */\nexport const PUNCH_ANIMATIONS: ReadonlyMap<string, SkeletalAnimation> = new Map(\n [\n [\"jab\", JAB_ANIMATION],\n [\"cross\", CROSS_ANIMATION],\n [\"palm_strike\", PALM_STRIKE_ANIMATION],\n [\"hook\", HOOK_ANIMATION],\n [\"lead_hook\", LEAD_HOOK_ANIMATION],\n [\"uppercut\", UPPERCUT_ANIMATION],\n [\"lead_uppercut\", LEAD_UPPERCUT_ANIMATION],\n [\"overhand\", OVERHAND_ANIMATION],\n [\"backfist\", BACKFIST_ANIMATION],\n [\"spinning_backfist\", SPINNING_BACKFIST_ANIMATION],\n [\"hammer_fist\", HAMMER_FIST_ANIMATION],\n [\"superman_punch\", SUPERMAN_PUNCH_ANIMATION],\n [\"jab_cross\", JAB_CROSS_ANIMATION],\n [\"double_hook\", DOUBLE_HOOK_ANIMATION],\n [\"body_shot\", BODY_SHOT_ANIMATION],\n ],\n);\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RecoveryAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/RecoveryAnimations.ts"],"sourcesContent":["/**\n * Recovery Animation System for Black Trigram\n *\n * Implements realistic recovery animations for standing up from fallen states.\n * Based on Korean martial arts recovery techniques (기상 - Gisang).\n *\n * @module systems/animation/RecoveryAnimations\n * @category Animation\n * @korean 기상애니메이션\n */\n\nimport type { GroundState, RecoveryAnimationType } from \"../core/types\";\nimport {\n GROUND_STATE_TO_RECOVERY,\n RECOVERY_TYPE_TO_ANIMATION,\n} from \"../core/types\";\n\n/**\n * Recovery animation keyframe data structure\n *\n * Defines key poses during recovery animations for skeletal rendering.\n * Each keyframe specifies body positions at critical moments.\n *\n * @korean 기상키프레임\n */\nexport interface RecoveryKeyframe {\n /** Frame number (0-indexed) */\n readonly frame: number;\n\n /** Torso rotation (radians) */\n readonly torsoRotation: { x: number; y: number; z: number };\n\n /** Center of mass vertical position (0-1, 1=standing, 0=ground) */\n readonly centerOfMassHeight: number;\n\n /** Description of this keyframe */\n readonly description: {\n readonly korean: string;\n readonly english: string;\n };\n\n /** Whether player is vulnerable at this frame */\n readonly vulnerable: boolean;\n}\n\n/**\n * Prone stand-up keyframes (엎드린 기상)\n *\n * 30 frames (500ms) sequence:\n * - Frames 0-8: Push up with hands, torso lifts\n * - Frames 9-18: Legs swing under body, kneeling position\n * - Frames 19-24: Rise from kneeling to standing (vulnerable)\n * - Frames 25-29: Final stance adjustment (interruptible)\n *\n * @korean 엎드린기상키프레임\n */\nexport const RECOVERY_PRONE_KEYFRAMES: readonly RecoveryKeyframe[] = [\n {\n frame: 0,\n torsoRotation: { x: 1.57, y: 0, z: 0 }, // Face down (90° forward)\n centerOfMassHeight: 0.05,\n description: {\n korean: \"엎드린 자세\",\n english: \"Prone position\",\n },\n vulnerable: true,\n },\n {\n frame: 8,\n torsoRotation: { x: 1.2, y: 0, z: 0 }, // Hands pushing, torso lifting\n centerOfMassHeight: 0.2,\n description: {\n korean: \"손으로 밀어 올리기\",\n english: \"Hands push up torso\",\n },\n vulnerable: true,\n },\n {\n frame: 18,\n torsoRotation: { x: 0.7, y: 0, z: 0 }, // Kneeling position\n centerOfMassHeight: 0.5,\n description: {\n korean: \"무릎 꿇기\",\n english: \"Kneeling position\",\n },\n vulnerable: true,\n },\n {\n frame: 24,\n torsoRotation: { x: 0.2, y: 0, z: 0 }, // Rising to standing\n centerOfMassHeight: 0.75,\n description: {\n korean: \"일어서기\",\n english: \"Rising to standing\",\n },\n vulnerable: false, // Last 6 frames (24-30) entering safe zone\n },\n {\n frame: 29,\n torsoRotation: { x: 0, y: 0, z: 0 }, // Standing (interruptible)\n centerOfMassHeight: 0.9,\n description: {\n korean: \"서 있는 자세\",\n english: \"Standing stance\",\n },\n vulnerable: false, // Last 6 frames (25-30) are not vulnerable\n },\n] as const;\n\n/**\n * Supine stand-up keyframes (누운 기상)\n *\n * 36 frames (600ms) sequence:\n * - Frames 0-10: Abs crunch sit-up motion\n * - Frames 11-22: Forward roll onto feet\n * - Frames 23-30: Feet plant, rise to standing (vulnerable)\n * - Frames 31-35: Final stance adjustment (interruptible)\n *\n * @korean 누운기상키프레임\n */\nexport const RECOVERY_SUPINE_KEYFRAMES: readonly RecoveryKeyframe[] = [\n {\n frame: 0,\n torsoRotation: { x: -1.57, y: 0, z: 0 }, // Face up (90° back)\n centerOfMassHeight: 0.05,\n description: {\n korean: \"누운 자세\",\n english: \"Supine position\",\n },\n vulnerable: true,\n },\n {\n frame: 10,\n torsoRotation: { x: -0.9, y: 0, z: 0 }, // Sit-up motion\n centerOfMassHeight: 0.3,\n description: {\n korean: \"윗몸 일으키기\",\n english: \"Sit-up motion\",\n },\n vulnerable: true,\n },\n {\n frame: 22,\n torsoRotation: { x: 0.4, y: 0, z: 0 }, // Forward roll\n centerOfMassHeight: 0.4,\n description: {\n korean: \"전방 구르기\",\n english: \"Forward roll\",\n },\n vulnerable: true,\n },\n {\n frame: 30,\n torsoRotation: { x: 0.2, y: 0, z: 0 }, // Feet planted, rising\n centerOfMassHeight: 0.7,\n description: {\n korean: \"발 디디고 일어서기\",\n english: \"Feet planted, rising\",\n },\n vulnerable: false, // Last 6 frames (30-36) entering safe zone\n },\n {\n frame: 35,\n torsoRotation: { x: 0, y: 0, z: 0 }, // Standing (interruptible)\n centerOfMassHeight: 0.9,\n description: {\n korean: \"서 있는 자세\",\n english: \"Standing stance\",\n },\n vulnerable: false, // Last 6 frames (30-36) are not vulnerable\n },\n] as const;\n\n/**\n * Roll recovery keyframes (회전기상)\n *\n * 24 frames (400ms) sequence - FAST recovery\n * - Frames 0-6: Roll to side, momentum building\n * - Frames 7-14: Spring to feet with explosive movement\n * - Frames 15-18: Quick stance (vulnerable)\n * - Frames 19-23: Combat ready (interruptible)\n *\n * Costs 20 stamina for speed advantage.\n *\n * @korean 회전기상키프레임\n */\nexport const RECOVERY_ROLL_KEYFRAMES: readonly RecoveryKeyframe[] = [\n {\n frame: 0,\n torsoRotation: { x: 0, y: 1.57, z: 1.57 }, // Side position (90° roll)\n centerOfMassHeight: 0.05,\n description: {\n korean: \"측면 자세\",\n english: \"Side position\",\n },\n vulnerable: true,\n },\n {\n frame: 6,\n torsoRotation: { x: 0.3, y: 0.8, z: 0.9 }, // Rolling motion\n centerOfMassHeight: 0.25,\n description: {\n korean: \"구르기 움직임\",\n english: \"Rolling motion\",\n },\n vulnerable: true,\n },\n {\n frame: 14,\n torsoRotation: { x: 0.4, y: 0, z: 0 }, // Springing to feet\n centerOfMassHeight: 0.6,\n description: {\n korean: \"발로 튀어오르기\",\n english: \"Spring to feet\",\n },\n vulnerable: true,\n },\n {\n frame: 18,\n torsoRotation: { x: 0.1, y: 0, z: 0 }, // Quick stance\n centerOfMassHeight: 0.85,\n description: {\n korean: \"빠른 자세\",\n english: \"Quick stance\",\n },\n vulnerable: false, // Last 6 frames (18-24) entering safe zone\n },\n {\n frame: 23,\n torsoRotation: { x: 0, y: 0, z: 0 }, // Combat ready (interruptible)\n centerOfMassHeight: 0.9,\n description: {\n korean: \"전투 준비\",\n english: \"Combat ready\",\n },\n vulnerable: false, // Last 6 frames (18-24) are not vulnerable\n },\n] as const;\n\n/**\n * Defensive getup keyframes (방어기상)\n *\n * 42 frames (700ms) sequence - SLOW but protected\n * - Frames 0-14: Slow rise with arms guarding head/torso\n * - Frames 15-28: Gradual stand with maintained guard\n * - Frames 29-36: Stance formation with guard (50% damage reduction)\n * - Frames 37-41: Ready stance (interruptible)\n *\n * Provides 50% damage reduction throughout animation.\n *\n * @korean 방어기상키프레임\n */\nexport const RECOVERY_DEFENSIVE_KEYFRAMES: readonly RecoveryKeyframe[] = [\n {\n frame: 0,\n torsoRotation: { x: 1.2, y: 0, z: 0 }, // Grounded, arms up\n centerOfMassHeight: 0.05,\n description: {\n korean: \"지면에서 팔 올리기\",\n english: \"Grounded, arms up\",\n },\n vulnerable: true, // 50% damage reduction applies\n },\n {\n frame: 14,\n torsoRotation: { x: 0.9, y: 0, z: 0 }, // Slow rise, guard maintained\n centerOfMassHeight: 0.3,\n description: {\n korean: \"천천히 일어나며 방어\",\n english: \"Slow rise, guarded\",\n },\n vulnerable: true, // 50% damage reduction applies\n },\n {\n frame: 28,\n torsoRotation: { x: 0.5, y: 0, z: 0 }, // Gradual stand, guard up\n centerOfMassHeight: 0.6,\n description: {\n korean: \"점차 서며 방어 유지\",\n english: \"Gradual stand, guard up\",\n },\n vulnerable: true, // 50% damage reduction applies\n },\n {\n frame: 36,\n torsoRotation: { x: 0.2, y: 0, z: 0 }, // Stance formation, guarded\n centerOfMassHeight: 0.8,\n description: {\n korean: \"자세 형성, 방어 상태\",\n english: \"Stance formation, guarded\",\n },\n vulnerable: false, // Last 6 frames (36-42) entering safe zone (still 50% reduction)\n },\n {\n frame: 41,\n torsoRotation: { x: 0, y: 0, z: 0 }, // Ready stance (interruptible)\n centerOfMassHeight: 0.9,\n description: {\n korean: \"준비 자세\",\n english: \"Ready stance\",\n },\n vulnerable: false, // Last 6 frames (36-42) are not vulnerable\n },\n] as const;\n\n/**\n * Get keyframes for a specific recovery type\n *\n * @param recoveryType - Type of recovery animation\n * @returns Array of keyframes for that recovery type\n *\n * @korean 기상키프레임가져오기\n */\nexport function getRecoveryKeyframes(\n recoveryType: RecoveryAnimationType\n): readonly RecoveryKeyframe[] {\n switch (recoveryType) {\n case \"prone_standup\":\n return RECOVERY_PRONE_KEYFRAMES;\n case \"supine_standup\":\n return RECOVERY_SUPINE_KEYFRAMES;\n case \"roll_recovery\":\n return RECOVERY_ROLL_KEYFRAMES;\n case \"defensive_getup\":\n return RECOVERY_DEFENSIVE_KEYFRAMES;\n default:\n return RECOVERY_ROLL_KEYFRAMES;\n }\n}\n\n/**\n * Check if a frame in a recovery animation is vulnerable\n *\n * Vulnerability is determined by keyframe data. The last 6 frames\n * of each recovery animation are interruptible and not vulnerable.\n *\n * @param recoveryType - Type of recovery animation\n * @param frame - Current frame number (0-indexed)\n * @returns True if player is vulnerable at this frame\n *\n * @korean 취약프레임확인\n */\nexport function isVulnerableFrame(\n recoveryType: RecoveryAnimationType,\n frame: number\n): boolean {\n const keyframes = getRecoveryKeyframes(recoveryType);\n\n // Find the keyframe for this frame or the previous keyframe\n let currentKeyframe = keyframes[0];\n for (const kf of keyframes) {\n if (kf.frame <= frame) {\n currentKeyframe = kf;\n } else {\n break;\n }\n }\n\n return currentKeyframe.vulnerable;\n}\n\n/**\n * Determine appropriate recovery animation from ground state\n *\n * Uses ground state to select default recovery animation.\n * Side positions default to roll recovery for dynamic movement.\n *\n * @param groundState - Current ground position\n * @returns Default recovery animation type\n *\n * @example\n * ```typescript\n * const recoveryType = determineRecoveryType(\"prone\");\n * // Returns: \"prone_standup\"\n *\n * const sideRecovery = determineRecoveryType(\"side_left\");\n * // Returns: \"roll_recovery\" (default for side positions)\n * ```\n *\n * @korean 기상유형결정\n */\nexport function determineRecoveryType(\n groundState: GroundState\n): RecoveryAnimationType {\n return GROUND_STATE_TO_RECOVERY[groundState];\n}\n\n/**\n * Get recovery animation state from recovery type\n *\n * @param recoveryType - Recovery animation type\n * @returns Animation state name\n *\n * @korean 기상애니메이션상태\n */\nexport function getRecoveryAnimationState(\n recoveryType: RecoveryAnimationType\n): string {\n return RECOVERY_TYPE_TO_ANIMATION[recoveryType];\n}\n\n/**\n * Recovery animation configuration\n *\n * Additional properties for recovery animations beyond base AnimationConfig.\n *\n * @korean 기상설정\n */\nexport interface RecoveryConfig {\n /** Recovery animation type */\n readonly type: RecoveryAnimationType;\n\n /** Stamina cost to execute (0 for normal recoveries) */\n readonly staminaCost: number;\n\n /** Damage reduction percentage during animation (0-1) */\n readonly damageReduction: number;\n\n /** Number of initial vulnerable frames (first N frames are vulnerable to damage) */\n readonly vulnerableFrames: number;\n\n /** Frame when player becomes interruptible (last 6 frames typically) */\n readonly interruptibleFrame: number;\n}\n\n/**\n * Recovery animation configurations\n *\n * Defines stamina costs, damage reduction, and vulnerability windows.\n *\n * @korean 기상설정맵\n */\nexport const RECOVERY_CONFIGS: Record<RecoveryAnimationType, RecoveryConfig> = {\n prone_standup: {\n type: \"prone_standup\",\n staminaCost: 0,\n damageReduction: 0,\n vulnerableFrames: 24, // Vulnerable for first 24 frames (80%)\n interruptibleFrame: 24, // Last 6 frames (25-30) are interruptible\n },\n supine_standup: {\n type: \"supine_standup\",\n staminaCost: 0,\n damageReduction: 0,\n vulnerableFrames: 30, // Vulnerable for first 30 frames (83%)\n interruptibleFrame: 30, // Last 6 frames (30-36) are interruptible\n },\n roll_recovery: {\n type: \"roll_recovery\",\n staminaCost: 20, // Costs stamina for speed\n damageReduction: 0,\n vulnerableFrames: 18, // Vulnerable for first 18 frames (75%)\n interruptibleFrame: 18, // Last 6 frames (18-24) are interruptible\n },\n defensive_getup: {\n type: \"defensive_getup\",\n staminaCost: 0,\n damageReduction: 0.5, // 50% damage reduction throughout\n vulnerableFrames: 36, // Vulnerable for first 36 frames (86%)\n interruptibleFrame: 36, // Last 6 frames (36-42) are interruptible\n },\n};\n\n/**\n * Get recovery configuration\n *\n * @param recoveryType - Recovery animation type\n * @returns Recovery configuration\n *\n * @korean 기상설정가져오기\n */\nexport function getRecoveryConfig(\n recoveryType: RecoveryAnimationType\n): RecoveryConfig {\n return RECOVERY_CONFIGS[recoveryType];\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RecoveryAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/RecoveryAnimations.ts"],"sourcesContent":["/**\n * Recovery Animation System for Black Trigram\n *\n * Implements realistic recovery animations for standing up from fallen states.\n * Based on Korean martial arts recovery techniques (기상 - Gisang).\n *\n * @module systems/animation/RecoveryAnimations\n * @category Animation\n * @korean 기상애니메이션\n */\n\nimport type { GroundState, RecoveryAnimationType } from \"../core/types\";\nimport {\n GROUND_STATE_TO_RECOVERY,\n RECOVERY_TYPE_TO_ANIMATION,\n} from \"../core/types\";\n\n/**\n * Recovery animation keyframe data structure\n *\n * Defines key poses during recovery animations for skeletal rendering.\n * Each keyframe specifies body positions at critical moments.\n *\n * @korean 기상키프레임\n */\nexport interface RecoveryKeyframe {\n /** Frame number (0-indexed) */\n readonly frame: number;\n\n /** Torso rotation (radians) */\n readonly torsoRotation: { x: number; y: number; z: number };\n\n /** Center of mass vertical position (0-1, 1=standing, 0=ground) */\n readonly centerOfMassHeight: number;\n\n /** Description of this keyframe */\n readonly description: {\n readonly korean: string;\n readonly english: string;\n };\n\n /** Whether player is vulnerable at this frame */\n readonly vulnerable: boolean;\n}\n\n/**\n * Prone stand-up keyframes (엎드린 기상)\n *\n * 30 frames (500ms) sequence:\n * - Frames 0-8: Push up with hands, torso lifts\n * - Frames 9-18: Legs swing under body, kneeling position\n * - Frames 19-24: Rise from kneeling to standing (vulnerable)\n * - Frames 25-29: Final stance adjustment (interruptible)\n *\n * @korean 엎드린기상키프레임\n */\nexport const RECOVERY_PRONE_KEYFRAMES: readonly RecoveryKeyframe[] = [\n {\n frame: 0,\n torsoRotation: { x: 1.57, y: 0, z: 0 }, // Face down (90° forward)\n centerOfMassHeight: 0.05,\n description: {\n korean: \"엎드린 자세\",\n english: \"Prone position\",\n },\n vulnerable: true,\n },\n {\n frame: 8,\n torsoRotation: { x: 1.2, y: 0, z: 0 }, // Hands pushing, torso lifting\n centerOfMassHeight: 0.2,\n description: {\n korean: \"손으로 밀어 올리기\",\n english: \"Hands push up torso\",\n },\n vulnerable: true,\n },\n {\n frame: 18,\n torsoRotation: { x: 0.7, y: 0, z: 0 }, // Kneeling position\n centerOfMassHeight: 0.5,\n description: {\n korean: \"무릎 꿇기\",\n english: \"Kneeling position\",\n },\n vulnerable: true,\n },\n {\n frame: 24,\n torsoRotation: { x: 0.2, y: 0, z: 0 }, // Rising to standing\n centerOfMassHeight: 0.75,\n description: {\n korean: \"일어서기\",\n english: \"Rising to standing\",\n },\n vulnerable: false, // Last 6 frames (24-30) entering safe zone\n },\n {\n frame: 29,\n torsoRotation: { x: 0, y: 0, z: 0 }, // Standing (interruptible)\n centerOfMassHeight: 0.9,\n description: {\n korean: \"서 있는 자세\",\n english: \"Standing stance\",\n },\n vulnerable: false, // Last 6 frames (25-30) are not vulnerable\n },\n] as const;\n\n/**\n * Supine stand-up keyframes (누운 기상)\n *\n * 36 frames (600ms) sequence:\n * - Frames 0-10: Abs crunch sit-up motion\n * - Frames 11-22: Forward roll onto feet\n * - Frames 23-30: Feet plant, rise to standing (vulnerable)\n * - Frames 31-35: Final stance adjustment (interruptible)\n *\n * @korean 누운기상키프레임\n */\nexport const RECOVERY_SUPINE_KEYFRAMES: readonly RecoveryKeyframe[] = [\n {\n frame: 0,\n torsoRotation: { x: -1.57, y: 0, z: 0 }, // Face up (90° back)\n centerOfMassHeight: 0.05,\n description: {\n korean: \"누운 자세\",\n english: \"Supine position\",\n },\n vulnerable: true,\n },\n {\n frame: 10,\n torsoRotation: { x: -0.9, y: 0, z: 0 }, // Sit-up motion\n centerOfMassHeight: 0.3,\n description: {\n korean: \"윗몸 일으키기\",\n english: \"Sit-up motion\",\n },\n vulnerable: true,\n },\n {\n frame: 22,\n torsoRotation: { x: 0.4, y: 0, z: 0 }, // Forward roll\n centerOfMassHeight: 0.4,\n description: {\n korean: \"전방 구르기\",\n english: \"Forward roll\",\n },\n vulnerable: true,\n },\n {\n frame: 30,\n torsoRotation: { x: 0.2, y: 0, z: 0 }, // Feet planted, rising\n centerOfMassHeight: 0.7,\n description: {\n korean: \"발 디디고 일어서기\",\n english: \"Feet planted, rising\",\n },\n vulnerable: false, // Last 6 frames (30-36) entering safe zone\n },\n {\n frame: 35,\n torsoRotation: { x: 0, y: 0, z: 0 }, // Standing (interruptible)\n centerOfMassHeight: 0.9,\n description: {\n korean: \"서 있는 자세\",\n english: \"Standing stance\",\n },\n vulnerable: false, // Last 6 frames (30-36) are not vulnerable\n },\n] as const;\n\n/**\n * Roll recovery keyframes (회전기상)\n *\n * 24 frames (400ms) sequence - FAST recovery\n * - Frames 0-6: Roll to side, momentum building\n * - Frames 7-14: Spring to feet with explosive movement\n * - Frames 15-18: Quick stance (vulnerable)\n * - Frames 19-23: Combat ready (interruptible)\n *\n * Costs 20 stamina for speed advantage.\n *\n * @korean 회전기상키프레임\n */\nexport const RECOVERY_ROLL_KEYFRAMES: readonly RecoveryKeyframe[] = [\n {\n frame: 0,\n torsoRotation: { x: 0, y: 1.57, z: 1.57 }, // Side position (90° roll)\n centerOfMassHeight: 0.05,\n description: {\n korean: \"측면 자세\",\n english: \"Side position\",\n },\n vulnerable: true,\n },\n {\n frame: 6,\n torsoRotation: { x: 0.3, y: 0.8, z: 0.9 }, // Rolling motion\n centerOfMassHeight: 0.25,\n description: {\n korean: \"구르기 움직임\",\n english: \"Rolling motion\",\n },\n vulnerable: true,\n },\n {\n frame: 14,\n torsoRotation: { x: 0.4, y: 0, z: 0 }, // Springing to feet\n centerOfMassHeight: 0.6,\n description: {\n korean: \"발로 튀어오르기\",\n english: \"Spring to feet\",\n },\n vulnerable: true,\n },\n {\n frame: 18,\n torsoRotation: { x: 0.1, y: 0, z: 0 }, // Quick stance\n centerOfMassHeight: 0.85,\n description: {\n korean: \"빠른 자세\",\n english: \"Quick stance\",\n },\n vulnerable: false, // Last 6 frames (18-24) entering safe zone\n },\n {\n frame: 23,\n torsoRotation: { x: 0, y: 0, z: 0 }, // Combat ready (interruptible)\n centerOfMassHeight: 0.9,\n description: {\n korean: \"전투 준비\",\n english: \"Combat ready\",\n },\n vulnerable: false, // Last 6 frames (18-24) are not vulnerable\n },\n] as const;\n\n/**\n * Defensive getup keyframes (방어기상)\n *\n * 42 frames (700ms) sequence - SLOW but protected\n * - Frames 0-14: Slow rise with arms guarding head/torso\n * - Frames 15-28: Gradual stand with maintained guard\n * - Frames 29-36: Stance formation with guard (50% damage reduction)\n * - Frames 37-41: Ready stance (interruptible)\n *\n * Provides 50% damage reduction throughout animation.\n *\n * @korean 방어기상키프레임\n */\nexport const RECOVERY_DEFENSIVE_KEYFRAMES: readonly RecoveryKeyframe[] = [\n {\n frame: 0,\n torsoRotation: { x: 1.2, y: 0, z: 0 }, // Grounded, arms up\n centerOfMassHeight: 0.05,\n description: {\n korean: \"지면에서 팔 올리기\",\n english: \"Grounded, arms up\",\n },\n vulnerable: true, // 50% damage reduction applies\n },\n {\n frame: 14,\n torsoRotation: { x: 0.9, y: 0, z: 0 }, // Slow rise, guard maintained\n centerOfMassHeight: 0.3,\n description: {\n korean: \"천천히 일어나며 방어\",\n english: \"Slow rise, guarded\",\n },\n vulnerable: true, // 50% damage reduction applies\n },\n {\n frame: 28,\n torsoRotation: { x: 0.5, y: 0, z: 0 }, // Gradual stand, guard up\n centerOfMassHeight: 0.6,\n description: {\n korean: \"점차 서며 방어 유지\",\n english: \"Gradual stand, guard up\",\n },\n vulnerable: true, // 50% damage reduction applies\n },\n {\n frame: 36,\n torsoRotation: { x: 0.2, y: 0, z: 0 }, // Stance formation, guarded\n centerOfMassHeight: 0.8,\n description: {\n korean: \"자세 형성, 방어 상태\",\n english: \"Stance formation, guarded\",\n },\n vulnerable: false, // Last 6 frames (36-42) entering safe zone (still 50% reduction)\n },\n {\n frame: 41,\n torsoRotation: { x: 0, y: 0, z: 0 }, // Ready stance (interruptible)\n centerOfMassHeight: 0.9,\n description: {\n korean: \"준비 자세\",\n english: \"Ready stance\",\n },\n vulnerable: false, // Last 6 frames (36-42) are not vulnerable\n },\n] as const;\n\n/**\n * Get keyframes for a specific recovery type\n *\n * @param recoveryType - Type of recovery animation\n * @returns Array of keyframes for that recovery type\n *\n * @korean 기상키프레임가져오기\n */\nexport function getRecoveryKeyframes(\n recoveryType: RecoveryAnimationType\n): readonly RecoveryKeyframe[] {\n switch (recoveryType) {\n case \"prone_standup\":\n return RECOVERY_PRONE_KEYFRAMES;\n case \"supine_standup\":\n return RECOVERY_SUPINE_KEYFRAMES;\n case \"roll_recovery\":\n return RECOVERY_ROLL_KEYFRAMES;\n case \"defensive_getup\":\n return RECOVERY_DEFENSIVE_KEYFRAMES;\n default:\n return RECOVERY_ROLL_KEYFRAMES;\n }\n}\n\n/**\n * Check if a frame in a recovery animation is vulnerable\n *\n * Vulnerability is determined by keyframe data. The last 6 frames\n * of each recovery animation are interruptible and not vulnerable.\n *\n * @param recoveryType - Type of recovery animation\n * @param frame - Current frame number (0-indexed)\n * @returns True if player is vulnerable at this frame\n *\n * @korean 취약프레임확인\n */\nexport function isVulnerableFrame(\n recoveryType: RecoveryAnimationType,\n frame: number\n): boolean {\n const keyframes = getRecoveryKeyframes(recoveryType);\n\n // Find the keyframe for this frame or the previous keyframe\n let currentKeyframe = keyframes[0];\n for (const kf of keyframes) {\n if (kf.frame <= frame) {\n currentKeyframe = kf;\n } else {\n break;\n }\n }\n\n return currentKeyframe.vulnerable;\n}\n\n/**\n * Determine appropriate recovery animation from ground state\n *\n * Uses ground state to select default recovery animation.\n * Side positions default to roll recovery for dynamic movement.\n *\n * @param groundState - Current ground position\n * @returns Default recovery animation type\n *\n * @example\n * ```typescript\n * const recoveryType = determineRecoveryType(\"prone\");\n * // Returns: \"prone_standup\"\n *\n * const sideRecovery = determineRecoveryType(\"side_left\");\n * // Returns: \"roll_recovery\" (default for side positions)\n * ```\n *\n * @korean 기상유형결정\n */\nexport function determineRecoveryType(\n groundState: GroundState\n): RecoveryAnimationType {\n return GROUND_STATE_TO_RECOVERY[groundState];\n}\n\n/**\n * Get recovery animation state from recovery type\n *\n * @param recoveryType - Recovery animation type\n * @returns Animation state name\n *\n * @korean 기상애니메이션상태\n */\nexport function getRecoveryAnimationState(\n recoveryType: RecoveryAnimationType\n): string {\n return RECOVERY_TYPE_TO_ANIMATION[recoveryType];\n}\n\n/**\n * Recovery animation configuration\n *\n * Additional properties for recovery animations beyond base AnimationConfig.\n *\n * @korean 기상설정\n */\nexport interface RecoveryConfig {\n /** Recovery animation type */\n readonly type: RecoveryAnimationType;\n\n /** Stamina cost to execute (0 for normal recoveries) */\n readonly staminaCost: number;\n\n /** Damage reduction percentage during animation (0-1) */\n readonly damageReduction: number;\n\n /** Number of initial vulnerable frames (first N frames are vulnerable to damage) */\n readonly vulnerableFrames: number;\n\n /** Frame when player becomes interruptible (last 6 frames typically) */\n readonly interruptibleFrame: number;\n}\n\n/**\n * Recovery animation configurations\n *\n * Defines stamina costs, damage reduction, and vulnerability windows.\n *\n * @korean 기상설정맵\n */\nexport const RECOVERY_CONFIGS: Record<RecoveryAnimationType, RecoveryConfig> = {\n prone_standup: {\n type: \"prone_standup\",\n staminaCost: 0,\n damageReduction: 0,\n vulnerableFrames: 24, // Vulnerable for first 24 frames (80%)\n interruptibleFrame: 24, // Last 6 frames (25-30) are interruptible\n },\n supine_standup: {\n type: \"supine_standup\",\n staminaCost: 0,\n damageReduction: 0,\n vulnerableFrames: 30, // Vulnerable for first 30 frames (83%)\n interruptibleFrame: 30, // Last 6 frames (30-36) are interruptible\n },\n roll_recovery: {\n type: \"roll_recovery\",\n staminaCost: 20, // Costs stamina for speed\n damageReduction: 0,\n vulnerableFrames: 18, // Vulnerable for first 18 frames (75%)\n interruptibleFrame: 18, // Last 6 frames (18-24) are interruptible\n },\n defensive_getup: {\n type: \"defensive_getup\",\n staminaCost: 0,\n damageReduction: 0.5, // 50% damage reduction throughout\n vulnerableFrames: 36, // Vulnerable for first 36 frames (86%)\n interruptibleFrame: 36, // Last 6 frames (36-42) are interruptible\n },\n};\n\n/**\n * Get recovery configuration\n *\n * @param recoveryType - Recovery animation type\n * @returns Recovery configuration\n *\n * @korean 기상설정가져오기\n */\nexport function getRecoveryConfig(\n recoveryType: RecoveryAnimationType\n): RecoveryConfig {\n return RECOVERY_CONFIGS[recoveryType];\n}\n"],"mappings":";;;;;;;;;;;;;AAwDA,IAAa,2BAAwD;CACnE;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAM,GAAG;GAAG,GAAG;EAAE;EACrC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;EACX;EACA,YAAY;CACd;CACA;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAK,GAAG;GAAG,GAAG;EAAE;EACpC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;EACX;EACA,YAAY;CACd;CACA;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAK,GAAG;GAAG,GAAG;EAAE;EACpC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;EACX;EACA,YAAY;CACd;CACA;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAK,GAAG;GAAG,GAAG;EAAE;EACpC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;EACX;EACA,YAAY;CACd;CACA;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAG,GAAG;GAAG,GAAG;EAAE;EAClC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;EACX;EACA,YAAY;CACd;AACF;;;;;;;;;;;;AAaA,IAAa,4BAAyD;CACpE;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAO,GAAG;GAAG,GAAG;EAAE;EACtC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;EACX;EACA,YAAY;CACd;CACA;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAM,GAAG;GAAG,GAAG;EAAE;EACrC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;EACX;EACA,YAAY;CACd;CACA;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAK,GAAG;GAAG,GAAG;EAAE;EACpC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;EACX;EACA,YAAY;CACd;CACA;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAK,GAAG;GAAG,GAAG;EAAE;EACpC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;EACX;EACA,YAAY;CACd;CACA;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAG,GAAG;GAAG,GAAG;EAAE;EAClC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;EACX;EACA,YAAY;CACd;AACF;;;;;;;;;;;;;;AAeA,IAAa,0BAAuD;CAClE;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAG,GAAG;GAAM,GAAG;EAAK;EACxC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;EACX;EACA,YAAY;CACd;CACA;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAK,GAAG;GAAK,GAAG;EAAI;EACxC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;EACX;EACA,YAAY;CACd;CACA;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAK,GAAG;GAAG,GAAG;EAAE;EACpC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;EACX;EACA,YAAY;CACd;CACA;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAK,GAAG;GAAG,GAAG;EAAE;EACpC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;EACX;EACA,YAAY;CACd;CACA;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAG,GAAG;GAAG,GAAG;EAAE;EAClC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;EACX;EACA,YAAY;CACd;AACF;;;;;;;;;;;;;;AAeA,IAAa,+BAA4D;CACvE;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAK,GAAG;GAAG,GAAG;EAAE;EACpC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;EACX;EACA,YAAY;CACd;CACA;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAK,GAAG;GAAG,GAAG;EAAE;EACpC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;EACX;EACA,YAAY;CACd;CACA;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAK,GAAG;GAAG,GAAG;EAAE;EACpC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;EACX;EACA,YAAY;CACd;CACA;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAK,GAAG;GAAG,GAAG;EAAE;EACpC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;EACX;EACA,YAAY;CACd;CACA;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAG,GAAG;GAAG,GAAG;EAAE;EAClC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;EACX;EACA,YAAY;CACd;AACF;;;;;;;;;AAUA,SAAgB,qBACd,cAC6B;CAC7B,QAAQ,cAAR;EACE,KAAK,iBACH,OAAO;EACT,KAAK,kBACH,OAAO;EACT,KAAK,iBACH,OAAO;EACT,KAAK,mBACH,OAAO;EACT,SACE,OAAO;CACX;AACF;;;;;;;;;;;;;AAcA,SAAgB,kBACd,cACA,OACS;CACT,MAAM,YAAY,qBAAqB,YAAY;CAGnD,IAAI,kBAAkB,UAAU;CAChC,KAAK,MAAM,MAAM,WACf,IAAI,GAAG,SAAS,OACd,kBAAkB;MAElB;CAIJ,OAAO,gBAAgB;AACzB;;;;;;;;;;;;;;;;;;;;;AAsBA,SAAgB,sBACd,aACuB;CACvB,OAAO,yBAAyB;AAClC;;;;;;;;;AAUA,SAAgB,0BACd,cACQ;CACR,OAAO,2BAA2B;AACpC;;;;;;;;AAiCA,IAAa,mBAAkE;CAC7E,eAAe;EACb,MAAM;EACN,aAAa;EACb,iBAAiB;EACjB,kBAAkB;EAClB,oBAAoB;CACtB;CACA,gBAAgB;EACd,MAAM;EACN,aAAa;EACb,iBAAiB;EACjB,kBAAkB;EAClB,oBAAoB;CACtB;CACA,eAAe;EACb,MAAM;EACN,aAAa;EACb,iBAAiB;EACjB,kBAAkB;EAClB,oBAAoB;CACtB;CACA,iBAAiB;EACf,MAAM;EACN,aAAa;EACb,iBAAiB;EACjB,kBAAkB;EAClB,oBAAoB;CACtB;AACF;;;;;;;;;AAUA,SAAgB,kBACd,cACgB;CAChB,OAAO,iBAAiB;AAC1B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SonStanceAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/SonStanceAnimations.ts"],"sourcesContent":["/**\n * ☴ Son (Wind) Stance-Specific Animations\n *\n * Specialized idle, movement, guard, and combat animations for the Son (손/Wind) trigram.\n * Embodies continuous pressure and flowing combinations from Taekyon rhythmic combat.\n *\n * **Korean Martial Arts Context:**\n * - **무술**: 택견 유동 기술 (Taekyon Fluid Movement)\n * - **특성**: 지속적 압박 (Continuous Pressure), 흐르는 연속 공격 (Flowing Combinations)\n * - **철학**: 바람의 끊임없음 (Wind's Relentlessness), 소용돌이의 힘 (Whirlwind Power)\n * - **대표 기술**: 선풍연격 (Whirlwind Strike/Continuous Pressure), 회오리 타격 (Sweeping Strikes)\n *\n * @module systems/animation/catalogs/SonStanceAnimations\n * @category Animation\n * @korean 손괘자세애니메이션\n */\n\nimport { BoneName, type SkeletalAnimation } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\n\n// Import Son Wind continuous techniques (손괘 연속 타격)\nimport {\n SON_WHIRLWIND_STRIKE_ANIMATION,\n SON_SWEEPING_MULTI_STRIKE,\n} from \"./SonTechniqueAnimations\";\n\n/**\n * Anatomical safety constants for Son (Wind) trigram animations\n *\n * These limits document safe physiological ranges validated by Korean martial arts experts\n * and inform the design of all Son animations to ensure realistic, safe joint mechanics.\n *\n * Note: These are documentation constants that guide animation design. Actual animation\n * rotations stay well within these limits naturally through authentic Taekyon biomechanics.\n *\n * @internal Documentation-only constants for animation design reference\n */\nexport const ANATOMICAL_LIMITS_SON_STANCE = {\n /**\n * Maximum safe shoulder rotation for continuous circular motion: ±90° (±1.57 radians)\n *\n * Son (Wind) emphasizes fluid circular motion requiring safe shoulder range.\n */\n MAX_SHOULDER_ROTATION: 1.57, // ±90° in radians\n\n /**\n * Maximum safe elbow flexion for flowing transitions: 145° (2.53 radians)\n *\n * Allows natural flowing guard positions and continuous strike transitions.\n */\n MAX_ELBOW_FLEXION: 2.53, // 145° in radians\n\n /**\n * Maximum safe hip rotation for circular movement: ±70° (±1.22 radians)\n *\n * Hip rotation drives circular footwork and sweeping techniques.\n */\n MAX_HIP_ROTATION: 1.22, // ±70° in radians\n} as const;\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☴ SON IDLE SWAYING ANIMATION (손괘 흐름 자세)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Son Idle Swaying Animation\n *\n * **Korean**: 손괘 흐름 자세 (Son-gwae Heureum Jase)\n * **Philosophy**: Wind's endless flow through rhythmic swaying like trees in breeze\n *\n * Characteristics:\n * - Gentle swaying motion side-to-side\n * - Rhythmic breathing with flowing upper body\n * - Hands moving in small continuous circles\n * - Weight shifting foot to foot continuously\n * - Head tracking with fluid neck movement\n *\n * Animation Cycle:\n * - 0ms: Neutral center position\n * - 700ms: Sway left with circular hand motion\n * - 1400ms: Return to center\n * - 2100ms: Sway right with circular hand motion\n * - 2800ms: Return to start (complete cycle)\n *\n * @korean 손괘흐름자세\n * @duration 2800ms (2.8 second cycle)\n * @category Idle Animation\n */\nexport const SON_IDLE_SWAYING: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"son_idle_swaying\", \"손괘 흐름 자세\")\n .asIdle(2.8, true)\n // Keyframe 0ms: Neutral center (baseline)\n .at(0)\n .rotate(BoneName.PELVIS, 0, 0, 0.03) // 0°, 0°, 2° (slight lean right)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0) // Neutral spine\n .rotate(BoneName.SHOULDER_L, 0.17, 0.09, -0.26) // 10°, 5°, -15° (flowing guard)\n .rotate(BoneName.SHOULDER_R, 0.17, -0.09, 0.26) // 10°, -5°, 15°\n .rotate(BoneName.ELBOW_L, 0, 0, -1.57) // -90° (bent guard)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.57) // 90° (bent guard)\n .rotate(BoneName.WRIST_L, 0, 0, -0.09) // 0°, 0°, -5° (circular hand motion start)\n .rotate(BoneName.WRIST_R, 0, 0, 0.09) // 0°, 0°, 5°\n .rotate(BoneName.HEAD, 0, 0, 0) // Neutral head\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Keyframe 700ms: Sway left with circular flow\n .at(0.7)\n .rotate(BoneName.PELVIS, 0, 0, -0.07) // 0°, 0°, -4° (lean left)\n .rotate(BoneName.SPINE_UPPER, 0, -0.05, 0) // 0°, -3°, 0° (upper body follows)\n .rotate(BoneName.SHOULDER_L, 0.21, 0.12, -0.3) // 12°, 7°, -17° (left shoulder rises)\n .rotate(BoneName.SHOULDER_R, 0.14, -0.05, 0.22) // 8°, -3°, 13° (right shoulder drops)\n .rotate(BoneName.WRIST_L, 0.09, 0, -0.17) // 5°, 0°, -10° (hands continue circles)\n .rotate(BoneName.WRIST_R, -0.09, 0, 0.17) // -5°, 0°, 10°\n .rotate(BoneName.HEAD, 0, -0.05, -0.03) // 0°, -3°, -2° (head tracks with flow)\n .position(BoneName.PELVIS, -0.02, 0, 0) // Minimal lateral shift\n .done<MartialArtsAnimationBuilder>()\n // Keyframe 1400ms: Return to center\n .at(1.4)\n .rotate(BoneName.PELVIS, 0, 0, 0) // Return to neutral\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .rotate(BoneName.SHOULDER_L, 0.17, 0.09, -0.26)\n .rotate(BoneName.SHOULDER_R, 0.17, -0.09, 0.26)\n .rotate(BoneName.WRIST_L, 0, 0, -0.09)\n .rotate(BoneName.WRIST_R, 0, 0, 0.09)\n .rotate(BoneName.HEAD, 0, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Keyframe 2100ms: Sway right with circular flow\n .at(2.1)\n .rotate(BoneName.PELVIS, 0, 0, 0.07) // 0°, 0°, 4° (lean right)\n .rotate(BoneName.SPINE_UPPER, 0, 0.05, 0) // 0°, 3°, 0° (upper body follows)\n .rotate(BoneName.SHOULDER_L, 0.14, 0.05, -0.22) // 8°, 3°, -13° (left shoulder drops)\n .rotate(BoneName.SHOULDER_R, 0.21, -0.12, 0.3) // 12°, -7°, 17° (right shoulder rises)\n .rotate(BoneName.WRIST_L, -0.09, 0, 0) // -5°, 0°, 0° (hands reverse circles)\n .rotate(BoneName.WRIST_R, 0.09, 0, 0) // 5°, 0°, 0°\n .rotate(BoneName.HEAD, 0, 0.05, 0.03) // 0°, 3°, 2° (head tracks with flow)\n .position(BoneName.PELVIS, 0.02, 0, 0) // Minimal lateral shift right\n .done<MartialArtsAnimationBuilder>()\n // Keyframe 2800ms: Return to start (complete cycle)\n .at(2.8)\n .rotate(BoneName.PELVIS, 0, 0, 0.03)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .rotate(BoneName.SHOULDER_L, 0.17, 0.09, -0.26)\n .rotate(BoneName.SHOULDER_R, 0.17, -0.09, 0.26)\n .rotate(BoneName.WRIST_L, 0, 0, -0.09)\n .rotate(BoneName.WRIST_R, 0, 0, 0.09)\n .rotate(BoneName.HEAD, 0, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☴ SON FLOWING ARC STEP (바람 호 걸음)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Son Flowing Arc Step Animation\n *\n * **Korean**: 바람 호 걸음 (Baram Ho Georeum) - Wind Arc Step\n * **Technique**: Arc-shaped forward movement with hip-led circular motion\n *\n * Characteristics:\n * - Forward movement follows arc path (not straight)\n * - Hips lead with circular motion\n * - Arms swing naturally with momentum\n * - Smooth weight transfer through arc\n * - Continuous flowing transition\n *\n * Animation Phases:\n * - 0-200ms: Initial hip rotation and weight shift\n * - 200-500ms: Arc path forward with hip driving\n * - 500-667ms: Landing and settling into flowing position\n *\n * @korean 바람호걸음\n * @frames 12-16 frames (~42-56ms per frame at 60fps)\n * @duration 667ms\n * @category Movement Animation\n */\nexport const SON_FLOWING_ARC_STEP: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"son_flowing_arc_step\", \"바람 호 걸음\")\n .asMovement(0.667, false)\n // Phase 1: Initial hip rotation (0ms)\n .at(0)\n .rotate(BoneName.PELVIS, 0.09, -0.26, 0) // 5°, -15°, 0° (hip winds for arc)\n .rotate(BoneName.SPINE_UPPER, 0.12, -0.17, 0) // 7°, -10°, 0° (torso follows hip)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20° (rear leg ready to push)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (lead leg ready)\n .rotate(BoneName.SHOULDER_L, 0.17, 0.17, -0.26) // 10°, 10°, -15° (arms begin swing)\n .rotate(BoneName.SHOULDER_R, 0.17, -0.17, 0.26) // 10°, -10°, 15°\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Arc path forward (400ms)\n .at(0.4)\n .rotate(BoneName.PELVIS, 0.14, -0.17, 0) // 8°, -10°, 0° (unwinding through arc)\n .rotate(BoneName.SPINE_UPPER, 0.17, -0.09, 0) // 10°, -5°, 0°\n .rotate(BoneName.KNEE_R, -0.17, 0, 0) // -10° (rear leg extending)\n .rotate(BoneName.KNEE_L, -0.52, 0, 0) // -30° (lead leg absorbing weight)\n .rotate(BoneName.SHOULDER_L, 0.21, 0.26, -0.35) // 12°, 15°, -20° (arms swing with momentum)\n .rotate(BoneName.SHOULDER_R, 0.21, -0.26, 0.35) // 12°, -15°, 20°\n .position(BoneName.PELVIS, -0.12, 0.02, 0.25) // Arc trajectory (slight left, up, forward)\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Landing and settling (667ms)\n .at(0.667)\n .rotate(BoneName.PELVIS, 0.09, -0.26, 0) // 5°, -15°, 0° (settled in arc position)\n .rotate(BoneName.SPINE_UPPER, 0.12, -0.17, 0) // 7°, -10°, 0°\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (rear leg stable)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° (lead leg grounded)\n .rotate(BoneName.SHOULDER_L, 0.17, 0.17, -0.26) // Return to flowing guard\n .rotate(BoneName.SHOULDER_R, 0.17, -0.17, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.57) // -90° guard position\n .rotate(BoneName.ELBOW_R, 0, 0, 1.57) // 90° guard position\n .position(BoneName.PELVIS, -0.15, 0, 0.35) // Final arc position\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☴ SON SWEEPING CIRCLE STEP (회오리 원형보)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Son Sweeping Circle Step Animation\n *\n * **Korean**: 회오리 원형보 (Hoeori Wonhyeongbo) - Whirlwind Circle Step\n * **Technique**: Full circular movement around opponent while maintaining orientation\n *\n * Characteristics:\n * - Complete circular path around target\n * - Body remains oriented toward opponent\n * - Hands maintain guard while circling\n * - Continuous flow without stopping\n * - Weight transfer smoothly through circle\n *\n * Animation Phases:\n * - 0-280ms: Initial circular pivot\n * - 280-700ms: Circular arc movement\n * - 700-889ms: Complete circle and settle\n *\n * @korean 회오리원형보\n * @frames 14-18 frames (~49-63ms per frame at 60fps)\n * @duration 889ms\n * @category Movement Animation\n */\nexport const SON_SWEEPING_CIRCLE_STEP: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"son_sweeping_circle_step\",\n \"회오리 원형보\",\n )\n .asMovement(0.889, false)\n // Phase 1: Initial circular pivot (0ms)\n .at(0)\n .rotate(BoneName.PELVIS, 0.09, -0.79, 0) // 5°, -45°, 0° (begin rotation)\n .rotate(BoneName.SPINE_UPPER, 0.12, -0.87, 0) // 7°, -50°, 0° (torso leads)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20° (pivot foot)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stepping foot)\n .rotate(BoneName.SHOULDER_L, 0.17, 0.09, -0.26) // Maintain guard\n .rotate(BoneName.SHOULDER_R, 0.17, -0.09, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.57)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.57)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Circular arc movement (490ms)\n .at(0.49)\n .rotate(BoneName.PELVIS, 0.09, -1.57, 0) // 5°, -90°, 0° (quarter circle)\n .rotate(BoneName.SPINE_UPPER, 0.12, -1.74, 0) // 7°, -100°, 0°\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (pivot stable)\n .rotate(BoneName.KNEE_L, -0.44, 0, 0) // -25° (stepping load)\n .rotate(BoneName.HEAD, 0, -0.87, 0) // 0°, -50°, 0° (head tracks target)\n .position(BoneName.PELVIS, -0.25, 0.02, 0.1) // Circular path (left and slight forward)\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Complete circle (889ms)\n .at(0.889)\n .rotate(BoneName.PELVIS, 0.09, -2.79, 0) // 5°, -160°, 0° (near full circle)\n .rotate(BoneName.SPINE_UPPER, 0.12, -2.79, 0) // 7°, -160°, 0° (spine follows pelvis)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (stable)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° (grounded)\n .rotate(BoneName.SHOULDER_L, 0.17, 0.09, -0.26) // Guard maintained throughout\n .rotate(BoneName.SHOULDER_R, 0.17, -0.09, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.57)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.57)\n .rotate(BoneName.HEAD, 0, -2.79, 0) // 0°, -160°, 0° (head follows rotation)\n .position(BoneName.PELVIS, -0.35, 0, -0.1) // Complete circular position\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☴ SON MOBILE GUARD TRANSITION (바람 방어 전환)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Son Mobile Guard Transition Animation\n *\n * **Korean**: 바람 방어 (Baram Bangeo) - Wind Guard\n * **Technique**: Transition into Son's characteristic mobile guard with micro-adjustments\n *\n * Characteristics:\n * - Hands in constant subtle motion (micro-adjustments)\n * - Shoulders relaxed, ready to flow\n * - Weight centered, ready to move any direction\n * - Head tracking opponent with fluid neck movement\n * - Continuous readiness for pressure attacks\n *\n * Animation Phases:\n * - 0-180ms: Begin transition with hand repositioning\n * - 180-360ms: Settle into mobile guard with micro-adjustments\n *\n * @korean 바람방어\n * @duration 360ms\n * @category Stance Animation\n */\nexport const SON_MOBILE_GUARD_TRANSITION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"son_mobile_guard_transition\", \"바람 방어\")\n .asStance(0.36, false)\n // Phase 1: Begin transition (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_L, 0.14, 0.07, -0.22) // 8°, 4°, -12.5° (moving toward guard)\n .rotate(BoneName.SHOULDER_R, 0.14, -0.07, 0.22) // 8°, -4°, 12.5°\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4) // -80° (transitioning)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4) // 80° (transitioning)\n .rotate(BoneName.WRIST_L, 0, 0, -0.05) // Slight wrist adjustment\n .rotate(BoneName.WRIST_R, 0, 0, 0.05)\n .rotate(BoneName.PELVIS, 0, 0, 0) // Neutral pelvis\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable stance)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (stable stance)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Settle into mobile guard (360ms)\n .at(0.36)\n .rotate(BoneName.SHOULDER_L, 0.17, 0.09, -0.26) // 10°, 5°, -15° (Son guard)\n .rotate(BoneName.SHOULDER_R, 0.17, -0.09, 0.26) // 10°, -5°, 15°\n .rotate(BoneName.ELBOW_L, 0, 0, -1.57) // -90° (Son guard angle)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.57) // 90° (Son guard angle)\n .rotate(BoneName.WRIST_L, 0, 0, -0.09) // 0°, 0°, -5° (micro-adjustment position)\n .rotate(BoneName.WRIST_R, 0, 0, 0.09) // 0°, 0°, 5°\n .rotate(BoneName.HEAD, 0, 0, 0) // Neutral tracking\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable stance)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (stable stance)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// EXPORTS\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Map of all Son stance-specific animations for easy access\n * @korean 손괘자세애니메이션맵\n */\nexport const SON_STANCE_ANIMATIONS: ReadonlyMap<string, SkeletalAnimation> =\n new Map([\n // Idle & Movement\n [\"son_idle_swaying\", SON_IDLE_SWAYING],\n [\"son_flowing_arc_step\", SON_FLOWING_ARC_STEP],\n [\"son_sweeping_circle_step\", SON_SWEEPING_CIRCLE_STEP],\n\n // Stance Transitions\n [\"son_mobile_guard_transition\", SON_MOBILE_GUARD_TRANSITION],\n \n // Wind Continuous Strike Techniques (손괘 연속 타격)\n [\"son_whirlwind_strike\", SON_WHIRLWIND_STRIKE_ANIMATION],\n [\"son_sweeping_multi_strike\", SON_SWEEPING_MULTI_STRIKE],\n ]);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwFA,IAAa,mBACX,4BAA4B,OAAO,oBAAoB,WAAW,CAC/D,OAAO,KAAK,KAAK,CAEjB,GAAG,EAAE,CACL,OAAO,SAAS,QAAQ,GAAG,GAAG,IAAK,CACnC,OAAO,SAAS,aAAa,GAAG,GAAG,EAAE,CACrC,OAAO,SAAS,YAAY,KAAM,KAAM,KAAM,CAC9C,OAAO,SAAS,YAAY,KAAM,MAAO,IAAK,CAC9C,OAAO,SAAS,SAAS,GAAG,GAAG,MAAM,CACrC,OAAO,SAAS,SAAS,GAAG,GAAG,KAAK,CACpC,OAAO,SAAS,SAAS,GAAG,GAAG,KAAM,CACrC,OAAO,SAAS,SAAS,GAAG,GAAG,IAAK,CACpC,OAAO,SAAS,MAAM,GAAG,GAAG,EAAE,CAC9B,SAAS,SAAS,QAAQ,GAAG,GAAG,EAAE,CAClC,MAAmC,CAEnC,GAAG,GAAI,CACP,OAAO,SAAS,QAAQ,GAAG,GAAG,KAAM,CACpC,OAAO,SAAS,aAAa,GAAG,MAAO,EAAE,CACzC,OAAO,SAAS,YAAY,KAAM,KAAM,IAAK,CAC7C,OAAO,SAAS,YAAY,KAAM,MAAO,IAAK,CAC9C,OAAO,SAAS,SAAS,KAAM,GAAG,KAAM,CACxC,OAAO,SAAS,SAAS,MAAO,GAAG,IAAK,CACxC,OAAO,SAAS,MAAM,GAAG,MAAO,KAAM,CACtC,SAAS,SAAS,QAAQ,MAAO,GAAG,EAAE,CACtC,MAAmC,CAEnC,GAAG,IAAI,CACP,OAAO,SAAS,QAAQ,GAAG,GAAG,EAAE,CAChC,OAAO,SAAS,aAAa,GAAG,GAAG,EAAE,CACrC,OAAO,SAAS,YAAY,KAAM,KAAM,KAAM,CAC9C,OAAO,SAAS,YAAY,KAAM,MAAO,IAAK,CAC9C,OAAO,SAAS,SAAS,GAAG,GAAG,KAAM,CACrC,OAAO,SAAS,SAAS,GAAG,GAAG,IAAK,CACpC,OAAO,SAAS,MAAM,GAAG,GAAG,EAAE,CAC9B,SAAS,SAAS,QAAQ,GAAG,GAAG,EAAE,CAClC,MAAmC,CAEnC,GAAG,IAAI,CACP,OAAO,SAAS,QAAQ,GAAG,GAAG,IAAK,CACnC,OAAO,SAAS,aAAa,GAAG,KAAM,EAAE,CACxC,OAAO,SAAS,YAAY,KAAM,KAAM,KAAM,CAC9C,OAAO,SAAS,YAAY,KAAM,MAAO,GAAI,CAC7C,OAAO,SAAS,SAAS,MAAO,GAAG,EAAE,CACrC,OAAO,SAAS,SAAS,KAAM,GAAG,EAAE,CACpC,OAAO,SAAS,MAAM,GAAG,KAAM,IAAK,CACpC,SAAS,SAAS,QAAQ,KAAM,GAAG,EAAE,CACrC,MAAmC,CAEnC,GAAG,IAAI,CACP,OAAO,SAAS,QAAQ,GAAG,GAAG,IAAK,CACnC,OAAO,SAAS,aAAa,GAAG,GAAG,EAAE,CACrC,OAAO,SAAS,YAAY,KAAM,KAAM,KAAM,CAC9C,OAAO,SAAS,YAAY,KAAM,MAAO,IAAK,CAC9C,OAAO,SAAS,SAAS,GAAG,GAAG,KAAM,CACrC,OAAO,SAAS,SAAS,GAAG,GAAG,IAAK,CACpC,OAAO,SAAS,MAAM,GAAG,GAAG,EAAE,CAC9B,SAAS,SAAS,QAAQ,GAAG,GAAG,EAAE,CAClC,MAAmC,CACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;AA6BZ,IAAa,uBACX,4BAA4B,OAAO,wBAAwB,UAAU,CAClE,WAAW,MAAO,MAAM,CAExB,GAAG,EAAE,CACL,OAAO,SAAS,QAAQ,KAAM,MAAO,EAAE,CACvC,OAAO,SAAS,aAAa,KAAM,MAAO,EAAE,CAC5C,OAAO,SAAS,QAAQ,MAAO,GAAG,EAAE,CACpC,OAAO,SAAS,QAAQ,MAAO,GAAG,EAAE,CACpC,OAAO,SAAS,YAAY,KAAM,KAAM,KAAM,CAC9C,OAAO,SAAS,YAAY,KAAM,MAAO,IAAK,CAC9C,SAAS,SAAS,QAAQ,GAAG,GAAG,EAAE,CAClC,MAAmC,CAEnC,GAAG,GAAI,CACP,OAAO,SAAS,QAAQ,KAAM,MAAO,EAAE,CACvC,OAAO,SAAS,aAAa,KAAM,MAAO,EAAE,CAC5C,OAAO,SAAS,QAAQ,MAAO,GAAG,EAAE,CACpC,OAAO,SAAS,QAAQ,MAAO,GAAG,EAAE,CACpC,OAAO,SAAS,YAAY,KAAM,KAAM,KAAM,CAC9C,OAAO,SAAS,YAAY,KAAM,MAAO,IAAK,CAC9C,SAAS,SAAS,QAAQ,MAAO,KAAM,IAAK,CAC5C,MAAmC,CAEnC,GAAG,KAAM,CACT,OAAO,SAAS,QAAQ,KAAM,MAAO,EAAE,CACvC,OAAO,SAAS,aAAa,KAAM,MAAO,EAAE,CAC5C,OAAO,SAAS,QAAQ,MAAO,GAAG,EAAE,CACpC,OAAO,SAAS,QAAQ,MAAO,GAAG,EAAE,CACpC,OAAO,SAAS,YAAY,KAAM,KAAM,KAAM,CAC9C,OAAO,SAAS,YAAY,KAAM,MAAO,IAAK,CAC9C,OAAO,SAAS,SAAS,GAAG,GAAG,MAAM,CACrC,OAAO,SAAS,SAAS,GAAG,GAAG,KAAK,CACpC,SAAS,SAAS,QAAQ,MAAO,GAAG,IAAK,CACzC,MAAmC,CACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;AA6BZ,IAAa,2BACX,4BAA4B,OAC1B,4BACA,UACD,CACE,WAAW,MAAO,MAAM,CAExB,GAAG,EAAE,CACL,OAAO,SAAS,QAAQ,KAAM,MAAO,EAAE,CACvC,OAAO,SAAS,aAAa,KAAM,MAAO,EAAE,CAC5C,OAAO,SAAS,QAAQ,MAAO,GAAG,EAAE,CACpC,OAAO,SAAS,QAAQ,MAAO,GAAG,EAAE,CACpC,OAAO,SAAS,YAAY,KAAM,KAAM,KAAM,CAC9C,OAAO,SAAS,YAAY,KAAM,MAAO,IAAK,CAC9C,OAAO,SAAS,SAAS,GAAG,GAAG,MAAM,CACrC,OAAO,SAAS,SAAS,GAAG,GAAG,KAAK,CACpC,SAAS,SAAS,QAAQ,GAAG,GAAG,EAAE,CAClC,MAAmC,CAEnC,GAAG,IAAK,CACR,OAAO,SAAS,QAAQ,KAAM,OAAO,EAAE,CACvC,OAAO,SAAS,aAAa,KAAM,OAAO,EAAE,CAC5C,OAAO,SAAS,QAAQ,MAAO,GAAG,EAAE,CACpC,OAAO,SAAS,QAAQ,MAAO,GAAG,EAAE,CACpC,OAAO,SAAS,MAAM,GAAG,MAAO,EAAE,CAClC,SAAS,SAAS,QAAQ,MAAO,KAAM,GAAI,CAC3C,MAAmC,CAEnC,GAAG,KAAM,CACT,OAAO,SAAS,QAAQ,KAAM,OAAO,EAAE,CACvC,OAAO,SAAS,aAAa,KAAM,OAAO,EAAE,CAC5C,OAAO,SAAS,QAAQ,MAAO,GAAG,EAAE,CACpC,OAAO,SAAS,QAAQ,MAAO,GAAG,EAAE,CACpC,OAAO,SAAS,YAAY,KAAM,KAAM,KAAM,CAC9C,OAAO,SAAS,YAAY,KAAM,MAAO,IAAK,CAC9C,OAAO,SAAS,SAAS,GAAG,GAAG,MAAM,CACrC,OAAO,SAAS,SAAS,GAAG,GAAG,KAAK,CACpC,OAAO,SAAS,MAAM,GAAG,OAAO,EAAE,CAClC,SAAS,SAAS,QAAQ,MAAO,GAAG,IAAK,CACzC,MAAmC,CACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;AA2BZ,IAAa,8BACX,4BAA4B,OAAO,+BAA+B,QAAQ,CACvE,SAAS,KAAM,MAAM,CAErB,GAAG,EAAE,CACL,OAAO,SAAS,YAAY,KAAM,KAAM,KAAM,CAC9C,OAAO,SAAS,YAAY,KAAM,MAAO,IAAK,CAC9C,OAAO,SAAS,SAAS,GAAG,GAAG,KAAK,CACpC,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,CACnC,OAAO,SAAS,SAAS,GAAG,GAAG,KAAM,CACrC,OAAO,SAAS,SAAS,GAAG,GAAG,IAAK,CACpC,OAAO,SAAS,QAAQ,GAAG,GAAG,EAAE,CAChC,OAAO,SAAS,QAAQ,MAAO,GAAG,EAAE,CACpC,OAAO,SAAS,QAAQ,MAAO,GAAG,EAAE,CACpC,SAAS,SAAS,QAAQ,GAAG,GAAG,EAAE,CAClC,MAAmC,CAEnC,GAAG,IAAK,CACR,OAAO,SAAS,YAAY,KAAM,KAAM,KAAM,CAC9C,OAAO,SAAS,YAAY,KAAM,MAAO,IAAK,CAC9C,OAAO,SAAS,SAAS,GAAG,GAAG,MAAM,CACrC,OAAO,SAAS,SAAS,GAAG,GAAG,KAAK,CACpC,OAAO,SAAS,SAAS,GAAG,GAAG,KAAM,CACrC,OAAO,SAAS,SAAS,GAAG,GAAG,IAAK,CACpC,OAAO,SAAS,MAAM,GAAG,GAAG,EAAE,CAC9B,OAAO,SAAS,QAAQ,MAAO,GAAG,EAAE,CACpC,OAAO,SAAS,QAAQ,MAAO,GAAG,EAAE,CACpC,SAAS,SAAS,QAAQ,GAAG,GAAG,EAAE,CAClC,MAAmC,CACnC,OAAO;;;;;AAUZ,IAAa,wBACX,IAAI,IAAI;CAEN,CAAC,oBAAoB,iBAAiB;CACtC,CAAC,wBAAwB,qBAAqB;CAC9C,CAAC,4BAA4B,yBAAyB;CAGtD,CAAC,+BAA+B,4BAA4B;CAG5D,CAAC,wBAAwB,+BAA+B;CACxD,CAAC,6BAA6B,0BAA0B;CACzD,CAAC"}
|
|
1
|
+
{"version":3,"file":"SonStanceAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/SonStanceAnimations.ts"],"sourcesContent":["/**\n * ☴ Son (Wind) Stance-Specific Animations\n *\n * Specialized idle, movement, guard, and combat animations for the Son (손/Wind) trigram.\n * Embodies continuous pressure and flowing combinations from Taekyon rhythmic combat.\n *\n * **Korean Martial Arts Context:**\n * - **무술**: 택견 유동 기술 (Taekyon Fluid Movement)\n * - **특성**: 지속적 압박 (Continuous Pressure), 흐르는 연속 공격 (Flowing Combinations)\n * - **철학**: 바람의 끊임없음 (Wind's Relentlessness), 소용돌이의 힘 (Whirlwind Power)\n * - **대표 기술**: 선풍연격 (Whirlwind Strike/Continuous Pressure), 회오리 타격 (Sweeping Strikes)\n *\n * @module systems/animation/catalogs/SonStanceAnimations\n * @category Animation\n * @korean 손괘자세애니메이션\n */\n\nimport { BoneName, type SkeletalAnimation } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\n\n// Import Son Wind continuous techniques (손괘 연속 타격)\nimport {\n SON_WHIRLWIND_STRIKE_ANIMATION,\n SON_SWEEPING_MULTI_STRIKE,\n} from \"./SonTechniqueAnimations\";\n\n/**\n * Anatomical safety constants for Son (Wind) trigram animations\n *\n * These limits document safe physiological ranges validated by Korean martial arts experts\n * and inform the design of all Son animations to ensure realistic, safe joint mechanics.\n *\n * Note: These are documentation constants that guide animation design. Actual animation\n * rotations stay well within these limits naturally through authentic Taekyon biomechanics.\n *\n * @internal Documentation-only constants for animation design reference\n */\nexport const ANATOMICAL_LIMITS_SON_STANCE = {\n /**\n * Maximum safe shoulder rotation for continuous circular motion: ±90° (±1.57 radians)\n *\n * Son (Wind) emphasizes fluid circular motion requiring safe shoulder range.\n */\n MAX_SHOULDER_ROTATION: 1.57, // ±90° in radians\n\n /**\n * Maximum safe elbow flexion for flowing transitions: 145° (2.53 radians)\n *\n * Allows natural flowing guard positions and continuous strike transitions.\n */\n MAX_ELBOW_FLEXION: 2.53, // 145° in radians\n\n /**\n * Maximum safe hip rotation for circular movement: ±70° (±1.22 radians)\n *\n * Hip rotation drives circular footwork and sweeping techniques.\n */\n MAX_HIP_ROTATION: 1.22, // ±70° in radians\n} as const;\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☴ SON IDLE SWAYING ANIMATION (손괘 흐름 자세)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Son Idle Swaying Animation\n *\n * **Korean**: 손괘 흐름 자세 (Son-gwae Heureum Jase)\n * **Philosophy**: Wind's endless flow through rhythmic swaying like trees in breeze\n *\n * Characteristics:\n * - Gentle swaying motion side-to-side\n * - Rhythmic breathing with flowing upper body\n * - Hands moving in small continuous circles\n * - Weight shifting foot to foot continuously\n * - Head tracking with fluid neck movement\n *\n * Animation Cycle:\n * - 0ms: Neutral center position\n * - 700ms: Sway left with circular hand motion\n * - 1400ms: Return to center\n * - 2100ms: Sway right with circular hand motion\n * - 2800ms: Return to start (complete cycle)\n *\n * @korean 손괘흐름자세\n * @duration 2800ms (2.8 second cycle)\n * @category Idle Animation\n */\nexport const SON_IDLE_SWAYING: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"son_idle_swaying\", \"손괘 흐름 자세\")\n .asIdle(2.8, true)\n // Keyframe 0ms: Neutral center (baseline)\n .at(0)\n .rotate(BoneName.PELVIS, 0, 0, 0.03) // 0°, 0°, 2° (slight lean right)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0) // Neutral spine\n .rotate(BoneName.SHOULDER_L, 0.17, 0.09, -0.26) // 10°, 5°, -15° (flowing guard)\n .rotate(BoneName.SHOULDER_R, 0.17, -0.09, 0.26) // 10°, -5°, 15°\n .rotate(BoneName.ELBOW_L, 0, 0, -1.57) // -90° (bent guard)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.57) // 90° (bent guard)\n .rotate(BoneName.WRIST_L, 0, 0, -0.09) // 0°, 0°, -5° (circular hand motion start)\n .rotate(BoneName.WRIST_R, 0, 0, 0.09) // 0°, 0°, 5°\n .rotate(BoneName.HEAD, 0, 0, 0) // Neutral head\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Keyframe 700ms: Sway left with circular flow\n .at(0.7)\n .rotate(BoneName.PELVIS, 0, 0, -0.07) // 0°, 0°, -4° (lean left)\n .rotate(BoneName.SPINE_UPPER, 0, -0.05, 0) // 0°, -3°, 0° (upper body follows)\n .rotate(BoneName.SHOULDER_L, 0.21, 0.12, -0.3) // 12°, 7°, -17° (left shoulder rises)\n .rotate(BoneName.SHOULDER_R, 0.14, -0.05, 0.22) // 8°, -3°, 13° (right shoulder drops)\n .rotate(BoneName.WRIST_L, 0.09, 0, -0.17) // 5°, 0°, -10° (hands continue circles)\n .rotate(BoneName.WRIST_R, -0.09, 0, 0.17) // -5°, 0°, 10°\n .rotate(BoneName.HEAD, 0, -0.05, -0.03) // 0°, -3°, -2° (head tracks with flow)\n .position(BoneName.PELVIS, -0.02, 0, 0) // Minimal lateral shift\n .done<MartialArtsAnimationBuilder>()\n // Keyframe 1400ms: Return to center\n .at(1.4)\n .rotate(BoneName.PELVIS, 0, 0, 0) // Return to neutral\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .rotate(BoneName.SHOULDER_L, 0.17, 0.09, -0.26)\n .rotate(BoneName.SHOULDER_R, 0.17, -0.09, 0.26)\n .rotate(BoneName.WRIST_L, 0, 0, -0.09)\n .rotate(BoneName.WRIST_R, 0, 0, 0.09)\n .rotate(BoneName.HEAD, 0, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Keyframe 2100ms: Sway right with circular flow\n .at(2.1)\n .rotate(BoneName.PELVIS, 0, 0, 0.07) // 0°, 0°, 4° (lean right)\n .rotate(BoneName.SPINE_UPPER, 0, 0.05, 0) // 0°, 3°, 0° (upper body follows)\n .rotate(BoneName.SHOULDER_L, 0.14, 0.05, -0.22) // 8°, 3°, -13° (left shoulder drops)\n .rotate(BoneName.SHOULDER_R, 0.21, -0.12, 0.3) // 12°, -7°, 17° (right shoulder rises)\n .rotate(BoneName.WRIST_L, -0.09, 0, 0) // -5°, 0°, 0° (hands reverse circles)\n .rotate(BoneName.WRIST_R, 0.09, 0, 0) // 5°, 0°, 0°\n .rotate(BoneName.HEAD, 0, 0.05, 0.03) // 0°, 3°, 2° (head tracks with flow)\n .position(BoneName.PELVIS, 0.02, 0, 0) // Minimal lateral shift right\n .done<MartialArtsAnimationBuilder>()\n // Keyframe 2800ms: Return to start (complete cycle)\n .at(2.8)\n .rotate(BoneName.PELVIS, 0, 0, 0.03)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .rotate(BoneName.SHOULDER_L, 0.17, 0.09, -0.26)\n .rotate(BoneName.SHOULDER_R, 0.17, -0.09, 0.26)\n .rotate(BoneName.WRIST_L, 0, 0, -0.09)\n .rotate(BoneName.WRIST_R, 0, 0, 0.09)\n .rotate(BoneName.HEAD, 0, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☴ SON FLOWING ARC STEP (바람 호 걸음)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Son Flowing Arc Step Animation\n *\n * **Korean**: 바람 호 걸음 (Baram Ho Georeum) - Wind Arc Step\n * **Technique**: Arc-shaped forward movement with hip-led circular motion\n *\n * Characteristics:\n * - Forward movement follows arc path (not straight)\n * - Hips lead with circular motion\n * - Arms swing naturally with momentum\n * - Smooth weight transfer through arc\n * - Continuous flowing transition\n *\n * Animation Phases:\n * - 0-200ms: Initial hip rotation and weight shift\n * - 200-500ms: Arc path forward with hip driving\n * - 500-667ms: Landing and settling into flowing position\n *\n * @korean 바람호걸음\n * @frames 12-16 frames (~42-56ms per frame at 60fps)\n * @duration 667ms\n * @category Movement Animation\n */\nexport const SON_FLOWING_ARC_STEP: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"son_flowing_arc_step\", \"바람 호 걸음\")\n .asMovement(0.667, false)\n // Phase 1: Initial hip rotation (0ms)\n .at(0)\n .rotate(BoneName.PELVIS, 0.09, -0.26, 0) // 5°, -15°, 0° (hip winds for arc)\n .rotate(BoneName.SPINE_UPPER, 0.12, -0.17, 0) // 7°, -10°, 0° (torso follows hip)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20° (rear leg ready to push)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (lead leg ready)\n .rotate(BoneName.SHOULDER_L, 0.17, 0.17, -0.26) // 10°, 10°, -15° (arms begin swing)\n .rotate(BoneName.SHOULDER_R, 0.17, -0.17, 0.26) // 10°, -10°, 15°\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Arc path forward (400ms)\n .at(0.4)\n .rotate(BoneName.PELVIS, 0.14, -0.17, 0) // 8°, -10°, 0° (unwinding through arc)\n .rotate(BoneName.SPINE_UPPER, 0.17, -0.09, 0) // 10°, -5°, 0°\n .rotate(BoneName.KNEE_R, -0.17, 0, 0) // -10° (rear leg extending)\n .rotate(BoneName.KNEE_L, -0.52, 0, 0) // -30° (lead leg absorbing weight)\n .rotate(BoneName.SHOULDER_L, 0.21, 0.26, -0.35) // 12°, 15°, -20° (arms swing with momentum)\n .rotate(BoneName.SHOULDER_R, 0.21, -0.26, 0.35) // 12°, -15°, 20°\n .position(BoneName.PELVIS, -0.12, 0.02, 0.25) // Arc trajectory (slight left, up, forward)\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Landing and settling (667ms)\n .at(0.667)\n .rotate(BoneName.PELVIS, 0.09, -0.26, 0) // 5°, -15°, 0° (settled in arc position)\n .rotate(BoneName.SPINE_UPPER, 0.12, -0.17, 0) // 7°, -10°, 0°\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (rear leg stable)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° (lead leg grounded)\n .rotate(BoneName.SHOULDER_L, 0.17, 0.17, -0.26) // Return to flowing guard\n .rotate(BoneName.SHOULDER_R, 0.17, -0.17, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.57) // -90° guard position\n .rotate(BoneName.ELBOW_R, 0, 0, 1.57) // 90° guard position\n .position(BoneName.PELVIS, -0.15, 0, 0.35) // Final arc position\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☴ SON SWEEPING CIRCLE STEP (회오리 원형보)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Son Sweeping Circle Step Animation\n *\n * **Korean**: 회오리 원형보 (Hoeori Wonhyeongbo) - Whirlwind Circle Step\n * **Technique**: Full circular movement around opponent while maintaining orientation\n *\n * Characteristics:\n * - Complete circular path around target\n * - Body remains oriented toward opponent\n * - Hands maintain guard while circling\n * - Continuous flow without stopping\n * - Weight transfer smoothly through circle\n *\n * Animation Phases:\n * - 0-280ms: Initial circular pivot\n * - 280-700ms: Circular arc movement\n * - 700-889ms: Complete circle and settle\n *\n * @korean 회오리원형보\n * @frames 14-18 frames (~49-63ms per frame at 60fps)\n * @duration 889ms\n * @category Movement Animation\n */\nexport const SON_SWEEPING_CIRCLE_STEP: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"son_sweeping_circle_step\",\n \"회오리 원형보\",\n )\n .asMovement(0.889, false)\n // Phase 1: Initial circular pivot (0ms)\n .at(0)\n .rotate(BoneName.PELVIS, 0.09, -0.79, 0) // 5°, -45°, 0° (begin rotation)\n .rotate(BoneName.SPINE_UPPER, 0.12, -0.87, 0) // 7°, -50°, 0° (torso leads)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20° (pivot foot)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stepping foot)\n .rotate(BoneName.SHOULDER_L, 0.17, 0.09, -0.26) // Maintain guard\n .rotate(BoneName.SHOULDER_R, 0.17, -0.09, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.57)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.57)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Circular arc movement (490ms)\n .at(0.49)\n .rotate(BoneName.PELVIS, 0.09, -1.57, 0) // 5°, -90°, 0° (quarter circle)\n .rotate(BoneName.SPINE_UPPER, 0.12, -1.74, 0) // 7°, -100°, 0°\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (pivot stable)\n .rotate(BoneName.KNEE_L, -0.44, 0, 0) // -25° (stepping load)\n .rotate(BoneName.HEAD, 0, -0.87, 0) // 0°, -50°, 0° (head tracks target)\n .position(BoneName.PELVIS, -0.25, 0.02, 0.1) // Circular path (left and slight forward)\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Complete circle (889ms)\n .at(0.889)\n .rotate(BoneName.PELVIS, 0.09, -2.79, 0) // 5°, -160°, 0° (near full circle)\n .rotate(BoneName.SPINE_UPPER, 0.12, -2.79, 0) // 7°, -160°, 0° (spine follows pelvis)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (stable)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° (grounded)\n .rotate(BoneName.SHOULDER_L, 0.17, 0.09, -0.26) // Guard maintained throughout\n .rotate(BoneName.SHOULDER_R, 0.17, -0.09, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.57)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.57)\n .rotate(BoneName.HEAD, 0, -2.79, 0) // 0°, -160°, 0° (head follows rotation)\n .position(BoneName.PELVIS, -0.35, 0, -0.1) // Complete circular position\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☴ SON MOBILE GUARD TRANSITION (바람 방어 전환)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Son Mobile Guard Transition Animation\n *\n * **Korean**: 바람 방어 (Baram Bangeo) - Wind Guard\n * **Technique**: Transition into Son's characteristic mobile guard with micro-adjustments\n *\n * Characteristics:\n * - Hands in constant subtle motion (micro-adjustments)\n * - Shoulders relaxed, ready to flow\n * - Weight centered, ready to move any direction\n * - Head tracking opponent with fluid neck movement\n * - Continuous readiness for pressure attacks\n *\n * Animation Phases:\n * - 0-180ms: Begin transition with hand repositioning\n * - 180-360ms: Settle into mobile guard with micro-adjustments\n *\n * @korean 바람방어\n * @duration 360ms\n * @category Stance Animation\n */\nexport const SON_MOBILE_GUARD_TRANSITION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"son_mobile_guard_transition\", \"바람 방어\")\n .asStance(0.36, false)\n // Phase 1: Begin transition (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_L, 0.14, 0.07, -0.22) // 8°, 4°, -12.5° (moving toward guard)\n .rotate(BoneName.SHOULDER_R, 0.14, -0.07, 0.22) // 8°, -4°, 12.5°\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4) // -80° (transitioning)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4) // 80° (transitioning)\n .rotate(BoneName.WRIST_L, 0, 0, -0.05) // Slight wrist adjustment\n .rotate(BoneName.WRIST_R, 0, 0, 0.05)\n .rotate(BoneName.PELVIS, 0, 0, 0) // Neutral pelvis\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable stance)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (stable stance)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Settle into mobile guard (360ms)\n .at(0.36)\n .rotate(BoneName.SHOULDER_L, 0.17, 0.09, -0.26) // 10°, 5°, -15° (Son guard)\n .rotate(BoneName.SHOULDER_R, 0.17, -0.09, 0.26) // 10°, -5°, 15°\n .rotate(BoneName.ELBOW_L, 0, 0, -1.57) // -90° (Son guard angle)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.57) // 90° (Son guard angle)\n .rotate(BoneName.WRIST_L, 0, 0, -0.09) // 0°, 0°, -5° (micro-adjustment position)\n .rotate(BoneName.WRIST_R, 0, 0, 0.09) // 0°, 0°, 5°\n .rotate(BoneName.HEAD, 0, 0, 0) // Neutral tracking\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable stance)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (stable stance)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// EXPORTS\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Map of all Son stance-specific animations for easy access\n * @korean 손괘자세애니메이션맵\n */\nexport const SON_STANCE_ANIMATIONS: ReadonlyMap<string, SkeletalAnimation> =\n new Map([\n // Idle & Movement\n [\"son_idle_swaying\", SON_IDLE_SWAYING],\n [\"son_flowing_arc_step\", SON_FLOWING_ARC_STEP],\n [\"son_sweeping_circle_step\", SON_SWEEPING_CIRCLE_STEP],\n\n // Stance Transitions\n [\"son_mobile_guard_transition\", SON_MOBILE_GUARD_TRANSITION],\n \n // Wind Continuous Strike Techniques (손괘 연속 타격)\n [\"son_whirlwind_strike\", SON_WHIRLWIND_STRIKE_ANIMATION],\n [\"son_sweeping_multi_strike\", SON_SWEEPING_MULTI_STRIKE],\n ]);\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SonTechniqueAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/SonTechniqueAnimations.ts"],"sourcesContent":["/**\n * ☴ Son (Wind) Technique Animations\n *\n * Combat technique animations for Son (손/Wind) trigram continuous pressure attacks.\n * Implements Taekyon-inspired whirlwind combinations and sweeping multi-strike sequences.\n *\n * **Korean Martial Arts Context:**\n * - **무술**: 택견 연속 타격 (Taekyon Continuous Strikes)\n * - **특성**: 선풍연격 (Whirlwind Strikes), 회오리 타격 (Sweeping Multi-Strikes)\n * - **철학**: 끊임없는 공격 (Relentless Attack), 소용돌이 힘 (Whirlwind Power)\n * - **대표 기술**: 선풍연격 (Seonpung Yeongyeok), 소용돌이 타격 (Soyongdori Tagyeok)\n *\n * @module systems/animation/catalogs/SonTechniqueAnimations\n * @category Animation\n * @korean 손괘기술애니메이션\n */\n\nimport { BoneName, type SkeletalAnimation } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☴ SON WHIRLWIND STRIKE ANIMATION (선풍연격)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Son Whirlwind Strike Animation\n *\n * **Korean**: 선풍연격 (Seonpung Yeongyeok)\n * **Technique**: Continuous rotating strikes with wind-like pressure\n * **Target Points**: Multiple targets in sweeping circular pattern\n *\n * Authentic Taekyon Continuous Pressure Technique:\n * - Three consecutive strikes while rotating body\n * - Each strike flows from previous without stopping\n * - Hip rotation powers all strikes\n * - Circular body motion creates whirlwind effect\n * - Targets multiple vital points in sequence\n *\n * Animation Phases:\n * - Setup (0-375ms, frames 0-6): Wind-up with counter-rotation\n * - Strike-1 (375-750ms, frames 7-12): First strike with rotation through center\n * - Strike-2 (750-1125ms, frames 13-18): Second strike continuing rotation\n * - Strike-3 (1125-1500ms, frames 19-24): Third strike completing whirlwind\n *\n * Target Vital Points Sequence:\n * - Strike-1: 늑골 (Neukgol/Ribs) - Side body strike\n * - Strike-2: 명치 (Myeongchi/Solar Plexus) - Center strike\n * - Strike-3: 태양혈 (Taeyanghyeol/Temple) - Head strike\n *\n * **Performance**: 60fps target (16.67ms per frame)\n * **Damage Type**: Continuous pressure with cumulative effect\n *\n * @korean 선풍연격\n * @frames 24 total (6 setup, 6 strike-1, 6 strike-2, 6 strike-3)\n * @duration 1500ms\n * @category Attack Animation\n */\nexport const SON_WHIRLWIND_STRIKE_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"son_whirlwind_strike\",\n \"선풍연격\"\n )\n .asAttack(1.5)\n // =================================================================\n // SETUP PHASE (0-375ms, frames 0-6)\n // =================================================================\n // Frame 0: Neutral guard baseline (0ms)\n .at(0)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0) // Neutral\n .rotate(BoneName.PELVIS, 0, 0, 0) // Neutral\n .rotate(BoneName.SHOULDER_R, 0.17, -0.09, 0.26) // 10°, -5°, 15° guard\n .rotate(BoneName.ELBOW_R, 0, 0, 1.57) // 90° guard\n .rotate(BoneName.SHOULDER_L, 0.17, 0.09, -0.26) // 10°, 5°, -15° guard\n .rotate(BoneName.ELBOW_L, 0, 0, -1.57) // -90° guard\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Frame 3: Begin wind-up (188ms)\n .at(0.188)\n .rotate(BoneName.SPINE_UPPER, 0, -0.26, 0) // 0°, -15°, 0° (wind-up rotation)\n .rotate(BoneName.PELVIS, 0, -0.35, 0) // 0°, -20°, 0° (hip winds back)\n .rotate(BoneName.SHOULDER_R, -0.17, 0, 0.35) // -10°, 0°, 20° (right arm cocks)\n .rotate(BoneName.ELBOW_R, 0, 0, 2.09) // 120° (bent ready)\n .rotate(BoneName.SHOULDER_L, 0.26, 0.17, -0.17) // 15°, 10°, -10° (left forward)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.22) // -70° (extending slightly)\n .done<MartialArtsAnimationBuilder>()\n // Frame 6: Maximum wind-up (375ms)\n .at(0.375)\n .rotate(BoneName.SPINE_UPPER, 0, -0.35, 0) // 0°, -20°, 0° (peak wind-up)\n .rotate(BoneName.PELVIS, 0, -0.52, 0) // 0°, -30°, 0° (maximum coil)\n .rotate(BoneName.SHOULDER_R, -0.26, 0, 0.52) // -15°, 0°, 30° (fully cocked)\n .rotate(BoneName.ELBOW_R, 0, 0, 2.27) // 130° (maximum chamber)\n .rotate(BoneName.HEAD, 0, -0.17, 0) // 0°, -10°, 0° (looking back)\n .position(BoneName.PELVIS, 0, -0.02, 0) // Slight crouch\n .done<MartialArtsAnimationBuilder>()\n // =================================================================\n // STRIKE-1 PHASE (375-750ms, frames 7-12)\n // =================================================================\n // Frame 9: Mid-strike-1 (562ms)\n .at(0.562)\n .rotate(BoneName.SPINE_UPPER, 0, 0.09, 0) // 0°, 5°, 0° (torso follows hip rotation)\n .rotate(BoneName.PELVIS, 0, 0.12, 0) // 0°, 7°, 0° (hip leads and drives forward)\n .rotate(BoneName.SHOULDER_R, 0.7, 0, 0) // 40°, 0°, 0° (first strike extends)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.17) // 10° (nearly extended)\n .rotate(BoneName.WRIST_R, 0.17, 0, 0) // 10°, 0°, 0° (strike alignment)\n .rotate(BoneName.KNEE_R, -0.17, 0, 0) // -10° (rear leg pushes)\n .position(BoneName.PELVIS, 0, 0, 0.05) // Forward drive\n .done<MartialArtsAnimationBuilder>()\n // Frame 12: Strike-1 full extension (750ms)\n .at(0.75)\n .rotate(BoneName.SPINE_UPPER, 0, 0.26, 0) // 0°, 15°, 0° (rotation continues)\n .rotate(BoneName.PELVIS, 0, 0.26, 0) // 0°, 15°, 0° (hip follows through)\n .rotate(BoneName.SHOULDER_R, 1.05, 0, -0.09) // 60°, 0°, -5° (full extension)\n .rotate(BoneName.ELBOW_R, 0, 0, 0) // 0° (straight arm)\n .rotate(BoneName.WRIST_R, 0.26, 0, 0) // 15°, 0°, 0° (impact angle)\n .rotate(BoneName.SHOULDER_L, 0.35, 0.26, -0.09) // 20°, 15°, -5° (left begins)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.79) // -45° (preparing)\n .position(BoneName.PELVIS, 0, 0, 0.1) // Maximum forward\n .done<MartialArtsAnimationBuilder>()\n // =================================================================\n // STRIKE-2 PHASE (750-1125ms, frames 13-18)\n // =================================================================\n // Frame 15: Mid-strike-2 (938ms)\n .at(0.938)\n .rotate(BoneName.SPINE_UPPER, 0, 0.61, 0) // 0°, 35°, 0° (continued rotation)\n .rotate(BoneName.PELVIS, 0, 0.52, 0) // 0°, 30°, 0° (hip drives)\n .rotate(BoneName.SHOULDER_R, 0.52, 0, 0.17) // 30°, 0°, 10° (right retracts)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.57) // 90° (pulling back)\n .rotate(BoneName.SHOULDER_L, 0.79, 0.26, -0.09) // 45°, 15°, -5° (left strikes)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.09) // -5° (extending)\n .rotate(BoneName.WRIST_L, 0.17, 0, 0) // 10°, 0°, 0° (strike ready)\n .done<MartialArtsAnimationBuilder>()\n // Frame 18: Strike-2 full extension (1125ms)\n .at(1.125)\n .rotate(BoneName.SPINE_UPPER, 0, 0.87, 0) // 0°, 50°, 0° (deep rotation)\n .rotate(BoneName.PELVIS, 0, 0.79, 0) // 0°, 45°, 0° (hip full through)\n .rotate(BoneName.SHOULDER_L, 1.14, 0.35, -0.14) // 65°, 20°, -8° (left full extension)\n .rotate(BoneName.ELBOW_L, 0, 0, 0) // 0° (straight arm)\n .rotate(BoneName.WRIST_L, 0.26, 0, 0) // 15°, 0°, 0° (impact)\n .rotate(BoneName.SHOULDER_R, 0.35, 0, 0.26) // 20°, 0°, 15° (right recovering)\n .rotate(BoneName.HEAD, 0, 0.52, 0) // 0°, 30°, 0° (head follows)\n .position(BoneName.PELVIS, -0.05, 0, 0.15) // Slight lateral shift with forward\n .done<MartialArtsAnimationBuilder>()\n // =================================================================\n // STRIKE-3 PHASE (1125-1500ms, frames 19-24)\n // =================================================================\n // Frame 21: Mid-strike-3 (1312ms)\n .at(1.312)\n .rotate(BoneName.SPINE_UPPER, 0, 1.22, 0) // 0°, 70°, 0° (near complete rotation)\n .rotate(BoneName.PELVIS, 0, 1.05, 0) // 0°, 60°, 0° (maximum hip rotation)\n .rotate(BoneName.SHOULDER_R, 0.87, 0.09, 0) // 50°, 5°, 0° (right strikes again)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.14) // 8° (extending)\n .rotate(BoneName.WRIST_R, 0.17, 0, 0) // 10°, 0°, 0° (strike alignment)\n .rotate(BoneName.SHOULDER_L, 0.52, 0.17, 0.17) // 30°, 10°, 10° (left retracts)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4) // -80° (pulling back)\n .done<MartialArtsAnimationBuilder>()\n // Frame 24: Strike-3 final extension (1500ms)\n .at(1.5)\n .rotate(BoneName.SPINE_UPPER, 0, 1.22, 0) // 0°, 70°, 0° (spine follows pelvis)\n .rotate(BoneName.PELVIS, 0, 1.4, 0) // 0°, 80°, 0° (pelvis drives full rotation)\n .rotate(BoneName.SHOULDER_R, 1.14, 0, -0.09) // 65°, 0°, -5° (final strike extended)\n .rotate(BoneName.ELBOW_R, 0, 0, 0) // 0° (straight arm at impact)\n .rotate(BoneName.WRIST_R, 0.26, 0, 0) // 15°, 0°, 0° (final impact)\n .rotate(BoneName.HEAD, 0, 1.05, 0) // 0°, 60°, 0° (full head rotation)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (rear leg drive)\n .position(BoneName.PELVIS, -0.1, 0, 0.2) // Final whirlwind position\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☴ SON SWEEPING MULTI-STRIKE (소용돌이 타격)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Son Sweeping Multi-Strike Animation\n *\n * **Korean**: 소용돌이 타격 (Soyongdori Tagyeok) - Whirlpool Strike\n * **Technique**: Continuous sweeping strikes in flowing pattern\n * **Target Points**: Low-to-high sweeping pattern targeting legs and body\n *\n * Authentic Taekyon Sweeping Technique:\n * - Low sweeping kick flows into body strike\n * - Continuous circular motion without pause\n * - Body rotation powers both sweeps\n * - Minimal recovery between strikes\n * - Creates whirlpool-like motion pattern\n *\n * Animation Phases:\n * - Wind-up (0-300ms, frames 0-5): Preparation with weight shift\n * - Sweep-1 (300-800ms, frames 6-13): Low sweeping leg attack\n * - Sweep-2 (800-1300ms, frames 14-21): Body-level circular strike\n * - Recovery (1300-1600ms, frames 22-26): Return to flowing guard\n *\n * Target Vital Points Sequence:\n * - Sweep-1: 발목 (Balmok/Ankle), 종아리 (Jongari/Calf)\n * - Sweep-2: 늑골 (Neukgol/Ribs), 간 (Gan/Liver)\n *\n * **Performance**: 60fps target (16.67ms per frame)\n * **Damage Type**: Sweeping pressure with destabilization\n *\n * @korean 소용돌이타격\n * @frames 26 total (5 wind-up, 8 sweep-1, 8 sweep-2, 5 recovery)\n * @duration 1600ms\n * @category Attack Animation\n */\nexport const SON_SWEEPING_MULTI_STRIKE: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"son_sweeping_multi_strike\",\n \"소용돌이 타격\"\n )\n .asAttack(1.6)\n // =================================================================\n // WIND-UP PHASE (0-300ms, frames 0-5)\n // =================================================================\n // Frame 0: Neutral guard (0ms)\n .at(0)\n .rotate(BoneName.PELVIS, 0, 0, 0) // Neutral\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0) // Neutral\n .rotate(BoneName.SHOULDER_L, 0.17, 0.09, -0.26) // Guard position\n .rotate(BoneName.SHOULDER_R, 0.17, -0.09, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.57)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.57)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15°\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15°\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Frame 3: Weight shift preparation (180ms)\n .at(0.18)\n .rotate(BoneName.PELVIS, 0, -0.35, 0) // 0°, -20°, 0° (wind-up)\n .rotate(BoneName.SPINE_UPPER, 0, -0.52, 0) // 0°, -30°, 0° (torso winds)\n .rotate(BoneName.KNEE_R, -0.44, 0, 0) // -25° (weight on right)\n .rotate(BoneName.KNEE_L, -0.17, 0, 0) // -10° (left lightens)\n .rotate(BoneName.HIP_L, 0.26, 0, 0) // 15°, 0°, 0° (left leg begins to lift)\n .position(BoneName.PELVIS, 0, -0.02, 0) // Slight crouch\n .done<MartialArtsAnimationBuilder>()\n // Frame 5: Full wind-up (300ms)\n .at(0.3)\n .rotate(BoneName.PELVIS, 0, -0.52, 0) // 0°, -30°, 0° (maximum wind)\n .rotate(BoneName.SPINE_UPPER, 0, -0.7, 0) // 0°, -40°, 0° (deep coil)\n .rotate(BoneName.KNEE_R, -0.52, 0, 0) // -30° (stable base)\n .rotate(BoneName.HIP_L, 0.52, 0, 0.17) // 30°, 0°, 10° (leg chambered for sweep)\n .rotate(BoneName.KNEE_L, -0.87, 0, 0) // -50° (chambered bent)\n .position(BoneName.PELVIS, 0, -0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n // =================================================================\n // SWEEP-1 PHASE (300-800ms, frames 6-13) - Low Sweeping Kick\n // =================================================================\n // Frame 8: Begin sweep (480ms)\n .at(0.48)\n .rotate(BoneName.PELVIS, 0, -0.17, 0) // 0°, -10°, 0° (unwinding)\n .rotate(BoneName.SPINE_UPPER, 0, -0.26, 0) // 0°, -15°, 0°\n .rotate(BoneName.HIP_L, 0.35, 0, 0.52) // 20°, 0°, 30° (leg extending)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° (extending for sweep)\n .rotate(BoneName.FOOT_L, -0.17, 0, 0) // -10° (foot for sweep)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20° (supporting)\n .position(BoneName.PELVIS, 0, -0.04, 0.05)\n .done<MartialArtsAnimationBuilder>()\n // Frame 10: Mid-sweep (600ms)\n .at(0.6)\n .rotate(BoneName.PELVIS, 0, 0.17, 0) // 0°, 10°, 0° (rotation through)\n .rotate(BoneName.SPINE_UPPER, 0, 0.26, 0) // 0°, 15°, 0°\n .rotate(BoneName.HIP_L, 0.26, 0, 0.87) // 15°, 0°, 50° (sweeping arc)\n .rotate(BoneName.KNEE_L, -0.17, 0, 0) // -10° (nearly extended)\n .rotate(BoneName.FOOT_L, 0.17, 0, 0) // 10° (sweeping position)\n .position(BoneName.PELVIS, -0.1, -0.05, 0.1) // Lateral and forward\n .done<MartialArtsAnimationBuilder>()\n // Frame 13: Complete low sweep (800ms)\n .at(0.8)\n .rotate(BoneName.PELVIS, 0, 0.52, 0) // 0°, 30°, 0° (full rotation)\n .rotate(BoneName.SPINE_UPPER, 0, 0.61, 0) // 0°, 35°, 0°\n .rotate(BoneName.HIP_L, 0.17, 0, 1.22) // 10°, 0°, 70° (complete arc)\n .rotate(BoneName.KNEE_L, -0.09, 0, 0) // -5° (extended)\n .rotate(BoneName.FOOT_L, 0.26, 0, 0) // 15° (impact angle)\n .rotate(BoneName.HEAD, 0, 0.35, 0) // 0°, 20°, 0° (tracking)\n .position(BoneName.PELVIS, -0.15, -0.06, 0.15)\n .done<MartialArtsAnimationBuilder>()\n // =================================================================\n // SWEEP-2 PHASE (800-1300ms, frames 14-21) - Body-Level Strike\n // =================================================================\n // Frame 16: Transition to body strike (960ms)\n .at(0.96)\n .rotate(BoneName.PELVIS, 0, 0.79, 0) // 0°, 45°, 0° (continuing rotation)\n .rotate(BoneName.SPINE_UPPER, 0, 0.87, 0) // 0°, 50°, 0°\n .rotate(BoneName.HIP_L, 0, 0, 0.52) // 0°, 0°, 30° (leg retracting)\n .rotate(BoneName.KNEE_L, -0.44, 0, 0) // -25° (pulling back)\n .rotate(BoneName.SHOULDER_R, 0.52, 0.17, 0) // 30°, 10°, 0° (right arm begins)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.87) // 50° (preparing strike)\n .position(BoneName.PELVIS, -0.15, -0.04, 0.2)\n .done<MartialArtsAnimationBuilder>()\n // Frame 18: Mid body sweep (1080ms)\n .at(1.08)\n .rotate(BoneName.PELVIS, 0, 1.05, 0) // 0°, 60°, 0° (deep rotation)\n .rotate(BoneName.SPINE_UPPER, 0, 1.22, 0) // 0°, 70°, 0°\n .rotate(BoneName.SHOULDER_R, 0.87, 0.26, -0.17) // 50°, 15°, -10° (sweeping strike)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.35) // 20° (extending)\n .rotate(BoneName.WRIST_R, 0.17, 0, 0) // 10°, 0°, 0° (strike angle)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (foot planted)\n .position(BoneName.PELVIS, -0.2, -0.02, 0.25)\n .done<MartialArtsAnimationBuilder>()\n // Frame 21: Complete body sweep (1300ms)\n .at(1.3)\n .rotate(BoneName.PELVIS, 0, 1.4, 0) // 0°, 80°, 0° (near full circle)\n .rotate(BoneName.SPINE_UPPER, 0, 1.57, 0) // 0°, 90°, 0° (quarter rotation complete)\n .rotate(BoneName.SHOULDER_R, 1.14, 0.35, -0.26) // 65°, 20°, -15° (full extension)\n .rotate(BoneName.ELBOW_R, 0, 0, 0) // 0° (straight arm impact)\n .rotate(BoneName.WRIST_R, 0.26, 0, 0) // 15°, 0°, 0° (impact)\n .rotate(BoneName.HEAD, 0, 1.22, 0) // 0°, 70°, 0° (full tracking)\n .position(BoneName.PELVIS, -0.25, 0, 0.3)\n .done<MartialArtsAnimationBuilder>()\n // =================================================================\n // RECOVERY PHASE (1300-1600ms, frames 22-26)\n // =================================================================\n // Frame 24: Begin recovery (1450ms)\n .at(1.45)\n .rotate(BoneName.PELVIS, 0, 0.87, 0) // 0°, 50°, 0° (unwinding)\n .rotate(BoneName.SPINE_UPPER, 0, 0.79, 0) // 0°, 45°, 0°\n .rotate(BoneName.SHOULDER_R, 0.52, 0.17, 0.17) // 30°, 10°, 10° (retracting)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.05) // 60° (bending back)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (stable)\n .position(BoneName.PELVIS, -0.15, 0, 0.2)\n .done<MartialArtsAnimationBuilder>()\n // Frame 26: Return to guard (1600ms)\n .at(1.6)\n .rotate(BoneName.PELVIS, 0, 0, 0) // Return to neutral\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .rotate(BoneName.SHOULDER_L, 0.17, 0.09, -0.26) // Guard restored\n .rotate(BoneName.SHOULDER_R, 0.17, -0.09, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.57)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.57)\n .rotate(BoneName.HEAD, 0, 0, 0)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// EXPORTS\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Map of all Son technique animations for easy access\n * @korean 손괘기술애니메이션맵\n */\nexport const SON_TECHNIQUE_ANIMATIONS: ReadonlyMap<string, SkeletalAnimation> = new Map([\n [\"son_whirlwind_strike\", SON_WHIRLWIND_STRIKE_ANIMATION],\n [\"son_sweeping_multi_strike\", SON_SWEEPING_MULTI_STRIKE],\n]);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SonTechniqueAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/SonTechniqueAnimations.ts"],"sourcesContent":["/**\n * ☴ Son (Wind) Technique Animations\n *\n * Combat technique animations for Son (손/Wind) trigram continuous pressure attacks.\n * Implements Taekyon-inspired whirlwind combinations and sweeping multi-strike sequences.\n *\n * **Korean Martial Arts Context:**\n * - **무술**: 택견 연속 타격 (Taekyon Continuous Strikes)\n * - **특성**: 선풍연격 (Whirlwind Strikes), 회오리 타격 (Sweeping Multi-Strikes)\n * - **철학**: 끊임없는 공격 (Relentless Attack), 소용돌이 힘 (Whirlwind Power)\n * - **대표 기술**: 선풍연격 (Seonpung Yeongyeok), 소용돌이 타격 (Soyongdori Tagyeok)\n *\n * @module systems/animation/catalogs/SonTechniqueAnimations\n * @category Animation\n * @korean 손괘기술애니메이션\n */\n\nimport { BoneName, type SkeletalAnimation } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☴ SON WHIRLWIND STRIKE ANIMATION (선풍연격)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Son Whirlwind Strike Animation\n *\n * **Korean**: 선풍연격 (Seonpung Yeongyeok)\n * **Technique**: Continuous rotating strikes with wind-like pressure\n * **Target Points**: Multiple targets in sweeping circular pattern\n *\n * Authentic Taekyon Continuous Pressure Technique:\n * - Three consecutive strikes while rotating body\n * - Each strike flows from previous without stopping\n * - Hip rotation powers all strikes\n * - Circular body motion creates whirlwind effect\n * - Targets multiple vital points in sequence\n *\n * Animation Phases:\n * - Setup (0-375ms, frames 0-6): Wind-up with counter-rotation\n * - Strike-1 (375-750ms, frames 7-12): First strike with rotation through center\n * - Strike-2 (750-1125ms, frames 13-18): Second strike continuing rotation\n * - Strike-3 (1125-1500ms, frames 19-24): Third strike completing whirlwind\n *\n * Target Vital Points Sequence:\n * - Strike-1: 늑골 (Neukgol/Ribs) - Side body strike\n * - Strike-2: 명치 (Myeongchi/Solar Plexus) - Center strike\n * - Strike-3: 태양혈 (Taeyanghyeol/Temple) - Head strike\n *\n * **Performance**: 60fps target (16.67ms per frame)\n * **Damage Type**: Continuous pressure with cumulative effect\n *\n * @korean 선풍연격\n * @frames 24 total (6 setup, 6 strike-1, 6 strike-2, 6 strike-3)\n * @duration 1500ms\n * @category Attack Animation\n */\nexport const SON_WHIRLWIND_STRIKE_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"son_whirlwind_strike\",\n \"선풍연격\"\n )\n .asAttack(1.5)\n // =================================================================\n // SETUP PHASE (0-375ms, frames 0-6)\n // =================================================================\n // Frame 0: Neutral guard baseline (0ms)\n .at(0)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0) // Neutral\n .rotate(BoneName.PELVIS, 0, 0, 0) // Neutral\n .rotate(BoneName.SHOULDER_R, 0.17, -0.09, 0.26) // 10°, -5°, 15° guard\n .rotate(BoneName.ELBOW_R, 0, 0, 1.57) // 90° guard\n .rotate(BoneName.SHOULDER_L, 0.17, 0.09, -0.26) // 10°, 5°, -15° guard\n .rotate(BoneName.ELBOW_L, 0, 0, -1.57) // -90° guard\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Frame 3: Begin wind-up (188ms)\n .at(0.188)\n .rotate(BoneName.SPINE_UPPER, 0, -0.26, 0) // 0°, -15°, 0° (wind-up rotation)\n .rotate(BoneName.PELVIS, 0, -0.35, 0) // 0°, -20°, 0° (hip winds back)\n .rotate(BoneName.SHOULDER_R, -0.17, 0, 0.35) // -10°, 0°, 20° (right arm cocks)\n .rotate(BoneName.ELBOW_R, 0, 0, 2.09) // 120° (bent ready)\n .rotate(BoneName.SHOULDER_L, 0.26, 0.17, -0.17) // 15°, 10°, -10° (left forward)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.22) // -70° (extending slightly)\n .done<MartialArtsAnimationBuilder>()\n // Frame 6: Maximum wind-up (375ms)\n .at(0.375)\n .rotate(BoneName.SPINE_UPPER, 0, -0.35, 0) // 0°, -20°, 0° (peak wind-up)\n .rotate(BoneName.PELVIS, 0, -0.52, 0) // 0°, -30°, 0° (maximum coil)\n .rotate(BoneName.SHOULDER_R, -0.26, 0, 0.52) // -15°, 0°, 30° (fully cocked)\n .rotate(BoneName.ELBOW_R, 0, 0, 2.27) // 130° (maximum chamber)\n .rotate(BoneName.HEAD, 0, -0.17, 0) // 0°, -10°, 0° (looking back)\n .position(BoneName.PELVIS, 0, -0.02, 0) // Slight crouch\n .done<MartialArtsAnimationBuilder>()\n // =================================================================\n // STRIKE-1 PHASE (375-750ms, frames 7-12)\n // =================================================================\n // Frame 9: Mid-strike-1 (562ms)\n .at(0.562)\n .rotate(BoneName.SPINE_UPPER, 0, 0.09, 0) // 0°, 5°, 0° (torso follows hip rotation)\n .rotate(BoneName.PELVIS, 0, 0.12, 0) // 0°, 7°, 0° (hip leads and drives forward)\n .rotate(BoneName.SHOULDER_R, 0.7, 0, 0) // 40°, 0°, 0° (first strike extends)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.17) // 10° (nearly extended)\n .rotate(BoneName.WRIST_R, 0.17, 0, 0) // 10°, 0°, 0° (strike alignment)\n .rotate(BoneName.KNEE_R, -0.17, 0, 0) // -10° (rear leg pushes)\n .position(BoneName.PELVIS, 0, 0, 0.05) // Forward drive\n .done<MartialArtsAnimationBuilder>()\n // Frame 12: Strike-1 full extension (750ms)\n .at(0.75)\n .rotate(BoneName.SPINE_UPPER, 0, 0.26, 0) // 0°, 15°, 0° (rotation continues)\n .rotate(BoneName.PELVIS, 0, 0.26, 0) // 0°, 15°, 0° (hip follows through)\n .rotate(BoneName.SHOULDER_R, 1.05, 0, -0.09) // 60°, 0°, -5° (full extension)\n .rotate(BoneName.ELBOW_R, 0, 0, 0) // 0° (straight arm)\n .rotate(BoneName.WRIST_R, 0.26, 0, 0) // 15°, 0°, 0° (impact angle)\n .rotate(BoneName.SHOULDER_L, 0.35, 0.26, -0.09) // 20°, 15°, -5° (left begins)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.79) // -45° (preparing)\n .position(BoneName.PELVIS, 0, 0, 0.1) // Maximum forward\n .done<MartialArtsAnimationBuilder>()\n // =================================================================\n // STRIKE-2 PHASE (750-1125ms, frames 13-18)\n // =================================================================\n // Frame 15: Mid-strike-2 (938ms)\n .at(0.938)\n .rotate(BoneName.SPINE_UPPER, 0, 0.61, 0) // 0°, 35°, 0° (continued rotation)\n .rotate(BoneName.PELVIS, 0, 0.52, 0) // 0°, 30°, 0° (hip drives)\n .rotate(BoneName.SHOULDER_R, 0.52, 0, 0.17) // 30°, 0°, 10° (right retracts)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.57) // 90° (pulling back)\n .rotate(BoneName.SHOULDER_L, 0.79, 0.26, -0.09) // 45°, 15°, -5° (left strikes)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.09) // -5° (extending)\n .rotate(BoneName.WRIST_L, 0.17, 0, 0) // 10°, 0°, 0° (strike ready)\n .done<MartialArtsAnimationBuilder>()\n // Frame 18: Strike-2 full extension (1125ms)\n .at(1.125)\n .rotate(BoneName.SPINE_UPPER, 0, 0.87, 0) // 0°, 50°, 0° (deep rotation)\n .rotate(BoneName.PELVIS, 0, 0.79, 0) // 0°, 45°, 0° (hip full through)\n .rotate(BoneName.SHOULDER_L, 1.14, 0.35, -0.14) // 65°, 20°, -8° (left full extension)\n .rotate(BoneName.ELBOW_L, 0, 0, 0) // 0° (straight arm)\n .rotate(BoneName.WRIST_L, 0.26, 0, 0) // 15°, 0°, 0° (impact)\n .rotate(BoneName.SHOULDER_R, 0.35, 0, 0.26) // 20°, 0°, 15° (right recovering)\n .rotate(BoneName.HEAD, 0, 0.52, 0) // 0°, 30°, 0° (head follows)\n .position(BoneName.PELVIS, -0.05, 0, 0.15) // Slight lateral shift with forward\n .done<MartialArtsAnimationBuilder>()\n // =================================================================\n // STRIKE-3 PHASE (1125-1500ms, frames 19-24)\n // =================================================================\n // Frame 21: Mid-strike-3 (1312ms)\n .at(1.312)\n .rotate(BoneName.SPINE_UPPER, 0, 1.22, 0) // 0°, 70°, 0° (near complete rotation)\n .rotate(BoneName.PELVIS, 0, 1.05, 0) // 0°, 60°, 0° (maximum hip rotation)\n .rotate(BoneName.SHOULDER_R, 0.87, 0.09, 0) // 50°, 5°, 0° (right strikes again)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.14) // 8° (extending)\n .rotate(BoneName.WRIST_R, 0.17, 0, 0) // 10°, 0°, 0° (strike alignment)\n .rotate(BoneName.SHOULDER_L, 0.52, 0.17, 0.17) // 30°, 10°, 10° (left retracts)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4) // -80° (pulling back)\n .done<MartialArtsAnimationBuilder>()\n // Frame 24: Strike-3 final extension (1500ms)\n .at(1.5)\n .rotate(BoneName.SPINE_UPPER, 0, 1.22, 0) // 0°, 70°, 0° (spine follows pelvis)\n .rotate(BoneName.PELVIS, 0, 1.4, 0) // 0°, 80°, 0° (pelvis drives full rotation)\n .rotate(BoneName.SHOULDER_R, 1.14, 0, -0.09) // 65°, 0°, -5° (final strike extended)\n .rotate(BoneName.ELBOW_R, 0, 0, 0) // 0° (straight arm at impact)\n .rotate(BoneName.WRIST_R, 0.26, 0, 0) // 15°, 0°, 0° (final impact)\n .rotate(BoneName.HEAD, 0, 1.05, 0) // 0°, 60°, 0° (full head rotation)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (rear leg drive)\n .position(BoneName.PELVIS, -0.1, 0, 0.2) // Final whirlwind position\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☴ SON SWEEPING MULTI-STRIKE (소용돌이 타격)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Son Sweeping Multi-Strike Animation\n *\n * **Korean**: 소용돌이 타격 (Soyongdori Tagyeok) - Whirlpool Strike\n * **Technique**: Continuous sweeping strikes in flowing pattern\n * **Target Points**: Low-to-high sweeping pattern targeting legs and body\n *\n * Authentic Taekyon Sweeping Technique:\n * - Low sweeping kick flows into body strike\n * - Continuous circular motion without pause\n * - Body rotation powers both sweeps\n * - Minimal recovery between strikes\n * - Creates whirlpool-like motion pattern\n *\n * Animation Phases:\n * - Wind-up (0-300ms, frames 0-5): Preparation with weight shift\n * - Sweep-1 (300-800ms, frames 6-13): Low sweeping leg attack\n * - Sweep-2 (800-1300ms, frames 14-21): Body-level circular strike\n * - Recovery (1300-1600ms, frames 22-26): Return to flowing guard\n *\n * Target Vital Points Sequence:\n * - Sweep-1: 발목 (Balmok/Ankle), 종아리 (Jongari/Calf)\n * - Sweep-2: 늑골 (Neukgol/Ribs), 간 (Gan/Liver)\n *\n * **Performance**: 60fps target (16.67ms per frame)\n * **Damage Type**: Sweeping pressure with destabilization\n *\n * @korean 소용돌이타격\n * @frames 26 total (5 wind-up, 8 sweep-1, 8 sweep-2, 5 recovery)\n * @duration 1600ms\n * @category Attack Animation\n */\nexport const SON_SWEEPING_MULTI_STRIKE: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"son_sweeping_multi_strike\",\n \"소용돌이 타격\"\n )\n .asAttack(1.6)\n // =================================================================\n // WIND-UP PHASE (0-300ms, frames 0-5)\n // =================================================================\n // Frame 0: Neutral guard (0ms)\n .at(0)\n .rotate(BoneName.PELVIS, 0, 0, 0) // Neutral\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0) // Neutral\n .rotate(BoneName.SHOULDER_L, 0.17, 0.09, -0.26) // Guard position\n .rotate(BoneName.SHOULDER_R, 0.17, -0.09, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.57)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.57)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15°\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15°\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Frame 3: Weight shift preparation (180ms)\n .at(0.18)\n .rotate(BoneName.PELVIS, 0, -0.35, 0) // 0°, -20°, 0° (wind-up)\n .rotate(BoneName.SPINE_UPPER, 0, -0.52, 0) // 0°, -30°, 0° (torso winds)\n .rotate(BoneName.KNEE_R, -0.44, 0, 0) // -25° (weight on right)\n .rotate(BoneName.KNEE_L, -0.17, 0, 0) // -10° (left lightens)\n .rotate(BoneName.HIP_L, 0.26, 0, 0) // 15°, 0°, 0° (left leg begins to lift)\n .position(BoneName.PELVIS, 0, -0.02, 0) // Slight crouch\n .done<MartialArtsAnimationBuilder>()\n // Frame 5: Full wind-up (300ms)\n .at(0.3)\n .rotate(BoneName.PELVIS, 0, -0.52, 0) // 0°, -30°, 0° (maximum wind)\n .rotate(BoneName.SPINE_UPPER, 0, -0.7, 0) // 0°, -40°, 0° (deep coil)\n .rotate(BoneName.KNEE_R, -0.52, 0, 0) // -30° (stable base)\n .rotate(BoneName.HIP_L, 0.52, 0, 0.17) // 30°, 0°, 10° (leg chambered for sweep)\n .rotate(BoneName.KNEE_L, -0.87, 0, 0) // -50° (chambered bent)\n .position(BoneName.PELVIS, 0, -0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n // =================================================================\n // SWEEP-1 PHASE (300-800ms, frames 6-13) - Low Sweeping Kick\n // =================================================================\n // Frame 8: Begin sweep (480ms)\n .at(0.48)\n .rotate(BoneName.PELVIS, 0, -0.17, 0) // 0°, -10°, 0° (unwinding)\n .rotate(BoneName.SPINE_UPPER, 0, -0.26, 0) // 0°, -15°, 0°\n .rotate(BoneName.HIP_L, 0.35, 0, 0.52) // 20°, 0°, 30° (leg extending)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° (extending for sweep)\n .rotate(BoneName.FOOT_L, -0.17, 0, 0) // -10° (foot for sweep)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20° (supporting)\n .position(BoneName.PELVIS, 0, -0.04, 0.05)\n .done<MartialArtsAnimationBuilder>()\n // Frame 10: Mid-sweep (600ms)\n .at(0.6)\n .rotate(BoneName.PELVIS, 0, 0.17, 0) // 0°, 10°, 0° (rotation through)\n .rotate(BoneName.SPINE_UPPER, 0, 0.26, 0) // 0°, 15°, 0°\n .rotate(BoneName.HIP_L, 0.26, 0, 0.87) // 15°, 0°, 50° (sweeping arc)\n .rotate(BoneName.KNEE_L, -0.17, 0, 0) // -10° (nearly extended)\n .rotate(BoneName.FOOT_L, 0.17, 0, 0) // 10° (sweeping position)\n .position(BoneName.PELVIS, -0.1, -0.05, 0.1) // Lateral and forward\n .done<MartialArtsAnimationBuilder>()\n // Frame 13: Complete low sweep (800ms)\n .at(0.8)\n .rotate(BoneName.PELVIS, 0, 0.52, 0) // 0°, 30°, 0° (full rotation)\n .rotate(BoneName.SPINE_UPPER, 0, 0.61, 0) // 0°, 35°, 0°\n .rotate(BoneName.HIP_L, 0.17, 0, 1.22) // 10°, 0°, 70° (complete arc)\n .rotate(BoneName.KNEE_L, -0.09, 0, 0) // -5° (extended)\n .rotate(BoneName.FOOT_L, 0.26, 0, 0) // 15° (impact angle)\n .rotate(BoneName.HEAD, 0, 0.35, 0) // 0°, 20°, 0° (tracking)\n .position(BoneName.PELVIS, -0.15, -0.06, 0.15)\n .done<MartialArtsAnimationBuilder>()\n // =================================================================\n // SWEEP-2 PHASE (800-1300ms, frames 14-21) - Body-Level Strike\n // =================================================================\n // Frame 16: Transition to body strike (960ms)\n .at(0.96)\n .rotate(BoneName.PELVIS, 0, 0.79, 0) // 0°, 45°, 0° (continuing rotation)\n .rotate(BoneName.SPINE_UPPER, 0, 0.87, 0) // 0°, 50°, 0°\n .rotate(BoneName.HIP_L, 0, 0, 0.52) // 0°, 0°, 30° (leg retracting)\n .rotate(BoneName.KNEE_L, -0.44, 0, 0) // -25° (pulling back)\n .rotate(BoneName.SHOULDER_R, 0.52, 0.17, 0) // 30°, 10°, 0° (right arm begins)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.87) // 50° (preparing strike)\n .position(BoneName.PELVIS, -0.15, -0.04, 0.2)\n .done<MartialArtsAnimationBuilder>()\n // Frame 18: Mid body sweep (1080ms)\n .at(1.08)\n .rotate(BoneName.PELVIS, 0, 1.05, 0) // 0°, 60°, 0° (deep rotation)\n .rotate(BoneName.SPINE_UPPER, 0, 1.22, 0) // 0°, 70°, 0°\n .rotate(BoneName.SHOULDER_R, 0.87, 0.26, -0.17) // 50°, 15°, -10° (sweeping strike)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.35) // 20° (extending)\n .rotate(BoneName.WRIST_R, 0.17, 0, 0) // 10°, 0°, 0° (strike angle)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (foot planted)\n .position(BoneName.PELVIS, -0.2, -0.02, 0.25)\n .done<MartialArtsAnimationBuilder>()\n // Frame 21: Complete body sweep (1300ms)\n .at(1.3)\n .rotate(BoneName.PELVIS, 0, 1.4, 0) // 0°, 80°, 0° (near full circle)\n .rotate(BoneName.SPINE_UPPER, 0, 1.57, 0) // 0°, 90°, 0° (quarter rotation complete)\n .rotate(BoneName.SHOULDER_R, 1.14, 0.35, -0.26) // 65°, 20°, -15° (full extension)\n .rotate(BoneName.ELBOW_R, 0, 0, 0) // 0° (straight arm impact)\n .rotate(BoneName.WRIST_R, 0.26, 0, 0) // 15°, 0°, 0° (impact)\n .rotate(BoneName.HEAD, 0, 1.22, 0) // 0°, 70°, 0° (full tracking)\n .position(BoneName.PELVIS, -0.25, 0, 0.3)\n .done<MartialArtsAnimationBuilder>()\n // =================================================================\n // RECOVERY PHASE (1300-1600ms, frames 22-26)\n // =================================================================\n // Frame 24: Begin recovery (1450ms)\n .at(1.45)\n .rotate(BoneName.PELVIS, 0, 0.87, 0) // 0°, 50°, 0° (unwinding)\n .rotate(BoneName.SPINE_UPPER, 0, 0.79, 0) // 0°, 45°, 0°\n .rotate(BoneName.SHOULDER_R, 0.52, 0.17, 0.17) // 30°, 10°, 10° (retracting)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.05) // 60° (bending back)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (stable)\n .position(BoneName.PELVIS, -0.15, 0, 0.2)\n .done<MartialArtsAnimationBuilder>()\n // Frame 26: Return to guard (1600ms)\n .at(1.6)\n .rotate(BoneName.PELVIS, 0, 0, 0) // Return to neutral\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .rotate(BoneName.SHOULDER_L, 0.17, 0.09, -0.26) // Guard restored\n .rotate(BoneName.SHOULDER_R, 0.17, -0.09, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.57)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.57)\n .rotate(BoneName.HEAD, 0, 0, 0)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// EXPORTS\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Map of all Son technique animations for easy access\n * @korean 손괘기술애니메이션맵\n */\nexport const SON_TECHNIQUE_ANIMATIONS: ReadonlyMap<string, SkeletalAnimation> = new Map([\n [\"son_whirlwind_strike\", SON_WHIRLWIND_STRIKE_ANIMATION],\n [\"son_sweeping_multi_strike\", SON_SWEEPING_MULTI_STRIKE],\n]);\n"],"mappings":"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"}
|