blacktrigram 0.7.67 → 0.7.69

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.
Files changed (219) hide show
  1. package/lib/App2.js.map +1 -1
  2. package/lib/assets/index.css +987 -987
  3. package/lib/audio/AudioAssetLoader.js.map +1 -1
  4. package/lib/audio/AudioAssetRegistry.js +2 -2
  5. package/lib/audio/AudioAssetRegistry.js.map +1 -1
  6. package/lib/audio/AudioCache.js.map +1 -1
  7. package/lib/audio/AudioManager.js +1 -1
  8. package/lib/audio/AudioManager.js.map +1 -1
  9. package/lib/audio/AudioMonitor.js.map +1 -1
  10. package/lib/audio/AudioPool.js.map +1 -1
  11. package/lib/audio/AudioProvider.js.map +1 -1
  12. package/lib/audio/AudioUtils.js.map +1 -1
  13. package/lib/audio/BoneImpactAudioMap.js.map +1 -1
  14. package/lib/components/screens/combat/CombatScreen3D.js +3 -3
  15. package/lib/components/screens/combat/CombatScreen3D.js.map +1 -1
  16. package/lib/components/screens/combat/components/controls/CombatControlsPanel.js.map +1 -1
  17. package/lib/components/screens/combat/components/controls/PauseMenu.js.map +1 -1
  18. package/lib/components/screens/combat/components/effects/BloodDecals3D.js.map +1 -1
  19. package/lib/components/screens/combat/components/effects/BloodParticles3D.js.map +1 -1
  20. package/lib/components/screens/combat/components/effects/BloodViscosity3D.js.map +1 -1
  21. package/lib/components/screens/combat/components/effects/CombatParticleEffects3D.js.map +1 -1
  22. package/lib/components/screens/combat/components/effects/InternalDamage3D.js.map +1 -1
  23. package/lib/components/screens/combat/components/effects/ParticleAudio3D.js.map +1 -1
  24. package/lib/components/screens/combat/components/hud/FPSMonitor.js.map +1 -1
  25. package/lib/components/screens/combat/components/indicators/BalanceIndicator.js.map +1 -1
  26. package/lib/components/screens/combat/hooks/useAICombat.js.map +1 -1
  27. package/lib/components/screens/combat/hooks/useCombatActions.js.map +1 -1
  28. package/lib/components/screens/combat/hooks/useCombatAttackMovement.js.map +1 -1
  29. package/lib/components/screens/controls/ControlsScreen3D.js.map +1 -1
  30. package/lib/components/screens/controls/components/ControlCategoryTabsOverlayHtml.js.map +1 -1
  31. package/lib/components/screens/endscreen/components/MatchStatisticsDisplayOverlayHtml.js.map +1 -1
  32. package/lib/components/screens/endscreen/components/PerformanceBreakdownOverlayHtml.js.map +1 -1
  33. package/lib/components/screens/endscreen/components/VictoryAnimation3D.js.map +1 -1
  34. package/lib/components/screens/intro/IntroScreen3D.js +1 -1
  35. package/lib/components/screens/intro/IntroScreen3D.js.map +1 -1
  36. package/lib/components/screens/intro/components/AbilityListOverlayHtml.js.map +1 -1
  37. package/lib/components/screens/intro/components/ArchetypeCardGridOverlayHtml.js.map +1 -1
  38. package/lib/components/screens/intro/components/ArchetypeDisplayOverlayHtml.js.map +1 -1
  39. package/lib/components/screens/intro/components/EnhancedArchetypeDisplayOverlayHtml.js.map +1 -1
  40. package/lib/components/screens/intro/components/MenuButtonsOverlayHtml.js.map +1 -1
  41. package/lib/components/screens/intro/components/MenuSectionOverlayHtml.js.map +1 -1
  42. package/lib/components/screens/intro/components/StatBarOverlayHtml.js.map +1 -1
  43. package/lib/components/screens/philosophy/PhilosophyScreen3D.js.map +1 -1
  44. package/lib/components/screens/training/TrainingScreen3D.js +1 -1
  45. package/lib/components/screens/training/TrainingScreen3D.js.map +1 -1
  46. package/lib/components/screens/training/components/AnatomyOverlay3D.js.map +1 -1
  47. package/lib/components/screens/training/components/FootworkDrillsOverlayHtml.js.map +1 -1
  48. package/lib/components/screens/training/components/HitFeedbackEffect3D.js.map +1 -1
  49. package/lib/components/screens/training/components/TrainingButtonsOverlayHtml.js.map +1 -1
  50. package/lib/components/screens/training/components/TrainingDummy3D.js.map +1 -1
  51. package/lib/components/screens/training/components/TrainingModeSelectorOverlayHtml.js.map +1 -1
  52. package/lib/components/screens/training/components/TrainingStatsOverlayHtml.js.map +1 -1
  53. package/lib/components/screens/training/components/VitalPointMarker3D.js.map +1 -1
  54. package/lib/components/screens/training/hooks/useAttackMovement.js.map +1 -1
  55. package/lib/components/screens/training/hooks/useTrainingActions.js.map +1 -1
  56. package/lib/components/shared/mobile/ActionButtons.js.map +1 -1
  57. package/lib/components/shared/mobile/GestureRecognizerPure.js.map +1 -1
  58. package/lib/components/shared/mobile/HapticController.js.map +1 -1
  59. package/lib/components/shared/mobile/StanceWheelPure.js.map +1 -1
  60. package/lib/components/shared/mobile/VirtualDPad.js.map +1 -1
  61. package/lib/components/shared/three/anatomy/BoneAttachedMuscles.js.map +1 -1
  62. package/lib/components/shared/three/anatomy/BoneClothing.js.map +1 -1
  63. package/lib/components/shared/three/anatomy/BoneRenderer.js.map +1 -1
  64. package/lib/components/shared/three/anatomy/Face3D.js.map +1 -1
  65. package/lib/components/shared/three/effects/ActionFeedback.js.map +1 -1
  66. package/lib/components/shared/three/effects/DamageNumbers.js.map +1 -1
  67. package/lib/components/shared/three/effects/HitEffects3D.js.map +1 -1
  68. package/lib/components/shared/three/effects/StanceTransitionEffect.js.map +1 -1
  69. package/lib/components/shared/three/effects/VitalPointMarkers3D.js.map +1 -1
  70. package/lib/components/shared/three/indicators/ElementalColorSystem.js.map +1 -1
  71. package/lib/components/shared/three/indicators/GuardIndicator.js.map +1 -1
  72. package/lib/components/shared/three/scene/CombatArena3D.js.map +1 -1
  73. package/lib/components/shared/three/ui/BodyPartHealthDisplay.js.map +1 -1
  74. package/lib/components/shared/three/ui/CombatReadinessBar.js.map +1 -1
  75. package/lib/components/shared/three/ui/HealthBar.js.map +1 -1
  76. package/lib/components/shared/three/ui/PlayerHUD.js.map +1 -1
  77. package/lib/components/shared/three/ui/SpeedIndicatorHUD.js.map +1 -1
  78. package/lib/components/shared/three/ui/StaminaBar.js.map +1 -1
  79. package/lib/components/shared/three/ui/TechniqueCard.js.map +1 -1
  80. package/lib/components/shared/three/ui/VitalPointOverlayControlsHtml.js.map +1 -1
  81. package/lib/components/shared/ui/SplashScreen.js +2 -2
  82. package/lib/components/shared/ui/VitalPointOverlayControlsPure.js.map +1 -1
  83. package/lib/components/ui/combat/BalanceIndicatorOverlayHtml.js.map +1 -1
  84. package/lib/data/techniques.js.map +1 -1
  85. package/lib/hooks/useCombatTimer.js.map +1 -1
  86. package/lib/hooks/useKeyboardControls.js.map +1 -1
  87. package/lib/hooks/useSkeletalAnimation.js +2 -2
  88. package/lib/hooks/useSkeletalAnimation.js.map +1 -1
  89. package/lib/hooks/useTechniqueSelection.js.map +1 -1
  90. package/lib/hooks/useWebGLContextLossHandler.js.map +1 -1
  91. package/lib/index.js +2 -2
  92. package/lib/systems/CombatSystem.js.map +1 -1
  93. package/lib/systems/EffectCalculator.js.map +1 -1
  94. package/lib/systems/ResponsiveScaling.js.map +1 -1
  95. package/lib/systems/TrigramSystem.js.map +1 -1
  96. package/lib/systems/ai/AIPersonality.js.map +1 -1
  97. package/lib/systems/ai/ArchetypeEnforcer.js.map +1 -1
  98. package/lib/systems/ai/DecisionTree.js.map +1 -1
  99. package/lib/systems/animation/builders/KeyframeConfig.js.map +1 -1
  100. package/lib/systems/animation/builders/KeyframeInterpolation.js.map +1 -1
  101. package/lib/systems/animation/builders/MartialArtsAnimationBuilder.js.map +1 -1
  102. package/lib/systems/animation/builders/SkeletonRig.js +1 -1
  103. package/lib/systems/animation/builders/SkeletonRig.js.map +1 -1
  104. package/lib/systems/animation/catalogs/AttackAnimations.js +1 -1
  105. package/lib/systems/animation/catalogs/AttackAnimations.js.map +1 -1
  106. package/lib/systems/animation/catalogs/BasicAnimations.js +1 -1
  107. package/lib/systems/animation/catalogs/BasicAnimations.js.map +1 -1
  108. package/lib/systems/animation/catalogs/ComboAnimations.js +1 -1
  109. package/lib/systems/animation/catalogs/ComboAnimations.js.map +1 -1
  110. package/lib/systems/animation/catalogs/DarkOpsAnimations.js +1 -1
  111. package/lib/systems/animation/catalogs/DarkOpsAnimations.js.map +1 -1
  112. package/lib/systems/animation/catalogs/DefensiveAnimations.js +2 -11
  113. package/lib/systems/animation/catalogs/DefensiveAnimations.js.map +1 -1
  114. package/lib/systems/animation/catalogs/ElbowKneeAnimations.js +1 -1
  115. package/lib/systems/animation/catalogs/ElbowKneeAnimations.js.map +1 -1
  116. package/lib/systems/animation/catalogs/FootworkSkeletalAnimations.js +1 -1
  117. package/lib/systems/animation/catalogs/FootworkSkeletalAnimations.js.map +1 -1
  118. package/lib/systems/animation/catalogs/GamRedirectionAnimations.js.map +1 -1
  119. package/lib/systems/animation/catalogs/GamStanceAnimations.js.map +1 -1
  120. package/lib/systems/animation/catalogs/GamTechniqueAnimations.js.map +1 -1
  121. package/lib/systems/animation/catalogs/GanStanceAnimations.js +1 -1
  122. package/lib/systems/animation/catalogs/GanStanceAnimations.js.map +1 -1
  123. package/lib/systems/animation/catalogs/GanTechniqueAnimations.js +1 -1
  124. package/lib/systems/animation/catalogs/GanTechniqueAnimations.js.map +1 -1
  125. package/lib/systems/animation/catalogs/GeonStanceAnimations.js +1 -1
  126. package/lib/systems/animation/catalogs/GeonStanceAnimations.js.map +1 -1
  127. package/lib/systems/animation/catalogs/GonTechniqueAnimations.js +1 -1
  128. package/lib/systems/animation/catalogs/GonTechniqueAnimations.js.map +1 -1
  129. package/lib/systems/animation/catalogs/GrapplingAnimations.js +1 -1
  130. package/lib/systems/animation/catalogs/GrapplingAnimations.js.map +1 -1
  131. package/lib/systems/animation/catalogs/JinStanceAnimations.js +1 -1
  132. package/lib/systems/animation/catalogs/JinStanceAnimations.js.map +1 -1
  133. package/lib/systems/animation/catalogs/JinTechniqueAnimations.js +1 -1
  134. package/lib/systems/animation/catalogs/JinTechniqueAnimations.js.map +1 -1
  135. package/lib/systems/animation/catalogs/KickAnimations.js +1 -1
  136. package/lib/systems/animation/catalogs/KickAnimations.js.map +1 -1
  137. package/lib/systems/animation/catalogs/LiStanceAnimations.js +1 -1
  138. package/lib/systems/animation/catalogs/LiStanceAnimations.js.map +1 -1
  139. package/lib/systems/animation/catalogs/LiTechniqueAnimations.js.map +1 -1
  140. package/lib/systems/animation/catalogs/MovementAnimations.js +1 -1
  141. package/lib/systems/animation/catalogs/MovementAnimations.js.map +1 -1
  142. package/lib/systems/animation/catalogs/PunchAnimations.js +1 -1
  143. package/lib/systems/animation/catalogs/PunchAnimations.js.map +1 -1
  144. package/lib/systems/animation/catalogs/SonStanceAnimations.js +1 -1
  145. package/lib/systems/animation/catalogs/SonStanceAnimations.js.map +1 -1
  146. package/lib/systems/animation/catalogs/SonTechniqueAnimations.js +1 -1
  147. package/lib/systems/animation/catalogs/SonTechniqueAnimations.js.map +1 -1
  148. package/lib/systems/animation/catalogs/SpecializedPunchAnimations.js +1 -1
  149. package/lib/systems/animation/catalogs/SpecializedPunchAnimations.js.map +1 -1
  150. package/lib/systems/animation/catalogs/StanceAnimations.js +1 -1
  151. package/lib/systems/animation/catalogs/StanceAnimations.js.map +1 -1
  152. package/lib/systems/animation/catalogs/StanceAttackAnimations.js +215 -272
  153. package/lib/systems/animation/catalogs/StanceAttackAnimations.js.map +1 -1
  154. package/lib/systems/animation/catalogs/StanceIdleAnimations.js +2 -11
  155. package/lib/systems/animation/catalogs/StanceIdleAnimations.js.map +1 -1
  156. package/lib/systems/animation/catalogs/StanceLocomotionAnimations.js +2 -2
  157. package/lib/systems/animation/catalogs/StanceLocomotionAnimations.js.map +1 -1
  158. package/lib/systems/animation/catalogs/StepSkeletalAnimations.js +1 -1
  159. package/lib/systems/animation/catalogs/StepSkeletalAnimations.js.map +1 -1
  160. package/lib/systems/animation/catalogs/TaeJointLockAnimations.js.map +1 -1
  161. package/lib/systems/animation/catalogs/TaeStanceAnimations.js +1 -1
  162. package/lib/systems/animation/catalogs/TaeStanceAnimations.js.map +1 -1
  163. package/lib/systems/animation/core/AnimationOptimizations.js +1 -1
  164. package/lib/systems/animation/core/AnimationOptimizations.js.map +1 -1
  165. package/lib/systems/animation/core/AnimationPriority.js.map +1 -1
  166. package/lib/systems/animation/core/AnimationRegistry.js +11 -209
  167. package/lib/systems/animation/core/AnimationRegistry.js.map +1 -1
  168. package/lib/systems/animation/core/AnimationStateMachine.js +2 -2
  169. package/lib/systems/animation/core/AnimationStateMachine.js.map +1 -1
  170. package/lib/systems/animation/core/TechniqueAnimationMapper.js +1 -1
  171. package/lib/systems/animation/core/TechniqueAnimationMapper.js.map +1 -1
  172. package/lib/systems/animation/core/TechniqueAnimationMapping.js +1 -1
  173. package/lib/systems/animation/core/TechniqueAnimationMapping.js.map +1 -1
  174. package/lib/systems/animation/systems/MuscleActivation.js.map +1 -1
  175. package/lib/systems/bodypart/BodyPartDamageIntegration.js.map +1 -1
  176. package/lib/systems/bodypart/BodyPartHealthSystem.js.map +1 -1
  177. package/lib/systems/bodypart/BodyPartPositionMapping.js.map +1 -1
  178. package/lib/systems/bodypart/InjuryTracker.js.map +1 -1
  179. package/lib/systems/breathing/BreathingDisruptionSystem.js.map +1 -1
  180. package/lib/systems/combat/BalanceSystem.js.map +1 -1
  181. package/lib/systems/combat/BreakingStatusEffects.js.map +1 -1
  182. package/lib/systems/combat/CombatStateSystem.js.map +1 -1
  183. package/lib/systems/combat/GrappleSystem.js.map +1 -1
  184. package/lib/systems/combat/painConsciousnessUtils.js.map +1 -1
  185. package/lib/systems/combat/typeGuards.js.map +1 -1
  186. package/lib/systems/index.js +2 -2
  187. package/lib/systems/movement/integration.js.map +1 -1
  188. package/lib/systems/physics/AttackMovementPhysics.js.map +1 -1
  189. package/lib/systems/physics/CollisionDetection.js +1 -1
  190. package/lib/systems/physics/CollisionDetection.js.map +1 -1
  191. package/lib/systems/physics/KnockbackPhysics.js.map +1 -1
  192. package/lib/systems/physics/MovementPhysics.js.map +1 -1
  193. package/lib/systems/physics/PhysicalReachCalculator.js.map +1 -1
  194. package/lib/systems/physics/SpeedModifierSystem.js.map +1 -1
  195. package/lib/systems/trigram/KoreanTechniques.js.map +1 -1
  196. package/lib/systems/trigram/StanceManager.js.map +1 -1
  197. package/lib/systems/trigram/TransitionCalculator.js.map +1 -1
  198. package/lib/systems/trigram/TrigramCalculator.js.map +1 -1
  199. package/lib/systems/trigram/techniques/TechniqueConfig.js.map +1 -1
  200. package/lib/systems/trigram/techniques/index.js.map +1 -1
  201. package/lib/systems/trigram/types.js.map +1 -1
  202. package/lib/systems/vitalpoint/DamageCalculator.js.map +1 -1
  203. package/lib/systems/vitalpoint/KoreanAnatomy.js.map +1 -1
  204. package/lib/systems/vitalpoint/KoreanVitalPoints.js.map +1 -1
  205. package/lib/systems/vitalpoint/MeridianVitalPointMapping.js.map +1 -1
  206. package/lib/types/constants/designSystem.js.map +1 -1
  207. package/lib/utils/colorHelpers.js.map +1 -1
  208. package/lib/utils/colorUtils.js.map +1 -1
  209. package/lib/utils/controlMapping.js.map +1 -1
  210. package/lib/utils/deviceDetection.js.map +1 -1
  211. package/lib/utils/effectUtils.js.map +1 -1
  212. package/lib/utils/fabricTextures.js.map +1 -1
  213. package/lib/utils/htmlOverlayHelpers.js.map +1 -1
  214. package/lib/utils/performance/PerformanceMonitor.js.map +1 -1
  215. package/lib/utils/performance/PerformanceOverlay3D.js.map +1 -1
  216. package/lib/utils/safeAreaUtils.js.map +1 -1
  217. package/lib/utils/stanceHelpers.js.map +1 -1
  218. package/lib/utils/visualEffects.js.map +1 -1
  219. package/package.json +9 -9
@@ -1 +1 @@
1
- {"version":3,"file":"StanceLocomotionAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/StanceLocomotionAnimations.ts"],"sourcesContent":["/**\n * Stance-Specific Locomotion Animations Module\n *\n * Trigram-specific walk and run animations for each of the eight stances.\n * Each trigram has unique movement characteristics reflecting its philosophy:\n *\n * ☰ Geon (Heaven): Direct, powerful movements\n * ☱ Tae (Lake): Fluid, adaptive movements\n * ☲ Li (Fire): Quick, precise movements\n * ☳ Jin (Thunder): Explosive, sudden movements\n * ☴ Son (Wind): Continuous, flowing movements\n * ☵ Gam (Water): Adaptive, redirecting movements\n * ☶ Gan (Mountain): Stable, grounded movements\n * ☷ Gon (Earth): Heavy, rooted movements\n *\n * DESIGN PRINCIPLES:\n * - Fighters MAINTAIN GUARD during locomotion (no arm swing)\n * - Arms/torso/pelvis use withTrigramGuard() from builder\n * - Legs blend trigram base position + locomotion motion\n * - Each stance has distinct leg mechanics (stance width, knee bend, weight)\n *\n * @module systems/animation/StanceLocomotionAnimations\n * @korean 자세별이동애니메이션\n */\n\nimport { TrigramStance } from \"@/types/common\";\nimport type { SkeletalAnimation } from \"@/types/skeletal\";\nimport { BoneName } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\nimport { KOREAN_STANCE_BIOMECHANICS } from \"../builders/MartialArtsConstants\";\nimport { TRIGRAM_GUARD_POSES } from \"../builders/TrigramGuardApplicator\";\n\n// ═══════════════════════════════════════════════════════════════════════════\n// CONSTANTS\n// ═══════════════════════════════════════════════════════════════════════════\n\n/** Default shoulder width for stance locomotion animations (cm) */\nconst DEFAULT_SHOULDER_WIDTH_CM = 46;\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ARM SWING HELPERS - Apply guard pose with locomotion swing offset\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Get arm positions with walk swing for a trigram stance\n *\n * Combines the trigram's guard arm position with a forward/back swing offset.\n * The elbow position from the guard is preserved to maintain proper guard shape.\n *\n * @param stance - Trigram stance\n * @param leftSwing - Left shoulder forward swing (positive = forward)\n * @param rightSwing - Right shoulder forward swing (positive = forward)\n * @returns Arm rotation values to apply\n *\n * @korean 걷기팔스윙가져오기\n */\nfunction getWalkArmSwing(\n stance: TrigramStance,\n leftSwing: number,\n rightSwing: number,\n): {\n leftShoulder: [number, number, number];\n leftElbow: [number, number, number];\n rightShoulder: [number, number, number];\n rightElbow: [number, number, number];\n} {\n const guard = TRIGRAM_GUARD_POSES[stance];\n\n return {\n // Add swing to X rotation, preserve Y and Z from guard\n leftShoulder: [\n guard.leftArm.shoulder.x + leftSwing,\n guard.leftArm.shoulder.y,\n guard.leftArm.shoulder.z,\n ],\n leftElbow: [\n guard.leftArm.elbow.x,\n guard.leftArm.elbow.y,\n guard.leftArm.elbow.z,\n ],\n rightShoulder: [\n guard.rightArm.shoulder.x + rightSwing,\n guard.rightArm.shoulder.y,\n guard.rightArm.shoulder.z,\n ],\n rightElbow: [\n guard.rightArm.elbow.x,\n guard.rightArm.elbow.y,\n guard.rightArm.elbow.z,\n ],\n };\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// SINGLE STEP WALK DESIGN (단일 보행 설계)\n// ═══════════════════════════════════════════════════════════════════════════\n/**\n * WALK ANIMATION DESIGN PHILOSOPHY:\n *\n * Walk animations are SINGLE STEPS that change foot laterality.\n * Each walk animation:\n * 1. Starts with one foot forward (e.g., left foot front)\n * 2. Steps forward with the rear foot\n * 3. Ends with the other foot forward (e.g., right foot front)\n *\n * This is NOT a continuous walk cycle - it's a discrete step that\n * transitions between two stable idle poses with opposite foot laterality.\n *\n * The animation should:\n * - Duration: 0.4-0.6s for a single step (longer = more deliberate)\n * - NOT loop (loops: false)\n * - End in a stable stance ready for another action\n * - Maintain guard position throughout (no wild arm swings)\n *\n * RUN ANIMATION DESIGN PHILOSOPHY:\n *\n * Run animations are CONTINUOUS LOOPING cycles.\n * Trained fighters maintain guard pose during running:\n * - Arms stay in guard position (NO arm swing)\n * - Only legs show running motion\n * - This allows immediate combat readiness\n *\n * @korean 단일보행설계철학\n */\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☰ GEON (건) - HEAVEN: Direct, Powerful Movements\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Geon Walk - 건보법\n * SINGLE STEP: Powerful authoritative stride, changes foot laterality\n *\n * Start: Left foot forward, right foot back\n * End: Right foot forward, left foot back (reversed laterality)\n *\n * Maintains high guard throughout the step\n */\nexport const GEON_WALK_ANIMATION: SkeletalAnimation = (() => {\n const arms = getWalkArmSwing(TrigramStance.GEON, 0, 0); // Guard position maintained\n\n return (\n MartialArtsAnimationBuilder.create(\"walk_geon\", \"건보법\")\n .asMovement(0.5, false) // Single step, NOT looping\n // Start: Left foot forward (standard stance laterality)\n .at(0.0, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.1, 0.05, 0)\n .rotate(BoneName.HIP_L, 0.35, 0, 0) // Left forward\n .rotate(BoneName.KNEE_L, -0.25, 0, 0)\n .rotate(BoneName.HIP_R, -0.25, 0, 0) // Right back\n .rotate(BoneName.KNEE_R, -0.15, 0, 0)\n // Arms maintain guard\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.05, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GEON_HEAVEN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // Mid: Passing phase (feet together, weight shifting)\n .at(0.25, \"linear\")\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.HIP_L, 0, 0, 0) // Feet passing\n .rotate(BoneName.KNEE_L, -0.5, 0, 0) // Lift rear foot\n .rotate(BoneName.HIP_R, 0.2, 0, 0) // Stepping forward\n .rotate(BoneName.KNEE_R, -0.6, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .position(BoneName.PELVIS, 0, 0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GEON_HEAVEN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // End: Right foot forward (reversed laterality)\n .at(0.5, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.1, -0.05, 0)\n .rotate(BoneName.HIP_R, 0.35, 0, 0) // Right now forward\n .rotate(BoneName.KNEE_R, -0.25, 0, 0)\n .rotate(BoneName.HIP_L, -0.25, 0, 0) // Left now back\n .rotate(BoneName.KNEE_L, -0.15, 0, 0)\n // Arms maintain guard\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GEON_HEAVEN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n/**\n * Geon Run - 건질주\n * Powerful forward charge with aggressive posture\n * Stance width: 1.35x shoulder width maintained during run\n *\n * Uses GEON_HIGH_GUARD_POSE arm positions with enhanced run swing\n */\nexport const GEON_RUN_ANIMATION: SkeletalAnimation = (() => {\n // Trained fighters maintain guard pose - no arm swing\n const arms = getWalkArmSwing(TrigramStance.GEON, 0, 0);\n\n return (\n MartialArtsAnimationBuilder.create(\"run_geon\", \"건질주\")\n .asMovement(0.45, true)\n .at(0.0, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.2, 0.08, 0)\n .rotate(BoneName.HIP_L, -0.5, 0, 0)\n .rotate(BoneName.KNEE_L, -0.2, 0, 0)\n .rotate(BoneName.HIP_R, 0.7, 0, 0)\n .rotate(BoneName.KNEE_R, -1.0, 0, 0)\n // Arms maintain guard pose throughout\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.15, 0, 0)\n .position(BoneName.PELVIS, 0, 0.05, 0.05)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GEON_HEAVEN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.225, \"linear\")\n .rotate(BoneName.PELVIS, 0.15, 0, 0)\n .rotate(BoneName.HIP_L, 0.2, 0, 0)\n .rotate(BoneName.KNEE_L, -1.2, 0, 0)\n .rotate(BoneName.HIP_R, -0.3, 0, 0)\n .rotate(BoneName.KNEE_R, -0.3, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.08, 0.05)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GEON_HEAVEN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.45, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.2, -0.08, 0)\n .rotate(BoneName.HIP_R, -0.5, 0, 0)\n .rotate(BoneName.KNEE_R, -0.2, 0, 0)\n .rotate(BoneName.HIP_L, 0.7, 0, 0)\n .rotate(BoneName.KNEE_L, -1.0, 0, 0)\n // Arms maintain guard pose throughout\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.05, 0.05)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GEON_HEAVEN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☱ TAE (태) - LAKE: Fluid, Adaptive Movements\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Tae Walk - 태보법\n * SINGLE STEP: Light cat-like step with 90/10 weight on back foot\n *\n * Start: Left foot forward\n * End: Right foot forward (reversed laterality)\n *\n * Maintains fluid guard throughout\n */\nexport const TAE_WALK_ANIMATION: SkeletalAnimation = (() => {\n const arms = getWalkArmSwing(TrigramStance.TAE, 0, 0);\n\n return (\n MartialArtsAnimationBuilder.create(\"walk_tae\", \"태보법\")\n .asMovement(0.55, false) // Single step, NOT looping\n // Start: Left foot forward (cat stance)\n .at(0.0, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.05, 0.08, 0)\n .rotate(BoneName.HIP_L, 0.2, 0, -0.1) // Left forward\n .rotate(BoneName.KNEE_L, -0.1, 0, 0)\n .rotate(BoneName.FOOT_L, 0.2, 0, 0)\n .rotate(BoneName.HIP_R, -0.15, 0, 0.1) // Right back (weight)\n .rotate(BoneName.KNEE_R, -0.4, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0, 0.05, 0)\n .position(BoneName.PELVIS, 0, -0.02, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.TAE_LAKE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // Mid: Passing phase\n .at(0.275, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.03, 0, 0)\n .rotate(BoneName.HIP_L, -0.1, 0, 0)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0)\n .rotate(BoneName.HIP_R, 0.15, 0, 0)\n .rotate(BoneName.KNEE_R, -0.5, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .position(BoneName.PELVIS, 0, 0.01, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.TAE_LAKE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // End: Right foot forward (reversed laterality)\n .at(0.55, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.05, -0.08, 0)\n .rotate(BoneName.HIP_R, 0.2, 0, 0.1) // Right now forward\n .rotate(BoneName.KNEE_R, -0.1, 0, 0)\n .rotate(BoneName.FOOT_R, 0.2, 0, 0)\n .rotate(BoneName.HIP_L, -0.15, 0, -0.1) // Left now back\n .rotate(BoneName.KNEE_L, -0.4, 0, 0)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SPINE_UPPER, 0, -0.05, 0)\n .position(BoneName.PELVIS, 0, -0.02, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.TAE_LAKE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n/**\n * Tae Run - 태질주\n * Flowing, evasive run with quick direction changes\n *\n * Uses TAE_FLUID_GUARD_POSE arm positions with run swing\n */\nexport const TAE_RUN_ANIMATION: SkeletalAnimation = (() => {\n // Trained fighters maintain guard pose - no arm swing\n const arms = getWalkArmSwing(TrigramStance.TAE, 0, 0);\n\n return MartialArtsAnimationBuilder.create(\"run_tae\", \"태질주\")\n .asMovement(0.5, true)\n .at(0.0, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.12, 0.1, 0)\n .rotate(BoneName.HIP_L, -0.4, 0, 0)\n .rotate(BoneName.KNEE_L, -0.3, 0, 0)\n .rotate(BoneName.HIP_R, 0.6, 0, 0)\n .rotate(BoneName.KNEE_R, -0.8, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.05, 0.05, 0)\n .position(BoneName.PELVIS, 0, 0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.TAE_LAKE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.25, \"linear\")\n .rotate(BoneName.PELVIS, 0.1, 0, 0)\n .rotate(BoneName.HIP_L, 0.3, 0, 0)\n .rotate(BoneName.KNEE_L, -1.0, 0, 0)\n .rotate(BoneName.HIP_R, -0.2, 0, 0)\n .rotate(BoneName.KNEE_R, -0.25, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.06, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.TAE_LAKE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.5, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.12, -0.1, 0)\n .rotate(BoneName.HIP_R, -0.4, 0, 0)\n .rotate(BoneName.KNEE_R, -0.3, 0, 0)\n .rotate(BoneName.HIP_L, 0.6, 0, 0)\n .rotate(BoneName.KNEE_L, -0.8, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.05, -0.05, 0)\n .position(BoneName.PELVIS, 0, 0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.TAE_LAKE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build();\n})();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☲ LI (리) - FIRE: Quick, Precise Movements\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Li Walk - 리보법\n * SINGLE STEP: Quick precise step with minimal movement\n *\n * Start: Left foot forward\n * End: Right foot forward (reversed laterality)\n *\n * Maintains peekaboo guard throughout\n */\nexport const LI_WALK_ANIMATION: SkeletalAnimation = (() => {\n const arms = getWalkArmSwing(TrigramStance.LI, 0, 0);\n\n return (\n MartialArtsAnimationBuilder.create(\"walk_li\", \"리보법\")\n .asMovement(0.45, false) // Single step, fast and precise\n // Start: Left foot forward\n .at(0.0, \"linear\")\n .rotate(BoneName.PELVIS, 0.08, 0.06, 0)\n .rotate(BoneName.HIP_L, 0.3, 0, 0) // Left forward\n .rotate(BoneName.KNEE_L, -0.2, 0, 0)\n .rotate(BoneName.HIP_R, -0.2, 0, 0) // Right back\n .rotate(BoneName.KNEE_R, -0.15, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.03, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.LI_FIRE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // Mid: Passing phase (quick)\n .at(0.225, \"linear\")\n .rotate(BoneName.PELVIS, 0.05, 0, 0)\n .rotate(BoneName.HIP_L, -0.1, 0, 0)\n .rotate(BoneName.KNEE_L, -0.12, 0, 0)\n .rotate(BoneName.HIP_R, 0.1, 0, 0)\n .rotate(BoneName.KNEE_R, -0.5, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .position(BoneName.PELVIS, 0, 0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.LI_FIRE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // End: Right foot forward\n .at(0.45, \"linear\")\n .rotate(BoneName.PELVIS, 0.08, -0.06, 0)\n .rotate(BoneName.HIP_R, 0.3, 0, 0) // Right now forward\n .rotate(BoneName.KNEE_R, -0.2, 0, 0)\n .rotate(BoneName.HIP_L, -0.2, 0, 0) // Left now back\n .rotate(BoneName.KNEE_L, -0.15, 0, 0)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.LI_FIRE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n/**\n * Li Run - 리질주\n * Explosive sprint with precision footwork\n *\n * Uses LI_FIRE_GUARD_POSE arm positions with run swing\n */\nexport const LI_RUN_ANIMATION: SkeletalAnimation = (() => {\n // Trained fighters maintain guard pose - no arm swing\n const arms = getWalkArmSwing(TrigramStance.LI, 0, 0);\n\n return MartialArtsAnimationBuilder.create(\"run_li\", \"리질주\")\n .asMovement(0.4, true)\n .at(0.0, \"linear\")\n .rotate(BoneName.PELVIS, 0.18, 0.08, 0)\n .rotate(BoneName.HIP_L, -0.45, 0, 0)\n .rotate(BoneName.KNEE_L, -0.25, 0, 0)\n .rotate(BoneName.HIP_R, 0.65, 0, 0)\n .rotate(BoneName.KNEE_R, -0.95, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.12, 0, 0)\n .position(BoneName.PELVIS, 0, 0.06, 0.04)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.LI_FIRE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.2, \"linear\")\n .rotate(BoneName.PELVIS, 0.12, 0, 0)\n .rotate(BoneName.HIP_L, 0.25, 0, 0)\n .rotate(BoneName.KNEE_L, -1.15, 0, 0)\n .rotate(BoneName.HIP_R, -0.25, 0, 0)\n .rotate(BoneName.KNEE_R, -0.25, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.09, 0.04)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.LI_FIRE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.4, \"linear\")\n .rotate(BoneName.PELVIS, 0.18, -0.08, 0)\n .rotate(BoneName.HIP_R, -0.45, 0, 0)\n .rotate(BoneName.KNEE_R, -0.25, 0, 0)\n .rotate(BoneName.HIP_L, 0.65, 0, 0)\n .rotate(BoneName.KNEE_L, -0.95, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.06, 0.04)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.LI_FIRE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build();\n})();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☳ JIN (진) - THUNDER: Explosive, Sudden Movements\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Jin Walk - 진보법\n * Explosive step-and-ready walk, prepared to strike\n *\n * Uses JIN_THUNDER_GUARD_POSE arm positions with walk swing\n */\nexport const JIN_WALK_ANIMATION: SkeletalAnimation = (() => {\n const arms = getWalkArmSwing(TrigramStance.JIN, 0, 0);\n\n return (\n MartialArtsAnimationBuilder.create(\"walk_jin\", \"진보법\")\n .asMovement(0.5, false) // Single step, coiled energy\n // Start: Left foot forward\n .at(0.0, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.12, 0.06, 0)\n .rotate(BoneName.HIP_L, 0.4, 0, 0) // Left forward\n .rotate(BoneName.KNEE_L, -0.3, 0, 0)\n .rotate(BoneName.HIP_R, -0.3, 0, 0) // Right back\n .rotate(BoneName.KNEE_R, -0.2, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.08, 0, 0)\n .rotate(BoneName.SPINE_LOWER, 0.05, 0, 0)\n .position(BoneName.PELVIS, 0, -0.01, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.JIN_THUNDER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // Mid: Passing phase\n .at(0.25, \"ease-in\")\n .rotate(BoneName.PELVIS, 0.08, 0, 0)\n .rotate(BoneName.HIP_L, -0.15, 0, 0)\n .rotate(BoneName.KNEE_L, -0.2, 0, 0)\n .rotate(BoneName.HIP_R, 0.15, 0, 0)\n .rotate(BoneName.KNEE_R, -0.6, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.02, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.JIN_THUNDER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // End: Right foot forward\n .at(0.5, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.12, -0.06, 0)\n .rotate(BoneName.HIP_R, 0.4, 0, 0) // Right now forward\n .rotate(BoneName.KNEE_R, -0.3, 0, 0)\n .rotate(BoneName.HIP_L, -0.3, 0, 0) // Left now back\n .rotate(BoneName.KNEE_L, -0.2, 0, 0)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .position(BoneName.PELVIS, 0, -0.01, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.JIN_THUNDER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n/**\n * Jin Run - 진질주\n * Thunderous charge with explosive power\n *\n * Uses JIN_THUNDER_GUARD_POSE arm positions with run swing\n */\nexport const JIN_RUN_ANIMATION: SkeletalAnimation = (() => {\n // Trained fighters maintain guard pose - no arm swing\n const arms = getWalkArmSwing(TrigramStance.JIN, 0, 0);\n\n return MartialArtsAnimationBuilder.create(\"run_jin\", \"진질주\")\n .asMovement(0.42, true)\n .at(0.0, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.22, 0.1, 0)\n .rotate(BoneName.HIP_L, -0.55, 0, 0)\n .rotate(BoneName.KNEE_L, -0.3, 0, 0)\n .rotate(BoneName.HIP_R, 0.75, 0, 0)\n .rotate(BoneName.KNEE_R, -1.1, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.18, 0, 0)\n .rotate(BoneName.SPINE_LOWER, 0.1, 0, 0)\n .position(BoneName.PELVIS, 0, 0.04, 0.06)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.JIN_THUNDER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.21, \"linear\")\n .rotate(BoneName.PELVIS, 0.16, 0, 0)\n .rotate(BoneName.HIP_L, 0.3, 0, 0)\n .rotate(BoneName.KNEE_L, -1.25, 0, 0)\n .rotate(BoneName.HIP_R, -0.35, 0, 0)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.08, 0.06)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.JIN_THUNDER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.42, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.22, -0.1, 0)\n .rotate(BoneName.HIP_R, -0.55, 0, 0)\n .rotate(BoneName.KNEE_R, -0.3, 0, 0)\n .rotate(BoneName.HIP_L, 0.75, 0, 0)\n .rotate(BoneName.KNEE_L, -1.1, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.04, 0.06)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.JIN_THUNDER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build();\n})();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☴ SON (손) - WIND: Continuous, Flowing Movements\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Son Walk - 손보법\n * SINGLE STEP: Gentle flowing step like wind through trees\n *\n * Start: Left foot forward\n * End: Right foot forward (reversed laterality)\n */\nexport const SON_WALK_ANIMATION: SkeletalAnimation = (() => {\n const arms = getWalkArmSwing(TrigramStance.SON, 0, 0);\n\n return (\n MartialArtsAnimationBuilder.create(\"walk_son\", \"손보법\")\n .asMovement(0.55, false) // Single flowing step\n // Start: Left foot forward\n .at(0.0, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.06, 0.04, 0)\n .rotate(BoneName.HIP_L, 0.25, 0, 0) // Left forward\n .rotate(BoneName.KNEE_L, -0.15, 0, 0)\n .rotate(BoneName.HIP_R, -0.18, 0, 0) // Right back\n .rotate(BoneName.KNEE_R, -0.12, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.02, 0.03, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.SON_WIND.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // Mid: Passing phase\n .at(0.275, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.04, 0, 0)\n .rotate(BoneName.HIP_L, -0.08, 0, 0)\n .rotate(BoneName.KNEE_L, -0.1, 0, 0)\n .rotate(BoneName.HIP_R, 0.1, 0, 0)\n .rotate(BoneName.KNEE_R, -0.4, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.02, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.SON_WIND.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // End: Right foot forward\n .at(0.55, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.06, -0.04, 0)\n .rotate(BoneName.HIP_R, 0.25, 0, 0) // Right now forward\n .rotate(BoneName.KNEE_R, -0.15, 0, 0)\n .rotate(BoneName.HIP_L, -0.18, 0, 0) // Left now back\n .rotate(BoneName.KNEE_L, -0.12, 0, 0)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SPINE_UPPER, 0.02, -0.03, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.SON_WIND.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n/**\n * Son Run - 손질주\n * Swift, gliding run like wind rushing\n *\n * Uses SON_WIND_GUARD_POSE arm positions with run swing\n */\nexport const SON_RUN_ANIMATION: SkeletalAnimation = (() => {\n // Trained fighters maintain guard pose - no arm swing\n const arms = getWalkArmSwing(TrigramStance.SON, 0, 0);\n\n return MartialArtsAnimationBuilder.create(\"run_son\", \"손질주\")\n .asMovement(0.48, true)\n .at(0.0, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.14, 0.08, 0)\n .rotate(BoneName.HIP_L, -0.4, 0, 0)\n .rotate(BoneName.KNEE_L, -0.25, 0, 0)\n .rotate(BoneName.HIP_R, 0.6, 0, 0)\n .rotate(BoneName.KNEE_R, -0.85, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.08, 0.04, 0)\n .position(BoneName.PELVIS, 0, 0.04, 0.02)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.SON_WIND.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.24, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.1, 0, 0)\n .rotate(BoneName.HIP_L, 0.2, 0, 0)\n .rotate(BoneName.KNEE_L, -1.0, 0, 0)\n .rotate(BoneName.HIP_R, -0.2, 0, 0)\n .rotate(BoneName.KNEE_R, -0.2, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.07, 0.02)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.SON_WIND.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.48, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.14, -0.08, 0)\n .rotate(BoneName.HIP_R, -0.4, 0, 0)\n .rotate(BoneName.KNEE_R, -0.25, 0, 0)\n .rotate(BoneName.HIP_L, 0.6, 0, 0)\n .rotate(BoneName.KNEE_L, -0.85, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.08, -0.04, 0)\n .position(BoneName.PELVIS, 0, 0.04, 0.02)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.SON_WIND.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build();\n})();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☵ GAM (감) - WATER: Adaptive, Redirecting Movements\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gam Walk - 감보법\n * SINGLE STEP: Flowing adaptive step that flows around obstacles\n *\n * Start: Left foot forward\n * End: Right foot forward (reversed laterality)\n */\nexport const GAM_WALK_ANIMATION: SkeletalAnimation = (() => {\n const arms = getWalkArmSwing(TrigramStance.GAM, 0, 0);\n\n return (\n MartialArtsAnimationBuilder.create(\"walk_gam\", \"감보법\")\n .asMovement(0.55, false) // Single flowing step\n // Start: Left foot forward\n .at(0.0, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.05, 0.06, 0.02)\n .rotate(BoneName.HIP_L, 0.28, 0, -0.05) // Left forward\n .rotate(BoneName.KNEE_L, -0.18, 0, 0)\n .rotate(BoneName.HIP_R, -0.2, 0, 0.05) // Right back\n .rotate(BoneName.KNEE_R, -0.15, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0, 0.04, 0.02)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAM_WATER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // Mid: Passing phase\n .at(0.275, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.03, 0, 0)\n .rotate(BoneName.HIP_L, -0.1, 0, 0)\n .rotate(BoneName.KNEE_L, -0.12, 0, 0)\n .rotate(BoneName.HIP_R, 0.12, 0, 0)\n .rotate(BoneName.KNEE_R, -0.45, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .position(BoneName.PELVIS, 0, 0.02, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAM_WATER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // End: Right foot forward\n .at(0.55, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.05, -0.06, -0.02)\n .rotate(BoneName.HIP_R, 0.28, 0, 0.05) // Right now forward\n .rotate(BoneName.KNEE_R, -0.18, 0, 0)\n .rotate(BoneName.HIP_L, -0.2, 0, -0.05) // Left now back\n .rotate(BoneName.KNEE_L, -0.15, 0, 0)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SPINE_UPPER, 0, -0.04, -0.02)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAM_WATER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n/**\n * Gam Run - 감질주\n * Fluid run that flows like water around obstacles\n *\n * Uses GAM_WATER_GUARD_POSE arm positions with run swing\n */\nexport const GAM_RUN_ANIMATION: SkeletalAnimation = (() => {\n // Trained fighters maintain guard pose - no arm swing\n const arms = getWalkArmSwing(TrigramStance.GAM, 0, 0);\n\n return MartialArtsAnimationBuilder.create(\"run_gam\", \"감질주\")\n .asMovement(0.52, true)\n .at(0.0, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.12, 0.1, 0.03)\n .rotate(BoneName.HIP_L, -0.38, 0, 0)\n .rotate(BoneName.KNEE_L, -0.28, 0, 0)\n .rotate(BoneName.HIP_R, 0.58, 0, 0)\n .rotate(BoneName.KNEE_R, -0.82, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.06, 0.05, 0.02)\n .position(BoneName.PELVIS, 0.02, 0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAM_WATER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.26, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.08, 0, 0)\n .rotate(BoneName.HIP_L, 0.22, 0, 0)\n .rotate(BoneName.KNEE_L, -0.95, 0, 0)\n .rotate(BoneName.HIP_R, -0.18, 0, 0)\n .rotate(BoneName.KNEE_R, -0.22, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.06, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAM_WATER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.52, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.12, -0.1, -0.03)\n .rotate(BoneName.HIP_R, -0.38, 0, 0)\n .rotate(BoneName.KNEE_R, -0.28, 0, 0)\n .rotate(BoneName.HIP_L, 0.58, 0, 0)\n .rotate(BoneName.KNEE_L, -0.82, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.06, -0.05, -0.02)\n .position(BoneName.PELVIS, -0.02, 0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAM_WATER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build();\n})();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☶ GAN (간) - MOUNTAIN: Stable, Grounded Movements\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gan Walk - 간보법\n * SINGLE STEP: Solid immovable step with defensive posture\n *\n * Start: Left foot forward\n * End: Right foot forward (reversed laterality)\n */\nexport const GAN_WALK_ANIMATION: SkeletalAnimation = (() => {\n const arms = getWalkArmSwing(TrigramStance.GAN, 0, 0);\n\n return (\n MartialArtsAnimationBuilder.create(\"walk_gan\", \"간보법\")\n .asMovement(0.6, false) // Single grounded step\n // Start: Left foot forward\n .at(0.0, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.08, 0.04, 0)\n .rotate(BoneName.HIP_L, 0.3, 0, 0) // Left forward\n .rotate(BoneName.KNEE_L, -0.28, 0, 0)\n .rotate(BoneName.HIP_R, -0.22, 0, 0) // Right back\n .rotate(BoneName.KNEE_R, -0.25, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.04, 0, 0)\n .rotate(BoneName.SPINE_LOWER, 0.06, 0, 0)\n .position(BoneName.PELVIS, 0, -0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAN_MOUNTAIN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // Mid: Passing phase (deliberate)\n .at(0.3, \"linear\")\n .rotate(BoneName.PELVIS, 0.06, 0, 0)\n .rotate(BoneName.HIP_L, -0.05, 0, 0)\n .rotate(BoneName.KNEE_L, -0.2, 0, 0)\n .rotate(BoneName.HIP_R, 0.08, 0, 0)\n .rotate(BoneName.KNEE_R, -0.5, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, -0.01, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAN_MOUNTAIN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // End: Right foot forward\n .at(0.6, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.08, -0.04, 0)\n .rotate(BoneName.HIP_R, 0.3, 0, 0) // Right now forward\n .rotate(BoneName.KNEE_R, -0.28, 0, 0)\n .rotate(BoneName.HIP_L, -0.22, 0, 0) // Left now back\n .rotate(BoneName.KNEE_L, -0.25, 0, 0)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .position(BoneName.PELVIS, 0, -0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAN_MOUNTAIN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n/**\n * Gan Run - 간질주\n * Heavy, unstoppable charge like an avalanche\n *\n * Uses GAN_MOUNTAIN_GUARD_POSE arm positions with run swing\n */\nexport const GAN_RUN_ANIMATION: SkeletalAnimation = (() => {\n // Trained fighters maintain guard pose - no arm swing\n const arms = getWalkArmSwing(TrigramStance.GAN, 0, 0);\n\n return MartialArtsAnimationBuilder.create(\"run_gan\", \"간질주\")\n .asMovement(0.55, true)\n .at(0.0, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.18, 0.08, 0)\n .rotate(BoneName.HIP_L, -0.45, 0, 0)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0)\n .rotate(BoneName.HIP_R, 0.65, 0, 0)\n .rotate(BoneName.KNEE_R, -0.9, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.12, 0, 0)\n .rotate(BoneName.SPINE_LOWER, 0.1, 0, 0)\n .position(BoneName.PELVIS, 0, 0.02, 0.04)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAN_MOUNTAIN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.275, \"linear\")\n .rotate(BoneName.PELVIS, 0.14, 0, 0)\n .rotate(BoneName.HIP_L, 0.2, 0, 0)\n .rotate(BoneName.KNEE_L, -1.05, 0, 0)\n .rotate(BoneName.HIP_R, -0.25, 0, 0)\n .rotate(BoneName.KNEE_R, -0.3, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.05, 0.04)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAN_MOUNTAIN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.55, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.18, -0.08, 0)\n .rotate(BoneName.HIP_R, -0.45, 0, 0)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0)\n .rotate(BoneName.HIP_L, 0.65, 0, 0)\n .rotate(BoneName.KNEE_L, -0.9, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.02, 0.04)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAN_MOUNTAIN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build();\n})();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☷ GON (곤) - EARTH: Heavy, Rooted Movements\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gon Walk - 곤보법\n * SINGLE STEP: Heavy rooted step with low center of gravity\n *\n * Start: Left foot forward\n * End: Right foot forward (reversed laterality)\n */\nexport const GON_WALK_ANIMATION: SkeletalAnimation = (() => {\n const arms = getWalkArmSwing(TrigramStance.GON, 0, 0);\n\n return (\n MartialArtsAnimationBuilder.create(\"walk_gon\", \"곤보법\")\n .asMovement(0.65, false) // Single heavy step\n // Start: Left foot forward\n .at(0.0, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.1, 0.05, 0)\n .rotate(BoneName.HIP_L, 0.35, 0, -0.08) // Left forward\n .rotate(BoneName.KNEE_L, -0.38, 0, 0)\n .rotate(BoneName.HIP_R, -0.25, 0, 0.08) // Right back\n .rotate(BoneName.KNEE_R, -0.35, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.06, 0, 0)\n .rotate(BoneName.SPINE_LOWER, 0.1, 0, 0)\n .position(BoneName.PELVIS, 0, -0.06, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GON_EARTH.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // Mid: Passing phase (heavy)\n .at(0.325, \"linear\")\n .rotate(BoneName.PELVIS, 0.08, 0, 0)\n .rotate(BoneName.HIP_L, -0.08, 0, 0)\n .rotate(BoneName.KNEE_L, -0.28, 0, 0)\n .rotate(BoneName.HIP_R, 0.1, 0, 0)\n .rotate(BoneName.KNEE_R, -0.55, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, -0.04, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GON_EARTH.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // End: Right foot forward\n .at(0.65, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.1, -0.05, 0)\n .rotate(BoneName.HIP_R, 0.35, 0, 0.08) // Right now forward\n .rotate(BoneName.KNEE_R, -0.38, 0, 0)\n .rotate(BoneName.HIP_L, -0.25, 0, -0.08) // Left now back\n .rotate(BoneName.KNEE_L, -0.35, 0, 0)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .position(BoneName.PELVIS, 0, -0.06, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GON_EARTH.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n/**\n * Gon Run - 곤질주\n * Powerful, earthshaking run\n *\n * Trained fighters maintain guard pose throughout\n */\nexport const GON_RUN_ANIMATION: SkeletalAnimation = (() => {\n // Trained fighters maintain guard pose - no arm swing\n const arms = getWalkArmSwing(TrigramStance.GON, 0, 0);\n\n return MartialArtsAnimationBuilder.create(\"run_gon\", \"곤질주\")\n .asMovement(0.58, true)\n .at(0.0, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.2, 0.1, 0)\n .rotate(BoneName.HIP_L, -0.5, 0, 0)\n .rotate(BoneName.KNEE_L, -0.4, 0, 0)\n .rotate(BoneName.HIP_R, 0.7, 0, 0)\n .rotate(BoneName.KNEE_R, -0.95, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.14, 0, 0)\n .rotate(BoneName.SPINE_LOWER, 0.12, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0.05)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GON_EARTH.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.29, \"linear\")\n .rotate(BoneName.PELVIS, 0.16, 0, 0)\n .rotate(BoneName.HIP_L, 0.25, 0, 0)\n .rotate(BoneName.KNEE_L, -1.1, 0, 0)\n .rotate(BoneName.HIP_R, -0.3, 0, 0)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.04, 0.05)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GON_EARTH.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.58, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.2, -0.1, 0)\n .rotate(BoneName.HIP_R, -0.5, 0, 0)\n .rotate(BoneName.KNEE_R, -0.4, 0, 0)\n .rotate(BoneName.HIP_L, 0.7, 0, 0)\n .rotate(BoneName.KNEE_L, -0.95, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0, 0.05)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GON_EARTH.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build();\n})();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ANIMATION MAPS\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Map of all stance-specific walk animations\n * @korean 자세별걷기애니메이션맵\n */\nexport const STANCE_WALK_ANIMATIONS: ReadonlyMap<string, SkeletalAnimation> =\n new Map([\n [\"walk_geon\", GEON_WALK_ANIMATION],\n [\"walk_tae\", TAE_WALK_ANIMATION],\n [\"walk_li\", LI_WALK_ANIMATION],\n [\"walk_jin\", JIN_WALK_ANIMATION],\n [\"walk_son\", SON_WALK_ANIMATION],\n [\"walk_gam\", GAM_WALK_ANIMATION],\n [\"walk_gan\", GAN_WALK_ANIMATION],\n [\"walk_gon\", GON_WALK_ANIMATION],\n ]);\n\n/**\n * Map of all stance-specific run animations\n * @korean 자세별달리기애니메이션맵\n */\nexport const STANCE_RUN_ANIMATIONS: ReadonlyMap<string, SkeletalAnimation> =\n new Map([\n [\"run_geon\", GEON_RUN_ANIMATION],\n [\"run_tae\", TAE_RUN_ANIMATION],\n [\"run_li\", LI_RUN_ANIMATION],\n [\"run_jin\", JIN_RUN_ANIMATION],\n [\"run_son\", SON_RUN_ANIMATION],\n [\"run_gam\", GAM_RUN_ANIMATION],\n [\"run_gan\", GAN_RUN_ANIMATION],\n [\"run_gon\", GON_RUN_ANIMATION],\n ]);\n\n/**\n * Combined map of all stance locomotion animations\n * @korean 자세별이동애니메이션통합맵\n */\nexport const STANCE_LOCOMOTION_ANIMATIONS: ReadonlyMap<\n string,\n SkeletalAnimation\n> = new Map([...STANCE_WALK_ANIMATIONS, ...STANCE_RUN_ANIMATIONS]);\n\n/**\n * Get stance-specific walk animation\n * @param stance - Trigram stance name (geon, tae, li, etc.)\n * @returns Walk animation for that stance\n */\nexport function getStanceWalkAnimation(\n stance: string,\n): SkeletalAnimation | undefined {\n return STANCE_WALK_ANIMATIONS.get(`walk_${stance}`);\n}\n\n/**\n * Get stance-specific run animation\n * @param stance - Trigram stance name (geon, tae, li, etc.)\n * @returns Run animation for that stance\n */\nexport function getStanceRunAnimation(\n stance: string,\n): SkeletalAnimation | undefined {\n return STANCE_RUN_ANIMATIONS.get(`run_${stance}`);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"StanceLocomotionAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/StanceLocomotionAnimations.ts"],"sourcesContent":["/**\n * Stance-Specific Locomotion Animations Module\n *\n * Trigram-specific walk and run animations for each of the eight stances.\n * Each trigram has unique movement characteristics reflecting its philosophy:\n *\n * ☰ Geon (Heaven): Direct, powerful movements\n * ☱ Tae (Lake): Fluid, adaptive movements\n * ☲ Li (Fire): Quick, precise movements\n * ☳ Jin (Thunder): Explosive, sudden movements\n * ☴ Son (Wind): Continuous, flowing movements\n * ☵ Gam (Water): Adaptive, redirecting movements\n * ☶ Gan (Mountain): Stable, grounded movements\n * ☷ Gon (Earth): Heavy, rooted movements\n *\n * DESIGN PRINCIPLES:\n * - Fighters MAINTAIN GUARD during locomotion (no arm swing)\n * - Arms/torso/pelvis use withTrigramGuard() from builder\n * - Legs blend trigram base position + locomotion motion\n * - Each stance has distinct leg mechanics (stance width, knee bend, weight)\n *\n * @module systems/animation/StanceLocomotionAnimations\n * @korean 자세별이동애니메이션\n */\n\nimport { TrigramStance } from \"@/types/common\";\nimport type { SkeletalAnimation } from \"@/types/skeletal\";\nimport { BoneName } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\nimport { KOREAN_STANCE_BIOMECHANICS } from \"../builders/MartialArtsConstants\";\nimport { TRIGRAM_GUARD_POSES } from \"../builders/TrigramGuardApplicator\";\n\n// ═══════════════════════════════════════════════════════════════════════════\n// CONSTANTS\n// ═══════════════════════════════════════════════════════════════════════════\n\n/** Default shoulder width for stance locomotion animations (cm) */\nconst DEFAULT_SHOULDER_WIDTH_CM = 46;\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ARM SWING HELPERS - Apply guard pose with locomotion swing offset\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Get arm positions with walk swing for a trigram stance\n *\n * Combines the trigram's guard arm position with a forward/back swing offset.\n * The elbow position from the guard is preserved to maintain proper guard shape.\n *\n * @param stance - Trigram stance\n * @param leftSwing - Left shoulder forward swing (positive = forward)\n * @param rightSwing - Right shoulder forward swing (positive = forward)\n * @returns Arm rotation values to apply\n *\n * @korean 걷기팔스윙가져오기\n */\nfunction getWalkArmSwing(\n stance: TrigramStance,\n leftSwing: number,\n rightSwing: number,\n): {\n leftShoulder: [number, number, number];\n leftElbow: [number, number, number];\n rightShoulder: [number, number, number];\n rightElbow: [number, number, number];\n} {\n const guard = TRIGRAM_GUARD_POSES[stance];\n\n return {\n // Add swing to X rotation, preserve Y and Z from guard\n leftShoulder: [\n guard.leftArm.shoulder.x + leftSwing,\n guard.leftArm.shoulder.y,\n guard.leftArm.shoulder.z,\n ],\n leftElbow: [\n guard.leftArm.elbow.x,\n guard.leftArm.elbow.y,\n guard.leftArm.elbow.z,\n ],\n rightShoulder: [\n guard.rightArm.shoulder.x + rightSwing,\n guard.rightArm.shoulder.y,\n guard.rightArm.shoulder.z,\n ],\n rightElbow: [\n guard.rightArm.elbow.x,\n guard.rightArm.elbow.y,\n guard.rightArm.elbow.z,\n ],\n };\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// SINGLE STEP WALK DESIGN (단일 보행 설계)\n// ═══════════════════════════════════════════════════════════════════════════\n/**\n * WALK ANIMATION DESIGN PHILOSOPHY:\n *\n * Walk animations are SINGLE STEPS that change foot laterality.\n * Each walk animation:\n * 1. Starts with one foot forward (e.g., left foot front)\n * 2. Steps forward with the rear foot\n * 3. Ends with the other foot forward (e.g., right foot front)\n *\n * This is NOT a continuous walk cycle - it's a discrete step that\n * transitions between two stable idle poses with opposite foot laterality.\n *\n * The animation should:\n * - Duration: 0.4-0.6s for a single step (longer = more deliberate)\n * - NOT loop (loops: false)\n * - End in a stable stance ready for another action\n * - Maintain guard position throughout (no wild arm swings)\n *\n * RUN ANIMATION DESIGN PHILOSOPHY:\n *\n * Run animations are CONTINUOUS LOOPING cycles.\n * Trained fighters maintain guard pose during running:\n * - Arms stay in guard position (NO arm swing)\n * - Only legs show running motion\n * - This allows immediate combat readiness\n *\n * @korean 단일보행설계철학\n */\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☰ GEON (건) - HEAVEN: Direct, Powerful Movements\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Geon Walk - 건보법\n * SINGLE STEP: Powerful authoritative stride, changes foot laterality\n *\n * Start: Left foot forward, right foot back\n * End: Right foot forward, left foot back (reversed laterality)\n *\n * Maintains high guard throughout the step\n */\nexport const GEON_WALK_ANIMATION: SkeletalAnimation = (() => {\n const arms = getWalkArmSwing(TrigramStance.GEON, 0, 0); // Guard position maintained\n\n return (\n MartialArtsAnimationBuilder.create(\"walk_geon\", \"건보법\")\n .asMovement(0.5, false) // Single step, NOT looping\n // Start: Left foot forward (standard stance laterality)\n .at(0.0, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.1, 0.05, 0)\n .rotate(BoneName.HIP_L, 0.35, 0, 0) // Left forward\n .rotate(BoneName.KNEE_L, -0.25, 0, 0)\n .rotate(BoneName.HIP_R, -0.25, 0, 0) // Right back\n .rotate(BoneName.KNEE_R, -0.15, 0, 0)\n // Arms maintain guard\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.05, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GEON_HEAVEN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // Mid: Passing phase (feet together, weight shifting)\n .at(0.25, \"linear\")\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.HIP_L, 0, 0, 0) // Feet passing\n .rotate(BoneName.KNEE_L, -0.5, 0, 0) // Lift rear foot\n .rotate(BoneName.HIP_R, 0.2, 0, 0) // Stepping forward\n .rotate(BoneName.KNEE_R, -0.6, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .position(BoneName.PELVIS, 0, 0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GEON_HEAVEN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // End: Right foot forward (reversed laterality)\n .at(0.5, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.1, -0.05, 0)\n .rotate(BoneName.HIP_R, 0.35, 0, 0) // Right now forward\n .rotate(BoneName.KNEE_R, -0.25, 0, 0)\n .rotate(BoneName.HIP_L, -0.25, 0, 0) // Left now back\n .rotate(BoneName.KNEE_L, -0.15, 0, 0)\n // Arms maintain guard\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GEON_HEAVEN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n/**\n * Geon Run - 건질주\n * Powerful forward charge with aggressive posture\n * Stance width: 1.35x shoulder width maintained during run\n *\n * Uses GEON_HIGH_GUARD_POSE arm positions with enhanced run swing\n */\nexport const GEON_RUN_ANIMATION: SkeletalAnimation = (() => {\n // Trained fighters maintain guard pose - no arm swing\n const arms = getWalkArmSwing(TrigramStance.GEON, 0, 0);\n\n return (\n MartialArtsAnimationBuilder.create(\"run_geon\", \"건질주\")\n .asMovement(0.45, true)\n .at(0.0, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.2, 0.08, 0)\n .rotate(BoneName.HIP_L, -0.5, 0, 0)\n .rotate(BoneName.KNEE_L, -0.2, 0, 0)\n .rotate(BoneName.HIP_R, 0.7, 0, 0)\n .rotate(BoneName.KNEE_R, -1.0, 0, 0)\n // Arms maintain guard pose throughout\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.15, 0, 0)\n .position(BoneName.PELVIS, 0, 0.05, 0.05)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GEON_HEAVEN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.225, \"linear\")\n .rotate(BoneName.PELVIS, 0.15, 0, 0)\n .rotate(BoneName.HIP_L, 0.2, 0, 0)\n .rotate(BoneName.KNEE_L, -1.2, 0, 0)\n .rotate(BoneName.HIP_R, -0.3, 0, 0)\n .rotate(BoneName.KNEE_R, -0.3, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.08, 0.05)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GEON_HEAVEN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.45, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.2, -0.08, 0)\n .rotate(BoneName.HIP_R, -0.5, 0, 0)\n .rotate(BoneName.KNEE_R, -0.2, 0, 0)\n .rotate(BoneName.HIP_L, 0.7, 0, 0)\n .rotate(BoneName.KNEE_L, -1.0, 0, 0)\n // Arms maintain guard pose throughout\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.05, 0.05)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GEON_HEAVEN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☱ TAE (태) - LAKE: Fluid, Adaptive Movements\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Tae Walk - 태보법\n * SINGLE STEP: Light cat-like step with 90/10 weight on back foot\n *\n * Start: Left foot forward\n * End: Right foot forward (reversed laterality)\n *\n * Maintains fluid guard throughout\n */\nexport const TAE_WALK_ANIMATION: SkeletalAnimation = (() => {\n const arms = getWalkArmSwing(TrigramStance.TAE, 0, 0);\n\n return (\n MartialArtsAnimationBuilder.create(\"walk_tae\", \"태보법\")\n .asMovement(0.55, false) // Single step, NOT looping\n // Start: Left foot forward (cat stance)\n .at(0.0, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.05, 0.08, 0)\n .rotate(BoneName.HIP_L, 0.2, 0, -0.1) // Left forward\n .rotate(BoneName.KNEE_L, -0.1, 0, 0)\n .rotate(BoneName.FOOT_L, 0.2, 0, 0)\n .rotate(BoneName.HIP_R, -0.15, 0, 0.1) // Right back (weight)\n .rotate(BoneName.KNEE_R, -0.4, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0, 0.05, 0)\n .position(BoneName.PELVIS, 0, -0.02, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.TAE_LAKE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // Mid: Passing phase\n .at(0.275, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.03, 0, 0)\n .rotate(BoneName.HIP_L, -0.1, 0, 0)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0)\n .rotate(BoneName.HIP_R, 0.15, 0, 0)\n .rotate(BoneName.KNEE_R, -0.5, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .position(BoneName.PELVIS, 0, 0.01, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.TAE_LAKE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // End: Right foot forward (reversed laterality)\n .at(0.55, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.05, -0.08, 0)\n .rotate(BoneName.HIP_R, 0.2, 0, 0.1) // Right now forward\n .rotate(BoneName.KNEE_R, -0.1, 0, 0)\n .rotate(BoneName.FOOT_R, 0.2, 0, 0)\n .rotate(BoneName.HIP_L, -0.15, 0, -0.1) // Left now back\n .rotate(BoneName.KNEE_L, -0.4, 0, 0)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SPINE_UPPER, 0, -0.05, 0)\n .position(BoneName.PELVIS, 0, -0.02, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.TAE_LAKE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n/**\n * Tae Run - 태질주\n * Flowing, evasive run with quick direction changes\n *\n * Uses TAE_FLUID_GUARD_POSE arm positions with run swing\n */\nexport const TAE_RUN_ANIMATION: SkeletalAnimation = (() => {\n // Trained fighters maintain guard pose - no arm swing\n const arms = getWalkArmSwing(TrigramStance.TAE, 0, 0);\n\n return MartialArtsAnimationBuilder.create(\"run_tae\", \"태질주\")\n .asMovement(0.5, true)\n .at(0.0, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.12, 0.1, 0)\n .rotate(BoneName.HIP_L, -0.4, 0, 0)\n .rotate(BoneName.KNEE_L, -0.3, 0, 0)\n .rotate(BoneName.HIP_R, 0.6, 0, 0)\n .rotate(BoneName.KNEE_R, -0.8, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.05, 0.05, 0)\n .position(BoneName.PELVIS, 0, 0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.TAE_LAKE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.25, \"linear\")\n .rotate(BoneName.PELVIS, 0.1, 0, 0)\n .rotate(BoneName.HIP_L, 0.3, 0, 0)\n .rotate(BoneName.KNEE_L, -1.0, 0, 0)\n .rotate(BoneName.HIP_R, -0.2, 0, 0)\n .rotate(BoneName.KNEE_R, -0.25, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.06, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.TAE_LAKE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.5, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.12, -0.1, 0)\n .rotate(BoneName.HIP_R, -0.4, 0, 0)\n .rotate(BoneName.KNEE_R, -0.3, 0, 0)\n .rotate(BoneName.HIP_L, 0.6, 0, 0)\n .rotate(BoneName.KNEE_L, -0.8, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.05, -0.05, 0)\n .position(BoneName.PELVIS, 0, 0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.TAE_LAKE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build();\n})();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☲ LI (리) - FIRE: Quick, Precise Movements\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Li Walk - 리보법\n * SINGLE STEP: Quick precise step with minimal movement\n *\n * Start: Left foot forward\n * End: Right foot forward (reversed laterality)\n *\n * Maintains peekaboo guard throughout\n */\nexport const LI_WALK_ANIMATION: SkeletalAnimation = (() => {\n const arms = getWalkArmSwing(TrigramStance.LI, 0, 0);\n\n return (\n MartialArtsAnimationBuilder.create(\"walk_li\", \"리보법\")\n .asMovement(0.45, false) // Single step, fast and precise\n // Start: Left foot forward\n .at(0.0, \"linear\")\n .rotate(BoneName.PELVIS, 0.08, 0.06, 0)\n .rotate(BoneName.HIP_L, 0.3, 0, 0) // Left forward\n .rotate(BoneName.KNEE_L, -0.2, 0, 0)\n .rotate(BoneName.HIP_R, -0.2, 0, 0) // Right back\n .rotate(BoneName.KNEE_R, -0.15, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.03, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.LI_FIRE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // Mid: Passing phase (quick)\n .at(0.225, \"linear\")\n .rotate(BoneName.PELVIS, 0.05, 0, 0)\n .rotate(BoneName.HIP_L, -0.1, 0, 0)\n .rotate(BoneName.KNEE_L, -0.12, 0, 0)\n .rotate(BoneName.HIP_R, 0.1, 0, 0)\n .rotate(BoneName.KNEE_R, -0.5, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .position(BoneName.PELVIS, 0, 0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.LI_FIRE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // End: Right foot forward\n .at(0.45, \"linear\")\n .rotate(BoneName.PELVIS, 0.08, -0.06, 0)\n .rotate(BoneName.HIP_R, 0.3, 0, 0) // Right now forward\n .rotate(BoneName.KNEE_R, -0.2, 0, 0)\n .rotate(BoneName.HIP_L, -0.2, 0, 0) // Left now back\n .rotate(BoneName.KNEE_L, -0.15, 0, 0)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.LI_FIRE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n/**\n * Li Run - 리질주\n * Explosive sprint with precision footwork\n *\n * Uses LI_FIRE_GUARD_POSE arm positions with run swing\n */\nexport const LI_RUN_ANIMATION: SkeletalAnimation = (() => {\n // Trained fighters maintain guard pose - no arm swing\n const arms = getWalkArmSwing(TrigramStance.LI, 0, 0);\n\n return MartialArtsAnimationBuilder.create(\"run_li\", \"리질주\")\n .asMovement(0.4, true)\n .at(0.0, \"linear\")\n .rotate(BoneName.PELVIS, 0.18, 0.08, 0)\n .rotate(BoneName.HIP_L, -0.45, 0, 0)\n .rotate(BoneName.KNEE_L, -0.25, 0, 0)\n .rotate(BoneName.HIP_R, 0.65, 0, 0)\n .rotate(BoneName.KNEE_R, -0.95, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.12, 0, 0)\n .position(BoneName.PELVIS, 0, 0.06, 0.04)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.LI_FIRE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.2, \"linear\")\n .rotate(BoneName.PELVIS, 0.12, 0, 0)\n .rotate(BoneName.HIP_L, 0.25, 0, 0)\n .rotate(BoneName.KNEE_L, -1.15, 0, 0)\n .rotate(BoneName.HIP_R, -0.25, 0, 0)\n .rotate(BoneName.KNEE_R, -0.25, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.09, 0.04)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.LI_FIRE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.4, \"linear\")\n .rotate(BoneName.PELVIS, 0.18, -0.08, 0)\n .rotate(BoneName.HIP_R, -0.45, 0, 0)\n .rotate(BoneName.KNEE_R, -0.25, 0, 0)\n .rotate(BoneName.HIP_L, 0.65, 0, 0)\n .rotate(BoneName.KNEE_L, -0.95, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.06, 0.04)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.LI_FIRE.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build();\n})();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☳ JIN (진) - THUNDER: Explosive, Sudden Movements\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Jin Walk - 진보법\n * Explosive step-and-ready walk, prepared to strike\n *\n * Uses JIN_THUNDER_GUARD_POSE arm positions with walk swing\n */\nexport const JIN_WALK_ANIMATION: SkeletalAnimation = (() => {\n const arms = getWalkArmSwing(TrigramStance.JIN, 0, 0);\n\n return (\n MartialArtsAnimationBuilder.create(\"walk_jin\", \"진보법\")\n .asMovement(0.5, false) // Single step, coiled energy\n // Start: Left foot forward\n .at(0.0, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.12, 0.06, 0)\n .rotate(BoneName.HIP_L, 0.4, 0, 0) // Left forward\n .rotate(BoneName.KNEE_L, -0.3, 0, 0)\n .rotate(BoneName.HIP_R, -0.3, 0, 0) // Right back\n .rotate(BoneName.KNEE_R, -0.2, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.08, 0, 0)\n .rotate(BoneName.SPINE_LOWER, 0.05, 0, 0)\n .position(BoneName.PELVIS, 0, -0.01, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.JIN_THUNDER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // Mid: Passing phase\n .at(0.25, \"ease-in\")\n .rotate(BoneName.PELVIS, 0.08, 0, 0)\n .rotate(BoneName.HIP_L, -0.15, 0, 0)\n .rotate(BoneName.KNEE_L, -0.2, 0, 0)\n .rotate(BoneName.HIP_R, 0.15, 0, 0)\n .rotate(BoneName.KNEE_R, -0.6, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.02, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.JIN_THUNDER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // End: Right foot forward\n .at(0.5, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.12, -0.06, 0)\n .rotate(BoneName.HIP_R, 0.4, 0, 0) // Right now forward\n .rotate(BoneName.KNEE_R, -0.3, 0, 0)\n .rotate(BoneName.HIP_L, -0.3, 0, 0) // Left now back\n .rotate(BoneName.KNEE_L, -0.2, 0, 0)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .position(BoneName.PELVIS, 0, -0.01, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.JIN_THUNDER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n/**\n * Jin Run - 진질주\n * Thunderous charge with explosive power\n *\n * Uses JIN_THUNDER_GUARD_POSE arm positions with run swing\n */\nexport const JIN_RUN_ANIMATION: SkeletalAnimation = (() => {\n // Trained fighters maintain guard pose - no arm swing\n const arms = getWalkArmSwing(TrigramStance.JIN, 0, 0);\n\n return MartialArtsAnimationBuilder.create(\"run_jin\", \"진질주\")\n .asMovement(0.42, true)\n .at(0.0, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.22, 0.1, 0)\n .rotate(BoneName.HIP_L, -0.55, 0, 0)\n .rotate(BoneName.KNEE_L, -0.3, 0, 0)\n .rotate(BoneName.HIP_R, 0.75, 0, 0)\n .rotate(BoneName.KNEE_R, -1.1, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.18, 0, 0)\n .rotate(BoneName.SPINE_LOWER, 0.1, 0, 0)\n .position(BoneName.PELVIS, 0, 0.04, 0.06)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.JIN_THUNDER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.21, \"linear\")\n .rotate(BoneName.PELVIS, 0.16, 0, 0)\n .rotate(BoneName.HIP_L, 0.3, 0, 0)\n .rotate(BoneName.KNEE_L, -1.25, 0, 0)\n .rotate(BoneName.HIP_R, -0.35, 0, 0)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.08, 0.06)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.JIN_THUNDER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.42, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.22, -0.1, 0)\n .rotate(BoneName.HIP_R, -0.55, 0, 0)\n .rotate(BoneName.KNEE_R, -0.3, 0, 0)\n .rotate(BoneName.HIP_L, 0.75, 0, 0)\n .rotate(BoneName.KNEE_L, -1.1, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.04, 0.06)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.JIN_THUNDER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build();\n})();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☴ SON (손) - WIND: Continuous, Flowing Movements\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Son Walk - 손보법\n * SINGLE STEP: Gentle flowing step like wind through trees\n *\n * Start: Left foot forward\n * End: Right foot forward (reversed laterality)\n */\nexport const SON_WALK_ANIMATION: SkeletalAnimation = (() => {\n const arms = getWalkArmSwing(TrigramStance.SON, 0, 0);\n\n return (\n MartialArtsAnimationBuilder.create(\"walk_son\", \"손보법\")\n .asMovement(0.55, false) // Single flowing step\n // Start: Left foot forward\n .at(0.0, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.06, 0.04, 0)\n .rotate(BoneName.HIP_L, 0.25, 0, 0) // Left forward\n .rotate(BoneName.KNEE_L, -0.15, 0, 0)\n .rotate(BoneName.HIP_R, -0.18, 0, 0) // Right back\n .rotate(BoneName.KNEE_R, -0.12, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.02, 0.03, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.SON_WIND.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // Mid: Passing phase\n .at(0.275, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.04, 0, 0)\n .rotate(BoneName.HIP_L, -0.08, 0, 0)\n .rotate(BoneName.KNEE_L, -0.1, 0, 0)\n .rotate(BoneName.HIP_R, 0.1, 0, 0)\n .rotate(BoneName.KNEE_R, -0.4, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.02, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.SON_WIND.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // End: Right foot forward\n .at(0.55, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.06, -0.04, 0)\n .rotate(BoneName.HIP_R, 0.25, 0, 0) // Right now forward\n .rotate(BoneName.KNEE_R, -0.15, 0, 0)\n .rotate(BoneName.HIP_L, -0.18, 0, 0) // Left now back\n .rotate(BoneName.KNEE_L, -0.12, 0, 0)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SPINE_UPPER, 0.02, -0.03, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.SON_WIND.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n/**\n * Son Run - 손질주\n * Swift, gliding run like wind rushing\n *\n * Uses SON_WIND_GUARD_POSE arm positions with run swing\n */\nexport const SON_RUN_ANIMATION: SkeletalAnimation = (() => {\n // Trained fighters maintain guard pose - no arm swing\n const arms = getWalkArmSwing(TrigramStance.SON, 0, 0);\n\n return MartialArtsAnimationBuilder.create(\"run_son\", \"손질주\")\n .asMovement(0.48, true)\n .at(0.0, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.14, 0.08, 0)\n .rotate(BoneName.HIP_L, -0.4, 0, 0)\n .rotate(BoneName.KNEE_L, -0.25, 0, 0)\n .rotate(BoneName.HIP_R, 0.6, 0, 0)\n .rotate(BoneName.KNEE_R, -0.85, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.08, 0.04, 0)\n .position(BoneName.PELVIS, 0, 0.04, 0.02)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.SON_WIND.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.24, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.1, 0, 0)\n .rotate(BoneName.HIP_L, 0.2, 0, 0)\n .rotate(BoneName.KNEE_L, -1.0, 0, 0)\n .rotate(BoneName.HIP_R, -0.2, 0, 0)\n .rotate(BoneName.KNEE_R, -0.2, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.07, 0.02)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.SON_WIND.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.48, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.14, -0.08, 0)\n .rotate(BoneName.HIP_R, -0.4, 0, 0)\n .rotate(BoneName.KNEE_R, -0.25, 0, 0)\n .rotate(BoneName.HIP_L, 0.6, 0, 0)\n .rotate(BoneName.KNEE_L, -0.85, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.08, -0.04, 0)\n .position(BoneName.PELVIS, 0, 0.04, 0.02)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.SON_WIND.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build();\n})();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☵ GAM (감) - WATER: Adaptive, Redirecting Movements\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gam Walk - 감보법\n * SINGLE STEP: Flowing adaptive step that flows around obstacles\n *\n * Start: Left foot forward\n * End: Right foot forward (reversed laterality)\n */\nexport const GAM_WALK_ANIMATION: SkeletalAnimation = (() => {\n const arms = getWalkArmSwing(TrigramStance.GAM, 0, 0);\n\n return (\n MartialArtsAnimationBuilder.create(\"walk_gam\", \"감보법\")\n .asMovement(0.55, false) // Single flowing step\n // Start: Left foot forward\n .at(0.0, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.05, 0.06, 0.02)\n .rotate(BoneName.HIP_L, 0.28, 0, -0.05) // Left forward\n .rotate(BoneName.KNEE_L, -0.18, 0, 0)\n .rotate(BoneName.HIP_R, -0.2, 0, 0.05) // Right back\n .rotate(BoneName.KNEE_R, -0.15, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0, 0.04, 0.02)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAM_WATER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // Mid: Passing phase\n .at(0.275, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.03, 0, 0)\n .rotate(BoneName.HIP_L, -0.1, 0, 0)\n .rotate(BoneName.KNEE_L, -0.12, 0, 0)\n .rotate(BoneName.HIP_R, 0.12, 0, 0)\n .rotate(BoneName.KNEE_R, -0.45, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .position(BoneName.PELVIS, 0, 0.02, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAM_WATER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // End: Right foot forward\n .at(0.55, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.05, -0.06, -0.02)\n .rotate(BoneName.HIP_R, 0.28, 0, 0.05) // Right now forward\n .rotate(BoneName.KNEE_R, -0.18, 0, 0)\n .rotate(BoneName.HIP_L, -0.2, 0, -0.05) // Left now back\n .rotate(BoneName.KNEE_L, -0.15, 0, 0)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SPINE_UPPER, 0, -0.04, -0.02)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAM_WATER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n/**\n * Gam Run - 감질주\n * Fluid run that flows like water around obstacles\n *\n * Uses GAM_WATER_GUARD_POSE arm positions with run swing\n */\nexport const GAM_RUN_ANIMATION: SkeletalAnimation = (() => {\n // Trained fighters maintain guard pose - no arm swing\n const arms = getWalkArmSwing(TrigramStance.GAM, 0, 0);\n\n return MartialArtsAnimationBuilder.create(\"run_gam\", \"감질주\")\n .asMovement(0.52, true)\n .at(0.0, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.12, 0.1, 0.03)\n .rotate(BoneName.HIP_L, -0.38, 0, 0)\n .rotate(BoneName.KNEE_L, -0.28, 0, 0)\n .rotate(BoneName.HIP_R, 0.58, 0, 0)\n .rotate(BoneName.KNEE_R, -0.82, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.06, 0.05, 0.02)\n .position(BoneName.PELVIS, 0.02, 0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAM_WATER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.26, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.08, 0, 0)\n .rotate(BoneName.HIP_L, 0.22, 0, 0)\n .rotate(BoneName.KNEE_L, -0.95, 0, 0)\n .rotate(BoneName.HIP_R, -0.18, 0, 0)\n .rotate(BoneName.KNEE_R, -0.22, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.06, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAM_WATER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.52, \"ease-in-out\")\n .rotate(BoneName.PELVIS, 0.12, -0.1, -0.03)\n .rotate(BoneName.HIP_R, -0.38, 0, 0)\n .rotate(BoneName.KNEE_R, -0.28, 0, 0)\n .rotate(BoneName.HIP_L, 0.58, 0, 0)\n .rotate(BoneName.KNEE_L, -0.82, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.06, -0.05, -0.02)\n .position(BoneName.PELVIS, -0.02, 0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAM_WATER.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build();\n})();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☶ GAN (간) - MOUNTAIN: Stable, Grounded Movements\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gan Walk - 간보법\n * SINGLE STEP: Solid immovable step with defensive posture\n *\n * Start: Left foot forward\n * End: Right foot forward (reversed laterality)\n */\nexport const GAN_WALK_ANIMATION: SkeletalAnimation = (() => {\n const arms = getWalkArmSwing(TrigramStance.GAN, 0, 0);\n\n return (\n MartialArtsAnimationBuilder.create(\"walk_gan\", \"간보법\")\n .asMovement(0.6, false) // Single grounded step\n // Start: Left foot forward\n .at(0.0, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.08, 0.04, 0)\n .rotate(BoneName.HIP_L, 0.3, 0, 0) // Left forward\n .rotate(BoneName.KNEE_L, -0.28, 0, 0)\n .rotate(BoneName.HIP_R, -0.22, 0, 0) // Right back\n .rotate(BoneName.KNEE_R, -0.25, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.04, 0, 0)\n .rotate(BoneName.SPINE_LOWER, 0.06, 0, 0)\n .position(BoneName.PELVIS, 0, -0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAN_MOUNTAIN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // Mid: Passing phase (deliberate)\n .at(0.3, \"linear\")\n .rotate(BoneName.PELVIS, 0.06, 0, 0)\n .rotate(BoneName.HIP_L, -0.05, 0, 0)\n .rotate(BoneName.KNEE_L, -0.2, 0, 0)\n .rotate(BoneName.HIP_R, 0.08, 0, 0)\n .rotate(BoneName.KNEE_R, -0.5, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, -0.01, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAN_MOUNTAIN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // End: Right foot forward\n .at(0.6, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.08, -0.04, 0)\n .rotate(BoneName.HIP_R, 0.3, 0, 0) // Right now forward\n .rotate(BoneName.KNEE_R, -0.28, 0, 0)\n .rotate(BoneName.HIP_L, -0.22, 0, 0) // Left now back\n .rotate(BoneName.KNEE_L, -0.25, 0, 0)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .position(BoneName.PELVIS, 0, -0.03, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAN_MOUNTAIN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n/**\n * Gan Run - 간질주\n * Heavy, unstoppable charge like an avalanche\n *\n * Uses GAN_MOUNTAIN_GUARD_POSE arm positions with run swing\n */\nexport const GAN_RUN_ANIMATION: SkeletalAnimation = (() => {\n // Trained fighters maintain guard pose - no arm swing\n const arms = getWalkArmSwing(TrigramStance.GAN, 0, 0);\n\n return MartialArtsAnimationBuilder.create(\"run_gan\", \"간질주\")\n .asMovement(0.55, true)\n .at(0.0, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.18, 0.08, 0)\n .rotate(BoneName.HIP_L, -0.45, 0, 0)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0)\n .rotate(BoneName.HIP_R, 0.65, 0, 0)\n .rotate(BoneName.KNEE_R, -0.9, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.12, 0, 0)\n .rotate(BoneName.SPINE_LOWER, 0.1, 0, 0)\n .position(BoneName.PELVIS, 0, 0.02, 0.04)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAN_MOUNTAIN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.275, \"linear\")\n .rotate(BoneName.PELVIS, 0.14, 0, 0)\n .rotate(BoneName.HIP_L, 0.2, 0, 0)\n .rotate(BoneName.KNEE_L, -1.05, 0, 0)\n .rotate(BoneName.HIP_R, -0.25, 0, 0)\n .rotate(BoneName.KNEE_R, -0.3, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.05, 0.04)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAN_MOUNTAIN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.55, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.18, -0.08, 0)\n .rotate(BoneName.HIP_R, -0.45, 0, 0)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0)\n .rotate(BoneName.HIP_L, 0.65, 0, 0)\n .rotate(BoneName.KNEE_L, -0.9, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.02, 0.04)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GAN_MOUNTAIN.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build();\n})();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☷ GON (곤) - EARTH: Heavy, Rooted Movements\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gon Walk - 곤보법\n * SINGLE STEP: Heavy rooted step with low center of gravity\n *\n * Start: Left foot forward\n * End: Right foot forward (reversed laterality)\n */\nexport const GON_WALK_ANIMATION: SkeletalAnimation = (() => {\n const arms = getWalkArmSwing(TrigramStance.GON, 0, 0);\n\n return (\n MartialArtsAnimationBuilder.create(\"walk_gon\", \"곤보법\")\n .asMovement(0.65, false) // Single heavy step\n // Start: Left foot forward\n .at(0.0, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.1, 0.05, 0)\n .rotate(BoneName.HIP_L, 0.35, 0, -0.08) // Left forward\n .rotate(BoneName.KNEE_L, -0.38, 0, 0)\n .rotate(BoneName.HIP_R, -0.25, 0, 0.08) // Right back\n .rotate(BoneName.KNEE_R, -0.35, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.06, 0, 0)\n .rotate(BoneName.SPINE_LOWER, 0.1, 0, 0)\n .position(BoneName.PELVIS, 0, -0.06, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GON_EARTH.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // Mid: Passing phase (heavy)\n .at(0.325, \"linear\")\n .rotate(BoneName.PELVIS, 0.08, 0, 0)\n .rotate(BoneName.HIP_L, -0.08, 0, 0)\n .rotate(BoneName.KNEE_L, -0.28, 0, 0)\n .rotate(BoneName.HIP_R, 0.1, 0, 0)\n .rotate(BoneName.KNEE_R, -0.55, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, -0.04, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GON_EARTH.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n // End: Right foot forward\n .at(0.65, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.1, -0.05, 0)\n .rotate(BoneName.HIP_R, 0.35, 0, 0.08) // Right now forward\n .rotate(BoneName.KNEE_R, -0.38, 0, 0)\n .rotate(BoneName.HIP_L, -0.25, 0, -0.08) // Left now back\n .rotate(BoneName.KNEE_L, -0.35, 0, 0)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .position(BoneName.PELVIS, 0, -0.06, 0)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GON_EARTH.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build()\n );\n})();\n\n/**\n * Gon Run - 곤질주\n * Powerful, earthshaking run\n *\n * Trained fighters maintain guard pose throughout\n */\nexport const GON_RUN_ANIMATION: SkeletalAnimation = (() => {\n // Trained fighters maintain guard pose - no arm swing\n const arms = getWalkArmSwing(TrigramStance.GON, 0, 0);\n\n return MartialArtsAnimationBuilder.create(\"run_gon\", \"곤질주\")\n .asMovement(0.58, true)\n .at(0.0, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.2, 0.1, 0)\n .rotate(BoneName.HIP_L, -0.5, 0, 0)\n .rotate(BoneName.KNEE_L, -0.4, 0, 0)\n .rotate(BoneName.HIP_R, 0.7, 0, 0)\n .rotate(BoneName.KNEE_R, -0.95, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .rotate(BoneName.SPINE_UPPER, 0.14, 0, 0)\n .rotate(BoneName.SPINE_LOWER, 0.12, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0.05)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GON_EARTH.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.29, \"linear\")\n .rotate(BoneName.PELVIS, 0.16, 0, 0)\n .rotate(BoneName.HIP_L, 0.25, 0, 0)\n .rotate(BoneName.KNEE_L, -1.1, 0, 0)\n .rotate(BoneName.HIP_R, -0.3, 0, 0)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0.04, 0.05)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GON_EARTH.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .at(0.58, \"ease-out\")\n .rotate(BoneName.PELVIS, 0.2, -0.1, 0)\n .rotate(BoneName.HIP_R, -0.5, 0, 0)\n .rotate(BoneName.KNEE_R, -0.4, 0, 0)\n .rotate(BoneName.HIP_L, 0.7, 0, 0)\n .rotate(BoneName.KNEE_L, -0.95, 0, 0)\n .rotate(BoneName.SHOULDER_L, ...arms.leftShoulder)\n .rotate(BoneName.ELBOW_L, ...arms.leftElbow)\n .rotate(BoneName.SHOULDER_R, ...arms.rightShoulder)\n .rotate(BoneName.ELBOW_R, ...arms.rightElbow)\n .position(BoneName.PELVIS, 0, 0, 0.05)\n .done<MartialArtsAnimationBuilder>()\n .withFootWidth(\n KOREAN_STANCE_BIOMECHANICS.GON_EARTH.stanceWidth,\n DEFAULT_SHOULDER_WIDTH_CM,\n )\n .build();\n})();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ANIMATION MAPS\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Map of all stance-specific walk animations\n * @korean 자세별걷기애니메이션맵\n */\nexport const STANCE_WALK_ANIMATIONS: ReadonlyMap<string, SkeletalAnimation> =\n new Map([\n [\"walk_geon\", GEON_WALK_ANIMATION],\n [\"walk_tae\", TAE_WALK_ANIMATION],\n [\"walk_li\", LI_WALK_ANIMATION],\n [\"walk_jin\", JIN_WALK_ANIMATION],\n [\"walk_son\", SON_WALK_ANIMATION],\n [\"walk_gam\", GAM_WALK_ANIMATION],\n [\"walk_gan\", GAN_WALK_ANIMATION],\n [\"walk_gon\", GON_WALK_ANIMATION],\n ]);\n\n/**\n * Map of all stance-specific run animations\n * @korean 자세별달리기애니메이션맵\n */\nexport const STANCE_RUN_ANIMATIONS: ReadonlyMap<string, SkeletalAnimation> =\n new Map([\n [\"run_geon\", GEON_RUN_ANIMATION],\n [\"run_tae\", TAE_RUN_ANIMATION],\n [\"run_li\", LI_RUN_ANIMATION],\n [\"run_jin\", JIN_RUN_ANIMATION],\n [\"run_son\", SON_RUN_ANIMATION],\n [\"run_gam\", GAM_RUN_ANIMATION],\n [\"run_gan\", GAN_RUN_ANIMATION],\n [\"run_gon\", GON_RUN_ANIMATION],\n ]);\n\n/**\n * Combined map of all stance locomotion animations\n * @korean 자세별이동애니메이션통합맵\n */\nexport const STANCE_LOCOMOTION_ANIMATIONS: ReadonlyMap<\n string,\n SkeletalAnimation\n> = new Map([...STANCE_WALK_ANIMATIONS, ...STANCE_RUN_ANIMATIONS]);\n\n/**\n * Get stance-specific walk animation\n * @param stance - Trigram stance name (geon, tae, li, etc.)\n * @returns Walk animation for that stance\n */\nexport function getStanceWalkAnimation(\n stance: string,\n): SkeletalAnimation | undefined {\n return STANCE_WALK_ANIMATIONS.get(`walk_${stance}`);\n}\n\n/**\n * Get stance-specific run animation\n * @param stance - Trigram stance name (geon, tae, li, etc.)\n * @returns Run animation for that stance\n */\nexport function getStanceRunAnimation(\n stance: string,\n): SkeletalAnimation | undefined {\n return STANCE_RUN_ANIMATIONS.get(`run_${stance}`);\n}\n"],"mappings":"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"}
@@ -74,7 +74,7 @@ var STEP_RIGHT_ANIMATION = MartialArtsAnimationBuilder.create("step_right", "우
74
74
  *
75
75
  * @korean 발걸음애니메이션맵
76
76
  */
77
- var STEP_ANIMATIONS = new Map([
77
+ var STEP_ANIMATIONS = /* @__PURE__ */ new Map([
78
78
  ["step_forward", STEP_FORWARD_ANIMATION],
79
79
  ["step_back", STEP_BACK_ANIMATION],
80
80
  ["step_left", STEP_LEFT_ANIMATION],
@@ -1 +1 @@
1
- {"version":3,"file":"StepSkeletalAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/StepSkeletalAnimations.ts"],"sourcesContent":["/**\n * Korean martial arts step movement animations with skeletal keyframes\n *\n * Defines realistic tactical step animation sequences for precise footwork\n * with 30cm distance, 300ms duration, and guard maintenance.\n *\n * All step animations are implemented using the MartialArtsAnimationBuilder pattern.\n *\n * @module systems/animation/StepSkeletalAnimations\n * @category Animation System\n * @korean 발걸음애니메이션\n */\n\nimport type { SkeletalAnimation } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\n\n/**\n * FORWARD STEP Animation (전진보법)\n *\n * Tactical forward step with weight transfer and guard maintenance.\n *\n * Animation phases:\n * 1. Preparation (0-0.1s): Weight shifts to back foot, crouch slightly\n * 2. Movement (0.1-0.2s): Front foot lifts and extends forward\n * 3. Landing (0.2-0.25s): Front foot plants, weight transfers forward\n * 4. Stabilization (0.25-0.3s): Back foot follows, body straightens\n *\n * Distance: 30cm forward\n * Duration: 300ms\n * Guard: Maintained throughout\n *\n * @korean 전진보법애니메이션\n */\nexport const STEP_FORWARD_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"step_forward\", \"전진보법\")\n .asMovement(0.3, false)\n .stance()\n .forwardStep(0.12, \"ease-out\")\n .forwardStep(0.1, \"linear\")\n .recover(0.08, \"ease-in\")\n .build();\n\n/**\n * BACKWARD STEP Animation (후진보법)\n *\n * Tactical backward step for defensive retreat while maintaining guard.\n *\n * Animation phases:\n * 1. Preparation (0-0.1s): Weight shifts to front foot\n * 2. Movement (0.1-0.2s): Back foot lifts and extends backward\n * 3. Landing (0.2-0.25s): Back foot plants, weight transfers\n * 4. Stabilization (0.25-0.3s): Front foot follows, guard maintained\n *\n * Distance: 30cm backward\n * Duration: 300ms\n * Guard: Maintained throughout\n *\n * @korean 후진보법애니메이션\n */\nexport const STEP_BACK_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"step_back\", \"후진보법\")\n .asMovement(0.3, false)\n .stance()\n .backwardStep(0.12, \"ease-out\")\n .backwardStep(0.1, \"linear\")\n .recover(0.08, \"ease-in\")\n .build();\n\n/**\n * STEP LEFT Animation (좌측보법)\n *\n * Lateral step to the left while maintaining forward-facing guard.\n *\n * Animation phases:\n * 1. Preparation (0-0.1s): Weight shifts to right foot\n * 2. Movement (0.1-0.2s): Left foot lifts and extends laterally\n * 3. Landing (0.2-0.25s): Left foot plants, weight transfers\n * 4. Stabilization (0.25-0.3s): Right foot follows, stance width maintained\n *\n * Distance: 30cm lateral (left)\n * Duration: 300ms\n * Guard: Maintained forward-facing\n *\n * @korean 좌측보법애니메이션\n */\nexport const STEP_LEFT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"step_left\", \"좌측보법\")\n .asMovement(0.3, false)\n .stance()\n .sideStepLeft(0.12, \"ease-out\")\n .sideStepLeft(0.1, \"linear\")\n .recover(0.08, \"ease-in\")\n .build();\n\n/**\n * STEP RIGHT Animation (우측보법)\n *\n * Lateral step to the right while maintaining forward-facing guard.\n * Mirror of step left.\n *\n * Distance: 30cm lateral (right)\n * Duration: 300ms\n * Guard: Maintained forward-facing\n *\n * @korean 우측보법애니메이션\n */\nexport const STEP_RIGHT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"step_right\", \"우측보법\")\n .asMovement(0.3, false)\n .stance()\n .sideStepRight(0.12, \"ease-out\")\n .sideStepRight(0.1, \"linear\")\n .recover(0.08, \"ease-in\")\n .build();\n\n/**\n * Map of all step animations by name\n *\n * Provides quick lookup for step movement animations.\n *\n * @korean 발걸음애니메이션맵\n */\nexport const STEP_ANIMATIONS = new Map<string, SkeletalAnimation>([\n [\"step_forward\", STEP_FORWARD_ANIMATION],\n [\"step_back\", STEP_BACK_ANIMATION],\n [\"step_left\", STEP_LEFT_ANIMATION],\n [\"step_right\", STEP_RIGHT_ANIMATION],\n]);\n\n/**\n * Get step animation by name\n *\n * Returns the skeletal animation for the specified step direction.\n * Returns undefined if animation not found.\n *\n * @param animationName - Animation state name (e.g., \"step_forward\")\n * @returns Skeletal animation or undefined\n * @korean 발걸음애니메이션가져오기\n */\nexport function getStepAnimation(\n animationName: string\n): SkeletalAnimation | undefined {\n return STEP_ANIMATIONS.get(animationName);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAiCA,IAAa,yBACX,4BAA4B,OAAO,gBAAgB,MAAM,EACtD,WAAW,IAAK,KAAK,EACrB,OAAO,EACP,YAAY,KAAM,UAAU,EAC5B,YAAY,IAAK,QAAQ,EACzB,QAAQ,KAAM,SAAS,EACvB,MAAM;;;;;;;;;;;;;;;;;;AAmBX,IAAa,sBACX,4BAA4B,OAAO,aAAa,MAAM,EACnD,WAAW,IAAK,KAAK,EACrB,OAAO,EACP,aAAa,KAAM,UAAU,EAC7B,aAAa,IAAK,QAAQ,EAC1B,QAAQ,KAAM,SAAS,EACvB,MAAM;;;;;;;;;;;;;;;;;;AAmBX,IAAa,sBACX,4BAA4B,OAAO,aAAa,MAAM,EACnD,WAAW,IAAK,KAAK,EACrB,OAAO,EACP,aAAa,KAAM,UAAU,EAC7B,aAAa,IAAK,QAAQ,EAC1B,QAAQ,KAAM,SAAS,EACvB,MAAM;;;;;;;;;;;;;AAcX,IAAa,uBACX,4BAA4B,OAAO,cAAc,MAAM,EACpD,WAAW,IAAK,KAAK,EACrB,OAAO,EACP,cAAc,KAAM,UAAU,EAC9B,cAAc,IAAK,QAAQ,EAC3B,QAAQ,KAAM,SAAS,EACvB,MAAM;;;;;;;;AASX,IAAa,kBAAkB,IAAI,IAA+B;CAChE,CAAC,gBAAgB,sBAAsB;CACvC,CAAC,aAAa,mBAAmB;CACjC,CAAC,aAAa,mBAAmB;CACjC,CAAC,cAAc,oBAAoB;AACrC,CAAC;;;;;;;;;;;AAYD,SAAgB,iBACd,eAC+B;CAC/B,OAAO,gBAAgB,IAAI,aAAa;AAC1C"}
1
+ {"version":3,"file":"StepSkeletalAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/StepSkeletalAnimations.ts"],"sourcesContent":["/**\n * Korean martial arts step movement animations with skeletal keyframes\n *\n * Defines realistic tactical step animation sequences for precise footwork\n * with 30cm distance, 300ms duration, and guard maintenance.\n *\n * All step animations are implemented using the MartialArtsAnimationBuilder pattern.\n *\n * @module systems/animation/StepSkeletalAnimations\n * @category Animation System\n * @korean 발걸음애니메이션\n */\n\nimport type { SkeletalAnimation } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\n\n/**\n * FORWARD STEP Animation (전진보법)\n *\n * Tactical forward step with weight transfer and guard maintenance.\n *\n * Animation phases:\n * 1. Preparation (0-0.1s): Weight shifts to back foot, crouch slightly\n * 2. Movement (0.1-0.2s): Front foot lifts and extends forward\n * 3. Landing (0.2-0.25s): Front foot plants, weight transfers forward\n * 4. Stabilization (0.25-0.3s): Back foot follows, body straightens\n *\n * Distance: 30cm forward\n * Duration: 300ms\n * Guard: Maintained throughout\n *\n * @korean 전진보법애니메이션\n */\nexport const STEP_FORWARD_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"step_forward\", \"전진보법\")\n .asMovement(0.3, false)\n .stance()\n .forwardStep(0.12, \"ease-out\")\n .forwardStep(0.1, \"linear\")\n .recover(0.08, \"ease-in\")\n .build();\n\n/**\n * BACKWARD STEP Animation (후진보법)\n *\n * Tactical backward step for defensive retreat while maintaining guard.\n *\n * Animation phases:\n * 1. Preparation (0-0.1s): Weight shifts to front foot\n * 2. Movement (0.1-0.2s): Back foot lifts and extends backward\n * 3. Landing (0.2-0.25s): Back foot plants, weight transfers\n * 4. Stabilization (0.25-0.3s): Front foot follows, guard maintained\n *\n * Distance: 30cm backward\n * Duration: 300ms\n * Guard: Maintained throughout\n *\n * @korean 후진보법애니메이션\n */\nexport const STEP_BACK_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"step_back\", \"후진보법\")\n .asMovement(0.3, false)\n .stance()\n .backwardStep(0.12, \"ease-out\")\n .backwardStep(0.1, \"linear\")\n .recover(0.08, \"ease-in\")\n .build();\n\n/**\n * STEP LEFT Animation (좌측보법)\n *\n * Lateral step to the left while maintaining forward-facing guard.\n *\n * Animation phases:\n * 1. Preparation (0-0.1s): Weight shifts to right foot\n * 2. Movement (0.1-0.2s): Left foot lifts and extends laterally\n * 3. Landing (0.2-0.25s): Left foot plants, weight transfers\n * 4. Stabilization (0.25-0.3s): Right foot follows, stance width maintained\n *\n * Distance: 30cm lateral (left)\n * Duration: 300ms\n * Guard: Maintained forward-facing\n *\n * @korean 좌측보법애니메이션\n */\nexport const STEP_LEFT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"step_left\", \"좌측보법\")\n .asMovement(0.3, false)\n .stance()\n .sideStepLeft(0.12, \"ease-out\")\n .sideStepLeft(0.1, \"linear\")\n .recover(0.08, \"ease-in\")\n .build();\n\n/**\n * STEP RIGHT Animation (우측보법)\n *\n * Lateral step to the right while maintaining forward-facing guard.\n * Mirror of step left.\n *\n * Distance: 30cm lateral (right)\n * Duration: 300ms\n * Guard: Maintained forward-facing\n *\n * @korean 우측보법애니메이션\n */\nexport const STEP_RIGHT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"step_right\", \"우측보법\")\n .asMovement(0.3, false)\n .stance()\n .sideStepRight(0.12, \"ease-out\")\n .sideStepRight(0.1, \"linear\")\n .recover(0.08, \"ease-in\")\n .build();\n\n/**\n * Map of all step animations by name\n *\n * Provides quick lookup for step movement animations.\n *\n * @korean 발걸음애니메이션맵\n */\nexport const STEP_ANIMATIONS = new Map<string, SkeletalAnimation>([\n [\"step_forward\", STEP_FORWARD_ANIMATION],\n [\"step_back\", STEP_BACK_ANIMATION],\n [\"step_left\", STEP_LEFT_ANIMATION],\n [\"step_right\", STEP_RIGHT_ANIMATION],\n]);\n\n/**\n * Get step animation by name\n *\n * Returns the skeletal animation for the specified step direction.\n * Returns undefined if animation not found.\n *\n * @param animationName - Animation state name (e.g., \"step_forward\")\n * @returns Skeletal animation or undefined\n * @korean 발걸음애니메이션가져오기\n */\nexport function getStepAnimation(\n animationName: string\n): SkeletalAnimation | undefined {\n return STEP_ANIMATIONS.get(animationName);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAiCA,IAAa,yBACX,4BAA4B,OAAO,gBAAgB,MAAM,CAAC,CACvD,WAAW,IAAK,KAAK,CAAC,CACtB,OAAO,CAAC,CACR,YAAY,KAAM,UAAU,CAAC,CAC7B,YAAY,IAAK,QAAQ,CAAC,CAC1B,QAAQ,KAAM,SAAS,CAAC,CACxB,MAAM;;;;;;;;;;;;;;;;;;AAmBX,IAAa,sBACX,4BAA4B,OAAO,aAAa,MAAM,CAAC,CACpD,WAAW,IAAK,KAAK,CAAC,CACtB,OAAO,CAAC,CACR,aAAa,KAAM,UAAU,CAAC,CAC9B,aAAa,IAAK,QAAQ,CAAC,CAC3B,QAAQ,KAAM,SAAS,CAAC,CACxB,MAAM;;;;;;;;;;;;;;;;;;AAmBX,IAAa,sBACX,4BAA4B,OAAO,aAAa,MAAM,CAAC,CACpD,WAAW,IAAK,KAAK,CAAC,CACtB,OAAO,CAAC,CACR,aAAa,KAAM,UAAU,CAAC,CAC9B,aAAa,IAAK,QAAQ,CAAC,CAC3B,QAAQ,KAAM,SAAS,CAAC,CACxB,MAAM;;;;;;;;;;;;;AAcX,IAAa,uBACX,4BAA4B,OAAO,cAAc,MAAM,CAAC,CACrD,WAAW,IAAK,KAAK,CAAC,CACtB,OAAO,CAAC,CACR,cAAc,KAAM,UAAU,CAAC,CAC/B,cAAc,IAAK,QAAQ,CAAC,CAC5B,QAAQ,KAAM,SAAS,CAAC,CACxB,MAAM;;;;;;;;AASX,IAAa,kCAAkB,IAAI,IAA+B;CAChE,CAAC,gBAAgB,sBAAsB;CACvC,CAAC,aAAa,mBAAmB;CACjC,CAAC,aAAa,mBAAmB;CACjC,CAAC,cAAc,oBAAoB;AACrC,CAAC;;;;;;;;;;;AAYD,SAAgB,iBACd,eAC+B;CAC/B,OAAO,gBAAgB,IAAI,aAAa;AAC1C"}
@@ -1 +1 @@
1
- {"version":3,"file":"TaeJointLockAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/TaeJointLockAnimations.ts"],"sourcesContent":["import { BoneName } from \"@/types/skeletal\";\nimport type { SkeletalAnimation } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\n\n/**\n * Anatomical safety constants for Tae (Lake) joint lock animations\n *\n * These limits document safe physiological ranges for joint manipulation techniques.\n * The constants serve as reference documentation validated by Korean martial arts experts\n * and inform the design of all joint lock animations to ensure realistic Hapkido mechanics\n * without exceeding anatomical safety thresholds.\n *\n * Note: These are documentation constants. The actual animation rotations are designed\n * to stay within these limits naturally through authentic joint lock biomechanics.\n */\nexport const ANATOMICAL_LIMITS_TAE_JOINT_LOCKS = {\n /**\n * Maximum safe wrist hyperextension: 70° (1.22 radians)\n * \n * Typical wrist extension limit is 70-90°. We use 70° as a safe\n * threshold for realistic joint locks without causing injury.\n */\n MAX_WRIST_HYPEREXTENSION: 1.22, // 70° in radians\n \n /**\n * Maximum safe elbow flexion: 145° (2.53 radians)\n * \n * Full elbow flexion is approximately 145-150°, allowing natural\n * bending and manipulation in joint lock techniques.\n */\n MAX_ELBOW_FLEXION: 2.53, // 145° in radians\n \n /**\n * Maximum safe shoulder rotation: ±90° (±1.57 radians)\n * \n * Safe shoulder rotation range for circular Hapkido movements\n * without risking impingement or structural damage.\n */\n MAX_SHOULDER_ROTATION: 1.57, // ±90° in radians\n} as const;\n\n// ═══════════════════════════════════════════════════════════════════════════\n// TAE TRIGRAM (☱ 태) - LAKE: JOINT MANIPULATION (관절기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * TAE WRIST LOCK SEQUENCE - 손목꺾기 (Wrist Lock Sequence)\n *\n * Simplified 3-phase Hapkido wrist lock sequence with circular small-circle technique.\n * \n * Phases:\n * - Setup (0-600ms): Reach and grasp opponent's wrist\n * - Control (600-1200ms): Apply circular pressure with small-circle rotation\n * - Finish (1200-1800ms): Lock wrist at hyperextension, opponent controlled\n *\n * Hapkido biomechanics:\n * - Small circular wrist motion generates torque\n * - Hip rotation powers the lock\n * - Wrist hyperextends to 70° (1.22 rad) safely\n * - Natural flowing movement, not jerky\n *\n * Target vital points: Wrist joint, elbow joint\n *\n * @korean 손목꺾기\n * @duration 1800ms (1.8 seconds)\n * @category Joint Lock Animation\n */\nexport const TAE_WRIST_LOCK_SEQUENCE: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"tae_wrist_lock_sequence\", \"손목꺾기\")\n .asAttack(1.8)\n // Phase 1: Setup - Reach and grasp wrist (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26) // -30°, 10°, -15° (Tae mid-level guard)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4) // 80° (flexed guard)\n .rotate(BoneName.WRIST_R, 0, 0, 0) // Neutral\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26) // -30°, -10°, 15°\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4) // -80° (flexed)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Control - Apply circular pressure (600ms)\n .at(0.6)\n .rotate(BoneName.SHOULDER_R, -0.17, 0.52, 0) // -10°, 30°, 0° (shoulder rises for leverage)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.05) // 60° (elbow in circular arc)\n .rotate(BoneName.WRIST_R, 0.35, 0.26, -0.44) // 20°, 15°, -25° (small-circle rotation peak)\n .rotate(BoneName.SPINE_UPPER, 0, 0.26, 0) // 0°, 15° (torso rotation)\n .rotate(BoneName.PELVIS, 0, 0.26, 0) // 0°, 15° (hip power)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (rear leg drive)\n .position(BoneName.PELVIS, 0, -0.03, 0.15) // Body drops slightly for pressure\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Finish - Lock at hyperextension (1200ms)\n .at(1.2)\n .rotate(BoneName.SHOULDER_R, 0.17, 0.7, 0.26) // 10°, 40°, 15° (shoulder locked high)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4) // 80° (elbow locked)\n .rotate(BoneName.WRIST_R, 0.61, 0.44, -0.61) // 35°, 25°, -35° (wrist hyperextension - lock!)\n .rotate(BoneName.SPINE_UPPER, 0, 0.44, 0) // 0°, 25° (full rotation)\n .rotate(BoneName.PELVIS, 0, 0.44, 0) // 0°, 25° (hip maximized)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20° (full leg drive)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (front leg stable)\n .position(BoneName.PELVIS, 0, -0.06, 0.2) // Body drop for maximum pressure\n .done<MartialArtsAnimationBuilder>()\n // Hold - Maintain control (1800ms)\n .at(1.8)\n .rotate(BoneName.SHOULDER_R, 0.17, 0.61, 0.26) // 10°, 35°, 15° (holding)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.22) // 70° (control)\n .rotate(BoneName.WRIST_R, 0.52, 0.35, -0.52) // 30°, 20°, -30° (maintained)\n .rotate(BoneName.SPINE_UPPER, 0, 0.35, 0) // 0°, 20° (stable)\n .rotate(BoneName.PELVIS, 0, 0.35, 0) // 0°, 20° (stable)\n .position(BoneName.PELVIS, 0, -0.05, 0.18) // Control position\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * TAE ELBOW CONTROL - 팔꿈치 제어 (Elbow Control)\n *\n * Simplified 3-phase Hapkido elbow lock with circular pressure application.\n *\n * Phases:\n * - Capture (0-500ms): Seize opponent's extended arm with both hands\n * - Control (500-1100ms): Apply circular pressure on elbow joint\n * - Lock (1100-1650ms): Lock elbow at hyperextension angle\n *\n * Hapkido biomechanics:\n * - Right hand rises, left hand pushes down (circular arc)\n * - Hip rotation generates power\n * - Natural flowing movement for joint manipulation\n *\n * Target vital points: Elbow joint\n *\n * @korean 팔꿈치 제어\n * @duration 1650ms (1.65 seconds)\n * @category Attack Animation\n */\nexport const TAE_ELBOW_CONTROL: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"tae_elbow_control\", \"팔꿈치 제어\")\n .asAttack(1.65)\n // Phase 1: Capture - Seize opponent's arm (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26) // Tae guard\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4) // 80° guard\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Control - Apply circular pressure (550ms)\n .at(0.55)\n .rotate(BoneName.SHOULDER_R, -0.17, 0.7, 0.09) // -10°, 40°, 5° (right hand rises)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.87) // 50° (creating leverage)\n .rotate(BoneName.SHOULDER_L, -0.09, 0.79, 0.35) // -5°, 45°, 20° (left hand pushes down)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.52) // -30° (pushing elbow joint)\n .rotate(BoneName.SPINE_UPPER, 0, 0.26, 0) // 0°, 15° (rotation)\n .rotate(BoneName.PELVIS, 0, 0.17, 0) // 0°, 10° (hip engagement)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (rear leg drive)\n .position(BoneName.PELVIS, 0, -0.03, 0.18) // Body drops for pressure\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Lock - Elbow hyperextension (1100ms)\n .at(1.1)\n .rotate(BoneName.SHOULDER_R, 0.17, 1.05, 0.35) // 10°, 60°, 20° (locked high)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4) // 80° (locked position)\n .rotate(BoneName.WRIST_R, 0.44, 0.35, -0.52) // 25°, 20°, -30° (control)\n .rotate(BoneName.SHOULDER_L, 0.26, 1.22, 0.61) // 15°, 70°, 35° (pushing down)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.87) // -50° (full pressure)\n .rotate(BoneName.WRIST_L, 0.35, 0, 0.44) // Maximum downward pressure\n .rotate(BoneName.SPINE_UPPER, 0, 0.44, 0) // 0°, 25° (full rotation)\n .rotate(BoneName.PELVIS, 0, 0.35, 0) // 0°, 20° (hip maximized)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20° (maximum drive)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable base)\n .position(BoneName.PELVIS, 0, -0.06, 0.22) // Body drops for leverage\n .done<MartialArtsAnimationBuilder>()\n // Hold - Maintain lock (1650ms)\n .at(1.65)\n .rotate(BoneName.SHOULDER_R, 0.09, 0.96, 0.26) // 5°, 55°, 15° (holding)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.22) // 70° (control)\n .rotate(BoneName.WRIST_R, 0.35, 0.26, -0.44) // Control maintained\n .rotate(BoneName.SHOULDER_L, 0.17, 1.13, 0.52) // 10°, 65°, 30° (pressure held)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.7) // -40° (pressure maintained)\n .rotate(BoneName.SPINE_UPPER, 0, 0.35, 0) // Stable control\n .rotate(BoneName.PELVIS, 0, 0.35, 0)\n .position(BoneName.PELVIS, 0, -0.05, 0.2)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * Finger Manipulation - 손가락제압\n *\n * Quick small joint manipulation for pain compliance.\n * Hapkido principle: Control through small joint isolation.\n *\n * @korean 손가락제압\n * @duration 500ms\n * @category Attack Animation\n */\nexport const TAE_FINGER_LOCK: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"finger_lock\", \"손가락제압\")\n .asAttack(0.5)\n // Start: Tae guard (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4)\n .rotate(BoneName.WRIST_R, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Grasp: Hand extends to grasp fingers (200ms)\n .at(0.2)\n .rotate(BoneName.SHOULDER_R, -0.35, 0.26, -0.17)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.7)\n .rotate(BoneName.WRIST_R, 0.26, 0.17, -0.35)\n .done<MartialArtsAnimationBuilder>()\n // Lock: Apply pressure on small joint (350ms)\n .at(0.35)\n .rotate(BoneName.SHOULDER_R, -0.26, 0.35, -0.09)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.52)\n .rotate(BoneName.WRIST_R, 0.44, 0.26, -0.52) // Maximum wrist bend for finger lock\n .done<MartialArtsAnimationBuilder>()\n // Release: Return to guard (500ms)\n .at(0.5)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4)\n .rotate(BoneName.WRIST_R, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * Flowing Joint Lock Defense - 유수관절기방어\n *\n * Counter-technique: Turning opponent's grab into a lock.\n * Hapkido principle: Yielding (Yu-Sool) - redirect force into control.\n *\n * @korean 유수관절기방어\n * @duration 650ms\n * @category Defense Animation\n */\nexport const TAE_FLOWING_COUNTER: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"flowing_lock_counter\", \"유수관절기방어\")\n .asDefense(0.65)\n // Start: Tae guard (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Yield: Begin circular redirection (250ms)\n .at(0.25)\n .rotate(BoneName.SHOULDER_L, -0.17, 0.52, 0.52) // -10°, 30°, 30° (circular motion)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.7) // -40° (flexing for control)\n .rotate(BoneName.SPINE_UPPER, 0, 0.26, 0) // 0°, 15° (rotation begins)\n .done<MartialArtsAnimationBuilder>()\n // Lock: Complete counter-lock (450ms)\n .at(0.45)\n .rotate(BoneName.SHOULDER_L, 0.17, 0.96, 0.7) // 10°, 55°, 40° (lock applied)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.52) // -30° (control position)\n .rotate(BoneName.SPINE_UPPER, 0, 0.44, 0) // 0°, 25° (full rotation)\n .done<MartialArtsAnimationBuilder>()\n // Release: Return to guard (650ms)\n .at(0.65)\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ADDITIONAL TAE COMBAT TECHNIQUES\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * TAE FLOWING STRIKES - 유수연타 (Flowing Water Strikes)\n *\n * Continuous palm strikes with fluid transitions between attacks.\n * This is a flowing strike sequence (연타), not a wrist-lock chain;\n * wrist-lock flows are modeled separately as 손목꺾기 (Wrist Lock).\n *\n * Hapkido principle: Flowing like water, never stopping.\n *\n * Phases:\n * - Setup (0-200ms): Initial palm strike\n * - Flow (200-400ms): Transition to second strike\n * - Finish (400-600ms): Final palm heel strike\n *\n * @korean 유수연타\n * @duration 600ms\n * @category Attack Animation\n */\nexport const TAE_FLOWING_STRIKES: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"tae_flowing_strikes\", \"유수연타\")\n .asAttack(0.6)\n // Phase 1: First palm strike (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26) // Guard position\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Flow to second strike (300ms)\n .at(0.3)\n .rotate(BoneName.SHOULDER_R, -0.17, 0.44, -0.09) // -10°, 25°, -5° (palm out)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.52) // 30° (extended)\n .rotate(BoneName.SHOULDER_L, -0.26, -0.35, 0.17) // -15°, -20°, 10° (preparing)\n .rotate(BoneName.SPINE_UPPER, 0, 0.17, 0) // 0°, 10° (rotation)\n .rotate(BoneName.PELVIS, 0, 0.17, 0) // 0°, 10° (hip power)\n .position(BoneName.PELVIS, 0, 0, 0.1) // Forward\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Final palm heel strike (600ms)\n .at(0.6)\n .rotate(BoneName.SHOULDER_L, -0.09, 0.52, 0.09) // -5°, 30°, 5° (strike)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.44) // -25° (extended)\n .rotate(BoneName.SPINE_UPPER, 0, -0.17, 0) // 0°, -10° (counter-rotation)\n .rotate(BoneName.PELVIS, 0, -0.09, 0) // 0°, -5° (return)\n .position(BoneName.PELVIS, 0, 0, 0.15) // Maximum reach\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * TAE SMALL CIRCLE TECHNIQUE - 소원법 (Small Circle Method)\n *\n * Advanced Hapkido technique using minimal circular motion for maximum leverage.\n * Controls both wrist and elbow simultaneously with small-circle manipulation.\n *\n * Phases:\n * - Contact (0-250ms): Grasp wrist and elbow\n * - Circle (250-550ms): Apply small-circle pressure\n * - Lock (550-750ms): Lock both joints\n *\n * @korean 소원법\n * @duration 750ms\n * @category Attack Animation\n */\nexport const TAE_SMALL_CIRCLE: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"tae_small_circle\", \"소원법\")\n .asAttack(0.75)\n // Phase 1: Contact - Grasp wrist and elbow (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26) // Guard\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4)\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Circle - Small-circle pressure (400ms)\n .at(0.4)\n .rotate(BoneName.SHOULDER_R, -0.26, 0.61, 0.17) // -15°, 35°, 10° (wrist control)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.87) // 50° (circular motion)\n .rotate(BoneName.WRIST_R, 0.26, 0.17, -0.35) // 15°, 10°, -20° (small circle)\n .rotate(BoneName.SHOULDER_L, -0.17, 0.7, 0.35) // -10°, 40°, 20° (elbow control)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.61) // -35° (pressure)\n .rotate(BoneName.SPINE_UPPER, 0, 0.26, 0) // 0°, 15° (rotation)\n .rotate(BoneName.PELVIS, 0, 0.17, 0) // 0°, 10° (hip power)\n .position(BoneName.PELVIS, 0, -0.02, 0.12) // Body drops\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Lock - Both joints locked (750ms)\n .at(0.75)\n .rotate(BoneName.SHOULDER_R, 0.09, 0.79, 0.35) // 5°, 45°, 20° (wrist locked)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.22) // 70° (locked)\n .rotate(BoneName.WRIST_R, 0.52, 0.35, -0.52) // 30°, 20°, -30° (hyperextension)\n .rotate(BoneName.SHOULDER_L, 0.17, 0.96, 0.52) // 10°, 55°, 30° (elbow locked)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.79) // -45° (maximum pressure)\n .rotate(BoneName.SPINE_UPPER, 0, 0.35, 0) // 0°, 20° (full rotation)\n .rotate(BoneName.PELVIS, 0, 0.26, 0) // 0°, 15° (hip maximized)\n .position(BoneName.PELVIS, 0, -0.04, 0.15) // Maximum control\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * TAE SHOULDER LOCK - 어깨꺾기 (Shoulder Manipulation)\n *\n * Hapkido shoulder lock twisting arm behind back.\n * Extremely effective control technique causing severe pain and compliance.\n *\n * Phases:\n * - Capture (0-300ms): Seize arm\n * - Twist (300-650ms): Rotate arm behind back\n * - Lock (650-850ms): Lock shoulder joint\n *\n * @korean 어깨꺾기\n * @duration 850ms\n * @category Attack Animation\n */\nexport const TAE_SHOULDER_LOCK: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"tae_shoulder_lock\", \"어깨꺾기\")\n .asAttack(0.85)\n // Phase 1: Capture - Seize arm (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26) // Guard\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4)\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Twist - Rotate arm behind (500ms)\n .at(0.5)\n .rotate(BoneName.SHOULDER_R, 0.26, 0.87, -0.52) // 15°, 50°, -30° (twisting motion)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.57) // 90° (behind back)\n .rotate(BoneName.WRIST_R, -0.35, 0.52, 0.79) // -20°, 30°, 45° (twisted)\n .rotate(BoneName.SHOULDER_L, -0.09, -0.44, 0.61) // -5°, -25°, 35° (assisting)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.87) // -50° (pushing)\n .rotate(BoneName.SPINE_UPPER, 0, 0.44, 0) // 0°, 25° (rotation for leverage)\n .rotate(BoneName.PELVIS, 0, 0.35, 0) // 0°, 20° (hip power)\n .position(BoneName.PELVIS, 0, -0.03, 0.1) // Body position\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Lock - Shoulder joint locked (850ms)\n .at(0.85)\n .rotate(BoneName.SHOULDER_R, 0.44, 1.05, -0.79) // 25°, 60°, -45° (locked behind)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.92) // 110° (extreme angle)\n .rotate(BoneName.WRIST_R, -0.52, 0.61, 1.05) // -30°, 35°, 60° (locked)\n .rotate(BoneName.SHOULDER_L, 0.09, -0.52, 0.79) // 5°, -30°, 45° (controlling)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.05) // -60° (maximum pressure)\n .rotate(BoneName.SPINE_UPPER, 0, 0.52, 0) // 0°, 30° (full rotation)\n .rotate(BoneName.PELVIS, 0, 0.44, 0) // 0°, 25° (hip maximized)\n .position(BoneName.PELVIS, 0, -0.05, 0.12) // Control position\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * TAE ARM BAR - 팔꺾기 (Arm Bar Submission)\n *\n * Hapkido arm bar immobilizing elbow for submission.\n * Most powerful Tae technique - forces opponent submission or risks arm break.\n *\n * Phases:\n * - Control (0-350ms): Secure arm extension\n * - Position (350-700ms): Pivot body for leverage\n * - Submit (700-900ms): Apply hyperextension pressure\n *\n * @korean 팔꺾기\n * @duration 900ms\n * @category Attack Animation\n */\nexport const TAE_ARM_BAR: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"tae_arm_bar\", \"팔꺾기\")\n .asAttack(0.9)\n // Phase 1: Control - Secure extended arm (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26) // Guard\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4)\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Position - Pivot for leverage (550ms)\n .at(0.55)\n .rotate(BoneName.SHOULDER_R, 0.17, 0.96, 0.44) // 10°, 55°, 25° (securing)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.52) // 30° (control)\n .rotate(BoneName.WRIST_R, 0.26, 0.17, -0.26) // 15°, 10°, -15° (grip)\n .rotate(BoneName.SHOULDER_L, 0.26, 1.13, 0.61) // 15°, 65°, 35° (holding)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.44) // -25° (positioning)\n .rotate(BoneName.SPINE_UPPER, 0, 0.61, 0) // 0°, 35° (pivot)\n .rotate(BoneName.PELVIS, 0, 0.52, 0) // 0°, 30° (hip rotation)\n .rotate(BoneName.KNEE_R, -0.44, 0, 0) // -25° (body drop)\n .position(BoneName.PELVIS, 0, -0.08, 0.15) // Low position for leverage\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Submit - Hyperextension pressure (900ms)\n .at(0.9)\n .rotate(BoneName.SHOULDER_R, 0.35, 1.22, 0.61) // 20°, 70°, 35° (locked)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.17) // 10° (slight bend for control)\n .rotate(BoneName.WRIST_R, 0.44, 0.26, -0.35) // 25°, 15°, -20° (firm grip)\n .rotate(BoneName.SHOULDER_L, 0.44, 1.4, 0.79) // 25°, 80°, 45° (maximum pressure)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.26) // -15° (locked position)\n .rotate(BoneName.WRIST_L, 0.35, 0, 0.44) // Downward pressure\n .rotate(BoneName.SPINE_UPPER, 0, 0.79, 0) // 0°, 45° (full pivot)\n .rotate(BoneName.PELVIS, 0, 0.7, 0) // 0°, 40° (maximum rotation)\n .rotate(BoneName.KNEE_R, -0.61, 0, 0) // -35° (full body weight)\n .rotate(BoneName.KNEE_L, -0.52, 0, 0) // -30° (grounded)\n .position(BoneName.PELVIS, 0, -0.12, 0.18) // Maximum leverage position\n .done<MartialArtsAnimationBuilder>()\n .build();\n"],"mappings":"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"}
1
+ {"version":3,"file":"TaeJointLockAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/TaeJointLockAnimations.ts"],"sourcesContent":["import { BoneName } from \"@/types/skeletal\";\nimport type { SkeletalAnimation } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\n\n/**\n * Anatomical safety constants for Tae (Lake) joint lock animations\n *\n * These limits document safe physiological ranges for joint manipulation techniques.\n * The constants serve as reference documentation validated by Korean martial arts experts\n * and inform the design of all joint lock animations to ensure realistic Hapkido mechanics\n * without exceeding anatomical safety thresholds.\n *\n * Note: These are documentation constants. The actual animation rotations are designed\n * to stay within these limits naturally through authentic joint lock biomechanics.\n */\nexport const ANATOMICAL_LIMITS_TAE_JOINT_LOCKS = {\n /**\n * Maximum safe wrist hyperextension: 70° (1.22 radians)\n * \n * Typical wrist extension limit is 70-90°. We use 70° as a safe\n * threshold for realistic joint locks without causing injury.\n */\n MAX_WRIST_HYPEREXTENSION: 1.22, // 70° in radians\n \n /**\n * Maximum safe elbow flexion: 145° (2.53 radians)\n * \n * Full elbow flexion is approximately 145-150°, allowing natural\n * bending and manipulation in joint lock techniques.\n */\n MAX_ELBOW_FLEXION: 2.53, // 145° in radians\n \n /**\n * Maximum safe shoulder rotation: ±90° (±1.57 radians)\n * \n * Safe shoulder rotation range for circular Hapkido movements\n * without risking impingement or structural damage.\n */\n MAX_SHOULDER_ROTATION: 1.57, // ±90° in radians\n} as const;\n\n// ═══════════════════════════════════════════════════════════════════════════\n// TAE TRIGRAM (☱ 태) - LAKE: JOINT MANIPULATION (관절기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * TAE WRIST LOCK SEQUENCE - 손목꺾기 (Wrist Lock Sequence)\n *\n * Simplified 3-phase Hapkido wrist lock sequence with circular small-circle technique.\n * \n * Phases:\n * - Setup (0-600ms): Reach and grasp opponent's wrist\n * - Control (600-1200ms): Apply circular pressure with small-circle rotation\n * - Finish (1200-1800ms): Lock wrist at hyperextension, opponent controlled\n *\n * Hapkido biomechanics:\n * - Small circular wrist motion generates torque\n * - Hip rotation powers the lock\n * - Wrist hyperextends to 70° (1.22 rad) safely\n * - Natural flowing movement, not jerky\n *\n * Target vital points: Wrist joint, elbow joint\n *\n * @korean 손목꺾기\n * @duration 1800ms (1.8 seconds)\n * @category Joint Lock Animation\n */\nexport const TAE_WRIST_LOCK_SEQUENCE: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"tae_wrist_lock_sequence\", \"손목꺾기\")\n .asAttack(1.8)\n // Phase 1: Setup - Reach and grasp wrist (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26) // -30°, 10°, -15° (Tae mid-level guard)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4) // 80° (flexed guard)\n .rotate(BoneName.WRIST_R, 0, 0, 0) // Neutral\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26) // -30°, -10°, 15°\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4) // -80° (flexed)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Control - Apply circular pressure (600ms)\n .at(0.6)\n .rotate(BoneName.SHOULDER_R, -0.17, 0.52, 0) // -10°, 30°, 0° (shoulder rises for leverage)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.05) // 60° (elbow in circular arc)\n .rotate(BoneName.WRIST_R, 0.35, 0.26, -0.44) // 20°, 15°, -25° (small-circle rotation peak)\n .rotate(BoneName.SPINE_UPPER, 0, 0.26, 0) // 0°, 15° (torso rotation)\n .rotate(BoneName.PELVIS, 0, 0.26, 0) // 0°, 15° (hip power)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (rear leg drive)\n .position(BoneName.PELVIS, 0, -0.03, 0.15) // Body drops slightly for pressure\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Finish - Lock at hyperextension (1200ms)\n .at(1.2)\n .rotate(BoneName.SHOULDER_R, 0.17, 0.7, 0.26) // 10°, 40°, 15° (shoulder locked high)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4) // 80° (elbow locked)\n .rotate(BoneName.WRIST_R, 0.61, 0.44, -0.61) // 35°, 25°, -35° (wrist hyperextension - lock!)\n .rotate(BoneName.SPINE_UPPER, 0, 0.44, 0) // 0°, 25° (full rotation)\n .rotate(BoneName.PELVIS, 0, 0.44, 0) // 0°, 25° (hip maximized)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20° (full leg drive)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (front leg stable)\n .position(BoneName.PELVIS, 0, -0.06, 0.2) // Body drop for maximum pressure\n .done<MartialArtsAnimationBuilder>()\n // Hold - Maintain control (1800ms)\n .at(1.8)\n .rotate(BoneName.SHOULDER_R, 0.17, 0.61, 0.26) // 10°, 35°, 15° (holding)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.22) // 70° (control)\n .rotate(BoneName.WRIST_R, 0.52, 0.35, -0.52) // 30°, 20°, -30° (maintained)\n .rotate(BoneName.SPINE_UPPER, 0, 0.35, 0) // 0°, 20° (stable)\n .rotate(BoneName.PELVIS, 0, 0.35, 0) // 0°, 20° (stable)\n .position(BoneName.PELVIS, 0, -0.05, 0.18) // Control position\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * TAE ELBOW CONTROL - 팔꿈치 제어 (Elbow Control)\n *\n * Simplified 3-phase Hapkido elbow lock with circular pressure application.\n *\n * Phases:\n * - Capture (0-500ms): Seize opponent's extended arm with both hands\n * - Control (500-1100ms): Apply circular pressure on elbow joint\n * - Lock (1100-1650ms): Lock elbow at hyperextension angle\n *\n * Hapkido biomechanics:\n * - Right hand rises, left hand pushes down (circular arc)\n * - Hip rotation generates power\n * - Natural flowing movement for joint manipulation\n *\n * Target vital points: Elbow joint\n *\n * @korean 팔꿈치 제어\n * @duration 1650ms (1.65 seconds)\n * @category Attack Animation\n */\nexport const TAE_ELBOW_CONTROL: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"tae_elbow_control\", \"팔꿈치 제어\")\n .asAttack(1.65)\n // Phase 1: Capture - Seize opponent's arm (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26) // Tae guard\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4) // 80° guard\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Control - Apply circular pressure (550ms)\n .at(0.55)\n .rotate(BoneName.SHOULDER_R, -0.17, 0.7, 0.09) // -10°, 40°, 5° (right hand rises)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.87) // 50° (creating leverage)\n .rotate(BoneName.SHOULDER_L, -0.09, 0.79, 0.35) // -5°, 45°, 20° (left hand pushes down)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.52) // -30° (pushing elbow joint)\n .rotate(BoneName.SPINE_UPPER, 0, 0.26, 0) // 0°, 15° (rotation)\n .rotate(BoneName.PELVIS, 0, 0.17, 0) // 0°, 10° (hip engagement)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (rear leg drive)\n .position(BoneName.PELVIS, 0, -0.03, 0.18) // Body drops for pressure\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Lock - Elbow hyperextension (1100ms)\n .at(1.1)\n .rotate(BoneName.SHOULDER_R, 0.17, 1.05, 0.35) // 10°, 60°, 20° (locked high)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4) // 80° (locked position)\n .rotate(BoneName.WRIST_R, 0.44, 0.35, -0.52) // 25°, 20°, -30° (control)\n .rotate(BoneName.SHOULDER_L, 0.26, 1.22, 0.61) // 15°, 70°, 35° (pushing down)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.87) // -50° (full pressure)\n .rotate(BoneName.WRIST_L, 0.35, 0, 0.44) // Maximum downward pressure\n .rotate(BoneName.SPINE_UPPER, 0, 0.44, 0) // 0°, 25° (full rotation)\n .rotate(BoneName.PELVIS, 0, 0.35, 0) // 0°, 20° (hip maximized)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20° (maximum drive)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable base)\n .position(BoneName.PELVIS, 0, -0.06, 0.22) // Body drops for leverage\n .done<MartialArtsAnimationBuilder>()\n // Hold - Maintain lock (1650ms)\n .at(1.65)\n .rotate(BoneName.SHOULDER_R, 0.09, 0.96, 0.26) // 5°, 55°, 15° (holding)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.22) // 70° (control)\n .rotate(BoneName.WRIST_R, 0.35, 0.26, -0.44) // Control maintained\n .rotate(BoneName.SHOULDER_L, 0.17, 1.13, 0.52) // 10°, 65°, 30° (pressure held)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.7) // -40° (pressure maintained)\n .rotate(BoneName.SPINE_UPPER, 0, 0.35, 0) // Stable control\n .rotate(BoneName.PELVIS, 0, 0.35, 0)\n .position(BoneName.PELVIS, 0, -0.05, 0.2)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * Finger Manipulation - 손가락제압\n *\n * Quick small joint manipulation for pain compliance.\n * Hapkido principle: Control through small joint isolation.\n *\n * @korean 손가락제압\n * @duration 500ms\n * @category Attack Animation\n */\nexport const TAE_FINGER_LOCK: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"finger_lock\", \"손가락제압\")\n .asAttack(0.5)\n // Start: Tae guard (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4)\n .rotate(BoneName.WRIST_R, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Grasp: Hand extends to grasp fingers (200ms)\n .at(0.2)\n .rotate(BoneName.SHOULDER_R, -0.35, 0.26, -0.17)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.7)\n .rotate(BoneName.WRIST_R, 0.26, 0.17, -0.35)\n .done<MartialArtsAnimationBuilder>()\n // Lock: Apply pressure on small joint (350ms)\n .at(0.35)\n .rotate(BoneName.SHOULDER_R, -0.26, 0.35, -0.09)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.52)\n .rotate(BoneName.WRIST_R, 0.44, 0.26, -0.52) // Maximum wrist bend for finger lock\n .done<MartialArtsAnimationBuilder>()\n // Release: Return to guard (500ms)\n .at(0.5)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4)\n .rotate(BoneName.WRIST_R, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * Flowing Joint Lock Defense - 유수관절기방어\n *\n * Counter-technique: Turning opponent's grab into a lock.\n * Hapkido principle: Yielding (Yu-Sool) - redirect force into control.\n *\n * @korean 유수관절기방어\n * @duration 650ms\n * @category Defense Animation\n */\nexport const TAE_FLOWING_COUNTER: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"flowing_lock_counter\", \"유수관절기방어\")\n .asDefense(0.65)\n // Start: Tae guard (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Yield: Begin circular redirection (250ms)\n .at(0.25)\n .rotate(BoneName.SHOULDER_L, -0.17, 0.52, 0.52) // -10°, 30°, 30° (circular motion)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.7) // -40° (flexing for control)\n .rotate(BoneName.SPINE_UPPER, 0, 0.26, 0) // 0°, 15° (rotation begins)\n .done<MartialArtsAnimationBuilder>()\n // Lock: Complete counter-lock (450ms)\n .at(0.45)\n .rotate(BoneName.SHOULDER_L, 0.17, 0.96, 0.7) // 10°, 55°, 40° (lock applied)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.52) // -30° (control position)\n .rotate(BoneName.SPINE_UPPER, 0, 0.44, 0) // 0°, 25° (full rotation)\n .done<MartialArtsAnimationBuilder>()\n // Release: Return to guard (650ms)\n .at(0.65)\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ADDITIONAL TAE COMBAT TECHNIQUES\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * TAE FLOWING STRIKES - 유수연타 (Flowing Water Strikes)\n *\n * Continuous palm strikes with fluid transitions between attacks.\n * This is a flowing strike sequence (연타), not a wrist-lock chain;\n * wrist-lock flows are modeled separately as 손목꺾기 (Wrist Lock).\n *\n * Hapkido principle: Flowing like water, never stopping.\n *\n * Phases:\n * - Setup (0-200ms): Initial palm strike\n * - Flow (200-400ms): Transition to second strike\n * - Finish (400-600ms): Final palm heel strike\n *\n * @korean 유수연타\n * @duration 600ms\n * @category Attack Animation\n */\nexport const TAE_FLOWING_STRIKES: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"tae_flowing_strikes\", \"유수연타\")\n .asAttack(0.6)\n // Phase 1: First palm strike (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26) // Guard position\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Flow to second strike (300ms)\n .at(0.3)\n .rotate(BoneName.SHOULDER_R, -0.17, 0.44, -0.09) // -10°, 25°, -5° (palm out)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.52) // 30° (extended)\n .rotate(BoneName.SHOULDER_L, -0.26, -0.35, 0.17) // -15°, -20°, 10° (preparing)\n .rotate(BoneName.SPINE_UPPER, 0, 0.17, 0) // 0°, 10° (rotation)\n .rotate(BoneName.PELVIS, 0, 0.17, 0) // 0°, 10° (hip power)\n .position(BoneName.PELVIS, 0, 0, 0.1) // Forward\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Final palm heel strike (600ms)\n .at(0.6)\n .rotate(BoneName.SHOULDER_L, -0.09, 0.52, 0.09) // -5°, 30°, 5° (strike)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.44) // -25° (extended)\n .rotate(BoneName.SPINE_UPPER, 0, -0.17, 0) // 0°, -10° (counter-rotation)\n .rotate(BoneName.PELVIS, 0, -0.09, 0) // 0°, -5° (return)\n .position(BoneName.PELVIS, 0, 0, 0.15) // Maximum reach\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * TAE SMALL CIRCLE TECHNIQUE - 소원법 (Small Circle Method)\n *\n * Advanced Hapkido technique using minimal circular motion for maximum leverage.\n * Controls both wrist and elbow simultaneously with small-circle manipulation.\n *\n * Phases:\n * - Contact (0-250ms): Grasp wrist and elbow\n * - Circle (250-550ms): Apply small-circle pressure\n * - Lock (550-750ms): Lock both joints\n *\n * @korean 소원법\n * @duration 750ms\n * @category Attack Animation\n */\nexport const TAE_SMALL_CIRCLE: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"tae_small_circle\", \"소원법\")\n .asAttack(0.75)\n // Phase 1: Contact - Grasp wrist and elbow (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26) // Guard\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4)\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Circle - Small-circle pressure (400ms)\n .at(0.4)\n .rotate(BoneName.SHOULDER_R, -0.26, 0.61, 0.17) // -15°, 35°, 10° (wrist control)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.87) // 50° (circular motion)\n .rotate(BoneName.WRIST_R, 0.26, 0.17, -0.35) // 15°, 10°, -20° (small circle)\n .rotate(BoneName.SHOULDER_L, -0.17, 0.7, 0.35) // -10°, 40°, 20° (elbow control)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.61) // -35° (pressure)\n .rotate(BoneName.SPINE_UPPER, 0, 0.26, 0) // 0°, 15° (rotation)\n .rotate(BoneName.PELVIS, 0, 0.17, 0) // 0°, 10° (hip power)\n .position(BoneName.PELVIS, 0, -0.02, 0.12) // Body drops\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Lock - Both joints locked (750ms)\n .at(0.75)\n .rotate(BoneName.SHOULDER_R, 0.09, 0.79, 0.35) // 5°, 45°, 20° (wrist locked)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.22) // 70° (locked)\n .rotate(BoneName.WRIST_R, 0.52, 0.35, -0.52) // 30°, 20°, -30° (hyperextension)\n .rotate(BoneName.SHOULDER_L, 0.17, 0.96, 0.52) // 10°, 55°, 30° (elbow locked)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.79) // -45° (maximum pressure)\n .rotate(BoneName.SPINE_UPPER, 0, 0.35, 0) // 0°, 20° (full rotation)\n .rotate(BoneName.PELVIS, 0, 0.26, 0) // 0°, 15° (hip maximized)\n .position(BoneName.PELVIS, 0, -0.04, 0.15) // Maximum control\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * TAE SHOULDER LOCK - 어깨꺾기 (Shoulder Manipulation)\n *\n * Hapkido shoulder lock twisting arm behind back.\n * Extremely effective control technique causing severe pain and compliance.\n *\n * Phases:\n * - Capture (0-300ms): Seize arm\n * - Twist (300-650ms): Rotate arm behind back\n * - Lock (650-850ms): Lock shoulder joint\n *\n * @korean 어깨꺾기\n * @duration 850ms\n * @category Attack Animation\n */\nexport const TAE_SHOULDER_LOCK: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"tae_shoulder_lock\", \"어깨꺾기\")\n .asAttack(0.85)\n // Phase 1: Capture - Seize arm (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26) // Guard\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4)\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Twist - Rotate arm behind (500ms)\n .at(0.5)\n .rotate(BoneName.SHOULDER_R, 0.26, 0.87, -0.52) // 15°, 50°, -30° (twisting motion)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.57) // 90° (behind back)\n .rotate(BoneName.WRIST_R, -0.35, 0.52, 0.79) // -20°, 30°, 45° (twisted)\n .rotate(BoneName.SHOULDER_L, -0.09, -0.44, 0.61) // -5°, -25°, 35° (assisting)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.87) // -50° (pushing)\n .rotate(BoneName.SPINE_UPPER, 0, 0.44, 0) // 0°, 25° (rotation for leverage)\n .rotate(BoneName.PELVIS, 0, 0.35, 0) // 0°, 20° (hip power)\n .position(BoneName.PELVIS, 0, -0.03, 0.1) // Body position\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Lock - Shoulder joint locked (850ms)\n .at(0.85)\n .rotate(BoneName.SHOULDER_R, 0.44, 1.05, -0.79) // 25°, 60°, -45° (locked behind)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.92) // 110° (extreme angle)\n .rotate(BoneName.WRIST_R, -0.52, 0.61, 1.05) // -30°, 35°, 60° (locked)\n .rotate(BoneName.SHOULDER_L, 0.09, -0.52, 0.79) // 5°, -30°, 45° (controlling)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.05) // -60° (maximum pressure)\n .rotate(BoneName.SPINE_UPPER, 0, 0.52, 0) // 0°, 30° (full rotation)\n .rotate(BoneName.PELVIS, 0, 0.44, 0) // 0°, 25° (hip maximized)\n .position(BoneName.PELVIS, 0, -0.05, 0.12) // Control position\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * TAE ARM BAR - 팔꺾기 (Arm Bar Submission)\n *\n * Hapkido arm bar immobilizing elbow for submission.\n * Most powerful Tae technique - forces opponent submission or risks arm break.\n *\n * Phases:\n * - Control (0-350ms): Secure arm extension\n * - Position (350-700ms): Pivot body for leverage\n * - Submit (700-900ms): Apply hyperextension pressure\n *\n * @korean 팔꺾기\n * @duration 900ms\n * @category Attack Animation\n */\nexport const TAE_ARM_BAR: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"tae_arm_bar\", \"팔꺾기\")\n .asAttack(0.9)\n // Phase 1: Control - Secure extended arm (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26) // Guard\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4)\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Position - Pivot for leverage (550ms)\n .at(0.55)\n .rotate(BoneName.SHOULDER_R, 0.17, 0.96, 0.44) // 10°, 55°, 25° (securing)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.52) // 30° (control)\n .rotate(BoneName.WRIST_R, 0.26, 0.17, -0.26) // 15°, 10°, -15° (grip)\n .rotate(BoneName.SHOULDER_L, 0.26, 1.13, 0.61) // 15°, 65°, 35° (holding)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.44) // -25° (positioning)\n .rotate(BoneName.SPINE_UPPER, 0, 0.61, 0) // 0°, 35° (pivot)\n .rotate(BoneName.PELVIS, 0, 0.52, 0) // 0°, 30° (hip rotation)\n .rotate(BoneName.KNEE_R, -0.44, 0, 0) // -25° (body drop)\n .position(BoneName.PELVIS, 0, -0.08, 0.15) // Low position for leverage\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Submit - Hyperextension pressure (900ms)\n .at(0.9)\n .rotate(BoneName.SHOULDER_R, 0.35, 1.22, 0.61) // 20°, 70°, 35° (locked)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.17) // 10° (slight bend for control)\n .rotate(BoneName.WRIST_R, 0.44, 0.26, -0.35) // 25°, 15°, -20° (firm grip)\n .rotate(BoneName.SHOULDER_L, 0.44, 1.4, 0.79) // 25°, 80°, 45° (maximum pressure)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.26) // -15° (locked position)\n .rotate(BoneName.WRIST_L, 0.35, 0, 0.44) // Downward pressure\n .rotate(BoneName.SPINE_UPPER, 0, 0.79, 0) // 0°, 45° (full pivot)\n .rotate(BoneName.PELVIS, 0, 0.7, 0) // 0°, 40° (maximum rotation)\n .rotate(BoneName.KNEE_R, -0.61, 0, 0) // -35° (full body weight)\n .rotate(BoneName.KNEE_L, -0.52, 0, 0) // -30° (grounded)\n .position(BoneName.PELVIS, 0, -0.12, 0.18) // Maximum leverage position\n .done<MartialArtsAnimationBuilder>()\n .build();\n"],"mappings":"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"}