blacktrigram 0.7.39 → 0.7.40

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 (354) hide show
  1. package/lib/App2.js.map +1 -1
  2. package/lib/audio/AudioAssetLoader.js.map +1 -1
  3. package/lib/audio/AudioAssetRegistry.js.map +1 -1
  4. package/lib/audio/AudioCache.js.map +1 -1
  5. package/lib/audio/AudioManager.js.map +1 -1
  6. package/lib/audio/AudioMonitor.js.map +1 -1
  7. package/lib/audio/AudioPool.js.map +1 -1
  8. package/lib/audio/AudioProvider.js.map +1 -1
  9. package/lib/audio/AudioUtils.js.map +1 -1
  10. package/lib/audio/BoneImpactAudioMap.js.map +1 -1
  11. package/lib/audio/VariantSelector.js.map +1 -1
  12. package/lib/audio/types.js.map +1 -1
  13. package/lib/components/screens/combat/CombatScreen3D.js.map +1 -1
  14. package/lib/components/screens/combat/components/controls/CombatButtons.js.map +1 -1
  15. package/lib/components/screens/combat/components/controls/CombatControlsPanel.js.map +1 -1
  16. package/lib/components/screens/combat/components/controls/ControlsGuide.js.map +1 -1
  17. package/lib/components/screens/combat/components/controls/KeyboardHints.js.map +1 -1
  18. package/lib/components/screens/combat/components/controls/PauseMenu.js.map +1 -1
  19. package/lib/components/screens/combat/components/controls/PauseMenuButton.js.map +1 -1
  20. package/lib/components/screens/combat/components/controls/QuickSettings.js.map +1 -1
  21. package/lib/components/screens/combat/components/effects/BloodDecals3D.js.map +1 -1
  22. package/lib/components/screens/combat/components/effects/BloodLossOverlayHtml.js.map +1 -1
  23. package/lib/components/screens/combat/components/effects/BloodParticles3D.js.map +1 -1
  24. package/lib/components/screens/combat/components/effects/BloodViscosity3D.js.map +1 -1
  25. package/lib/components/screens/combat/components/effects/CombatParticleEffects3D.js.map +1 -1
  26. package/lib/components/screens/combat/components/effects/ConsciousnessBlur.js.map +1 -1
  27. package/lib/components/screens/combat/components/effects/InternalDamage3D.js.map +1 -1
  28. package/lib/components/screens/combat/components/effects/PainVignette.js.map +1 -1
  29. package/lib/components/screens/combat/components/effects/ParticleAudio3D.js.map +1 -1
  30. package/lib/components/screens/combat/components/effects/TraumaOverlay3D.js.map +1 -1
  31. package/lib/components/screens/combat/components/feedback/MatchCountdown.js.map +1 -1
  32. package/lib/components/screens/combat/components/feedback/RoundAnnouncementOverlayHtml.js.map +1 -1
  33. package/lib/components/screens/combat/components/feedback/RoundDisplayStatus.js.map +1 -1
  34. package/lib/components/screens/combat/components/feedback/RoundStartAnnouncementOverlayHtml.js.map +1 -1
  35. package/lib/components/screens/combat/components/hud/CombatBottomHUD.js.map +1 -1
  36. package/lib/components/screens/combat/components/hud/CombatLeftHUD.js.map +1 -1
  37. package/lib/components/screens/combat/components/hud/CombatPortraitStatusStrip.js.map +1 -1
  38. package/lib/components/screens/combat/components/hud/CombatRightHUD.js.map +1 -1
  39. package/lib/components/screens/combat/components/hud/CombatTopHUD.js.map +1 -1
  40. package/lib/components/screens/combat/components/hud/DifficultyIndicator.js.map +1 -1
  41. package/lib/components/screens/combat/components/hud/FPSMonitor.js.map +1 -1
  42. package/lib/components/screens/combat/components/hud/MobileControlsWrapper.js.map +1 -1
  43. package/lib/components/screens/combat/components/hud/PlayerStateOverlayHtml.js.map +1 -1
  44. package/lib/components/screens/combat/components/indicators/BalanceIndicator.js.map +1 -1
  45. package/lib/components/screens/combat/components/indicators/InputBufferDisplay.js.map +1 -1
  46. package/lib/components/screens/combat/components/indicators/StaminaWarning.js.map +1 -1
  47. package/lib/components/screens/combat/components/indicators/TechniqueNameDisplay.js.map +1 -1
  48. package/lib/components/screens/combat/helpers/AnimationUpdater.js.map +1 -1
  49. package/lib/components/screens/combat/helpers/combatHelpers.js.map +1 -1
  50. package/lib/components/screens/combat/hooks/useAICombat.js.map +1 -1
  51. package/lib/components/screens/combat/hooks/useCombatActions.js.map +1 -1
  52. package/lib/components/screens/combat/hooks/useCombatAttackMovement.js.map +1 -1
  53. package/lib/components/screens/combat/hooks/useCombatAudio.js.map +1 -1
  54. package/lib/components/screens/combat/hooks/useCombatLayout.js.map +1 -1
  55. package/lib/components/screens/combat/hooks/useCombatState.js.map +1 -1
  56. package/lib/components/screens/controls/ControlsScreen3D.js.map +1 -1
  57. package/lib/components/screens/controls/components/ControlBindingsOverlayHtml.js.map +1 -1
  58. package/lib/components/screens/controls/components/ControlCategoryTabsOverlayHtml.js.map +1 -1
  59. package/lib/components/screens/controls/components/GamepadVisualization3D.js.map +1 -1
  60. package/lib/components/screens/controls/components/InteractiveControlDemoOverlayHtml.js.map +1 -1
  61. package/lib/components/screens/controls/components/Key3D.js.map +1 -1
  62. package/lib/components/screens/controls/components/VisualKeyboard3D.js.map +1 -1
  63. package/lib/components/screens/controls/constants/ControlsConstants.js.map +1 -1
  64. package/lib/components/screens/controls/hooks/useControlsState.js.map +1 -1
  65. package/lib/components/screens/endscreen/EndScreen3D.js.map +1 -1
  66. package/lib/components/screens/endscreen/components/DefeatAnimation3D.js.map +1 -1
  67. package/lib/components/screens/endscreen/components/MatchStatisticsDisplayOverlayHtml.js.map +1 -1
  68. package/lib/components/screens/endscreen/components/NavigationButtonsOverlayHtml.js.map +1 -1
  69. package/lib/components/screens/endscreen/components/PerformanceBreakdownOverlayHtml.js.map +1 -1
  70. package/lib/components/screens/endscreen/components/PerformanceRatingOverlayHtml.js.map +1 -1
  71. package/lib/components/screens/endscreen/components/VictoryAnimation3D.js.map +1 -1
  72. package/lib/components/screens/endscreen/components/WinnerDisplayOverlayHtml.js.map +1 -1
  73. package/lib/components/screens/intro/IntroScreen3D.js +1 -1
  74. package/lib/components/screens/intro/IntroScreen3D.js.map +1 -1
  75. package/lib/components/screens/intro/components/AbilityListOverlayHtml.js.map +1 -1
  76. package/lib/components/screens/intro/components/ArchetypeCardGridOverlayHtml.js.map +1 -1
  77. package/lib/components/screens/intro/components/ArchetypeCardOverlayHtml.js.map +1 -1
  78. package/lib/components/screens/intro/components/ArchetypeDisplayOverlayHtml.js.map +1 -1
  79. package/lib/components/screens/intro/components/EnhancedArchetypeDisplayOverlayHtml.js.map +1 -1
  80. package/lib/components/screens/intro/components/MenuButtonsOverlayHtml.js.map +1 -1
  81. package/lib/components/screens/intro/components/MenuSectionOverlayHtml.js.map +1 -1
  82. package/lib/components/screens/intro/components/StatBarOverlayHtml.js.map +1 -1
  83. package/lib/components/screens/philosophy/PhilosophyScreen3D.js.map +1 -1
  84. package/lib/components/screens/training/TrainingScreen3D.js.map +1 -1
  85. package/lib/components/screens/training/components/AnatomyControlsOverlayHtml.js.map +1 -1
  86. package/lib/components/screens/training/components/AnatomyOverlay3D.js.map +1 -1
  87. package/lib/components/screens/training/components/FootPlacementMarkers3D.js.map +1 -1
  88. package/lib/components/screens/training/components/FootworkDrillsOverlayHtml.js.map +1 -1
  89. package/lib/components/screens/training/components/HitFeedbackEffect3D.js.map +1 -1
  90. package/lib/components/screens/training/components/TrainingButtonsOverlayHtml.js.map +1 -1
  91. package/lib/components/screens/training/components/TrainingControlsOverlayHtml.js.map +1 -1
  92. package/lib/components/screens/training/components/TrainingDummy3D.js.map +1 -1
  93. package/lib/components/screens/training/components/TrainingFeedbackOverlayHtml.js.map +1 -1
  94. package/lib/components/screens/training/components/TrainingModeSelectorOverlayHtml.js.map +1 -1
  95. package/lib/components/screens/training/components/TrainingStatsOverlayHtml.js.map +1 -1
  96. package/lib/components/screens/training/components/VitalPointMarker3D.js.map +1 -1
  97. package/lib/components/screens/training/components/VitalPointTrainingOverlayHtml.js.map +1 -1
  98. package/lib/components/screens/training/components/hud/TrainingBottomHUD.js.map +1 -1
  99. package/lib/components/screens/training/components/hud/TrainingLeftHUD.js.map +1 -1
  100. package/lib/components/screens/training/components/hud/TrainingRightHUD.js.map +1 -1
  101. package/lib/components/screens/training/components/hud/TrainingTopHUD.js.map +1 -1
  102. package/lib/components/screens/training/hooks/useAttackMovement.js.map +1 -1
  103. package/lib/components/screens/training/hooks/useTrainingActions.js.map +1 -1
  104. package/lib/components/screens/training/hooks/useTrainingLayout.js.map +1 -1
  105. package/lib/components/screens/training/hooks/useTrainingState.js.map +1 -1
  106. package/lib/components/shared/base/BaseButton.js.map +1 -1
  107. package/lib/components/shared/base/BaseButtonOverlayHtml.js.map +1 -1
  108. package/lib/components/shared/base/BasePanel.js.map +1 -1
  109. package/lib/components/shared/base/BaseText.js.map +1 -1
  110. package/lib/components/shared/base/useKoreanTheme.js.map +1 -1
  111. package/lib/components/shared/debug/PerformanceDebugOverlayHtml.js.map +1 -1
  112. package/lib/components/shared/mobile/ActionButtons.js.map +1 -1
  113. package/lib/components/shared/mobile/GestureRecognizerPure.js.map +1 -1
  114. package/lib/components/shared/mobile/HapticController.js.map +1 -1
  115. package/lib/components/shared/mobile/MobileControlsPure.js.map +1 -1
  116. package/lib/components/shared/mobile/StanceWheelPure.js.map +1 -1
  117. package/lib/components/shared/mobile/TouchOptimizer.js.map +1 -1
  118. package/lib/components/shared/mobile/VirtualDPad.js.map +1 -1
  119. package/lib/components/shared/three/anatomy/BodySurface.js.map +1 -1
  120. package/lib/components/shared/three/anatomy/BoneAttachedMuscles.js.map +1 -1
  121. package/lib/components/shared/three/anatomy/BoneClothing.js.map +1 -1
  122. package/lib/components/shared/three/anatomy/BoneRenderer.js.map +1 -1
  123. package/lib/components/shared/three/anatomy/Face3D.js.map +1 -1
  124. package/lib/components/shared/three/anatomy/Foot3D.js.map +1 -1
  125. package/lib/components/shared/three/anatomy/Hand3D.js.map +1 -1
  126. package/lib/components/shared/three/effects/ActionFeedback.js.map +1 -1
  127. package/lib/components/shared/three/effects/DamageNumbers.js.map +1 -1
  128. package/lib/components/shared/three/effects/HitEffects3D.js.map +1 -1
  129. package/lib/components/shared/three/effects/PlayerStateIndicators.js.map +1 -1
  130. package/lib/components/shared/three/effects/StanceSymbol3D.js.map +1 -1
  131. package/lib/components/shared/three/effects/StanceTransitionEffect.js.map +1 -1
  132. package/lib/components/shared/three/effects/VitalPointMarkers3D.js.map +1 -1
  133. package/lib/components/shared/three/indicators/ElementalColorSystem.js.map +1 -1
  134. package/lib/components/shared/three/indicators/GuardIndicator.js.map +1 -1
  135. package/lib/components/shared/three/indicators/HapticFeedback.js.map +1 -1
  136. package/lib/components/shared/three/indicators/StanceChangeIndicator.js.map +1 -1
  137. package/lib/components/shared/three/models/Player3DWithTransitions.js.map +1 -1
  138. package/lib/components/shared/three/models/SkeletalPlayer3D.js.map +1 -1
  139. package/lib/components/shared/three/optimization/AdaptiveQuality.js.map +1 -1
  140. package/lib/components/shared/three/scene/AtmosphericParticles3D.js.map +1 -1
  141. package/lib/components/shared/three/scene/BackgroundScene3D.js.map +1 -1
  142. package/lib/components/shared/three/scene/CombatArena3D.js.map +1 -1
  143. package/lib/components/shared/three/scene/KoreanSignage3D.js.map +1 -1
  144. package/lib/components/shared/three/ui/ArchetypeCard.js.map +1 -1
  145. package/lib/components/shared/three/ui/BodyPartHealthDisplay.js.map +1 -1
  146. package/lib/components/shared/three/ui/BreathingIndicator2.js.map +1 -1
  147. package/lib/components/shared/three/ui/CombatReadinessBar.js.map +1 -1
  148. package/lib/components/shared/three/ui/ComboCounter.js.map +1 -1
  149. package/lib/components/shared/three/ui/HealthBar.js.map +1 -1
  150. package/lib/components/shared/three/ui/KoreanButton.js.map +1 -1
  151. package/lib/components/shared/three/ui/KoreanPanel.js.map +1 -1
  152. package/lib/components/shared/three/ui/KoreanText.js.map +1 -1
  153. package/lib/components/shared/three/ui/MenuList.js.map +1 -1
  154. package/lib/components/shared/three/ui/PlayerHUD.js.map +1 -1
  155. package/lib/components/shared/three/ui/ProgressBar.js.map +1 -1
  156. package/lib/components/shared/three/ui/SpeedIndicatorHUD.js.map +1 -1
  157. package/lib/components/shared/three/ui/StaminaBar.js.map +1 -1
  158. package/lib/components/shared/three/ui/TechniqueBar.js.map +1 -1
  159. package/lib/components/shared/three/ui/TechniqueCard.js.map +1 -1
  160. package/lib/components/shared/three/ui/VitalPointOverlayControlsHtml.js.map +1 -1
  161. package/lib/components/shared/ui/BackButton.js.map +1 -1
  162. package/lib/components/shared/ui/BaseHUDContainer.js.map +1 -1
  163. package/lib/components/shared/ui/CombatTimer.js.map +1 -1
  164. package/lib/components/shared/ui/ErrorModal.js.map +1 -1
  165. package/lib/components/shared/ui/LoadingState.js.map +1 -1
  166. package/lib/components/shared/ui/SplashScreen.js +2 -2
  167. package/lib/components/shared/ui/SplashScreen.js.map +1 -1
  168. package/lib/components/shared/ui/VitalPointOverlayControlsPure.js.map +1 -1
  169. package/lib/components/shared/ui/VolumeControl.js.map +1 -1
  170. package/lib/components/shared/ui/shared/ConfirmDialog.js.map +1 -1
  171. package/lib/components/ui/combat/BalanceIndicatorOverlayHtml.js.map +1 -1
  172. package/lib/constants/bodyDimensions.js.map +1 -1
  173. package/lib/constants/bodyRenderingConstants.js.map +1 -1
  174. package/lib/data/archetypeClothing.js.map +1 -1
  175. package/lib/data/archetypePhysicalAttributes.js.map +1 -1
  176. package/lib/data/techniqueMappings.js.map +1 -1
  177. package/lib/data/techniques.js.map +1 -1
  178. package/lib/hooks/useActionFeedback.js.map +1 -1
  179. package/lib/hooks/useBalanceAnimations.js.map +1 -1
  180. package/lib/hooks/useCombatTimer.js.map +1 -1
  181. package/lib/hooks/useDebounce.js.map +1 -1
  182. package/lib/hooks/useHUDLayout.js.map +1 -1
  183. package/lib/hooks/useHandPoseTransitions.js.map +1 -1
  184. package/lib/hooks/useKeyboardControls.js.map +1 -1
  185. package/lib/hooks/useMatchCountdown.js.map +1 -1
  186. package/lib/hooks/useMuscleActivation.js.map +1 -1
  187. package/lib/hooks/usePauseMenu.js.map +1 -1
  188. package/lib/hooks/usePlayerAnimation.js.map +1 -1
  189. package/lib/hooks/useResponsiveLayout.js.map +1 -1
  190. package/lib/hooks/useRoundTransition.js.map +1 -1
  191. package/lib/hooks/useSkeletalAnimation.js.map +1 -1
  192. package/lib/hooks/useTechniqueSelection.js.map +1 -1
  193. package/lib/hooks/useThrottle.js.map +1 -1
  194. package/lib/hooks/useTouchControls.js.map +1 -1
  195. package/lib/hooks/useWebGLContextLossHandler.js.map +1 -1
  196. package/lib/hooks/useWindowSize.js.map +1 -1
  197. package/lib/systems/CombatSystem.js.map +1 -1
  198. package/lib/systems/EffectCalculator.js.map +1 -1
  199. package/lib/systems/LayoutSystem.js.map +1 -1
  200. package/lib/systems/PlayerEffectManager.js.map +1 -1
  201. package/lib/systems/ResponsiveScaling.js.map +1 -1
  202. package/lib/systems/TrigramSystem.js.map +1 -1
  203. package/lib/systems/VitalPointSystem.js.map +1 -1
  204. package/lib/systems/ai/AIPersonality.js.map +1 -1
  205. package/lib/systems/ai/AdaptiveDifficulty.js.map +1 -1
  206. package/lib/systems/ai/ArchetypeEnforcer.js.map +1 -1
  207. package/lib/systems/ai/ComboSystem.js.map +1 -1
  208. package/lib/systems/ai/DecisionTree.js.map +1 -1
  209. package/lib/systems/ai/TrainingAI.js.map +1 -1
  210. package/lib/systems/ai/types.js.map +1 -1
  211. package/lib/systems/animation/builders/AnimationBuilder.js.map +1 -1
  212. package/lib/systems/animation/builders/HandPoseApplicator.js.map +1 -1
  213. package/lib/systems/animation/builders/HandPoses.js.map +1 -1
  214. package/lib/systems/animation/builders/KeyframeConfig.js.map +1 -1
  215. package/lib/systems/animation/builders/KeyframeInterpolation.js +3 -90
  216. package/lib/systems/animation/builders/KeyframeInterpolation.js.map +1 -1
  217. package/lib/systems/animation/builders/KickPhaseApplicator.js.map +1 -1
  218. package/lib/systems/animation/builders/KoreanGuardPositions.js.map +1 -1
  219. package/lib/systems/animation/builders/MartialArtsAnimationBuilder.js.map +1 -1
  220. package/lib/systems/animation/builders/MartialArtsConstants.js.map +1 -1
  221. package/lib/systems/animation/builders/MartialPoseApplicator.js.map +1 -1
  222. package/lib/systems/animation/builders/PunchPhaseApplicator.js.map +1 -1
  223. package/lib/systems/animation/builders/SkeletonRig.js.map +1 -1
  224. package/lib/systems/animation/builders/TrigramGuardApplicator.js.map +1 -1
  225. package/lib/systems/animation/catalogs/DefensiveAnimations.js.map +1 -1
  226. package/lib/systems/animation/catalogs/FootworkSkeletalAnimations.js.map +1 -1
  227. package/lib/systems/animation/catalogs/RecoveryAnimations.js.map +1 -1
  228. package/lib/systems/animation/catalogs/StanceAnimations.js.map +1 -1
  229. package/lib/systems/animation/catalogs/StanceAttackAnimations.js.map +1 -1
  230. package/lib/systems/animation/catalogs/StanceGuardPoses.js.map +1 -1
  231. package/lib/systems/animation/catalogs/StanceIdleAnimations.js.map +1 -1
  232. package/lib/systems/animation/catalogs/StanceLocomotionAnimations.js.map +1 -1
  233. package/lib/systems/animation/catalogs/StepSkeletalAnimations.js.map +1 -1
  234. package/lib/systems/animation/core/AnimationHitTiming.js.map +1 -1
  235. package/lib/systems/animation/core/AnimationOptimizations.js.map +1 -1
  236. package/lib/systems/animation/core/AnimationPriority.js.map +1 -1
  237. package/lib/systems/animation/core/AnimationRegistry.js.map +1 -1
  238. package/lib/systems/animation/core/AnimationStateMachine.js.map +1 -1
  239. package/lib/systems/animation/core/AnimationTransitions.js.map +1 -1
  240. package/lib/systems/animation/core/LateralityTransform.js.map +1 -1
  241. package/lib/systems/animation/core/RecoveryPhaseEnhancer.js.map +1 -1
  242. package/lib/systems/animation/core/TechniqueAnimationMapper.js.map +1 -1
  243. package/lib/systems/animation/core/TechniqueAnimationMapping.js.map +1 -1
  244. package/lib/systems/animation/core/types.js.map +1 -1
  245. package/lib/systems/animation/systems/AdvancedJointMovements.js.map +1 -1
  246. package/lib/systems/animation/systems/BodyFacingSystem.js.map +1 -1
  247. package/lib/systems/animation/systems/FacialExpressions.js.map +1 -1
  248. package/lib/systems/animation/systems/FallAnimations.js.map +1 -1
  249. package/lib/systems/animation/systems/MuscleActivation.js.map +1 -1
  250. package/lib/systems/bodypart/BodyPartDamageIntegration.js.map +1 -1
  251. package/lib/systems/bodypart/BodyPartHealthSystem.js.map +1 -1
  252. package/lib/systems/bodypart/BodyPartPositionMapping.js.map +1 -1
  253. package/lib/systems/bodypart/CombatInjuryIntegration.js.map +1 -1
  254. package/lib/systems/bodypart/InjuryIntegration.js.map +1 -1
  255. package/lib/systems/bodypart/InjuryTracker.js.map +1 -1
  256. package/lib/systems/bodypart/MovementPenaltySystem.js.map +1 -1
  257. package/lib/systems/bodypart/PlayerInjuryTrackingManager.js.map +1 -1
  258. package/lib/systems/bodypart/types.js.map +1 -1
  259. package/lib/systems/breathing/BreathingDisruptionSystem.js.map +1 -1
  260. package/lib/systems/breathing/feedback.js.map +1 -1
  261. package/lib/systems/breathing/integration.js.map +1 -1
  262. package/lib/systems/combat/BalanceSystem.js.map +1 -1
  263. package/lib/systems/combat/BreakingStatusEffects.js.map +1 -1
  264. package/lib/systems/combat/CombatStateSystem.js.map +1 -1
  265. package/lib/systems/combat/ConsciousnessSystem.js.map +1 -1
  266. package/lib/systems/combat/FallIntegration.js.map +1 -1
  267. package/lib/systems/combat/GrappleSystem.js.map +1 -1
  268. package/lib/systems/combat/LimbExposureSystem.js.map +1 -1
  269. package/lib/systems/combat/PainResponseSystem.js.map +1 -1
  270. package/lib/systems/combat/TrainingCombatSystem.js.map +1 -1
  271. package/lib/systems/combat/painConsciousnessUtils.js.map +1 -1
  272. package/lib/systems/combat/typeGuards.js.map +1 -1
  273. package/lib/systems/effects.js.map +1 -1
  274. package/lib/systems/game.js.map +1 -1
  275. package/lib/systems/movement/InjuryMovementModifier.js.map +1 -1
  276. package/lib/systems/movement/helpers/AccelerationUpdater.js.map +1 -1
  277. package/lib/systems/movement/helpers/accelerationUtils.js.map +1 -1
  278. package/lib/systems/movement/integration.js.map +1 -1
  279. package/lib/systems/physics/AttackMovementPhysics.js.map +1 -1
  280. package/lib/systems/physics/CollisionDetection.js.map +1 -1
  281. package/lib/systems/physics/CoordinateMapper.js.map +1 -1
  282. package/lib/systems/physics/KnockbackPhysics.js.map +1 -1
  283. package/lib/systems/physics/MovementPhysics.js.map +1 -1
  284. package/lib/systems/physics/PhysicalReachCalculator.js.map +1 -1
  285. package/lib/systems/physics/SpeedModifierSystem.js.map +1 -1
  286. package/lib/systems/trigram/KoreanCulture.js.map +1 -1
  287. package/lib/systems/trigram/KoreanTechniques.js.map +1 -1
  288. package/lib/systems/trigram/StanceManager.js.map +1 -1
  289. package/lib/systems/trigram/TransitionCalculator.js.map +1 -1
  290. package/lib/systems/trigram/TrigramCalculator.js.map +1 -1
  291. package/lib/systems/trigram/techniques/DarkOpsTechniques.js.map +1 -1
  292. package/lib/systems/trigram/techniques/GamTechniques.js.map +1 -1
  293. package/lib/systems/trigram/techniques/GanTechniques.js.map +1 -1
  294. package/lib/systems/trigram/techniques/GonTechniques.js.map +1 -1
  295. package/lib/systems/trigram/techniques/SonTechniques.js.map +1 -1
  296. package/lib/systems/trigram/techniques/TechniqueConfig.js.map +1 -1
  297. package/lib/systems/trigram/techniques/index.js.map +1 -1
  298. package/lib/systems/trigram/types/GonTechniqueExtensions.js.map +1 -1
  299. package/lib/systems/trigram/types.js.map +1 -1
  300. package/lib/systems/types.js.map +1 -1
  301. package/lib/systems/vitalpoint/DamageCalculator.js.map +1 -1
  302. package/lib/systems/vitalpoint/HitDetection.js.map +1 -1
  303. package/lib/systems/vitalpoint/KoreanAnatomy.js.map +1 -1
  304. package/lib/systems/vitalpoint/KoreanVitalPoints.js.map +1 -1
  305. package/lib/systems/vitalpoint/MeridianVitalPointMapping.js.map +1 -1
  306. package/lib/types/AccessibilityTypes.js.map +1 -1
  307. package/lib/types/PhysicsTypes.js.map +1 -1
  308. package/lib/types/common.js.map +1 -1
  309. package/lib/types/constants/colors.js.map +1 -1
  310. package/lib/types/constants/designSystem.js.map +1 -1
  311. package/lib/types/constants/layout.js.map +1 -1
  312. package/lib/types/constants/performance.js.map +1 -1
  313. package/lib/types/constants/typography.js.map +1 -1
  314. package/lib/types/facial.js.map +1 -1
  315. package/lib/types/hand-animation.js.map +1 -1
  316. package/lib/types/injury.js.map +1 -1
  317. package/lib/types/physics.js.map +1 -1
  318. package/lib/types/skeletal.js.map +1 -1
  319. package/lib/types/techniqueId.js.map +1 -1
  320. package/lib/utils/accessibility.js.map +1 -1
  321. package/lib/utils/arenaWorldDimensions.js.map +1 -1
  322. package/lib/utils/assetConfig.js.map +1 -1
  323. package/lib/utils/characterScaling.js.map +1 -1
  324. package/lib/utils/colorHelpers.js.map +1 -1
  325. package/lib/utils/colorUtils.js.map +1 -1
  326. package/lib/utils/combatReadiness.js.map +1 -1
  327. package/lib/utils/controlMapping.js.map +1 -1
  328. package/lib/utils/deviceDetection.js.map +1 -1
  329. package/lib/utils/effectUtils.js.map +1 -1
  330. package/lib/utils/fabricTextures.js.map +1 -1
  331. package/lib/utils/hapticFeedback.js.map +1 -1
  332. package/lib/utils/haptics.js.map +1 -1
  333. package/lib/utils/htmlOverlayHelpers.js.map +1 -1
  334. package/lib/utils/inputSystem.js.map +1 -1
  335. package/lib/utils/koreanThemeHelpers.js.map +1 -1
  336. package/lib/utils/math.js.map +1 -1
  337. package/lib/utils/mobileLayoutHelpers.js.map +1 -1
  338. package/lib/utils/mobileUIUtils.js.map +1 -1
  339. package/lib/utils/performance/PerformanceMonitor.js.map +1 -1
  340. package/lib/utils/performance/PerformanceOverlay3D.js.map +1 -1
  341. package/lib/utils/performance/usePerformanceMonitor.js.map +1 -1
  342. package/lib/utils/performanceOptimization.js.map +1 -1
  343. package/lib/utils/player3DHelpers.js.map +1 -1
  344. package/lib/utils/playerUtils.js.map +1 -1
  345. package/lib/utils/responsiveLayout.js.map +1 -1
  346. package/lib/utils/responsiveLayoutHelpers.js.map +1 -1
  347. package/lib/utils/responsiveOrientationConstants.js.map +1 -1
  348. package/lib/utils/safeAreaUtils.js.map +1 -1
  349. package/lib/utils/sharedPhysicsConfig.js.map +1 -1
  350. package/lib/utils/skeletonScaling.js.map +1 -1
  351. package/lib/utils/stanceHelpers.js.map +1 -1
  352. package/lib/utils/threeObjectPool.js.map +1 -1
  353. package/lib/utils/visualEffects.js.map +1 -1
  354. package/package.json +5 -5
@@ -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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"}
@@ -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,OAAO,CACvD,WAAW,IAAK,MAAM,CACtB,QAAQ,CACR,YAAY,KAAM,WAAW,CAC7B,YAAY,IAAK,SAAS,CAC1B,QAAQ,KAAM,UAAU,CACxB,OAAO;;;;;;;;;;;;;;;;;;AAmBZ,IAAa,sBACX,4BAA4B,OAAO,aAAa,OAAO,CACpD,WAAW,IAAK,MAAM,CACtB,QAAQ,CACR,aAAa,KAAM,WAAW,CAC9B,aAAa,IAAK,SAAS,CAC3B,QAAQ,KAAM,UAAU,CACxB,OAAO;;;;;;;;;;;;;;;;;;AAmBZ,IAAa,sBACX,4BAA4B,OAAO,aAAa,OAAO,CACpD,WAAW,IAAK,MAAM,CACtB,QAAQ,CACR,aAAa,KAAM,WAAW,CAC9B,aAAa,IAAK,SAAS,CAC3B,QAAQ,KAAM,UAAU,CACxB,OAAO;;;;;;;;;;;;;AAcZ,IAAa,uBACX,4BAA4B,OAAO,cAAc,OAAO,CACrD,WAAW,IAAK,MAAM,CACtB,QAAQ,CACR,cAAc,KAAM,WAAW,CAC/B,cAAc,IAAK,SAAS,CAC5B,QAAQ,KAAM,UAAU,CACxB,OAAO;;;;;;;;AASZ,IAAa,kBAAkB,IAAI,IAA+B;CAChE,CAAC,gBAAgB,uBAAuB;CACxC,CAAC,aAAa,oBAAoB;CAClC,CAAC,aAAa,oBAAoB;CAClC,CAAC,cAAc,qBAAqB;CACrC,CAAC;;;;;;;;;;;AAYF,SAAgB,iBACd,eAC+B;AAC/B,QAAO,gBAAgB,IAAI,cAAc"}
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,OAAO,CACvD,WAAW,IAAK,MAAM,CACtB,QAAQ,CACR,YAAY,KAAM,WAAW,CAC7B,YAAY,IAAK,SAAS,CAC1B,QAAQ,KAAM,UAAU,CACxB,OAAO;;;;;;;;;;;;;;;;;;AAmBZ,IAAa,sBACX,4BAA4B,OAAO,aAAa,OAAO,CACpD,WAAW,IAAK,MAAM,CACtB,QAAQ,CACR,aAAa,KAAM,WAAW,CAC9B,aAAa,IAAK,SAAS,CAC3B,QAAQ,KAAM,UAAU,CACxB,OAAO;;;;;;;;;;;;;;;;;;AAmBZ,IAAa,sBACX,4BAA4B,OAAO,aAAa,OAAO,CACpD,WAAW,IAAK,MAAM,CACtB,QAAQ,CACR,aAAa,KAAM,WAAW,CAC9B,aAAa,IAAK,SAAS,CAC3B,QAAQ,KAAM,UAAU,CACxB,OAAO;;;;;;;;;;;;;AAcZ,IAAa,uBACX,4BAA4B,OAAO,cAAc,OAAO,CACrD,WAAW,IAAK,MAAM,CACtB,QAAQ,CACR,cAAc,KAAM,WAAW,CAC/B,cAAc,IAAK,SAAS,CAC5B,QAAQ,KAAM,UAAU,CACxB,OAAO;;;;;;;;AASZ,IAAa,kBAAkB,IAAI,IAA+B;CAChE,CAAC,gBAAgB,uBAAuB;CACxC,CAAC,aAAa,oBAAoB;CAClC,CAAC,aAAa,oBAAoB;CAClC,CAAC,cAAc,qBAAqB;CACrC,CAAC;;;;;;;;;;;AAYF,SAAgB,iBACd,eAC+B;CAC/B,OAAO,gBAAgB,IAAI,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"AnimationHitTiming.js","names":[],"sources":["../../../../src/systems/animation/core/AnimationHitTiming.ts"],"sourcesContent":["/**\n * Animation Hit Timing System\n *\n * **Korean**: 애니메이션 타격 타이밍\n *\n * Defines when visual contact occurs in animations for reality-based hit detection.\n * Hits should only register when the animation visually shows limb contact with target.\n *\n * ## Philosophy\n *\n * Black Trigram emphasizes visual authenticity in combat. Hit detection must align\n * with what the player sees on screen. This system defines the exact frames/timing\n * when each technique's strike phase visually connects.\n *\n * ## Phases\n *\n * Korean martial arts techniques have distinct phases:\n * - **준비 (Chamber)**: Wind-up, no contact possible\n * - **실행 (Extension)**: Strike extending, contact window opens\n * - **정점 (Peak)**: Maximum extension, highest contact probability\n * - **회수 (Retraction)**: Pulling back, contact window closes\n * - **복귀 (Recovery)**: Return to stance, no contact\n *\n * @module systems/animation/AnimationHitTiming\n * @category Animation System\n * @korean 애니메이션타격타이밍\n */\n\nimport { AnimationType } from \"../builders/MartialArtsAnimationBuilder\";\n\n/**\n * Hit window timing for a technique animation.\n *\n * **Korean**: 타격 창 타이밍\n *\n * Defines when during an animation the technique can actually make contact.\n * Based on visual reach during the extension phase.\n *\n * @example\n * ```typescript\n * const jabTiming: AnimationHitWindow = {\n * startTime: 0.10, // Hit window opens at 100ms (after chamber)\n * peakTime: 0.15, // Peak extension at 150ms\n * endTime: 0.20, // Hit window closes at 200ms (before retraction)\n * maxReachMultiplier: 1.0, // 100% of limb length at peak\n * };\n * ```\n *\n * @public\n * @korean 타격창타이밍\n */\nexport interface AnimationHitWindow {\n /**\n * Time when hit window opens (seconds).\n * Start of extension phase where limb begins moving toward target.\n * @korean 시작시간\n */\n readonly startTime: number;\n\n /**\n * Time of maximum extension (seconds).\n * Peak of strike where reach is maximum and damage is highest.\n * @korean 정점시간\n */\n readonly peakTime: number;\n\n /**\n * Time when hit window closes (seconds).\n * End of extension phase where limb begins retracting.\n * @korean 종료시간\n */\n readonly endTime: number;\n\n /**\n * Reach multiplier at peak extension (0.0 - 1.5).\n * - 1.0 = full limb extension (standard strikes)\n * - 0.7 = partial extension (close-range techniques)\n * - 1.2+ = overextended (special techniques, jumping kicks)\n * @korean 최대도달배수\n */\n readonly maxReachMultiplier: number;\n\n /**\n * Optional reach curve during hit window.\n * If not provided, assumes linear interpolation from 0 to maxReachMultiplier.\n * @korean 도달곡선\n */\n readonly reachCurve?: (normalizedTime: number) => number;\n}\n\n/**\n * Complete hit timing configuration for a technique.\n *\n * **Korean**: 기술 타격 타이밍 설정\n *\n * @public\n * @korean 기술타격타이밍\n */\nexport interface TechniqueHitTiming {\n /**\n * Animation type this timing applies to.\n * @korean 애니메이션타입\n */\n readonly animationType: AnimationType;\n\n /**\n * Hit window configuration.\n * @korean 타격창\n */\n readonly hitWindow: AnimationHitWindow;\n\n /**\n * Whether this technique requires precise timing (true) or has a wider window (false).\n * Affects forgiveness in hit detection.\n * @korean 정밀타이밍필요\n */\n readonly requiresPreciseTiming: boolean;\n}\n\n/**\n * Hit timing database for animation types.\n *\n * **Korean**: 애니메이션 타격 타이밍 데이터베이스\n *\n * Based on TECHNIQUE_TIMING constants from MartialArtsAnimationBuilder.\n * Only includes timing for techniques with actual hit windows.\n * Movement and non-combat animations can query this and will get undefined.\n *\n * @public\n * @korean 애니메이션타격타이밍데이터베이스\n */\nexport const ANIMATION_HIT_TIMING: Partial<\n Record<AnimationType, TechniqueHitTiming>\n> = {\n // ═══════════════════════════════════════════════════════════════════════\n // PUNCH TECHNIQUES (주먹 기술)\n // ═══════════════════════════════════════════════════════════════════════\n\n [AnimationType.JAB]: {\n animationType: AnimationType.JAB,\n hitWindow: {\n startTime: 0.1, // Chamber: 100ms, Extension starts\n peakTime: 0.15, // Peak at 150ms (midpoint of 150ms extension)\n endTime: 0.25, // Retraction starts at 250ms\n maxReachMultiplier: 0.95, // Jabs don't fully extend (speed > reach)\n },\n requiresPreciseTiming: false, // Fast technique with forgiving window\n },\n\n [AnimationType.CROSS]: {\n animationType: AnimationType.CROSS,\n hitWindow: {\n startTime: 0.15, // Longer chamber for power\n peakTime: 0.25, // Peak at 250ms\n endTime: 0.35, // Window closes at 350ms\n maxReachMultiplier: 1.0, // Full extension for power\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.HOOK]: {\n animationType: AnimationType.HOOK,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 0.85, // Hooks are shorter range (arc motion)\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.UPPERCUT]: {\n animationType: AnimationType.UPPERCUT,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 0.7, // Close-range technique\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.OVERHAND]: {\n animationType: AnimationType.OVERHAND,\n hitWindow: {\n startTime: 0.2,\n peakTime: 0.3,\n endTime: 0.42,\n maxReachMultiplier: 1.1, // Longer reach from arc\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.BACKFIST]: {\n animationType: AnimationType.BACKFIST,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.18,\n endTime: 0.27,\n maxReachMultiplier: 0.9, // Snapping technique\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.HAMMER_FIST]: {\n animationType: AnimationType.HAMMER_FIST,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 0.85,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.PALM_STRIKE]: {\n animationType: AnimationType.PALM_STRIKE,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 1.0,\n },\n requiresPreciseTiming: false,\n },\n\n // ═══ Specialized Punch Variants ═══\n\n [AnimationType.SPEAR_HAND_STRIKE]: {\n animationType: AnimationType.SPEAR_HAND_STRIKE,\n hitWindow: {\n startTime: 0.08,\n peakTime: 0.13,\n endTime: 0.2,\n maxReachMultiplier: 1.05, // Extended fingers add reach\n },\n requiresPreciseTiming: true, // Precise targeting required\n },\n\n [AnimationType.NERVE_STRIKE]: {\n animationType: AnimationType.NERVE_STRIKE,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.15,\n endTime: 0.22,\n maxReachMultiplier: 0.9,\n },\n requiresPreciseTiming: true, // Must hit exact nerve point\n },\n\n [AnimationType.PRESSURE_POINT_STRIKE]: {\n animationType: AnimationType.PRESSURE_POINT_STRIKE,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.32,\n maxReachMultiplier: 0.85,\n },\n requiresPreciseTiming: true, // Precise pressure point targeting\n },\n\n [AnimationType.LIGHTNING_STRIKE]: {\n animationType: AnimationType.LIGHTNING_STRIKE,\n hitWindow: {\n startTime: 0.06,\n peakTime: 0.1,\n endTime: 0.15,\n maxReachMultiplier: 0.95,\n },\n requiresPreciseTiming: true, // Very fast, small window\n },\n\n [AnimationType.RAPID_BARRAGE]: {\n animationType: AnimationType.RAPID_BARRAGE,\n hitWindow: {\n startTime: 0.05,\n peakTime: 0.12,\n endTime: 0.2,\n maxReachMultiplier: 0.85, // Multiple hits, shorter reach each\n },\n requiresPreciseTiming: false, // Volume of strikes compensates\n },\n\n [AnimationType.RHYTHMIC_STRIKES]: {\n animationType: AnimationType.RHYTHMIC_STRIKES,\n hitWindow: {\n startTime: 0.08,\n peakTime: 0.15,\n endTime: 0.25,\n maxReachMultiplier: 0.9,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.NERVE_PARALYSIS]: {\n animationType: AnimationType.NERVE_PARALYSIS,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.2,\n endTime: 0.28,\n maxReachMultiplier: 0.85,\n },\n requiresPreciseTiming: true,\n },\n\n [AnimationType.THROAT_STRIKE]: {\n animationType: AnimationType.THROAT_STRIKE,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.15,\n endTime: 0.22,\n maxReachMultiplier: 0.95,\n },\n requiresPreciseTiming: true, // Must hit throat precisely\n },\n\n [AnimationType.EYE_GOUGE]: {\n animationType: AnimationType.EYE_GOUGE,\n hitWindow: {\n startTime: 0.08,\n peakTime: 0.12,\n endTime: 0.18,\n maxReachMultiplier: 0.8, // Very close range\n },\n requiresPreciseTiming: true, // Extremely precise target\n },\n\n [AnimationType.HEAVEN_STRIKE]: {\n animationType: AnimationType.HEAVEN_STRIKE,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 1.1, // Powerful extension\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.FLOWING_CROSS]: {\n animationType: AnimationType.FLOWING_CROSS,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.22,\n endTime: 0.32,\n maxReachMultiplier: 1.0,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SOLAR_PLEXUS_STRIKE]: {\n animationType: AnimationType.SOLAR_PLEXUS_STRIKE,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.2,\n endTime: 0.28,\n maxReachMultiplier: 0.95,\n },\n requiresPreciseTiming: true, // Must hit solar plexus\n },\n\n [AnimationType.FLOWING_PUSH]: {\n animationType: AnimationType.FLOWING_PUSH,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.2,\n endTime: 0.3,\n maxReachMultiplier: 1.0,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.LIVER_DISRUPTION]: {\n animationType: AnimationType.LIVER_DISRUPTION,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.33,\n maxReachMultiplier: 0.9,\n },\n requiresPreciseTiming: true, // Must hit liver\n },\n\n [AnimationType.EAR_STRIKE]: {\n animationType: AnimationType.EAR_STRIKE,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.16,\n endTime: 0.24,\n maxReachMultiplier: 0.85,\n },\n requiresPreciseTiming: true, // Must hit ear precisely\n },\n\n // ═══════════════════════════════════════════════════════════════════════\n // KICK TECHNIQUES (발차기 기술)\n // ═══════════════════════════════════════════════════════════════════════\n\n [AnimationType.FRONT_KICK]: {\n animationType: AnimationType.FRONT_KICK,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.27,\n endTime: 0.4,\n maxReachMultiplier: 1.0, // Full leg extension\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.ROUNDHOUSE_KICK]: {\n animationType: AnimationType.ROUNDHOUSE_KICK,\n hitWindow: {\n startTime: 0.2,\n peakTime: 0.32,\n endTime: 0.48,\n maxReachMultiplier: 1.05, // Slight overextension at peak\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SIDE_KICK]: {\n animationType: AnimationType.SIDE_KICK,\n hitWindow: {\n startTime: 0.2,\n peakTime: 0.35,\n endTime: 0.5,\n maxReachMultiplier: 1.1, // Maximum reach technique\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.BACK_KICK]: {\n animationType: AnimationType.BACK_KICK,\n hitWindow: {\n startTime: 0.25,\n peakTime: 0.4,\n endTime: 0.55,\n maxReachMultiplier: 1.15, // Powerful extension backward\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.AXE_KICK]: {\n animationType: AnimationType.AXE_KICK,\n hitWindow: {\n startTime: 0.25,\n peakTime: 0.45,\n endTime: 0.65,\n maxReachMultiplier: 1.2, // High vertical reach\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.CRESCENT_KICK]: {\n animationType: AnimationType.CRESCENT_KICK,\n hitWindow: {\n startTime: 0.18,\n peakTime: 0.32,\n endTime: 0.48,\n maxReachMultiplier: 1.0,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.LOW_KICK]: {\n animationType: AnimationType.LOW_KICK,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.22,\n endTime: 0.35,\n maxReachMultiplier: 0.95, // Lower target, less extension\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.PUSH_KICK]: {\n animationType: AnimationType.PUSH_KICK,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.22,\n endTime: 0.35,\n maxReachMultiplier: 1.0,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.JUMPING_KICK]: {\n animationType: AnimationType.JUMPING_KICK,\n hitWindow: {\n startTime: 0.3,\n peakTime: 0.45,\n endTime: 0.6,\n maxReachMultiplier: 1.3, // Airborne extension\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SPINNING_HEEL_KICK]: {\n animationType: AnimationType.SPINNING_HEEL_KICK,\n hitWindow: {\n startTime: 0.4,\n peakTime: 0.6,\n endTime: 0.8,\n maxReachMultiplier: 1.15, // Spinning adds reach\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.TORNADO_KICK]: {\n animationType: AnimationType.TORNADO_KICK,\n hitWindow: {\n startTime: 0.45,\n peakTime: 0.65,\n endTime: 0.85,\n maxReachMultiplier: 1.25, // Jumping + spinning\n },\n requiresPreciseTiming: false,\n },\n\n // ═══════════════════════════════════════════════════════════════════════\n // ELBOW & KNEE TECHNIQUES (팔꿈치 & 무릎 기술)\n // ═══════════════════════════════════════════════════════════════════════\n\n [AnimationType.ELBOW_STRIKE]: {\n animationType: AnimationType.ELBOW_STRIKE,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.18,\n endTime: 0.28,\n maxReachMultiplier: 0.5, // Very close range\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.ELBOW_UPPERCUT]: {\n animationType: AnimationType.ELBOW_UPPERCUT,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.22,\n endTime: 0.32,\n maxReachMultiplier: 0.45, // Close range upward\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SPINNING_ELBOW]: {\n animationType: AnimationType.SPINNING_ELBOW,\n hitWindow: {\n startTime: 0.3,\n peakTime: 0.5,\n endTime: 0.7,\n maxReachMultiplier: 0.6, // Spinning adds slight reach\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.TEMPLE_ELBOW]: {\n animationType: AnimationType.TEMPLE_ELBOW,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.18,\n endTime: 0.26,\n maxReachMultiplier: 0.5,\n },\n requiresPreciseTiming: true, // Must hit temple\n },\n\n [AnimationType.SPINNING_BACK_ELBOW]: {\n animationType: AnimationType.SPINNING_BACK_ELBOW,\n hitWindow: {\n startTime: 0.28,\n peakTime: 0.45,\n endTime: 0.62,\n maxReachMultiplier: 0.55,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SPINAL_ELBOW]: {\n animationType: AnimationType.SPINAL_ELBOW,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 0.5,\n },\n requiresPreciseTiming: true, // Must hit spine\n },\n\n [AnimationType.BRACHIAL_ELBOW]: {\n animationType: AnimationType.BRACHIAL_ELBOW,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.18,\n endTime: 0.26,\n maxReachMultiplier: 0.5,\n },\n requiresPreciseTiming: true, // Must hit brachial plexus\n },\n\n [AnimationType.KNEE_STRIKE]: {\n animationType: AnimationType.KNEE_STRIKE,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.22,\n endTime: 0.35,\n maxReachMultiplier: 0.4, // Very close range\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.FLYING_KNEE]: {\n animationType: AnimationType.FLYING_KNEE,\n hitWindow: {\n startTime: 0.25,\n peakTime: 0.4,\n endTime: 0.55,\n maxReachMultiplier: 0.65, // Jumping adds reach\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.KIDNEY_KNEE]: {\n animationType: AnimationType.KIDNEY_KNEE,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 0.4,\n },\n requiresPreciseTiming: true, // Must hit kidney\n },\n\n [AnimationType.FEMORAL_KNEE]: {\n animationType: AnimationType.FEMORAL_KNEE,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 0.4,\n },\n requiresPreciseTiming: true, // Must hit femoral artery\n },\n\n // ═══════════════════════════════════════════════════════════════════════\n // GRAPPLING TECHNIQUES (잡기 기술)\n // ═══════════════════════════════════════════════════════════════════════\n\n [AnimationType.THROW]: {\n animationType: AnimationType.THROW,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.35,\n endTime: 0.55,\n maxReachMultiplier: 0.7, // Must be close to grab\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.GRAPPLE]: {\n animationType: AnimationType.GRAPPLE,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.3,\n endTime: 0.5,\n maxReachMultiplier: 0.8, // Reach to grab\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SWEEP]: {\n animationType: AnimationType.SWEEP,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.3,\n endTime: 0.45,\n maxReachMultiplier: 0.9, // Low sweep\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SLAM]: {\n animationType: AnimationType.SLAM,\n hitWindow: {\n startTime: 0.2,\n peakTime: 0.4,\n endTime: 0.6,\n maxReachMultiplier: 0.7,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.WRIST_LOCK]: {\n animationType: AnimationType.WRIST_LOCK,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.25,\n endTime: 0.4,\n maxReachMultiplier: 0.75,\n },\n requiresPreciseTiming: true, // Must grab wrist\n },\n\n [AnimationType.ARM_BAR]: {\n animationType: AnimationType.ARM_BAR,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.35,\n endTime: 0.55,\n maxReachMultiplier: 0.8,\n },\n requiresPreciseTiming: true, // Must control arm\n },\n\n [AnimationType.SHOULDER_LOCK]: {\n animationType: AnimationType.SHOULDER_LOCK,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.3,\n endTime: 0.48,\n maxReachMultiplier: 0.75,\n },\n requiresPreciseTiming: true, // Must control shoulder\n },\n\n [AnimationType.HIP_THROW]: {\n animationType: AnimationType.HIP_THROW,\n hitWindow: {\n startTime: 0.18,\n peakTime: 0.38,\n endTime: 0.58,\n maxReachMultiplier: 0.7,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.LEG_REAP]: {\n animationType: AnimationType.LEG_REAP,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.3,\n endTime: 0.45,\n maxReachMultiplier: 0.85,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SMALL_CIRCLE_LOCK]: {\n animationType: AnimationType.SMALL_CIRCLE_LOCK,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.28,\n endTime: 0.44,\n maxReachMultiplier: 0.7,\n },\n requiresPreciseTiming: true, // Hapkido precision\n },\n\n [AnimationType.FINGER_LOCK]: {\n animationType: AnimationType.FINGER_LOCK,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.23,\n endTime: 0.36,\n maxReachMultiplier: 0.75,\n },\n requiresPreciseTiming: true, // Must grab fingers\n },\n\n [AnimationType.ELBOW_LOCK]: {\n animationType: AnimationType.ELBOW_LOCK,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.32,\n endTime: 0.49,\n maxReachMultiplier: 0.8,\n },\n requiresPreciseTiming: true, // Must control elbow\n },\n\n [AnimationType.SHOULDER_MANIPULATION]: {\n animationType: AnimationType.SHOULDER_MANIPULATION,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.32,\n endTime: 0.49,\n maxReachMultiplier: 0.75,\n },\n requiresPreciseTiming: true,\n },\n\n [AnimationType.MOUNTAIN_LOCK]: {\n animationType: AnimationType.MOUNTAIN_LOCK,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.32,\n endTime: 0.49,\n maxReachMultiplier: 0.75,\n },\n requiresPreciseTiming: true,\n },\n\n [AnimationType.EARTH_EMBRACE]: {\n animationType: AnimationType.EARTH_EMBRACE,\n hitWindow: {\n startTime: 0.18,\n peakTime: 0.4,\n endTime: 0.62,\n maxReachMultiplier: 0.8,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.TAKEDOWN]: {\n animationType: AnimationType.TAKEDOWN,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.35,\n endTime: 0.55,\n maxReachMultiplier: 0.75,\n },\n requiresPreciseTiming: false,\n },\n\n // ═══════════════════════════════════════════════════════════════════════\n // DEFENSIVE TECHNIQUES (방어 기술)\n // ═══════════════════════════════════════════════════════════════════════\n\n [AnimationType.BLOCK]: {\n animationType: AnimationType.BLOCK,\n hitWindow: {\n startTime: 0.03,\n peakTime: 0.05,\n endTime: 0.08,\n maxReachMultiplier: 0.6, // Arms defending\n },\n requiresPreciseTiming: true, // Must time block correctly\n },\n\n [AnimationType.PARRY]: {\n animationType: AnimationType.PARRY,\n hitWindow: {\n startTime: 0.03,\n peakTime: 0.06,\n endTime: 0.1,\n maxReachMultiplier: 0.7,\n },\n requiresPreciseTiming: true, // Precise deflection\n },\n\n [AnimationType.COUNTER_STRIKE]: {\n animationType: AnimationType.COUNTER_STRIKE,\n hitWindow: {\n startTime: 0.08,\n peakTime: 0.15,\n endTime: 0.25,\n maxReachMultiplier: 0.9, // Counter-strike reach\n },\n requiresPreciseTiming: true, // Timing critical for counters\n },\n};\n\n/**\n * Get hit timing configuration for an animation type.\n *\n * **Korean**: 애니메이션 타격 타이밍 가져오기\n *\n * @param animationType - Animation type to get timing for\n * @returns Hit timing configuration, or undefined if not a combat animation\n *\n * @example\n * ```typescript\n * const jabTiming = getAnimationHitTiming(AnimationType.JAB);\n * if (jabTiming) {\n * console.log(`Jab hit window: ${jabTiming.hitWindow.startTime}s - ${jabTiming.hitWindow.endTime}s`);\n * }\n * ```\n *\n * @public\n * @korean 애니메이션타격타이밍가져오기\n */\nexport function getAnimationHitTiming(\n animationType: AnimationType\n): TechniqueHitTiming | undefined {\n return ANIMATION_HIT_TIMING[animationType];\n}\n\n/**\n * Check if a technique can hit at the given animation time.\n *\n * **Korean**: 타격 가능 시간 확인\n *\n * @param animationType - Animation type\n * @param currentTime - Current time in animation (seconds)\n * @returns True if within hit window\n *\n * @example\n * ```typescript\n * const canHit = isWithinHitWindow(AnimationType.JAB, 0.15);\n * // Returns true (0.15s is within jab's 0.10-0.25s window)\n * ```\n *\n * @public\n * @korean 타격가능시간확인\n */\nexport function isWithinHitWindow(\n animationType: AnimationType,\n currentTime: number\n): boolean {\n const timing = ANIMATION_HIT_TIMING[animationType];\n if (!timing) {\n // Not a combat animation (movement, stance change, etc.)\n return false;\n }\n const { startTime, endTime } = timing.hitWindow;\n return currentTime >= startTime && currentTime <= endTime;\n}\n\n/**\n * Calculate current reach multiplier at a specific time in the animation.\n *\n * **Korean**: 현재 도달 배수 계산\n *\n * @param animationType - Animation type\n * @param currentTime - Current time in animation (seconds)\n * @returns Reach multiplier (0.0 - max), or 0 if outside hit window\n *\n * @example\n * ```typescript\n * const reach = getCurrentReachMultiplier(AnimationType.JAB, 0.15);\n * // Returns 0.95 (jab at peak time)\n *\n * const noReach = getCurrentReachMultiplier(AnimationType.JAB, 0.05);\n * // Returns 0 (before hit window starts)\n * ```\n *\n * @public\n * @korean 현재도달배수계산\n */\nexport function getCurrentReachMultiplier(\n animationType: AnimationType,\n currentTime: number\n): number {\n const timing = ANIMATION_HIT_TIMING[animationType];\n if (!timing) {\n // Not a combat animation\n return 0;\n }\n const { startTime, peakTime, endTime, maxReachMultiplier, reachCurve } =\n timing.hitWindow;\n\n // Outside hit window\n if (currentTime < startTime || currentTime > endTime) {\n return 0;\n }\n\n // Normalize time within hit window (0 = start, 0.5 = peak, 1 = end)\n let normalizedTime: number;\n if (currentTime <= peakTime) {\n // Start to peak (0 to 0.5)\n normalizedTime = 0.5 * ((currentTime - startTime) / (peakTime - startTime));\n } else {\n // Peak to end (0.5 to 1)\n normalizedTime =\n 0.5 + 0.5 * ((currentTime - peakTime) / (endTime - peakTime));\n }\n\n // Apply reach curve if provided, otherwise use simple interpolation\n if (reachCurve) {\n return maxReachMultiplier * reachCurve(normalizedTime);\n }\n\n // Default: Peak at center (0.5), taper off at edges\n // Use smooth curve: 1 - (2 * normalizedTime - 1)^2\n const peakFactor = 1 - Math.pow(2 * normalizedTime - 1, 2);\n return maxReachMultiplier * peakFactor;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AnimationHitTiming.js","names":[],"sources":["../../../../src/systems/animation/core/AnimationHitTiming.ts"],"sourcesContent":["/**\n * Animation Hit Timing System\n *\n * **Korean**: 애니메이션 타격 타이밍\n *\n * Defines when visual contact occurs in animations for reality-based hit detection.\n * Hits should only register when the animation visually shows limb contact with target.\n *\n * ## Philosophy\n *\n * Black Trigram emphasizes visual authenticity in combat. Hit detection must align\n * with what the player sees on screen. This system defines the exact frames/timing\n * when each technique's strike phase visually connects.\n *\n * ## Phases\n *\n * Korean martial arts techniques have distinct phases:\n * - **준비 (Chamber)**: Wind-up, no contact possible\n * - **실행 (Extension)**: Strike extending, contact window opens\n * - **정점 (Peak)**: Maximum extension, highest contact probability\n * - **회수 (Retraction)**: Pulling back, contact window closes\n * - **복귀 (Recovery)**: Return to stance, no contact\n *\n * @module systems/animation/AnimationHitTiming\n * @category Animation System\n * @korean 애니메이션타격타이밍\n */\n\nimport { AnimationType } from \"../builders/MartialArtsAnimationBuilder\";\n\n/**\n * Hit window timing for a technique animation.\n *\n * **Korean**: 타격 창 타이밍\n *\n * Defines when during an animation the technique can actually make contact.\n * Based on visual reach during the extension phase.\n *\n * @example\n * ```typescript\n * const jabTiming: AnimationHitWindow = {\n * startTime: 0.10, // Hit window opens at 100ms (after chamber)\n * peakTime: 0.15, // Peak extension at 150ms\n * endTime: 0.20, // Hit window closes at 200ms (before retraction)\n * maxReachMultiplier: 1.0, // 100% of limb length at peak\n * };\n * ```\n *\n * @public\n * @korean 타격창타이밍\n */\nexport interface AnimationHitWindow {\n /**\n * Time when hit window opens (seconds).\n * Start of extension phase where limb begins moving toward target.\n * @korean 시작시간\n */\n readonly startTime: number;\n\n /**\n * Time of maximum extension (seconds).\n * Peak of strike where reach is maximum and damage is highest.\n * @korean 정점시간\n */\n readonly peakTime: number;\n\n /**\n * Time when hit window closes (seconds).\n * End of extension phase where limb begins retracting.\n * @korean 종료시간\n */\n readonly endTime: number;\n\n /**\n * Reach multiplier at peak extension (0.0 - 1.5).\n * - 1.0 = full limb extension (standard strikes)\n * - 0.7 = partial extension (close-range techniques)\n * - 1.2+ = overextended (special techniques, jumping kicks)\n * @korean 최대도달배수\n */\n readonly maxReachMultiplier: number;\n\n /**\n * Optional reach curve during hit window.\n * If not provided, assumes linear interpolation from 0 to maxReachMultiplier.\n * @korean 도달곡선\n */\n readonly reachCurve?: (normalizedTime: number) => number;\n}\n\n/**\n * Complete hit timing configuration for a technique.\n *\n * **Korean**: 기술 타격 타이밍 설정\n *\n * @public\n * @korean 기술타격타이밍\n */\nexport interface TechniqueHitTiming {\n /**\n * Animation type this timing applies to.\n * @korean 애니메이션타입\n */\n readonly animationType: AnimationType;\n\n /**\n * Hit window configuration.\n * @korean 타격창\n */\n readonly hitWindow: AnimationHitWindow;\n\n /**\n * Whether this technique requires precise timing (true) or has a wider window (false).\n * Affects forgiveness in hit detection.\n * @korean 정밀타이밍필요\n */\n readonly requiresPreciseTiming: boolean;\n}\n\n/**\n * Hit timing database for animation types.\n *\n * **Korean**: 애니메이션 타격 타이밍 데이터베이스\n *\n * Based on TECHNIQUE_TIMING constants from MartialArtsAnimationBuilder.\n * Only includes timing for techniques with actual hit windows.\n * Movement and non-combat animations can query this and will get undefined.\n *\n * @public\n * @korean 애니메이션타격타이밍데이터베이스\n */\nexport const ANIMATION_HIT_TIMING: Partial<\n Record<AnimationType, TechniqueHitTiming>\n> = {\n // ═══════════════════════════════════════════════════════════════════════\n // PUNCH TECHNIQUES (주먹 기술)\n // ═══════════════════════════════════════════════════════════════════════\n\n [AnimationType.JAB]: {\n animationType: AnimationType.JAB,\n hitWindow: {\n startTime: 0.1, // Chamber: 100ms, Extension starts\n peakTime: 0.15, // Peak at 150ms (midpoint of 150ms extension)\n endTime: 0.25, // Retraction starts at 250ms\n maxReachMultiplier: 0.95, // Jabs don't fully extend (speed > reach)\n },\n requiresPreciseTiming: false, // Fast technique with forgiving window\n },\n\n [AnimationType.CROSS]: {\n animationType: AnimationType.CROSS,\n hitWindow: {\n startTime: 0.15, // Longer chamber for power\n peakTime: 0.25, // Peak at 250ms\n endTime: 0.35, // Window closes at 350ms\n maxReachMultiplier: 1.0, // Full extension for power\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.HOOK]: {\n animationType: AnimationType.HOOK,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 0.85, // Hooks are shorter range (arc motion)\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.UPPERCUT]: {\n animationType: AnimationType.UPPERCUT,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 0.7, // Close-range technique\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.OVERHAND]: {\n animationType: AnimationType.OVERHAND,\n hitWindow: {\n startTime: 0.2,\n peakTime: 0.3,\n endTime: 0.42,\n maxReachMultiplier: 1.1, // Longer reach from arc\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.BACKFIST]: {\n animationType: AnimationType.BACKFIST,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.18,\n endTime: 0.27,\n maxReachMultiplier: 0.9, // Snapping technique\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.HAMMER_FIST]: {\n animationType: AnimationType.HAMMER_FIST,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 0.85,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.PALM_STRIKE]: {\n animationType: AnimationType.PALM_STRIKE,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 1.0,\n },\n requiresPreciseTiming: false,\n },\n\n // ═══ Specialized Punch Variants ═══\n\n [AnimationType.SPEAR_HAND_STRIKE]: {\n animationType: AnimationType.SPEAR_HAND_STRIKE,\n hitWindow: {\n startTime: 0.08,\n peakTime: 0.13,\n endTime: 0.2,\n maxReachMultiplier: 1.05, // Extended fingers add reach\n },\n requiresPreciseTiming: true, // Precise targeting required\n },\n\n [AnimationType.NERVE_STRIKE]: {\n animationType: AnimationType.NERVE_STRIKE,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.15,\n endTime: 0.22,\n maxReachMultiplier: 0.9,\n },\n requiresPreciseTiming: true, // Must hit exact nerve point\n },\n\n [AnimationType.PRESSURE_POINT_STRIKE]: {\n animationType: AnimationType.PRESSURE_POINT_STRIKE,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.32,\n maxReachMultiplier: 0.85,\n },\n requiresPreciseTiming: true, // Precise pressure point targeting\n },\n\n [AnimationType.LIGHTNING_STRIKE]: {\n animationType: AnimationType.LIGHTNING_STRIKE,\n hitWindow: {\n startTime: 0.06,\n peakTime: 0.1,\n endTime: 0.15,\n maxReachMultiplier: 0.95,\n },\n requiresPreciseTiming: true, // Very fast, small window\n },\n\n [AnimationType.RAPID_BARRAGE]: {\n animationType: AnimationType.RAPID_BARRAGE,\n hitWindow: {\n startTime: 0.05,\n peakTime: 0.12,\n endTime: 0.2,\n maxReachMultiplier: 0.85, // Multiple hits, shorter reach each\n },\n requiresPreciseTiming: false, // Volume of strikes compensates\n },\n\n [AnimationType.RHYTHMIC_STRIKES]: {\n animationType: AnimationType.RHYTHMIC_STRIKES,\n hitWindow: {\n startTime: 0.08,\n peakTime: 0.15,\n endTime: 0.25,\n maxReachMultiplier: 0.9,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.NERVE_PARALYSIS]: {\n animationType: AnimationType.NERVE_PARALYSIS,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.2,\n endTime: 0.28,\n maxReachMultiplier: 0.85,\n },\n requiresPreciseTiming: true,\n },\n\n [AnimationType.THROAT_STRIKE]: {\n animationType: AnimationType.THROAT_STRIKE,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.15,\n endTime: 0.22,\n maxReachMultiplier: 0.95,\n },\n requiresPreciseTiming: true, // Must hit throat precisely\n },\n\n [AnimationType.EYE_GOUGE]: {\n animationType: AnimationType.EYE_GOUGE,\n hitWindow: {\n startTime: 0.08,\n peakTime: 0.12,\n endTime: 0.18,\n maxReachMultiplier: 0.8, // Very close range\n },\n requiresPreciseTiming: true, // Extremely precise target\n },\n\n [AnimationType.HEAVEN_STRIKE]: {\n animationType: AnimationType.HEAVEN_STRIKE,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 1.1, // Powerful extension\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.FLOWING_CROSS]: {\n animationType: AnimationType.FLOWING_CROSS,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.22,\n endTime: 0.32,\n maxReachMultiplier: 1.0,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SOLAR_PLEXUS_STRIKE]: {\n animationType: AnimationType.SOLAR_PLEXUS_STRIKE,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.2,\n endTime: 0.28,\n maxReachMultiplier: 0.95,\n },\n requiresPreciseTiming: true, // Must hit solar plexus\n },\n\n [AnimationType.FLOWING_PUSH]: {\n animationType: AnimationType.FLOWING_PUSH,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.2,\n endTime: 0.3,\n maxReachMultiplier: 1.0,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.LIVER_DISRUPTION]: {\n animationType: AnimationType.LIVER_DISRUPTION,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.33,\n maxReachMultiplier: 0.9,\n },\n requiresPreciseTiming: true, // Must hit liver\n },\n\n [AnimationType.EAR_STRIKE]: {\n animationType: AnimationType.EAR_STRIKE,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.16,\n endTime: 0.24,\n maxReachMultiplier: 0.85,\n },\n requiresPreciseTiming: true, // Must hit ear precisely\n },\n\n // ═══════════════════════════════════════════════════════════════════════\n // KICK TECHNIQUES (발차기 기술)\n // ═══════════════════════════════════════════════════════════════════════\n\n [AnimationType.FRONT_KICK]: {\n animationType: AnimationType.FRONT_KICK,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.27,\n endTime: 0.4,\n maxReachMultiplier: 1.0, // Full leg extension\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.ROUNDHOUSE_KICK]: {\n animationType: AnimationType.ROUNDHOUSE_KICK,\n hitWindow: {\n startTime: 0.2,\n peakTime: 0.32,\n endTime: 0.48,\n maxReachMultiplier: 1.05, // Slight overextension at peak\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SIDE_KICK]: {\n animationType: AnimationType.SIDE_KICK,\n hitWindow: {\n startTime: 0.2,\n peakTime: 0.35,\n endTime: 0.5,\n maxReachMultiplier: 1.1, // Maximum reach technique\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.BACK_KICK]: {\n animationType: AnimationType.BACK_KICK,\n hitWindow: {\n startTime: 0.25,\n peakTime: 0.4,\n endTime: 0.55,\n maxReachMultiplier: 1.15, // Powerful extension backward\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.AXE_KICK]: {\n animationType: AnimationType.AXE_KICK,\n hitWindow: {\n startTime: 0.25,\n peakTime: 0.45,\n endTime: 0.65,\n maxReachMultiplier: 1.2, // High vertical reach\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.CRESCENT_KICK]: {\n animationType: AnimationType.CRESCENT_KICK,\n hitWindow: {\n startTime: 0.18,\n peakTime: 0.32,\n endTime: 0.48,\n maxReachMultiplier: 1.0,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.LOW_KICK]: {\n animationType: AnimationType.LOW_KICK,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.22,\n endTime: 0.35,\n maxReachMultiplier: 0.95, // Lower target, less extension\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.PUSH_KICK]: {\n animationType: AnimationType.PUSH_KICK,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.22,\n endTime: 0.35,\n maxReachMultiplier: 1.0,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.JUMPING_KICK]: {\n animationType: AnimationType.JUMPING_KICK,\n hitWindow: {\n startTime: 0.3,\n peakTime: 0.45,\n endTime: 0.6,\n maxReachMultiplier: 1.3, // Airborne extension\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SPINNING_HEEL_KICK]: {\n animationType: AnimationType.SPINNING_HEEL_KICK,\n hitWindow: {\n startTime: 0.4,\n peakTime: 0.6,\n endTime: 0.8,\n maxReachMultiplier: 1.15, // Spinning adds reach\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.TORNADO_KICK]: {\n animationType: AnimationType.TORNADO_KICK,\n hitWindow: {\n startTime: 0.45,\n peakTime: 0.65,\n endTime: 0.85,\n maxReachMultiplier: 1.25, // Jumping + spinning\n },\n requiresPreciseTiming: false,\n },\n\n // ═══════════════════════════════════════════════════════════════════════\n // ELBOW & KNEE TECHNIQUES (팔꿈치 & 무릎 기술)\n // ═══════════════════════════════════════════════════════════════════════\n\n [AnimationType.ELBOW_STRIKE]: {\n animationType: AnimationType.ELBOW_STRIKE,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.18,\n endTime: 0.28,\n maxReachMultiplier: 0.5, // Very close range\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.ELBOW_UPPERCUT]: {\n animationType: AnimationType.ELBOW_UPPERCUT,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.22,\n endTime: 0.32,\n maxReachMultiplier: 0.45, // Close range upward\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SPINNING_ELBOW]: {\n animationType: AnimationType.SPINNING_ELBOW,\n hitWindow: {\n startTime: 0.3,\n peakTime: 0.5,\n endTime: 0.7,\n maxReachMultiplier: 0.6, // Spinning adds slight reach\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.TEMPLE_ELBOW]: {\n animationType: AnimationType.TEMPLE_ELBOW,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.18,\n endTime: 0.26,\n maxReachMultiplier: 0.5,\n },\n requiresPreciseTiming: true, // Must hit temple\n },\n\n [AnimationType.SPINNING_BACK_ELBOW]: {\n animationType: AnimationType.SPINNING_BACK_ELBOW,\n hitWindow: {\n startTime: 0.28,\n peakTime: 0.45,\n endTime: 0.62,\n maxReachMultiplier: 0.55,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SPINAL_ELBOW]: {\n animationType: AnimationType.SPINAL_ELBOW,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 0.5,\n },\n requiresPreciseTiming: true, // Must hit spine\n },\n\n [AnimationType.BRACHIAL_ELBOW]: {\n animationType: AnimationType.BRACHIAL_ELBOW,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.18,\n endTime: 0.26,\n maxReachMultiplier: 0.5,\n },\n requiresPreciseTiming: true, // Must hit brachial plexus\n },\n\n [AnimationType.KNEE_STRIKE]: {\n animationType: AnimationType.KNEE_STRIKE,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.22,\n endTime: 0.35,\n maxReachMultiplier: 0.4, // Very close range\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.FLYING_KNEE]: {\n animationType: AnimationType.FLYING_KNEE,\n hitWindow: {\n startTime: 0.25,\n peakTime: 0.4,\n endTime: 0.55,\n maxReachMultiplier: 0.65, // Jumping adds reach\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.KIDNEY_KNEE]: {\n animationType: AnimationType.KIDNEY_KNEE,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 0.4,\n },\n requiresPreciseTiming: true, // Must hit kidney\n },\n\n [AnimationType.FEMORAL_KNEE]: {\n animationType: AnimationType.FEMORAL_KNEE,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 0.4,\n },\n requiresPreciseTiming: true, // Must hit femoral artery\n },\n\n // ═══════════════════════════════════════════════════════════════════════\n // GRAPPLING TECHNIQUES (잡기 기술)\n // ═══════════════════════════════════════════════════════════════════════\n\n [AnimationType.THROW]: {\n animationType: AnimationType.THROW,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.35,\n endTime: 0.55,\n maxReachMultiplier: 0.7, // Must be close to grab\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.GRAPPLE]: {\n animationType: AnimationType.GRAPPLE,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.3,\n endTime: 0.5,\n maxReachMultiplier: 0.8, // Reach to grab\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SWEEP]: {\n animationType: AnimationType.SWEEP,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.3,\n endTime: 0.45,\n maxReachMultiplier: 0.9, // Low sweep\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SLAM]: {\n animationType: AnimationType.SLAM,\n hitWindow: {\n startTime: 0.2,\n peakTime: 0.4,\n endTime: 0.6,\n maxReachMultiplier: 0.7,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.WRIST_LOCK]: {\n animationType: AnimationType.WRIST_LOCK,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.25,\n endTime: 0.4,\n maxReachMultiplier: 0.75,\n },\n requiresPreciseTiming: true, // Must grab wrist\n },\n\n [AnimationType.ARM_BAR]: {\n animationType: AnimationType.ARM_BAR,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.35,\n endTime: 0.55,\n maxReachMultiplier: 0.8,\n },\n requiresPreciseTiming: true, // Must control arm\n },\n\n [AnimationType.SHOULDER_LOCK]: {\n animationType: AnimationType.SHOULDER_LOCK,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.3,\n endTime: 0.48,\n maxReachMultiplier: 0.75,\n },\n requiresPreciseTiming: true, // Must control shoulder\n },\n\n [AnimationType.HIP_THROW]: {\n animationType: AnimationType.HIP_THROW,\n hitWindow: {\n startTime: 0.18,\n peakTime: 0.38,\n endTime: 0.58,\n maxReachMultiplier: 0.7,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.LEG_REAP]: {\n animationType: AnimationType.LEG_REAP,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.3,\n endTime: 0.45,\n maxReachMultiplier: 0.85,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SMALL_CIRCLE_LOCK]: {\n animationType: AnimationType.SMALL_CIRCLE_LOCK,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.28,\n endTime: 0.44,\n maxReachMultiplier: 0.7,\n },\n requiresPreciseTiming: true, // Hapkido precision\n },\n\n [AnimationType.FINGER_LOCK]: {\n animationType: AnimationType.FINGER_LOCK,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.23,\n endTime: 0.36,\n maxReachMultiplier: 0.75,\n },\n requiresPreciseTiming: true, // Must grab fingers\n },\n\n [AnimationType.ELBOW_LOCK]: {\n animationType: AnimationType.ELBOW_LOCK,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.32,\n endTime: 0.49,\n maxReachMultiplier: 0.8,\n },\n requiresPreciseTiming: true, // Must control elbow\n },\n\n [AnimationType.SHOULDER_MANIPULATION]: {\n animationType: AnimationType.SHOULDER_MANIPULATION,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.32,\n endTime: 0.49,\n maxReachMultiplier: 0.75,\n },\n requiresPreciseTiming: true,\n },\n\n [AnimationType.MOUNTAIN_LOCK]: {\n animationType: AnimationType.MOUNTAIN_LOCK,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.32,\n endTime: 0.49,\n maxReachMultiplier: 0.75,\n },\n requiresPreciseTiming: true,\n },\n\n [AnimationType.EARTH_EMBRACE]: {\n animationType: AnimationType.EARTH_EMBRACE,\n hitWindow: {\n startTime: 0.18,\n peakTime: 0.4,\n endTime: 0.62,\n maxReachMultiplier: 0.8,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.TAKEDOWN]: {\n animationType: AnimationType.TAKEDOWN,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.35,\n endTime: 0.55,\n maxReachMultiplier: 0.75,\n },\n requiresPreciseTiming: false,\n },\n\n // ═══════════════════════════════════════════════════════════════════════\n // DEFENSIVE TECHNIQUES (방어 기술)\n // ═══════════════════════════════════════════════════════════════════════\n\n [AnimationType.BLOCK]: {\n animationType: AnimationType.BLOCK,\n hitWindow: {\n startTime: 0.03,\n peakTime: 0.05,\n endTime: 0.08,\n maxReachMultiplier: 0.6, // Arms defending\n },\n requiresPreciseTiming: true, // Must time block correctly\n },\n\n [AnimationType.PARRY]: {\n animationType: AnimationType.PARRY,\n hitWindow: {\n startTime: 0.03,\n peakTime: 0.06,\n endTime: 0.1,\n maxReachMultiplier: 0.7,\n },\n requiresPreciseTiming: true, // Precise deflection\n },\n\n [AnimationType.COUNTER_STRIKE]: {\n animationType: AnimationType.COUNTER_STRIKE,\n hitWindow: {\n startTime: 0.08,\n peakTime: 0.15,\n endTime: 0.25,\n maxReachMultiplier: 0.9, // Counter-strike reach\n },\n requiresPreciseTiming: true, // Timing critical for counters\n },\n};\n\n/**\n * Get hit timing configuration for an animation type.\n *\n * **Korean**: 애니메이션 타격 타이밍 가져오기\n *\n * @param animationType - Animation type to get timing for\n * @returns Hit timing configuration, or undefined if not a combat animation\n *\n * @example\n * ```typescript\n * const jabTiming = getAnimationHitTiming(AnimationType.JAB);\n * if (jabTiming) {\n * console.log(`Jab hit window: ${jabTiming.hitWindow.startTime}s - ${jabTiming.hitWindow.endTime}s`);\n * }\n * ```\n *\n * @public\n * @korean 애니메이션타격타이밍가져오기\n */\nexport function getAnimationHitTiming(\n animationType: AnimationType\n): TechniqueHitTiming | undefined {\n return ANIMATION_HIT_TIMING[animationType];\n}\n\n/**\n * Check if a technique can hit at the given animation time.\n *\n * **Korean**: 타격 가능 시간 확인\n *\n * @param animationType - Animation type\n * @param currentTime - Current time in animation (seconds)\n * @returns True if within hit window\n *\n * @example\n * ```typescript\n * const canHit = isWithinHitWindow(AnimationType.JAB, 0.15);\n * // Returns true (0.15s is within jab's 0.10-0.25s window)\n * ```\n *\n * @public\n * @korean 타격가능시간확인\n */\nexport function isWithinHitWindow(\n animationType: AnimationType,\n currentTime: number\n): boolean {\n const timing = ANIMATION_HIT_TIMING[animationType];\n if (!timing) {\n // Not a combat animation (movement, stance change, etc.)\n return false;\n }\n const { startTime, endTime } = timing.hitWindow;\n return currentTime >= startTime && currentTime <= endTime;\n}\n\n/**\n * Calculate current reach multiplier at a specific time in the animation.\n *\n * **Korean**: 현재 도달 배수 계산\n *\n * @param animationType - Animation type\n * @param currentTime - Current time in animation (seconds)\n * @returns Reach multiplier (0.0 - max), or 0 if outside hit window\n *\n * @example\n * ```typescript\n * const reach = getCurrentReachMultiplier(AnimationType.JAB, 0.15);\n * // Returns 0.95 (jab at peak time)\n *\n * const noReach = getCurrentReachMultiplier(AnimationType.JAB, 0.05);\n * // Returns 0 (before hit window starts)\n * ```\n *\n * @public\n * @korean 현재도달배수계산\n */\nexport function getCurrentReachMultiplier(\n animationType: AnimationType,\n currentTime: number\n): number {\n const timing = ANIMATION_HIT_TIMING[animationType];\n if (!timing) {\n // Not a combat animation\n return 0;\n }\n const { startTime, peakTime, endTime, maxReachMultiplier, reachCurve } =\n timing.hitWindow;\n\n // Outside hit window\n if (currentTime < startTime || currentTime > endTime) {\n return 0;\n }\n\n // Normalize time within hit window (0 = start, 0.5 = peak, 1 = end)\n let normalizedTime: number;\n if (currentTime <= peakTime) {\n // Start to peak (0 to 0.5)\n normalizedTime = 0.5 * ((currentTime - startTime) / (peakTime - startTime));\n } else {\n // Peak to end (0.5 to 1)\n normalizedTime =\n 0.5 + 0.5 * ((currentTime - peakTime) / (endTime - peakTime));\n }\n\n // Apply reach curve if provided, otherwise use simple interpolation\n if (reachCurve) {\n return maxReachMultiplier * reachCurve(normalizedTime);\n }\n\n // Default: Peak at center (0.5), taper off at edges\n // Use smooth curve: 1 - (2 * normalizedTime - 1)^2\n const peakFactor = 1 - Math.pow(2 * normalizedTime - 1, 2);\n return maxReachMultiplier * peakFactor;\n}\n"],"mappings":"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"}