blacktrigram 0.7.39 β†’ 0.7.41

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 +8 -8
@@ -1 +1 @@
1
- {"version":3,"file":"FootworkSkeletalAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/FootworkSkeletalAnimations.ts"],"sourcesContent":["/**\n * Korean Martial Arts Footwork Animations with Skeletal Keyframes (보법 μ• λ‹ˆλ©”μ΄μ…˜)\n *\n * **PHASE 4 ENHANCEMENT: 95%+ Korean Martial Arts Authenticity**\n *\n * Defines realistic footwork animation sequences for specialized movement patterns:\n * - μŠ¬λΌμ΄λ“œ μŠ€ν… (Slide Step): Lead foot moves first, rear follows\n * - μŠ€μœ„μΉ˜ μŠ€ν… (Switch Step): Quick stance reversal with hop\n * - λ°”μš΄μŠ€ μŠ€ν… (Bounce Step): Rhythmic boxing-style bounce\n * - 삼각 이동 (Triangle Footwork): Three-point angular movement\n * - μ›ν˜•λ³΄ (Circular Step): Lateral movement maintaining guard\n * - λ―Έλ„λŸΌλ³΄ (Glide Step): Both feet move together smoothly\n * - μΆ•μ‘±νšŒμ „ (Pivot Step): Ball-of-foot rotation\n * - μ„žμŒλ³΄ (Shuffle): Quick micro-adjustments\n *\n * Korean Martial Arts Footwork Principles Applied:\n * - λ””λ”€λ°œ (Didimbal): Stepping foot mechanics with proper heel/ball placement\n * - μΆ•λ°œ (Chukbal): Pivot foot stability and balance maintenance\n * - 체쀑이동 (Chejung Idong): Smooth weight transfer between feet\n * - 쀑심이동 (Jungsim Idong): Center of mass movement coordination\n * - λ³΄λ²•μ˜ 리듬 (Bobeop-ui Rhythm): Rhythmic footwork patterns from boxing\n *\n * @module systems/animation/FootworkSkeletalAnimations\n * @category Animation System\n * @korean λ³΄λ²•μ• λ‹ˆλ©”μ΄μ…˜\n */\n\nimport type { SkeletalAnimation } from \"@/types/skeletal\";\nimport { BoneName } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\nimport { toRadians } from \"@/utils/math\";\n\n// ═══════════════════════════════════════════════════════════════════════════\n// CIRCULAR STEP ANIMATIONS (μ›ν˜•λ³΄) - Lateral circular footwork\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * CIRCULAR STEP LEFT Animation (μ›ν˜•λ³΄ 쒌)\n *\n * **Korean Martial Arts Principle**: μ›ν˜• μΈ‘λ©΄ 이동 (Circular lateral movement)\n *\n * Creates angle by moving laterally in an arc:\n * 1. Both feet move in synchronized circular pattern\n * 2. Maintains guard and balance throughout\n * 3. Creates angle advantage for counter-striking\n * 4. Common in Taekyon and Hapkido for off-line positioning\n *\n * **Tactical Use**: Circle to opponent's weak side\n *\n * @korean μ›ν˜•λ³΄μ’Œμ• λ‹ˆλ©”μ΄μ…˜\n */\nexport const FOOTWORK_CIRCULAR_LEFT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_circular_left\", \"μ›ν˜•λ³΄ 쒌\")\n .asMovement(0.3)\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Begin circular arc left (μ›ν˜Έ μ‹œμž‘)\n .at(0.1, \"ease-out\")\n .position(BoneName.PELVIS, -0.08, -0.01, 0.05) // Arc pattern\n .rotate(BoneName.PELVIS, 0, toRadians(5), toRadians(3))\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Mid-arc (μ›ν˜Έ 쀑간)\n .at(0.2, \"linear\")\n .position(BoneName.PELVIS, -0.2, 0, 0.08) // Peak of arc\n .rotate(BoneName.PELVIS, 0, toRadians(8), toRadians(5))\n .rotate(BoneName.SPINE_LOWER, 0, toRadians(-4), 0) // Counter-rotate upper body\n .done<MartialArtsAnimationBuilder>()\n // Complete circle (원 μ™„μ„±)\n .at(0.3, \"ease-in\")\n .position(BoneName.PELVIS, -0.25, 0, 0.1) // Final position\n .rotate(BoneName.PELVIS, 0, 0, 0) // Reset rotation\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * CIRCULAR STEP RIGHT Animation (μ›ν˜•λ³΄ 우)\n *\n * **Korean Martial Arts Principle**: μ›ν˜• μΈ‘λ©΄ 이동 (Circular lateral movement)\n *\n * Mirror of left circular step for right lateral arc movement.\n *\n * @korean μ›ν˜•λ³΄μš°μ• λ‹ˆλ©”μ΄μ…˜\n */\nexport const FOOTWORK_CIRCULAR_RIGHT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_circular_right\", \"μ›ν˜•λ³΄ 우\")\n .asMovement(0.3)\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Begin circular arc right (μ›ν˜Έ μ‹œμž‘)\n .at(0.1, \"ease-out\")\n .position(BoneName.PELVIS, 0.08, -0.01, 0.05) // Arc pattern\n .rotate(BoneName.PELVIS, 0, toRadians(-5), toRadians(-3))\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Mid-arc (μ›ν˜Έ 쀑간)\n .at(0.2, \"linear\")\n .position(BoneName.PELVIS, 0.2, 0, 0.08) // Peak of arc\n .rotate(BoneName.PELVIS, 0, toRadians(-8), toRadians(-5))\n .rotate(BoneName.SPINE_LOWER, 0, toRadians(4), 0) // Counter-rotate upper body\n .done<MartialArtsAnimationBuilder>()\n // Complete circle (원 μ™„μ„±)\n .at(0.3, \"ease-in\")\n .position(BoneName.PELVIS, 0.25, 0, 0.1) // Final position\n .rotate(BoneName.PELVIS, 0, 0, 0) // Reset rotation\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// SLIDE STEP ANIMATIONS (λ―Έλ„λŸΌλ³΄) - Lead foot moves, rear follows\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * SLIDE STEP FORWARD Animation (λ―Έλ„λŸΌλ³΄ μ „)\n *\n * **Korean Martial Arts Principle**: λ””λ”€λ°œ μ„ ν–‰ 이동 (Lead foot advances first)\n *\n * Authentic boxing/Korean martial arts slide step where:\n * 1. Lead foot (left) lifts and advances 30cm forward\n * 2. Weight transfers to lead foot\n * 3. Rear foot (right) slides forward to maintain stance width\n * 4. Guard maintained throughout - no telegraphing\n *\n * **Weight Transfer Mechanics** (체쀑이동 원리):\n * - Phase 1 (0-0.05s): Weight shifts to rear foot, lead foot lifts (μ€€λΉ„)\n * - Phase 2 (0.05-0.12s): Lead foot extends forward, heel-first landing (이동)\n * - Phase 3 (0.12-0.18s): Weight transfers to lead, rear foot slides (μ°©μ§€)\n * - Phase 4 (0.18-0.2s): Stance width restored, balanced (μ•ˆμ •)\n *\n * **Distance**: 30cm forward | **Duration**: 200ms (12 frames @ 60fps)\n * **Maintains**: Stance width, guard position, forward-facing orientation\n *\n * @korean λ―Έλ„λŸΌλ³΄μ „μ• λ‹ˆλ©”μ΄μ…˜\n */\nexport const FOOTWORK_SLIDE_FORWARD_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_slide_forward\", \"λ―Έλ„λŸΌλ³΄ μ „\")\n .asMovement(0.2)\n // Initial stance - balanced position\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0) // Front knee slight bend\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0) // Back knee more bent\n .done<MartialArtsAnimationBuilder>()\n // Phase 1: Weight shift to rear, lead foot lightens (μ€€λΉ„)\n .at(0.03, \"ease-out\")\n .position(BoneName.PELVIS, 0.03, 0, 0.02) // Weight back\n .rotate(BoneName.KNEE_R, toRadians(-15), 0, 0) // Rear knee bends more\n .rotate(BoneName.KNEE_L, toRadians(-5), 0, 0) // Lead knee straightens\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Lead foot lifts and extends (이동 - λ””λ”€λ°œ)\n .at(0.08, \"linear\")\n .position(BoneName.PELVIS, 0.02, -0.01, 0.08) // Forward, slight drop\n .rotate(BoneName.HIP_L, toRadians(-20), 0, 0) // Lead hip lifts\n .rotate(BoneName.KNEE_L, toRadians(-25), 0, 0) // Lead knee lifts\n .rotate(BoneName.FOOT_L, toRadians(20), 0, 0) // Toe up, heel ready\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Lead foot lands, weight begins transfer (μ°©μ§€)\n .at(0.14, \"ease-in\")\n .position(BoneName.PELVIS, 0, -0.015, 0.2) // Forward on lead foot\n .rotate(BoneName.HIP_L, toRadians(-10), 0, 0) \n .rotate(BoneName.KNEE_L, toRadians(-12), 0, 0) // Lead accepts weight\n .rotate(BoneName.FOOT_L, toRadians(5), 0, 0) // Foot rolling flat\n .rotate(BoneName.KNEE_R, toRadians(-8), 0, 0) // Rear lightens\n .done<MartialArtsAnimationBuilder>()\n // Final: Balanced stance restored\n .at(0.2, \"ease-in\")\n .position(BoneName.PELVIS, 0, 0, 0.3) // Final forward position\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0) // Balanced\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0) // Balanced\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * SLIDE STEP BACKWARD Animation (λ―Έλ„λŸΌλ³΄ ν›„)\n *\n * **Korean Martial Arts Principle**: 후퇴 μ‹œ μ„ ν–‰ 이동 (Rear foot retreats first)\n *\n * Defensive retreat maintaining stance and guard:\n * 1. Rear foot (right) lifts and moves 30cm backward\n * 2. Weight transfers to rear foot (ball-of-foot landing)\n * 3. Lead foot (left) slides backward to maintain stance width\n * 4. Eyes stay on opponent, guard up\n *\n * **Weight Transfer**: Lead foot β†’ Rear foot β†’ Balanced\n * **Landing**: Ball-of-foot first (unlike forward heel-first)\n *\n * @korean λ―Έλ„λŸΌλ³΄ν›„μ• λ‹ˆλ©”μ΄μ…˜\n */\nexport const FOOTWORK_SLIDE_BACK_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_slide_back\", \"λ―Έλ„λŸΌλ³΄ ν›„\")\n .asMovement(0.2)\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Weight shift to lead foot (μ€€λΉ„)\n .at(0.03, \"ease-out\")\n .position(BoneName.PELVIS, -0.03, 0, -0.02) // Weight forward\n .rotate(BoneName.KNEE_L, toRadians(-15), 0, 0) // Lead accepts weight\n .rotate(BoneName.KNEE_R, toRadians(-5), 0, 0) // Rear lightens\n .done<MartialArtsAnimationBuilder>()\n // Rear foot lifts and extends back (이동)\n .at(0.08, \"linear\")\n .position(BoneName.PELVIS, -0.02, -0.01, -0.08) // Backward\n .rotate(BoneName.HIP_R, toRadians(18), 0, 0) // Rear hip extends\n .rotate(BoneName.KNEE_R, toRadians(-20), 0, 0) // Rear knee lifts slightly\n .rotate(BoneName.FOOT_R, toRadians(-15), 0, 0) // Ball of foot ready\n .done<MartialArtsAnimationBuilder>()\n // Rear foot lands on ball, weight transfers (μ°©μ§€)\n .at(0.14, \"ease-in\")\n .position(BoneName.PELVIS, 0, -0.015, -0.2) // Backward on rear foot\n .rotate(BoneName.HIP_R, toRadians(8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-12), 0, 0) // Rear accepts weight\n .rotate(BoneName.FOOT_R, toRadians(-8), 0, 0) // Heel settling\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0) // Lead lightens\n .done<MartialArtsAnimationBuilder>()\n // Final position\n .at(0.2, \"ease-in\")\n .position(BoneName.PELVIS, 0, 0, -0.3) // Final rear position\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// SLIDE STEP ANIMATIONS (λ―Έλ„λŸΌλ³΄) - Lateral Movement\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * SLIDE STEP LEFT Animation (λ―Έλ„λŸΌλ³΄ 쒌)\n *\n * **Korean Martial Arts Principle**: μΈ‘λ©΄ μ„ ν–‰ 이동 (Lateral lead foot movement)\n *\n * Creates angle advantage while maintaining forward guard:\n * 1. Left foot slides 25cm lateral left\n * 2. Weight shifts left while maintaining balance\n * 3. Right foot follows to restore stance width\n * 4. Pelvis rotates slightly, spine counter-rotates to keep guard forward\n *\n * **Tactical Advantage**: Off-line positioning, angle creation\n *\n * @korean λ―Έλ„λŸΌλ³΄μ’Œμ• λ‹ˆλ©”μ΄μ…˜\n */\nexport const FOOTWORK_SLIDE_LEFT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_slide_left\", \"λ―Έλ„λŸΌλ³΄ 쒌\")\n .asMovement(0.2)\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Weight shifts right (μ€€λΉ„)\n .at(0.05, \"ease-out\")\n .position(BoneName.PELVIS, 0.04, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, toRadians(3)) // Tilt right\n .rotate(BoneName.KNEE_R, toRadians(-12), 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-5), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Left foot slides lateral (이동)\n .at(0.1, \"linear\")\n .position(BoneName.PELVIS, -0.08, -0.01, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(5), toRadians(5)) // Hip engages\n .rotate(BoneName.SPINE_LOWER, 0, toRadians(-3), 0) // Counter-rotate\n .done<MartialArtsAnimationBuilder>()\n // Weight transfers to left (μ°©μ§€)\n .at(0.15, \"ease-in\")\n .position(BoneName.PELVIS, -0.2, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-8), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Final position (μ•ˆμ •)\n .at(0.2, \"ease-in\")\n .position(BoneName.PELVIS, -0.25, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, 0) // Return neutral\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard forward\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * SLIDE STEP RIGHT Animation (λ―Έλ„λŸΌλ³΄ 우)\n *\n * **Korean Martial Arts Principle**: μΈ‘λ©΄ μ„ ν–‰ 이동 (Lateral lead foot movement)\n *\n * Mirror of left slide step for right lateral movement.\n *\n * @korean λ―Έλ„λŸΌλ³΄μš°μ• λ‹ˆλ©”μ΄μ…˜\n */\nexport const FOOTWORK_SLIDE_RIGHT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_slide_right\", \"λ―Έλ„λŸΌλ³΄ 우\")\n .asMovement(0.2)\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Weight shifts left (μ€€λΉ„)\n .at(0.05, \"ease-out\")\n .position(BoneName.PELVIS, -0.04, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, toRadians(-3))\n .rotate(BoneName.KNEE_L, toRadians(-12), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-5), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Right foot slides lateral (이동)\n .at(0.1, \"linear\")\n .position(BoneName.PELVIS, 0.08, -0.01, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(-5), toRadians(-5))\n .rotate(BoneName.SPINE_LOWER, 0, toRadians(3), 0)\n .done<MartialArtsAnimationBuilder>()\n // Weight transfers to right (μ°©μ§€)\n .at(0.15, \"ease-in\")\n .position(BoneName.PELVIS, 0.2, 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Final position (μ•ˆμ •)\n .at(0.2, \"ease-in\")\n .position(BoneName.PELVIS, 0.25, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// SWITCH STEP ANIMATION (μŠ€μœ„μΉ˜ μŠ€ν…) - Stance Reversal\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * SWITCH STEP Animation (μŠ€μœ„μΉ˜ μŠ€ν…)\n *\n * **Korean Martial Arts Principle**: λ°œλ°”κΏˆ 도약 (Foot-exchange hop)\n *\n * Quick stance reversal used to confuse opponent or change angles:\n * 1. Small hop off ground with both feet\n * 2. Feet exchange positions mid-air (lead becomes rear, rear becomes lead)\n * 3. Land with opposite foot forward\n * 4. Brief moment of vulnerability during hop\n *\n * **Weight Transfer**: Balanced β†’ Airborne β†’ Reversed stance\n * **Duration**: 280ms (fast for rhythm disruption)\n * **Tactical Use**: Feint opponent's timing, switch power side\n *\n * **Momentary Vulnerability**: During hop, cannot defend or attack\n *\n * @korean μŠ€μœ„μΉ˜μŠ€ν…μ• λ‹ˆλ©”μ΄μ…˜\n */\nexport const FOOTWORK_SWITCH_STEP_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_switch_step\", \"μŠ€μœ„μΉ˜ μŠ€ν…\")\n .asMovement(0.28)\n // Initial stance - left foot forward\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Crouch preparation for hop (μ€€λΉ„)\n .at(0.05, \"ease-out\")\n .position(BoneName.PELVIS, 0, -0.03, 0) // Drop for spring\n .rotate(BoneName.KNEE_L, toRadians(-20), 0, 0) // Deep crouch\n .rotate(BoneName.KNEE_R, toRadians(-22), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Explosive hop - both feet leave ground (도약)\n .at(0.1, \"ease-out\")\n .position(BoneName.PELVIS, 0, 0.05, 0) // Airborne\n .rotate(BoneName.KNEE_L, toRadians(-15), 0, 0) // Legs partially extend\n .rotate(BoneName.KNEE_R, toRadians(-18), 0, 0)\n .rotate(BoneName.HIP_L, toRadians(5), 0, 0) // Begin rotation\n .rotate(BoneName.HIP_R, toRadians(-5), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Mid-air - feet exchange (곡쀑 κ΅ν™˜)\n .at(0.15, \"linear\")\n .position(BoneName.PELVIS, 0, 0.04, 0) // Peak of hop\n .rotate(BoneName.PELVIS, 0, toRadians(15), 0) // Body rotates\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Landing - right foot now forward (μ°©μ§€)\n .at(0.2, \"ease-in\")\n .position(BoneName.PELVIS, 0, -0.02, 0) // Impact absorption\n .rotate(BoneName.PELVIS, 0, toRadians(25), 0) // Rotation continues\n .rotate(BoneName.KNEE_R, toRadians(-18), 0, 0) // Right knee bends\n .rotate(BoneName.KNEE_L, toRadians(-20), 0, 0) // Left knee bends\n .done<MartialArtsAnimationBuilder>()\n // Stabilization - reversed stance (μ•ˆμ •)\n .at(0.25, \"ease-in\")\n .position(BoneName.PELVIS, 0, -0.01, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(30), 0) // Complete rotation\n .rotate(BoneName.KNEE_R, toRadians(-8), 0, 0) // Now lead foot\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0) // Now rear foot\n .done<MartialArtsAnimationBuilder>()\n // Final - stable reversed stance\n .at(0.28, \"ease-in\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(30), 0)\n .rotate(BoneName.KNEE_R, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// BOUNCE STEP ANIMATION (λ°”μš΄μŠ€ μŠ€ν…) - Rhythmic Movement\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * BOUNCE STEP Animation (λ°”μš΄μŠ€ μŠ€ν…)\n *\n * **Korean Martial Arts Principle**: 리듬 보법 (Rhythmic footwork)\n *\n * Light bouncing movement on balls of feet from boxing:\n * 1. Constant up-down bouncing motion\n * 2. Weight on balls of feet, heels slightly elevated\n * 3. Creates rhythm that's harder for opponent to time\n * 4. Energy efficient - small bounces, not jumps\n *\n * **Weight Distribution**: Always on balls of feet (μ•žκΏˆμΉ˜)\n * **Height Variation**: 2-3cm vertical displacement\n * **Frequency**: 2.5 bounces per second (fast rhythm)\n * **Duration**: 400ms for complete bounce cycle\n *\n * **Tactical Advantage**: \n * - Unpredictable timing\n * - Faster reaction time from active stance\n * - Harder to time attacks against\n *\n * @korean λ°”μš΄μŠ€μŠ€ν…μ• λ‹ˆλ©”μ΄μ…˜\n */\nexport const FOOTWORK_BOUNCE_STEP_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_bounce_step\", \"λ°”μš΄μŠ€ μŠ€ν…\")\n .asMovement(0.4)\n // Start on balls of feet (μ€€λΉ„)\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0.01, 0) // Slightly elevated\n .rotate(BoneName.KNEE_L, toRadians(-5), 0, 0) // Slight bend\n .rotate(BoneName.KNEE_R, toRadians(-7), 0, 0)\n .rotate(BoneName.FOOT_L, toRadians(-10), 0, 0) // Heel up\n .rotate(BoneName.FOOT_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // First bounce down (1μ°¨ λ°”μš΄μŠ€ ν•˜κ°•)\n .at(0.08, \"ease-in\")\n .position(BoneName.PELVIS, 0, -0.01, 0)\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0) // Knees absorb\n .rotate(BoneName.KNEE_R, toRadians(-12), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // First bounce up (1μ°¨ λ°”μš΄μŠ€ μƒμŠΉ)\n .at(0.16, \"ease-out\")\n .position(BoneName.PELVIS, 0, 0.02, 0.05) // Slight forward drift\n .rotate(BoneName.KNEE_L, toRadians(-5), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-7), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Second bounce down (2μ°¨ λ°”μš΄μŠ€ ν•˜κ°•)\n .at(0.24, \"ease-in\")\n .position(BoneName.PELVIS, 0, -0.01, 0.08)\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-12), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Second bounce up (2μ°¨ λ°”μš΄μŠ€ μƒμŠΉ)\n .at(0.32, \"ease-out\")\n .position(BoneName.PELVIS, 0, 0.02, 0.12)\n .rotate(BoneName.KNEE_L, toRadians(-5), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-7), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Final position - ready for next bounce (μ΅œμ’… μœ„μΉ˜)\n .at(0.4, \"ease-in\")\n .position(BoneName.PELVIS, 0, 0.01, 0.15)\n .rotate(BoneName.KNEE_L, toRadians(-7), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-9), 0, 0)\n .rotate(BoneName.FOOT_L, toRadians(-10), 0, 0) // Still on balls\n .rotate(BoneName.FOOT_R, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// TRIANGLE FOOTWORK ANIMATION (삼각 이동) - Advanced Angles\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * TRIANGLE FOOTWORK Animation (삼각 이동)\n *\n * **Korean Martial Arts Principle**: 삼각 진법 (Triangle tactical positioning)\n *\n * Advanced footwork creating tactical angles through three-point movement:\n * 1. Step forward-left at 45Β° (Point 1)\n * 2. Pivot on lead foot (Point 2)\n * 3. Step lateral-left to complete triangle (Point 3)\n * 4. Results in off-angle position with opponent exposed\n *\n * **Tactical Geometry**:\n * - Creates 90Β° angle from original position\n * - Off-line from opponent's centerline\n * - Opens attack angles to opponent's side\n * - Defensive value: harder to hit\n *\n * **Duration**: 650ms (requires precision)\n * **Distance**: 40cm total displacement (diagonal pattern)\n *\n * @korean μ‚Όκ°μ΄λ™μ• λ‹ˆλ©”μ΄μ…˜\n */\nexport const FOOTWORK_TRIANGLE_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_triangle\", \"삼각 이동\")\n .asMovement(0.65)\n // Initial stance\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Point 1: Step forward-left at 45Β° (1번 지점 - μ „μ’Œ 45Β°)\n .at(0.15, \"ease-out\")\n .position(BoneName.PELVIS, -0.12, -0.01, 0.12) // Diagonal forward-left\n .rotate(BoneName.PELVIS, 0, toRadians(-10), 0) // Slight body turn\n .rotate(BoneName.KNEE_L, toRadians(-12), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Point 2: Pivot on lead foot (2번 지점 - μΆ•λ°œ νšŒμ „)\n .at(0.35, \"linear\")\n .position(BoneName.PELVIS, -0.15, -0.015, 0.15)\n .rotate(BoneName.PELVIS, 0, toRadians(-35), 0) // Pivot 45Β° more\n .rotate(BoneName.SPINE_LOWER, 0, toRadians(15), 0) // Counter-rotate upper body\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0) // Pivot foot stable\n .rotate(BoneName.KNEE_R, toRadians(-8), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Point 3: Step lateral-left to complete triangle (3번 지점 - 쒌츑 μ™„μ„±)\n .at(0.5, \"ease-in\")\n .position(BoneName.PELVIS, -0.28, -0.02, 0.12) // Lateral left\n .rotate(BoneName.PELVIS, 0, toRadians(-45), 0) // 90Β° total from start\n .rotate(BoneName.SPINE_LOWER, 0, toRadians(10), 0)\n .rotate(BoneName.KNEE_L, toRadians(-12), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Final: Stabilize in off-angle position (μ΅œμ’… μ•ˆμ •ν™”)\n .at(0.65, \"ease-in\")\n .position(BoneName.PELVIS, -0.3, 0, 0.1) // Final triangle point\n .rotate(BoneName.PELVIS, 0, toRadians(-45), 0) // 90Β° off-line\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0) // Upper body faces forward\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained throughout\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// PIVOT STEP ANIMATIONS (μΆ•μ‘±νšŒμ „) - Ball-of-Foot Rotation\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * PIVOT LEFT Animation (μΆ•μ‘±νšŒμ „ 쒌)\n *\n * **Korean Martial Arts Principle**: μ•žκΏˆμΉ˜ νšŒμ „ (Ball-of-foot pivot)\n *\n * 45Β° rotation to the left on planted lead foot:\n * 1. Weight shifts to lead foot (left)\n * 2. Pivot on ball of lead foot\n * 3. Rear foot swings left in arc\n * 4. Upper body rotates with lower, guard maintained\n *\n * **Pivot Mechanics** (νšŒμ „ μ—­ν•™):\n * - Pivot point: Ball of lead foot (μ•žκΏˆμΉ˜)\n * - Weight: 80% on pivot foot during rotation\n * - Arc: Rear foot travels 25cm in arc\n * - Speed: 280ms for smooth 45Β° rotation\n *\n * **Tactical Use**: Quick angle change, evade linear attacks\n *\n * @korean μΆ•μ‘±νšŒμ „μ’Œμ• λ‹ˆλ©”μ΄μ…˜\n */\nexport const FOOTWORK_PIVOT_LEFT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_pivot_left\", \"μΆ•μ‘±νšŒμ „ 쒌\")\n .asMovement(0.25)\n // Initial stance\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Weight shift to lead foot (pivot preparation) (μ€€λΉ„)\n .at(0.06, \"ease-out\")\n .position(BoneName.PELVIS, -0.02, -0.01, 0) // Forward onto lead\n .rotate(BoneName.KNEE_L, toRadians(-12), 0, 0) // Lead accepts weight\n .rotate(BoneName.KNEE_R, toRadians(-5), 0, 0) // Rear lightens\n .rotate(BoneName.FOOT_L, toRadians(-8), 0, 0) // Weight on ball\n .done<MartialArtsAnimationBuilder>()\n // Begin pivot - rear foot lifts slightly (νšŒμ „ μ‹œμž‘)\n .at(0.12, \"linear\")\n .position(BoneName.PELVIS, -0.02, -0.015, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(-15), 0) // Body begins rotation\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0) // Pivot foot stable\n .rotate(BoneName.KNEE_R, toRadians(-8), 0, 0) // Rear foot active\n .rotate(BoneName.HIP_R, toRadians(5), 0, 0) // Rear hip lifts\n .done<MartialArtsAnimationBuilder>()\n // Mid-pivot - maximum rotation speed (νšŒμ „ 가속)\n .at(0.18, \"linear\")\n .position(BoneName.PELVIS, -0.01, -0.02, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(-35), 0) // Fast rotation\n .rotate(BoneName.SPINE_LOWER, 0, toRadians(5), 0) // Slight counter-rotate for balance\n .rotate(BoneName.KNEE_L, toRadians(-12), 0, 0)\n .rotate(BoneName.FOOT_L, toRadians(-10), 0, 0) // Still on ball\n .done<MartialArtsAnimationBuilder>()\n // Complete pivot - rear foot plants (νšŒμ „ μ™„λ£Œ)\n .at(0.2, \"ease-in\")\n .position(BoneName.PELVIS, 0, -0.015, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(-45), 0) // 45Β° rotation complete\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0) // Body aligned\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0) // Rear foot plants\n .rotate(BoneName.FOOT_L, toRadians(-5), 0, 0) // Pivot foot settling\n .done<MartialArtsAnimationBuilder>()\n // Stabilize in new angle (μ•ˆμ •ν™”)\n .at(0.25, \"ease-in\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(-45), 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.FOOT_L, 0, 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * PIVOT RIGHT Animation (μΆ•μ‘±νšŒμ „ 우)\n *\n * **Korean Martial Arts Principle**: μ•žκΏˆμΉ˜ νšŒμ „ (Ball-of-foot pivot)\n *\n * 45Β° rotation to the right on planted lead foot.\n * Mirror of left pivot mechanics.\n *\n * @korean μΆ•μ‘±νšŒμ „μš°μ• λ‹ˆλ©”μ΄μ…˜\n */\nexport const FOOTWORK_PIVOT_RIGHT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_pivot_right\", \"μΆ•μ‘±νšŒμ „ 우\")\n .asMovement(0.25)\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Weight shift to lead foot (μ€€λΉ„)\n .at(0.06, \"ease-out\")\n .position(BoneName.PELVIS, -0.02, -0.01, 0)\n .rotate(BoneName.KNEE_L, toRadians(-12), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-5), 0, 0)\n .rotate(BoneName.FOOT_L, toRadians(-8), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Begin pivot (νšŒμ „ μ‹œμž‘)\n .at(0.12, \"linear\")\n .position(BoneName.PELVIS, -0.02, -0.015, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(15), 0) // Right rotation\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-8), 0, 0)\n .rotate(BoneName.HIP_R, toRadians(5), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Mid-pivot (νšŒμ „ 가속)\n .at(0.18, \"linear\")\n .position(BoneName.PELVIS, -0.01, -0.02, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(35), 0)\n .rotate(BoneName.SPINE_LOWER, 0, toRadians(-5), 0)\n .rotate(BoneName.KNEE_L, toRadians(-12), 0, 0)\n .rotate(BoneName.FOOT_L, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Complete pivot (νšŒμ „ μ™„λ£Œ)\n .at(0.2, \"ease-in\")\n .position(BoneName.PELVIS, 0, -0.015, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(45), 0)\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.FOOT_L, toRadians(-5), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Stabilize (μ•ˆμ •ν™”)\n .at(0.25, \"ease-in\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(45), 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.FOOT_L, 0, 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// SHUFFLE STEP ANIMATION (μ„žμŒλ³΄) - Micro-Adjustments\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * SHUFFLE STEP Animation (μ„žμŒλ³΄)\n *\n * **Korean Martial Arts Principle**: λ―Έμ„Έ μ‘°μ • (Micro-position adjustment)\n *\n * Quick 10cm micro-adjustment for positional fine-tuning:\n * 1. Both feet move together in small shuffle\n * 2. Minimal vertical displacement (stay low)\n * 3. Ultra-fast 100ms duration\n * 4. Used for range management and timing adjustments\n *\n * **Characteristics**:\n * - Distance: 10cm (half a foot width)\n * - Duration: 100ms (ultra-fast, 6 frames @ 60fps)\n * - Weight: Remains balanced throughout\n * - Height: Minimal bob (1cm max)\n *\n * **Tactical Use**: \n * - Fine-tune distance without committing\n * - Adjust stance width\n * - Reset rhythm\n * - Feint movement\n *\n * @korean μ„žμŒλ³΄μ• λ‹ˆλ©”μ΄μ…˜\n */\nexport const FOOTWORK_SHUFFLE_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_shuffle\", \"μ„žμŒλ³΄\")\n .asMovement(0.1)\n // Initial - balanced on both feet\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Slight crouch for shuffle (μ€€λΉ„)\n .at(0.03, \"ease-out\")\n .position(BoneName.PELVIS, 0, -0.008, 0) // Minimal drop\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-12), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Execute shuffle forward (μ‹€ν–‰)\n .at(0.07, \"linear\")\n .position(BoneName.PELVIS, 0, -0.01, 0.1) // 10cm forward\n .rotate(BoneName.KNEE_L, toRadians(-9), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-11), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Return to normal height (볡귀)\n .at(0.1, \"ease-in\")\n .position(BoneName.PELVIS, 0, 0, 0.1) // Final position\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ANIMATION COLLECTIONS\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Map of all footwork animations by name\n *\n * **PHASE 4 ENHANCED**: 95%+ Korean martial arts authenticity\n * All animations now feature:\n * - Detailed weight transfer mechanics (체쀑이동)\n * - Proper foot placement (λ””λ”€λ°œ/μΆ•λ°œ)\n * - Guard maintenance throughout\n * - Realistic timing and distances\n * - Cultural authenticity with Korean terminology\n *\n * @korean λ³΄λ²•μ• λ‹ˆλ©”μ΄μ…˜λ§΅\n */\nexport const FOOTWORK_ANIMATIONS = new Map<string, SkeletalAnimation>([\n // Circular Steps (μ›ν˜•λ³΄) - Lateral circular movement\n [\"footwork_circular_left\", FOOTWORK_CIRCULAR_LEFT_ANIMATION],\n [\"footwork_circular_right\", FOOTWORK_CIRCULAR_RIGHT_ANIMATION],\n \n // Slide Steps (λ―Έλ„λŸΌλ³΄) - Lead foot moves first\n [\"footwork_slide_forward\", FOOTWORK_SLIDE_FORWARD_ANIMATION],\n [\"footwork_slide_back\", FOOTWORK_SLIDE_BACK_ANIMATION],\n [\"footwork_slide_left\", FOOTWORK_SLIDE_LEFT_ANIMATION],\n [\"footwork_slide_right\", FOOTWORK_SLIDE_RIGHT_ANIMATION],\n \n // Pivot Steps (μΆ•μ‘±νšŒμ „) - Ball-of-foot rotation\n [\"footwork_pivot_left\", FOOTWORK_PIVOT_LEFT_ANIMATION],\n [\"footwork_pivot_right\", FOOTWORK_PIVOT_RIGHT_ANIMATION],\n \n // Shuffle Step (μ„žμŒλ³΄) - Micro-adjustments\n [\"footwork_shuffle\", FOOTWORK_SHUFFLE_ANIMATION],\n]);\n\n/**\n * Get footwork animation by name\n *\n * @param animationName - Animation identifier\n * @returns Footwork animation or undefined if not found\n * @korean λ³΄λ²•μ• λ‹ˆλ©”μ΄μ…˜κ°€μ Έμ˜€κΈ°\n */\nexport function getFootworkAnimation(\n animationName: string\n): SkeletalAnimation | undefined {\n return FOOTWORK_ANIMATIONS.get(animationName);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"FootworkSkeletalAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/FootworkSkeletalAnimations.ts"],"sourcesContent":["/**\n * Korean Martial Arts Footwork Animations with Skeletal Keyframes (보법 μ• λ‹ˆλ©”μ΄μ…˜)\n *\n * **PHASE 4 ENHANCEMENT: 95%+ Korean Martial Arts Authenticity**\n *\n * Defines realistic footwork animation sequences for specialized movement patterns:\n * - μŠ¬λΌμ΄λ“œ μŠ€ν… (Slide Step): Lead foot moves first, rear follows\n * - μŠ€μœ„μΉ˜ μŠ€ν… (Switch Step): Quick stance reversal with hop\n * - λ°”μš΄μŠ€ μŠ€ν… (Bounce Step): Rhythmic boxing-style bounce\n * - 삼각 이동 (Triangle Footwork): Three-point angular movement\n * - μ›ν˜•λ³΄ (Circular Step): Lateral movement maintaining guard\n * - λ―Έλ„λŸΌλ³΄ (Glide Step): Both feet move together smoothly\n * - μΆ•μ‘±νšŒμ „ (Pivot Step): Ball-of-foot rotation\n * - μ„žμŒλ³΄ (Shuffle): Quick micro-adjustments\n *\n * Korean Martial Arts Footwork Principles Applied:\n * - λ””λ”€λ°œ (Didimbal): Stepping foot mechanics with proper heel/ball placement\n * - μΆ•λ°œ (Chukbal): Pivot foot stability and balance maintenance\n * - 체쀑이동 (Chejung Idong): Smooth weight transfer between feet\n * - 쀑심이동 (Jungsim Idong): Center of mass movement coordination\n * - λ³΄λ²•μ˜ 리듬 (Bobeop-ui Rhythm): Rhythmic footwork patterns from boxing\n *\n * @module systems/animation/FootworkSkeletalAnimations\n * @category Animation System\n * @korean λ³΄λ²•μ• λ‹ˆλ©”μ΄μ…˜\n */\n\nimport type { SkeletalAnimation } from \"@/types/skeletal\";\nimport { BoneName } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\nimport { toRadians } from \"@/utils/math\";\n\n// ═══════════════════════════════════════════════════════════════════════════\n// CIRCULAR STEP ANIMATIONS (μ›ν˜•λ³΄) - Lateral circular footwork\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * CIRCULAR STEP LEFT Animation (μ›ν˜•λ³΄ 쒌)\n *\n * **Korean Martial Arts Principle**: μ›ν˜• μΈ‘λ©΄ 이동 (Circular lateral movement)\n *\n * Creates angle by moving laterally in an arc:\n * 1. Both feet move in synchronized circular pattern\n * 2. Maintains guard and balance throughout\n * 3. Creates angle advantage for counter-striking\n * 4. Common in Taekyon and Hapkido for off-line positioning\n *\n * **Tactical Use**: Circle to opponent's weak side\n *\n * @korean μ›ν˜•λ³΄μ’Œμ• λ‹ˆλ©”μ΄μ…˜\n */\nexport const FOOTWORK_CIRCULAR_LEFT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_circular_left\", \"μ›ν˜•λ³΄ 쒌\")\n .asMovement(0.3)\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Begin circular arc left (μ›ν˜Έ μ‹œμž‘)\n .at(0.1, \"ease-out\")\n .position(BoneName.PELVIS, -0.08, -0.01, 0.05) // Arc pattern\n .rotate(BoneName.PELVIS, 0, toRadians(5), toRadians(3))\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Mid-arc (μ›ν˜Έ 쀑간)\n .at(0.2, \"linear\")\n .position(BoneName.PELVIS, -0.2, 0, 0.08) // Peak of arc\n .rotate(BoneName.PELVIS, 0, toRadians(8), toRadians(5))\n .rotate(BoneName.SPINE_LOWER, 0, toRadians(-4), 0) // Counter-rotate upper body\n .done<MartialArtsAnimationBuilder>()\n // Complete circle (원 μ™„μ„±)\n .at(0.3, \"ease-in\")\n .position(BoneName.PELVIS, -0.25, 0, 0.1) // Final position\n .rotate(BoneName.PELVIS, 0, 0, 0) // Reset rotation\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * CIRCULAR STEP RIGHT Animation (μ›ν˜•λ³΄ 우)\n *\n * **Korean Martial Arts Principle**: μ›ν˜• μΈ‘λ©΄ 이동 (Circular lateral movement)\n *\n * Mirror of left circular step for right lateral arc movement.\n *\n * @korean μ›ν˜•λ³΄μš°μ• λ‹ˆλ©”μ΄μ…˜\n */\nexport const FOOTWORK_CIRCULAR_RIGHT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_circular_right\", \"μ›ν˜•λ³΄ 우\")\n .asMovement(0.3)\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Begin circular arc right (μ›ν˜Έ μ‹œμž‘)\n .at(0.1, \"ease-out\")\n .position(BoneName.PELVIS, 0.08, -0.01, 0.05) // Arc pattern\n .rotate(BoneName.PELVIS, 0, toRadians(-5), toRadians(-3))\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Mid-arc (μ›ν˜Έ 쀑간)\n .at(0.2, \"linear\")\n .position(BoneName.PELVIS, 0.2, 0, 0.08) // Peak of arc\n .rotate(BoneName.PELVIS, 0, toRadians(-8), toRadians(-5))\n .rotate(BoneName.SPINE_LOWER, 0, toRadians(4), 0) // Counter-rotate upper body\n .done<MartialArtsAnimationBuilder>()\n // Complete circle (원 μ™„μ„±)\n .at(0.3, \"ease-in\")\n .position(BoneName.PELVIS, 0.25, 0, 0.1) // Final position\n .rotate(BoneName.PELVIS, 0, 0, 0) // Reset rotation\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// SLIDE STEP ANIMATIONS (λ―Έλ„λŸΌλ³΄) - Lead foot moves, rear follows\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * SLIDE STEP FORWARD Animation (λ―Έλ„λŸΌλ³΄ μ „)\n *\n * **Korean Martial Arts Principle**: λ””λ”€λ°œ μ„ ν–‰ 이동 (Lead foot advances first)\n *\n * Authentic boxing/Korean martial arts slide step where:\n * 1. Lead foot (left) lifts and advances 30cm forward\n * 2. Weight transfers to lead foot\n * 3. Rear foot (right) slides forward to maintain stance width\n * 4. Guard maintained throughout - no telegraphing\n *\n * **Weight Transfer Mechanics** (체쀑이동 원리):\n * - Phase 1 (0-0.05s): Weight shifts to rear foot, lead foot lifts (μ€€λΉ„)\n * - Phase 2 (0.05-0.12s): Lead foot extends forward, heel-first landing (이동)\n * - Phase 3 (0.12-0.18s): Weight transfers to lead, rear foot slides (μ°©μ§€)\n * - Phase 4 (0.18-0.2s): Stance width restored, balanced (μ•ˆμ •)\n *\n * **Distance**: 30cm forward | **Duration**: 200ms (12 frames @ 60fps)\n * **Maintains**: Stance width, guard position, forward-facing orientation\n *\n * @korean λ―Έλ„λŸΌλ³΄μ „μ• λ‹ˆλ©”μ΄μ…˜\n */\nexport const FOOTWORK_SLIDE_FORWARD_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_slide_forward\", \"λ―Έλ„λŸΌλ³΄ μ „\")\n .asMovement(0.2)\n // Initial stance - balanced position\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0) // Front knee slight bend\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0) // Back knee more bent\n .done<MartialArtsAnimationBuilder>()\n // Phase 1: Weight shift to rear, lead foot lightens (μ€€λΉ„)\n .at(0.03, \"ease-out\")\n .position(BoneName.PELVIS, 0.03, 0, 0.02) // Weight back\n .rotate(BoneName.KNEE_R, toRadians(-15), 0, 0) // Rear knee bends more\n .rotate(BoneName.KNEE_L, toRadians(-5), 0, 0) // Lead knee straightens\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Lead foot lifts and extends (이동 - λ””λ”€λ°œ)\n .at(0.08, \"linear\")\n .position(BoneName.PELVIS, 0.02, -0.01, 0.08) // Forward, slight drop\n .rotate(BoneName.HIP_L, toRadians(-20), 0, 0) // Lead hip lifts\n .rotate(BoneName.KNEE_L, toRadians(-25), 0, 0) // Lead knee lifts\n .rotate(BoneName.FOOT_L, toRadians(20), 0, 0) // Toe up, heel ready\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Lead foot lands, weight begins transfer (μ°©μ§€)\n .at(0.14, \"ease-in\")\n .position(BoneName.PELVIS, 0, -0.015, 0.2) // Forward on lead foot\n .rotate(BoneName.HIP_L, toRadians(-10), 0, 0) \n .rotate(BoneName.KNEE_L, toRadians(-12), 0, 0) // Lead accepts weight\n .rotate(BoneName.FOOT_L, toRadians(5), 0, 0) // Foot rolling flat\n .rotate(BoneName.KNEE_R, toRadians(-8), 0, 0) // Rear lightens\n .done<MartialArtsAnimationBuilder>()\n // Final: Balanced stance restored\n .at(0.2, \"ease-in\")\n .position(BoneName.PELVIS, 0, 0, 0.3) // Final forward position\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0) // Balanced\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0) // Balanced\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * SLIDE STEP BACKWARD Animation (λ―Έλ„λŸΌλ³΄ ν›„)\n *\n * **Korean Martial Arts Principle**: 후퇴 μ‹œ μ„ ν–‰ 이동 (Rear foot retreats first)\n *\n * Defensive retreat maintaining stance and guard:\n * 1. Rear foot (right) lifts and moves 30cm backward\n * 2. Weight transfers to rear foot (ball-of-foot landing)\n * 3. Lead foot (left) slides backward to maintain stance width\n * 4. Eyes stay on opponent, guard up\n *\n * **Weight Transfer**: Lead foot β†’ Rear foot β†’ Balanced\n * **Landing**: Ball-of-foot first (unlike forward heel-first)\n *\n * @korean λ―Έλ„λŸΌλ³΄ν›„μ• λ‹ˆλ©”μ΄μ…˜\n */\nexport const FOOTWORK_SLIDE_BACK_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_slide_back\", \"λ―Έλ„λŸΌλ³΄ ν›„\")\n .asMovement(0.2)\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Weight shift to lead foot (μ€€λΉ„)\n .at(0.03, \"ease-out\")\n .position(BoneName.PELVIS, -0.03, 0, -0.02) // Weight forward\n .rotate(BoneName.KNEE_L, toRadians(-15), 0, 0) // Lead accepts weight\n .rotate(BoneName.KNEE_R, toRadians(-5), 0, 0) // Rear lightens\n .done<MartialArtsAnimationBuilder>()\n // Rear foot lifts and extends back (이동)\n .at(0.08, \"linear\")\n .position(BoneName.PELVIS, -0.02, -0.01, -0.08) // Backward\n .rotate(BoneName.HIP_R, toRadians(18), 0, 0) // Rear hip extends\n .rotate(BoneName.KNEE_R, toRadians(-20), 0, 0) // Rear knee lifts slightly\n .rotate(BoneName.FOOT_R, toRadians(-15), 0, 0) // Ball of foot ready\n .done<MartialArtsAnimationBuilder>()\n // Rear foot lands on ball, weight transfers (μ°©μ§€)\n .at(0.14, \"ease-in\")\n .position(BoneName.PELVIS, 0, -0.015, -0.2) // Backward on rear foot\n .rotate(BoneName.HIP_R, toRadians(8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-12), 0, 0) // Rear accepts weight\n .rotate(BoneName.FOOT_R, toRadians(-8), 0, 0) // Heel settling\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0) // Lead lightens\n .done<MartialArtsAnimationBuilder>()\n // Final position\n .at(0.2, \"ease-in\")\n .position(BoneName.PELVIS, 0, 0, -0.3) // Final rear position\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// SLIDE STEP ANIMATIONS (λ―Έλ„λŸΌλ³΄) - Lateral Movement\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * SLIDE STEP LEFT Animation (λ―Έλ„λŸΌλ³΄ 쒌)\n *\n * **Korean Martial Arts Principle**: μΈ‘λ©΄ μ„ ν–‰ 이동 (Lateral lead foot movement)\n *\n * Creates angle advantage while maintaining forward guard:\n * 1. Left foot slides 25cm lateral left\n * 2. Weight shifts left while maintaining balance\n * 3. Right foot follows to restore stance width\n * 4. Pelvis rotates slightly, spine counter-rotates to keep guard forward\n *\n * **Tactical Advantage**: Off-line positioning, angle creation\n *\n * @korean λ―Έλ„λŸΌλ³΄μ’Œμ• λ‹ˆλ©”μ΄μ…˜\n */\nexport const FOOTWORK_SLIDE_LEFT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_slide_left\", \"λ―Έλ„λŸΌλ³΄ 쒌\")\n .asMovement(0.2)\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Weight shifts right (μ€€λΉ„)\n .at(0.05, \"ease-out\")\n .position(BoneName.PELVIS, 0.04, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, toRadians(3)) // Tilt right\n .rotate(BoneName.KNEE_R, toRadians(-12), 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-5), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Left foot slides lateral (이동)\n .at(0.1, \"linear\")\n .position(BoneName.PELVIS, -0.08, -0.01, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(5), toRadians(5)) // Hip engages\n .rotate(BoneName.SPINE_LOWER, 0, toRadians(-3), 0) // Counter-rotate\n .done<MartialArtsAnimationBuilder>()\n // Weight transfers to left (μ°©μ§€)\n .at(0.15, \"ease-in\")\n .position(BoneName.PELVIS, -0.2, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-8), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Final position (μ•ˆμ •)\n .at(0.2, \"ease-in\")\n .position(BoneName.PELVIS, -0.25, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, 0) // Return neutral\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard forward\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * SLIDE STEP RIGHT Animation (λ―Έλ„λŸΌλ³΄ 우)\n *\n * **Korean Martial Arts Principle**: μΈ‘λ©΄ μ„ ν–‰ 이동 (Lateral lead foot movement)\n *\n * Mirror of left slide step for right lateral movement.\n *\n * @korean λ―Έλ„λŸΌλ³΄μš°μ• λ‹ˆλ©”μ΄μ…˜\n */\nexport const FOOTWORK_SLIDE_RIGHT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_slide_right\", \"λ―Έλ„λŸΌλ³΄ 우\")\n .asMovement(0.2)\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Weight shifts left (μ€€λΉ„)\n .at(0.05, \"ease-out\")\n .position(BoneName.PELVIS, -0.04, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, toRadians(-3))\n .rotate(BoneName.KNEE_L, toRadians(-12), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-5), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Right foot slides lateral (이동)\n .at(0.1, \"linear\")\n .position(BoneName.PELVIS, 0.08, -0.01, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(-5), toRadians(-5))\n .rotate(BoneName.SPINE_LOWER, 0, toRadians(3), 0)\n .done<MartialArtsAnimationBuilder>()\n // Weight transfers to right (μ°©μ§€)\n .at(0.15, \"ease-in\")\n .position(BoneName.PELVIS, 0.2, 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Final position (μ•ˆμ •)\n .at(0.2, \"ease-in\")\n .position(BoneName.PELVIS, 0.25, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// SWITCH STEP ANIMATION (μŠ€μœ„μΉ˜ μŠ€ν…) - Stance Reversal\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * SWITCH STEP Animation (μŠ€μœ„μΉ˜ μŠ€ν…)\n *\n * **Korean Martial Arts Principle**: λ°œλ°”κΏˆ 도약 (Foot-exchange hop)\n *\n * Quick stance reversal used to confuse opponent or change angles:\n * 1. Small hop off ground with both feet\n * 2. Feet exchange positions mid-air (lead becomes rear, rear becomes lead)\n * 3. Land with opposite foot forward\n * 4. Brief moment of vulnerability during hop\n *\n * **Weight Transfer**: Balanced β†’ Airborne β†’ Reversed stance\n * **Duration**: 280ms (fast for rhythm disruption)\n * **Tactical Use**: Feint opponent's timing, switch power side\n *\n * **Momentary Vulnerability**: During hop, cannot defend or attack\n *\n * @korean μŠ€μœ„μΉ˜μŠ€ν…μ• λ‹ˆλ©”μ΄μ…˜\n */\nexport const FOOTWORK_SWITCH_STEP_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_switch_step\", \"μŠ€μœ„μΉ˜ μŠ€ν…\")\n .asMovement(0.28)\n // Initial stance - left foot forward\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Crouch preparation for hop (μ€€λΉ„)\n .at(0.05, \"ease-out\")\n .position(BoneName.PELVIS, 0, -0.03, 0) // Drop for spring\n .rotate(BoneName.KNEE_L, toRadians(-20), 0, 0) // Deep crouch\n .rotate(BoneName.KNEE_R, toRadians(-22), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Explosive hop - both feet leave ground (도약)\n .at(0.1, \"ease-out\")\n .position(BoneName.PELVIS, 0, 0.05, 0) // Airborne\n .rotate(BoneName.KNEE_L, toRadians(-15), 0, 0) // Legs partially extend\n .rotate(BoneName.KNEE_R, toRadians(-18), 0, 0)\n .rotate(BoneName.HIP_L, toRadians(5), 0, 0) // Begin rotation\n .rotate(BoneName.HIP_R, toRadians(-5), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Mid-air - feet exchange (곡쀑 κ΅ν™˜)\n .at(0.15, \"linear\")\n .position(BoneName.PELVIS, 0, 0.04, 0) // Peak of hop\n .rotate(BoneName.PELVIS, 0, toRadians(15), 0) // Body rotates\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Landing - right foot now forward (μ°©μ§€)\n .at(0.2, \"ease-in\")\n .position(BoneName.PELVIS, 0, -0.02, 0) // Impact absorption\n .rotate(BoneName.PELVIS, 0, toRadians(25), 0) // Rotation continues\n .rotate(BoneName.KNEE_R, toRadians(-18), 0, 0) // Right knee bends\n .rotate(BoneName.KNEE_L, toRadians(-20), 0, 0) // Left knee bends\n .done<MartialArtsAnimationBuilder>()\n // Stabilization - reversed stance (μ•ˆμ •)\n .at(0.25, \"ease-in\")\n .position(BoneName.PELVIS, 0, -0.01, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(30), 0) // Complete rotation\n .rotate(BoneName.KNEE_R, toRadians(-8), 0, 0) // Now lead foot\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0) // Now rear foot\n .done<MartialArtsAnimationBuilder>()\n // Final - stable reversed stance\n .at(0.28, \"ease-in\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(30), 0)\n .rotate(BoneName.KNEE_R, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// BOUNCE STEP ANIMATION (λ°”μš΄μŠ€ μŠ€ν…) - Rhythmic Movement\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * BOUNCE STEP Animation (λ°”μš΄μŠ€ μŠ€ν…)\n *\n * **Korean Martial Arts Principle**: 리듬 보법 (Rhythmic footwork)\n *\n * Light bouncing movement on balls of feet from boxing:\n * 1. Constant up-down bouncing motion\n * 2. Weight on balls of feet, heels slightly elevated\n * 3. Creates rhythm that's harder for opponent to time\n * 4. Energy efficient - small bounces, not jumps\n *\n * **Weight Distribution**: Always on balls of feet (μ•žκΏˆμΉ˜)\n * **Height Variation**: 2-3cm vertical displacement\n * **Frequency**: 2.5 bounces per second (fast rhythm)\n * **Duration**: 400ms for complete bounce cycle\n *\n * **Tactical Advantage**: \n * - Unpredictable timing\n * - Faster reaction time from active stance\n * - Harder to time attacks against\n *\n * @korean λ°”μš΄μŠ€μŠ€ν…μ• λ‹ˆλ©”μ΄μ…˜\n */\nexport const FOOTWORK_BOUNCE_STEP_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_bounce_step\", \"λ°”μš΄μŠ€ μŠ€ν…\")\n .asMovement(0.4)\n // Start on balls of feet (μ€€λΉ„)\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0.01, 0) // Slightly elevated\n .rotate(BoneName.KNEE_L, toRadians(-5), 0, 0) // Slight bend\n .rotate(BoneName.KNEE_R, toRadians(-7), 0, 0)\n .rotate(BoneName.FOOT_L, toRadians(-10), 0, 0) // Heel up\n .rotate(BoneName.FOOT_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // First bounce down (1μ°¨ λ°”μš΄μŠ€ ν•˜κ°•)\n .at(0.08, \"ease-in\")\n .position(BoneName.PELVIS, 0, -0.01, 0)\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0) // Knees absorb\n .rotate(BoneName.KNEE_R, toRadians(-12), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // First bounce up (1μ°¨ λ°”μš΄μŠ€ μƒμŠΉ)\n .at(0.16, \"ease-out\")\n .position(BoneName.PELVIS, 0, 0.02, 0.05) // Slight forward drift\n .rotate(BoneName.KNEE_L, toRadians(-5), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-7), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Second bounce down (2μ°¨ λ°”μš΄μŠ€ ν•˜κ°•)\n .at(0.24, \"ease-in\")\n .position(BoneName.PELVIS, 0, -0.01, 0.08)\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-12), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Second bounce up (2μ°¨ λ°”μš΄μŠ€ μƒμŠΉ)\n .at(0.32, \"ease-out\")\n .position(BoneName.PELVIS, 0, 0.02, 0.12)\n .rotate(BoneName.KNEE_L, toRadians(-5), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-7), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Final position - ready for next bounce (μ΅œμ’… μœ„μΉ˜)\n .at(0.4, \"ease-in\")\n .position(BoneName.PELVIS, 0, 0.01, 0.15)\n .rotate(BoneName.KNEE_L, toRadians(-7), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-9), 0, 0)\n .rotate(BoneName.FOOT_L, toRadians(-10), 0, 0) // Still on balls\n .rotate(BoneName.FOOT_R, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// TRIANGLE FOOTWORK ANIMATION (삼각 이동) - Advanced Angles\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * TRIANGLE FOOTWORK Animation (삼각 이동)\n *\n * **Korean Martial Arts Principle**: 삼각 진법 (Triangle tactical positioning)\n *\n * Advanced footwork creating tactical angles through three-point movement:\n * 1. Step forward-left at 45Β° (Point 1)\n * 2. Pivot on lead foot (Point 2)\n * 3. Step lateral-left to complete triangle (Point 3)\n * 4. Results in off-angle position with opponent exposed\n *\n * **Tactical Geometry**:\n * - Creates 90Β° angle from original position\n * - Off-line from opponent's centerline\n * - Opens attack angles to opponent's side\n * - Defensive value: harder to hit\n *\n * **Duration**: 650ms (requires precision)\n * **Distance**: 40cm total displacement (diagonal pattern)\n *\n * @korean μ‚Όκ°μ΄λ™μ• λ‹ˆλ©”μ΄μ…˜\n */\nexport const FOOTWORK_TRIANGLE_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_triangle\", \"삼각 이동\")\n .asMovement(0.65)\n // Initial stance\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Point 1: Step forward-left at 45Β° (1번 지점 - μ „μ’Œ 45Β°)\n .at(0.15, \"ease-out\")\n .position(BoneName.PELVIS, -0.12, -0.01, 0.12) // Diagonal forward-left\n .rotate(BoneName.PELVIS, 0, toRadians(-10), 0) // Slight body turn\n .rotate(BoneName.KNEE_L, toRadians(-12), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Point 2: Pivot on lead foot (2번 지점 - μΆ•λ°œ νšŒμ „)\n .at(0.35, \"linear\")\n .position(BoneName.PELVIS, -0.15, -0.015, 0.15)\n .rotate(BoneName.PELVIS, 0, toRadians(-35), 0) // Pivot 45Β° more\n .rotate(BoneName.SPINE_LOWER, 0, toRadians(15), 0) // Counter-rotate upper body\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0) // Pivot foot stable\n .rotate(BoneName.KNEE_R, toRadians(-8), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Point 3: Step lateral-left to complete triangle (3번 지점 - 쒌츑 μ™„μ„±)\n .at(0.5, \"ease-in\")\n .position(BoneName.PELVIS, -0.28, -0.02, 0.12) // Lateral left\n .rotate(BoneName.PELVIS, 0, toRadians(-45), 0) // 90Β° total from start\n .rotate(BoneName.SPINE_LOWER, 0, toRadians(10), 0)\n .rotate(BoneName.KNEE_L, toRadians(-12), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Final: Stabilize in off-angle position (μ΅œμ’… μ•ˆμ •ν™”)\n .at(0.65, \"ease-in\")\n .position(BoneName.PELVIS, -0.3, 0, 0.1) // Final triangle point\n .rotate(BoneName.PELVIS, 0, toRadians(-45), 0) // 90Β° off-line\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0) // Upper body faces forward\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained throughout\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// PIVOT STEP ANIMATIONS (μΆ•μ‘±νšŒμ „) - Ball-of-Foot Rotation\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * PIVOT LEFT Animation (μΆ•μ‘±νšŒμ „ 쒌)\n *\n * **Korean Martial Arts Principle**: μ•žκΏˆμΉ˜ νšŒμ „ (Ball-of-foot pivot)\n *\n * 45Β° rotation to the left on planted lead foot:\n * 1. Weight shifts to lead foot (left)\n * 2. Pivot on ball of lead foot\n * 3. Rear foot swings left in arc\n * 4. Upper body rotates with lower, guard maintained\n *\n * **Pivot Mechanics** (νšŒμ „ μ—­ν•™):\n * - Pivot point: Ball of lead foot (μ•žκΏˆμΉ˜)\n * - Weight: 80% on pivot foot during rotation\n * - Arc: Rear foot travels 25cm in arc\n * - Speed: 280ms for smooth 45Β° rotation\n *\n * **Tactical Use**: Quick angle change, evade linear attacks\n *\n * @korean μΆ•μ‘±νšŒμ „μ’Œμ• λ‹ˆλ©”μ΄μ…˜\n */\nexport const FOOTWORK_PIVOT_LEFT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_pivot_left\", \"μΆ•μ‘±νšŒμ „ 쒌\")\n .asMovement(0.25)\n // Initial stance\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Weight shift to lead foot (pivot preparation) (μ€€λΉ„)\n .at(0.06, \"ease-out\")\n .position(BoneName.PELVIS, -0.02, -0.01, 0) // Forward onto lead\n .rotate(BoneName.KNEE_L, toRadians(-12), 0, 0) // Lead accepts weight\n .rotate(BoneName.KNEE_R, toRadians(-5), 0, 0) // Rear lightens\n .rotate(BoneName.FOOT_L, toRadians(-8), 0, 0) // Weight on ball\n .done<MartialArtsAnimationBuilder>()\n // Begin pivot - rear foot lifts slightly (νšŒμ „ μ‹œμž‘)\n .at(0.12, \"linear\")\n .position(BoneName.PELVIS, -0.02, -0.015, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(-15), 0) // Body begins rotation\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0) // Pivot foot stable\n .rotate(BoneName.KNEE_R, toRadians(-8), 0, 0) // Rear foot active\n .rotate(BoneName.HIP_R, toRadians(5), 0, 0) // Rear hip lifts\n .done<MartialArtsAnimationBuilder>()\n // Mid-pivot - maximum rotation speed (νšŒμ „ 가속)\n .at(0.18, \"linear\")\n .position(BoneName.PELVIS, -0.01, -0.02, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(-35), 0) // Fast rotation\n .rotate(BoneName.SPINE_LOWER, 0, toRadians(5), 0) // Slight counter-rotate for balance\n .rotate(BoneName.KNEE_L, toRadians(-12), 0, 0)\n .rotate(BoneName.FOOT_L, toRadians(-10), 0, 0) // Still on ball\n .done<MartialArtsAnimationBuilder>()\n // Complete pivot - rear foot plants (νšŒμ „ μ™„λ£Œ)\n .at(0.2, \"ease-in\")\n .position(BoneName.PELVIS, 0, -0.015, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(-45), 0) // 45Β° rotation complete\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0) // Body aligned\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0) // Rear foot plants\n .rotate(BoneName.FOOT_L, toRadians(-5), 0, 0) // Pivot foot settling\n .done<MartialArtsAnimationBuilder>()\n // Stabilize in new angle (μ•ˆμ •ν™”)\n .at(0.25, \"ease-in\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(-45), 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.FOOT_L, 0, 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * PIVOT RIGHT Animation (μΆ•μ‘±νšŒμ „ 우)\n *\n * **Korean Martial Arts Principle**: μ•žκΏˆμΉ˜ νšŒμ „ (Ball-of-foot pivot)\n *\n * 45Β° rotation to the right on planted lead foot.\n * Mirror of left pivot mechanics.\n *\n * @korean μΆ•μ‘±νšŒμ „μš°μ• λ‹ˆλ©”μ΄μ…˜\n */\nexport const FOOTWORK_PIVOT_RIGHT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_pivot_right\", \"μΆ•μ‘±νšŒμ „ 우\")\n .asMovement(0.25)\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Weight shift to lead foot (μ€€λΉ„)\n .at(0.06, \"ease-out\")\n .position(BoneName.PELVIS, -0.02, -0.01, 0)\n .rotate(BoneName.KNEE_L, toRadians(-12), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-5), 0, 0)\n .rotate(BoneName.FOOT_L, toRadians(-8), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Begin pivot (νšŒμ „ μ‹œμž‘)\n .at(0.12, \"linear\")\n .position(BoneName.PELVIS, -0.02, -0.015, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(15), 0) // Right rotation\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-8), 0, 0)\n .rotate(BoneName.HIP_R, toRadians(5), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Mid-pivot (νšŒμ „ 가속)\n .at(0.18, \"linear\")\n .position(BoneName.PELVIS, -0.01, -0.02, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(35), 0)\n .rotate(BoneName.SPINE_LOWER, 0, toRadians(-5), 0)\n .rotate(BoneName.KNEE_L, toRadians(-12), 0, 0)\n .rotate(BoneName.FOOT_L, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Complete pivot (νšŒμ „ μ™„λ£Œ)\n .at(0.2, \"ease-in\")\n .position(BoneName.PELVIS, 0, -0.015, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(45), 0)\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.FOOT_L, toRadians(-5), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Stabilize (μ•ˆμ •ν™”)\n .at(0.25, \"ease-in\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, toRadians(45), 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.FOOT_L, 0, 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// SHUFFLE STEP ANIMATION (μ„žμŒλ³΄) - Micro-Adjustments\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * SHUFFLE STEP Animation (μ„žμŒλ³΄)\n *\n * **Korean Martial Arts Principle**: λ―Έμ„Έ μ‘°μ • (Micro-position adjustment)\n *\n * Quick 10cm micro-adjustment for positional fine-tuning:\n * 1. Both feet move together in small shuffle\n * 2. Minimal vertical displacement (stay low)\n * 3. Ultra-fast 100ms duration\n * 4. Used for range management and timing adjustments\n *\n * **Characteristics**:\n * - Distance: 10cm (half a foot width)\n * - Duration: 100ms (ultra-fast, 6 frames @ 60fps)\n * - Weight: Remains balanced throughout\n * - Height: Minimal bob (1cm max)\n *\n * **Tactical Use**: \n * - Fine-tune distance without committing\n * - Adjust stance width\n * - Reset rhythm\n * - Feint movement\n *\n * @korean μ„žμŒλ³΄μ• λ‹ˆλ©”μ΄μ…˜\n */\nexport const FOOTWORK_SHUFFLE_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"footwork_shuffle\", \"μ„žμŒλ³΄\")\n .asMovement(0.1)\n // Initial - balanced on both feet\n .at(0, \"linear\")\n .position(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Slight crouch for shuffle (μ€€λΉ„)\n .at(0.03, \"ease-out\")\n .position(BoneName.PELVIS, 0, -0.008, 0) // Minimal drop\n .rotate(BoneName.KNEE_L, toRadians(-10), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-12), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Execute shuffle forward (μ‹€ν–‰)\n .at(0.07, \"linear\")\n .position(BoneName.PELVIS, 0, -0.01, 0.1) // 10cm forward\n .rotate(BoneName.KNEE_L, toRadians(-9), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-11), 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Return to normal height (볡귀)\n .at(0.1, \"ease-in\")\n .position(BoneName.PELVIS, 0, 0, 0.1) // Final position\n .rotate(BoneName.KNEE_L, toRadians(-8), 0, 0)\n .rotate(BoneName.KNEE_R, toRadians(-10), 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.6, 0.4, 0.3) // Guard maintained\n .rotate(BoneName.ELBOW_L, 0, 0, -1.6)\n .rotate(BoneName.SHOULDER_R, -0.6, -0.4, -0.3)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.6)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ANIMATION COLLECTIONS\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Map of all footwork animations by name\n *\n * **PHASE 4 ENHANCED**: 95%+ Korean martial arts authenticity\n * All animations now feature:\n * - Detailed weight transfer mechanics (체쀑이동)\n * - Proper foot placement (λ””λ”€λ°œ/μΆ•λ°œ)\n * - Guard maintenance throughout\n * - Realistic timing and distances\n * - Cultural authenticity with Korean terminology\n *\n * @korean λ³΄λ²•μ• λ‹ˆλ©”μ΄μ…˜λ§΅\n */\nexport const FOOTWORK_ANIMATIONS = new Map<string, SkeletalAnimation>([\n // Circular Steps (μ›ν˜•λ³΄) - Lateral circular movement\n [\"footwork_circular_left\", FOOTWORK_CIRCULAR_LEFT_ANIMATION],\n [\"footwork_circular_right\", FOOTWORK_CIRCULAR_RIGHT_ANIMATION],\n \n // Slide Steps (λ―Έλ„λŸΌλ³΄) - Lead foot moves first\n [\"footwork_slide_forward\", FOOTWORK_SLIDE_FORWARD_ANIMATION],\n [\"footwork_slide_back\", FOOTWORK_SLIDE_BACK_ANIMATION],\n [\"footwork_slide_left\", FOOTWORK_SLIDE_LEFT_ANIMATION],\n [\"footwork_slide_right\", FOOTWORK_SLIDE_RIGHT_ANIMATION],\n \n // Pivot Steps (μΆ•μ‘±νšŒμ „) - Ball-of-foot rotation\n [\"footwork_pivot_left\", FOOTWORK_PIVOT_LEFT_ANIMATION],\n [\"footwork_pivot_right\", FOOTWORK_PIVOT_RIGHT_ANIMATION],\n \n // Shuffle Step (μ„žμŒλ³΄) - Micro-adjustments\n [\"footwork_shuffle\", FOOTWORK_SHUFFLE_ANIMATION],\n]);\n\n/**\n * Get footwork animation by name\n *\n * @param animationName - Animation identifier\n * @returns Footwork animation or undefined if not found\n * @korean λ³΄λ²•μ• λ‹ˆλ©”μ΄μ…˜κ°€μ Έμ˜€κΈ°\n */\nexport function getFootworkAnimation(\n animationName: string\n): SkeletalAnimation | undefined {\n return FOOTWORK_ANIMATIONS.get(animationName);\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"RecoveryAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/RecoveryAnimations.ts"],"sourcesContent":["/**\n * Recovery Animation System for Black Trigram\n *\n * Implements realistic recovery animations for standing up from fallen states.\n * Based on Korean martial arts recovery techniques (기상 - Gisang).\n *\n * @module systems/animation/RecoveryAnimations\n * @category Animation\n * @korean κΈ°μƒμ• λ‹ˆλ©”μ΄μ…˜\n */\n\nimport type { GroundState, RecoveryAnimationType } from \"../core/types\";\nimport {\n GROUND_STATE_TO_RECOVERY,\n RECOVERY_TYPE_TO_ANIMATION,\n} from \"../core/types\";\n\n/**\n * Recovery animation keyframe data structure\n *\n * Defines key poses during recovery animations for skeletal rendering.\n * Each keyframe specifies body positions at critical moments.\n *\n * @korean κΈ°μƒν‚€ν”„λ ˆμž„\n */\nexport interface RecoveryKeyframe {\n /** Frame number (0-indexed) */\n readonly frame: number;\n\n /** Torso rotation (radians) */\n readonly torsoRotation: { x: number; y: number; z: number };\n\n /** Center of mass vertical position (0-1, 1=standing, 0=ground) */\n readonly centerOfMassHeight: number;\n\n /** Description of this keyframe */\n readonly description: {\n readonly korean: string;\n readonly english: string;\n };\n\n /** Whether player is vulnerable at this frame */\n readonly vulnerable: boolean;\n}\n\n/**\n * Prone stand-up keyframes (μ—Žλ“œλ¦° 기상)\n *\n * 30 frames (500ms) sequence:\n * - Frames 0-8: Push up with hands, torso lifts\n * - Frames 9-18: Legs swing under body, kneeling position\n * - Frames 19-24: Rise from kneeling to standing (vulnerable)\n * - Frames 25-29: Final stance adjustment (interruptible)\n *\n * @korean μ—Žλ“œλ¦°κΈ°μƒν‚€ν”„λ ˆμž„\n */\nexport const RECOVERY_PRONE_KEYFRAMES: readonly RecoveryKeyframe[] = [\n {\n frame: 0,\n torsoRotation: { x: 1.57, y: 0, z: 0 }, // Face down (90Β° forward)\n centerOfMassHeight: 0.05,\n description: {\n korean: \"μ—Žλ“œλ¦° μžμ„Έ\",\n english: \"Prone position\",\n },\n vulnerable: true,\n },\n {\n frame: 8,\n torsoRotation: { x: 1.2, y: 0, z: 0 }, // Hands pushing, torso lifting\n centerOfMassHeight: 0.2,\n description: {\n korean: \"μ†μœΌλ‘œ λ°€μ–΄ 올리기\",\n english: \"Hands push up torso\",\n },\n vulnerable: true,\n },\n {\n frame: 18,\n torsoRotation: { x: 0.7, y: 0, z: 0 }, // Kneeling position\n centerOfMassHeight: 0.5,\n description: {\n korean: \"무릎 κΏ‡κΈ°\",\n english: \"Kneeling position\",\n },\n vulnerable: true,\n },\n {\n frame: 24,\n torsoRotation: { x: 0.2, y: 0, z: 0 }, // Rising to standing\n centerOfMassHeight: 0.75,\n description: {\n korean: \"μΌμ–΄μ„œκΈ°\",\n english: \"Rising to standing\",\n },\n vulnerable: false, // Last 6 frames (24-30) entering safe zone\n },\n {\n frame: 29,\n torsoRotation: { x: 0, y: 0, z: 0 }, // Standing (interruptible)\n centerOfMassHeight: 0.9,\n description: {\n korean: \"μ„œ μžˆλŠ” μžμ„Έ\",\n english: \"Standing stance\",\n },\n vulnerable: false, // Last 6 frames (25-30) are not vulnerable\n },\n] as const;\n\n/**\n * Supine stand-up keyframes (λˆ„μš΄ 기상)\n *\n * 36 frames (600ms) sequence:\n * - Frames 0-10: Abs crunch sit-up motion\n * - Frames 11-22: Forward roll onto feet\n * - Frames 23-30: Feet plant, rise to standing (vulnerable)\n * - Frames 31-35: Final stance adjustment (interruptible)\n *\n * @korean λˆ„μš΄κΈ°μƒν‚€ν”„λ ˆμž„\n */\nexport const RECOVERY_SUPINE_KEYFRAMES: readonly RecoveryKeyframe[] = [\n {\n frame: 0,\n torsoRotation: { x: -1.57, y: 0, z: 0 }, // Face up (90Β° back)\n centerOfMassHeight: 0.05,\n description: {\n korean: \"λˆ„μš΄ μžμ„Έ\",\n english: \"Supine position\",\n },\n vulnerable: true,\n },\n {\n frame: 10,\n torsoRotation: { x: -0.9, y: 0, z: 0 }, // Sit-up motion\n centerOfMassHeight: 0.3,\n description: {\n korean: \"μœ—λͺΈ μΌμœΌν‚€κΈ°\",\n english: \"Sit-up motion\",\n },\n vulnerable: true,\n },\n {\n frame: 22,\n torsoRotation: { x: 0.4, y: 0, z: 0 }, // Forward roll\n centerOfMassHeight: 0.4,\n description: {\n korean: \"μ „λ°© ꡬλ₯΄κΈ°\",\n english: \"Forward roll\",\n },\n vulnerable: true,\n },\n {\n frame: 30,\n torsoRotation: { x: 0.2, y: 0, z: 0 }, // Feet planted, rising\n centerOfMassHeight: 0.7,\n description: {\n korean: \"발 λ””λ””κ³  μΌμ–΄μ„œκΈ°\",\n english: \"Feet planted, rising\",\n },\n vulnerable: false, // Last 6 frames (30-36) entering safe zone\n },\n {\n frame: 35,\n torsoRotation: { x: 0, y: 0, z: 0 }, // Standing (interruptible)\n centerOfMassHeight: 0.9,\n description: {\n korean: \"μ„œ μžˆλŠ” μžμ„Έ\",\n english: \"Standing stance\",\n },\n vulnerable: false, // Last 6 frames (30-36) are not vulnerable\n },\n] as const;\n\n/**\n * Roll recovery keyframes (νšŒμ „κΈ°μƒ)\n *\n * 24 frames (400ms) sequence - FAST recovery\n * - Frames 0-6: Roll to side, momentum building\n * - Frames 7-14: Spring to feet with explosive movement\n * - Frames 15-18: Quick stance (vulnerable)\n * - Frames 19-23: Combat ready (interruptible)\n *\n * Costs 20 stamina for speed advantage.\n *\n * @korean νšŒμ „κΈ°μƒν‚€ν”„λ ˆμž„\n */\nexport const RECOVERY_ROLL_KEYFRAMES: readonly RecoveryKeyframe[] = [\n {\n frame: 0,\n torsoRotation: { x: 0, y: 1.57, z: 1.57 }, // Side position (90Β° roll)\n centerOfMassHeight: 0.05,\n description: {\n korean: \"μΈ‘λ©΄ μžμ„Έ\",\n english: \"Side position\",\n },\n vulnerable: true,\n },\n {\n frame: 6,\n torsoRotation: { x: 0.3, y: 0.8, z: 0.9 }, // Rolling motion\n centerOfMassHeight: 0.25,\n description: {\n korean: \"ꡬλ₯΄κΈ° μ›€μ§μž„\",\n english: \"Rolling motion\",\n },\n vulnerable: true,\n },\n {\n frame: 14,\n torsoRotation: { x: 0.4, y: 0, z: 0 }, // Springing to feet\n centerOfMassHeight: 0.6,\n description: {\n korean: \"발둜 νŠ€μ–΄μ˜€λ₯΄κΈ°\",\n english: \"Spring to feet\",\n },\n vulnerable: true,\n },\n {\n frame: 18,\n torsoRotation: { x: 0.1, y: 0, z: 0 }, // Quick stance\n centerOfMassHeight: 0.85,\n description: {\n korean: \"λΉ λ₯Έ μžμ„Έ\",\n english: \"Quick stance\",\n },\n vulnerable: false, // Last 6 frames (18-24) entering safe zone\n },\n {\n frame: 23,\n torsoRotation: { x: 0, y: 0, z: 0 }, // Combat ready (interruptible)\n centerOfMassHeight: 0.9,\n description: {\n korean: \"μ „νˆ¬ μ€€λΉ„\",\n english: \"Combat ready\",\n },\n vulnerable: false, // Last 6 frames (18-24) are not vulnerable\n },\n] as const;\n\n/**\n * Defensive getup keyframes (방어기상)\n *\n * 42 frames (700ms) sequence - SLOW but protected\n * - Frames 0-14: Slow rise with arms guarding head/torso\n * - Frames 15-28: Gradual stand with maintained guard\n * - Frames 29-36: Stance formation with guard (50% damage reduction)\n * - Frames 37-41: Ready stance (interruptible)\n *\n * Provides 50% damage reduction throughout animation.\n *\n * @korean λ°©μ–΄κΈ°μƒν‚€ν”„λ ˆμž„\n */\nexport const RECOVERY_DEFENSIVE_KEYFRAMES: readonly RecoveryKeyframe[] = [\n {\n frame: 0,\n torsoRotation: { x: 1.2, y: 0, z: 0 }, // Grounded, arms up\n centerOfMassHeight: 0.05,\n description: {\n korean: \"μ§€λ©΄μ—μ„œ νŒ” 올리기\",\n english: \"Grounded, arms up\",\n },\n vulnerable: true, // 50% damage reduction applies\n },\n {\n frame: 14,\n torsoRotation: { x: 0.9, y: 0, z: 0 }, // Slow rise, guard maintained\n centerOfMassHeight: 0.3,\n description: {\n korean: \"천천히 μΌμ–΄λ‚˜λ©° λ°©μ–΄\",\n english: \"Slow rise, guarded\",\n },\n vulnerable: true, // 50% damage reduction applies\n },\n {\n frame: 28,\n torsoRotation: { x: 0.5, y: 0, z: 0 }, // Gradual stand, guard up\n centerOfMassHeight: 0.6,\n description: {\n korean: \"점차 μ„œλ©° λ°©μ–΄ μœ μ§€\",\n english: \"Gradual stand, guard up\",\n },\n vulnerable: true, // 50% damage reduction applies\n },\n {\n frame: 36,\n torsoRotation: { x: 0.2, y: 0, z: 0 }, // Stance formation, guarded\n centerOfMassHeight: 0.8,\n description: {\n korean: \"μžμ„Έ ν˜•μ„±, λ°©μ–΄ μƒνƒœ\",\n english: \"Stance formation, guarded\",\n },\n vulnerable: false, // Last 6 frames (36-42) entering safe zone (still 50% reduction)\n },\n {\n frame: 41,\n torsoRotation: { x: 0, y: 0, z: 0 }, // Ready stance (interruptible)\n centerOfMassHeight: 0.9,\n description: {\n korean: \"μ€€λΉ„ μžμ„Έ\",\n english: \"Ready stance\",\n },\n vulnerable: false, // Last 6 frames (36-42) are not vulnerable\n },\n] as const;\n\n/**\n * Get keyframes for a specific recovery type\n *\n * @param recoveryType - Type of recovery animation\n * @returns Array of keyframes for that recovery type\n *\n * @public\n * @korean κΈ°μƒν‚€ν”„λ ˆμž„κ°€μ Έμ˜€κΈ°\n */\nexport function getRecoveryKeyframes(\n recoveryType: RecoveryAnimationType\n): readonly RecoveryKeyframe[] {\n switch (recoveryType) {\n case \"prone_standup\":\n return RECOVERY_PRONE_KEYFRAMES;\n case \"supine_standup\":\n return RECOVERY_SUPINE_KEYFRAMES;\n case \"roll_recovery\":\n return RECOVERY_ROLL_KEYFRAMES;\n case \"defensive_getup\":\n return RECOVERY_DEFENSIVE_KEYFRAMES;\n default:\n return RECOVERY_ROLL_KEYFRAMES;\n }\n}\n\n/**\n * Check if a frame in a recovery animation is vulnerable\n *\n * Vulnerability is determined by keyframe data. The last 6 frames\n * of each recovery animation are interruptible and not vulnerable.\n *\n * @param recoveryType - Type of recovery animation\n * @param frame - Current frame number (0-indexed)\n * @returns True if player is vulnerable at this frame\n *\n * @public\n * @korean μ·¨μ•½ν”„λ ˆμž„ν™•μΈ\n */\nexport function isVulnerableFrame(\n recoveryType: RecoveryAnimationType,\n frame: number\n): boolean {\n const keyframes = getRecoveryKeyframes(recoveryType);\n\n // Find the keyframe for this frame or the previous keyframe\n let currentKeyframe = keyframes[0];\n for (const kf of keyframes) {\n if (kf.frame <= frame) {\n currentKeyframe = kf;\n } else {\n break;\n }\n }\n\n return currentKeyframe.vulnerable;\n}\n\n/**\n * Determine appropriate recovery animation from ground state\n *\n * Uses ground state to select default recovery animation.\n * Side positions default to roll recovery for dynamic movement.\n *\n * @param groundState - Current ground position\n * @returns Default recovery animation type\n *\n * @example\n * ```typescript\n * const recoveryType = determineRecoveryType(\"prone\");\n * // Returns: \"prone_standup\"\n *\n * const sideRecovery = determineRecoveryType(\"side_left\");\n * // Returns: \"roll_recovery\" (default for side positions)\n * ```\n *\n * @public\n * @korean κΈ°μƒμœ ν˜•κ²°μ •\n */\nexport function determineRecoveryType(\n groundState: GroundState\n): RecoveryAnimationType {\n return GROUND_STATE_TO_RECOVERY[groundState];\n}\n\n/**\n * Get recovery animation state from recovery type\n *\n * @param recoveryType - Recovery animation type\n * @returns Animation state name\n *\n * @public\n * @korean κΈ°μƒμ• λ‹ˆλ©”μ΄μ…˜μƒνƒœ\n */\nexport function getRecoveryAnimationState(\n recoveryType: RecoveryAnimationType\n): string {\n return RECOVERY_TYPE_TO_ANIMATION[recoveryType];\n}\n\n/**\n * Recovery animation configuration\n *\n * Additional properties for recovery animations beyond base AnimationConfig.\n *\n * @korean 기상섀정\n */\nexport interface RecoveryConfig {\n /** Recovery animation type */\n readonly type: RecoveryAnimationType;\n\n /** Stamina cost to execute (0 for normal recoveries) */\n readonly staminaCost: number;\n\n /** Damage reduction percentage during animation (0-1) */\n readonly damageReduction: number;\n\n /** Number of initial vulnerable frames (first N frames are vulnerable to damage) */\n readonly vulnerableFrames: number;\n\n /** Frame when player becomes interruptible (last 6 frames typically) */\n readonly interruptibleFrame: number;\n}\n\n/**\n * Recovery animation configurations\n *\n * Defines stamina costs, damage reduction, and vulnerability windows.\n *\n * @korean 기상섀정맡\n */\nexport const RECOVERY_CONFIGS: Record<RecoveryAnimationType, RecoveryConfig> = {\n prone_standup: {\n type: \"prone_standup\",\n staminaCost: 0,\n damageReduction: 0,\n vulnerableFrames: 24, // Vulnerable for first 24 frames (80%)\n interruptibleFrame: 24, // Last 6 frames (25-30) are interruptible\n },\n supine_standup: {\n type: \"supine_standup\",\n staminaCost: 0,\n damageReduction: 0,\n vulnerableFrames: 30, // Vulnerable for first 30 frames (83%)\n interruptibleFrame: 30, // Last 6 frames (30-36) are interruptible\n },\n roll_recovery: {\n type: \"roll_recovery\",\n staminaCost: 20, // Costs stamina for speed\n damageReduction: 0,\n vulnerableFrames: 18, // Vulnerable for first 18 frames (75%)\n interruptibleFrame: 18, // Last 6 frames (18-24) are interruptible\n },\n defensive_getup: {\n type: \"defensive_getup\",\n staminaCost: 0,\n damageReduction: 0.5, // 50% damage reduction throughout\n vulnerableFrames: 36, // Vulnerable for first 36 frames (86%)\n interruptibleFrame: 36, // Last 6 frames (36-42) are interruptible\n },\n};\n\n/**\n * Get recovery configuration\n *\n * @param recoveryType - Recovery animation type\n * @returns Recovery configuration\n *\n * @public\n * @korean κΈ°μƒμ„€μ •κ°€μ Έμ˜€κΈ°\n */\nexport function getRecoveryConfig(\n recoveryType: RecoveryAnimationType\n): RecoveryConfig {\n return RECOVERY_CONFIGS[recoveryType];\n}\n"],"mappings":";;;;;;;;;;;;;AAwDA,IAAa,2BAAwD;CACnE;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAM,GAAG;GAAG,GAAG;GAAG;EACtC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;GACV;EACD,YAAY;EACb;CACD;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAK,GAAG;GAAG,GAAG;GAAG;EACrC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;GACV;EACD,YAAY;EACb;CACD;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAK,GAAG;GAAG,GAAG;GAAG;EACrC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;GACV;EACD,YAAY;EACb;CACD;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAK,GAAG;GAAG,GAAG;GAAG;EACrC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;GACV;EACD,YAAY;EACb;CACD;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAG,GAAG;GAAG,GAAG;GAAG;EACnC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;GACV;EACD,YAAY;EACb;CACF;;;;;;;;;;;;AAaD,IAAa,4BAAyD;CACpE;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAO,GAAG;GAAG,GAAG;GAAG;EACvC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;GACV;EACD,YAAY;EACb;CACD;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAM,GAAG;GAAG,GAAG;GAAG;EACtC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;GACV;EACD,YAAY;EACb;CACD;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAK,GAAG;GAAG,GAAG;GAAG;EACrC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;GACV;EACD,YAAY;EACb;CACD;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAK,GAAG;GAAG,GAAG;GAAG;EACrC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;GACV;EACD,YAAY;EACb;CACD;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAG,GAAG;GAAG,GAAG;GAAG;EACnC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;GACV;EACD,YAAY;EACb;CACF;;;;;;;;;;;;;;AAeD,IAAa,0BAAuD;CAClE;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAG,GAAG;GAAM,GAAG;GAAM;EACzC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;GACV;EACD,YAAY;EACb;CACD;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAK,GAAG;GAAK,GAAG;GAAK;EACzC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;GACV;EACD,YAAY;EACb;CACD;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAK,GAAG;GAAG,GAAG;GAAG;EACrC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;GACV;EACD,YAAY;EACb;CACD;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAK,GAAG;GAAG,GAAG;GAAG;EACrC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;GACV;EACD,YAAY;EACb;CACD;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAG,GAAG;GAAG,GAAG;GAAG;EACnC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;GACV;EACD,YAAY;EACb;CACF;;;;;;;;;;;;;;AAeD,IAAa,+BAA4D;CACvE;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAK,GAAG;GAAG,GAAG;GAAG;EACrC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;GACV;EACD,YAAY;EACb;CACD;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAK,GAAG;GAAG,GAAG;GAAG;EACrC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;GACV;EACD,YAAY;EACb;CACD;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAK,GAAG;GAAG,GAAG;GAAG;EACrC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;GACV;EACD,YAAY;EACb;CACD;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAK,GAAG;GAAG,GAAG;GAAG;EACrC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;GACV;EACD,YAAY;EACb;CACD;EACE,OAAO;EACP,eAAe;GAAE,GAAG;GAAG,GAAG;GAAG,GAAG;GAAG;EACnC,oBAAoB;EACpB,aAAa;GACX,QAAQ;GACR,SAAS;GACV;EACD,YAAY;EACb;CACF;;;;;;;;;;AAWD,SAAgB,qBACd,cAC6B;AAC7B,SAAQ,cAAR;EACE,KAAK,gBACH,QAAO;EACT,KAAK,iBACH,QAAO;EACT,KAAK,gBACH,QAAO;EACT,KAAK,kBACH,QAAO;EACT,QACE,QAAO;;;;;;;;;;;;;;;;AAiBb,SAAgB,kBACd,cACA,OACS;CACT,MAAM,YAAY,qBAAqB,aAAa;CAGpD,IAAI,kBAAkB,UAAU;AAChC,MAAK,MAAM,MAAM,UACf,KAAI,GAAG,SAAS,MACd,mBAAkB;KAElB;AAIJ,QAAO,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;AAwBzB,SAAgB,sBACd,aACuB;AACvB,QAAO,yBAAyB;;;;;;;;;;;AAYlC,SAAgB,0BACd,cACQ;AACR,QAAO,2BAA2B;;;;;;;;;AAkCpC,IAAa,mBAAkE;CAC7E,eAAe;EACb,MAAM;EACN,aAAa;EACb,iBAAiB;EACjB,kBAAkB;EAClB,oBAAoB;EACrB;CACD,gBAAgB;EACd,MAAM;EACN,aAAa;EACb,iBAAiB;EACjB,kBAAkB;EAClB,oBAAoB;EACrB;CACD,eAAe;EACb,MAAM;EACN,aAAa;EACb,iBAAiB;EACjB,kBAAkB;EAClB,oBAAoB;EACrB;CACD,iBAAiB;EACf,MAAM;EACN,aAAa;EACb,iBAAiB;EACjB,kBAAkB;EAClB,oBAAoB;EACrB;CACF;;;;;;;;;;AAWD,SAAgB,kBACd,cACgB;AAChB,QAAO,iBAAiB"}
1
+ {"version":3,"file":"RecoveryAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/RecoveryAnimations.ts"],"sourcesContent":["/**\n * Recovery Animation System for Black Trigram\n *\n * Implements realistic recovery animations for standing up from fallen states.\n * Based on Korean martial arts recovery techniques (기상 - Gisang).\n *\n * @module systems/animation/RecoveryAnimations\n * @category Animation\n * @korean κΈ°μƒμ• λ‹ˆλ©”μ΄μ…˜\n */\n\nimport type { GroundState, RecoveryAnimationType } from \"../core/types\";\nimport {\n GROUND_STATE_TO_RECOVERY,\n RECOVERY_TYPE_TO_ANIMATION,\n} from \"../core/types\";\n\n/**\n * Recovery animation keyframe data structure\n *\n * Defines key poses during recovery animations for skeletal rendering.\n * Each keyframe specifies body positions at critical moments.\n *\n * @korean κΈ°μƒν‚€ν”„λ ˆμž„\n */\nexport interface RecoveryKeyframe {\n /** Frame number (0-indexed) */\n readonly frame: number;\n\n /** Torso rotation (radians) */\n readonly torsoRotation: { x: number; y: number; z: number };\n\n /** Center of mass vertical position (0-1, 1=standing, 0=ground) */\n readonly centerOfMassHeight: number;\n\n /** Description of this keyframe */\n readonly description: {\n readonly korean: string;\n readonly english: string;\n };\n\n /** Whether player is vulnerable at this frame */\n readonly vulnerable: boolean;\n}\n\n/**\n * Prone stand-up keyframes (μ—Žλ“œλ¦° 기상)\n *\n * 30 frames (500ms) sequence:\n * - Frames 0-8: Push up with hands, torso lifts\n * - Frames 9-18: Legs swing under body, kneeling position\n * - Frames 19-24: Rise from kneeling to standing (vulnerable)\n * - Frames 25-29: Final stance adjustment (interruptible)\n *\n * @korean μ—Žλ“œλ¦°κΈ°μƒν‚€ν”„λ ˆμž„\n */\nexport const RECOVERY_PRONE_KEYFRAMES: readonly RecoveryKeyframe[] = [\n {\n frame: 0,\n torsoRotation: { x: 1.57, y: 0, z: 0 }, // Face down (90Β° forward)\n centerOfMassHeight: 0.05,\n description: {\n korean: \"μ—Žλ“œλ¦° μžμ„Έ\",\n english: \"Prone position\",\n },\n vulnerable: true,\n },\n {\n frame: 8,\n torsoRotation: { x: 1.2, y: 0, z: 0 }, // Hands pushing, torso lifting\n centerOfMassHeight: 0.2,\n description: {\n korean: \"μ†μœΌλ‘œ λ°€μ–΄ 올리기\",\n english: \"Hands push up torso\",\n },\n vulnerable: true,\n },\n {\n frame: 18,\n torsoRotation: { x: 0.7, y: 0, z: 0 }, // Kneeling position\n centerOfMassHeight: 0.5,\n description: {\n korean: \"무릎 κΏ‡κΈ°\",\n english: \"Kneeling position\",\n },\n vulnerable: true,\n },\n {\n frame: 24,\n torsoRotation: { x: 0.2, y: 0, z: 0 }, // Rising to standing\n centerOfMassHeight: 0.75,\n description: {\n korean: \"μΌμ–΄μ„œκΈ°\",\n english: \"Rising to standing\",\n },\n vulnerable: false, // Last 6 frames (24-30) entering safe zone\n },\n {\n frame: 29,\n torsoRotation: { x: 0, y: 0, z: 0 }, // Standing (interruptible)\n centerOfMassHeight: 0.9,\n description: {\n korean: \"μ„œ μžˆλŠ” μžμ„Έ\",\n english: \"Standing stance\",\n },\n vulnerable: false, // Last 6 frames (25-30) are not vulnerable\n },\n] as const;\n\n/**\n * Supine stand-up keyframes (λˆ„μš΄ 기상)\n *\n * 36 frames (600ms) sequence:\n * - Frames 0-10: Abs crunch sit-up motion\n * - Frames 11-22: Forward roll onto feet\n * - Frames 23-30: Feet plant, rise to standing (vulnerable)\n * - Frames 31-35: Final stance adjustment (interruptible)\n *\n * @korean λˆ„μš΄κΈ°μƒν‚€ν”„λ ˆμž„\n */\nexport const RECOVERY_SUPINE_KEYFRAMES: readonly RecoveryKeyframe[] = [\n {\n frame: 0,\n torsoRotation: { x: -1.57, y: 0, z: 0 }, // Face up (90Β° back)\n centerOfMassHeight: 0.05,\n description: {\n korean: \"λˆ„μš΄ μžμ„Έ\",\n english: \"Supine position\",\n },\n vulnerable: true,\n },\n {\n frame: 10,\n torsoRotation: { x: -0.9, y: 0, z: 0 }, // Sit-up motion\n centerOfMassHeight: 0.3,\n description: {\n korean: \"μœ—λͺΈ μΌμœΌν‚€κΈ°\",\n english: \"Sit-up motion\",\n },\n vulnerable: true,\n },\n {\n frame: 22,\n torsoRotation: { x: 0.4, y: 0, z: 0 }, // Forward roll\n centerOfMassHeight: 0.4,\n description: {\n korean: \"μ „λ°© ꡬλ₯΄κΈ°\",\n english: \"Forward roll\",\n },\n vulnerable: true,\n },\n {\n frame: 30,\n torsoRotation: { x: 0.2, y: 0, z: 0 }, // Feet planted, rising\n centerOfMassHeight: 0.7,\n description: {\n korean: \"발 λ””λ””κ³  μΌμ–΄μ„œκΈ°\",\n english: \"Feet planted, rising\",\n },\n vulnerable: false, // Last 6 frames (30-36) entering safe zone\n },\n {\n frame: 35,\n torsoRotation: { x: 0, y: 0, z: 0 }, // Standing (interruptible)\n centerOfMassHeight: 0.9,\n description: {\n korean: \"μ„œ μžˆλŠ” μžμ„Έ\",\n english: \"Standing stance\",\n },\n vulnerable: false, // Last 6 frames (30-36) are not vulnerable\n },\n] as const;\n\n/**\n * Roll recovery keyframes (νšŒμ „κΈ°μƒ)\n *\n * 24 frames (400ms) sequence - FAST recovery\n * - Frames 0-6: Roll to side, momentum building\n * - Frames 7-14: Spring to feet with explosive movement\n * - Frames 15-18: Quick stance (vulnerable)\n * - Frames 19-23: Combat ready (interruptible)\n *\n * Costs 20 stamina for speed advantage.\n *\n * @korean νšŒμ „κΈ°μƒν‚€ν”„λ ˆμž„\n */\nexport const RECOVERY_ROLL_KEYFRAMES: readonly RecoveryKeyframe[] = [\n {\n frame: 0,\n torsoRotation: { x: 0, y: 1.57, z: 1.57 }, // Side position (90Β° roll)\n centerOfMassHeight: 0.05,\n description: {\n korean: \"μΈ‘λ©΄ μžμ„Έ\",\n english: \"Side position\",\n },\n vulnerable: true,\n },\n {\n frame: 6,\n torsoRotation: { x: 0.3, y: 0.8, z: 0.9 }, // Rolling motion\n centerOfMassHeight: 0.25,\n description: {\n korean: \"ꡬλ₯΄κΈ° μ›€μ§μž„\",\n english: \"Rolling motion\",\n },\n vulnerable: true,\n },\n {\n frame: 14,\n torsoRotation: { x: 0.4, y: 0, z: 0 }, // Springing to feet\n centerOfMassHeight: 0.6,\n description: {\n korean: \"발둜 νŠ€μ–΄μ˜€λ₯΄κΈ°\",\n english: \"Spring to feet\",\n },\n vulnerable: true,\n },\n {\n frame: 18,\n torsoRotation: { x: 0.1, y: 0, z: 0 }, // Quick stance\n centerOfMassHeight: 0.85,\n description: {\n korean: \"λΉ λ₯Έ μžμ„Έ\",\n english: \"Quick stance\",\n },\n vulnerable: false, // Last 6 frames (18-24) entering safe zone\n },\n {\n frame: 23,\n torsoRotation: { x: 0, y: 0, z: 0 }, // Combat ready (interruptible)\n centerOfMassHeight: 0.9,\n description: {\n korean: \"μ „νˆ¬ μ€€λΉ„\",\n english: \"Combat ready\",\n },\n vulnerable: false, // Last 6 frames (18-24) are not vulnerable\n },\n] as const;\n\n/**\n * Defensive getup keyframes (방어기상)\n *\n * 42 frames (700ms) sequence - SLOW but protected\n * - Frames 0-14: Slow rise with arms guarding head/torso\n * - Frames 15-28: Gradual stand with maintained guard\n * - Frames 29-36: Stance formation with guard (50% damage reduction)\n * - Frames 37-41: Ready stance (interruptible)\n *\n * Provides 50% damage reduction throughout animation.\n *\n * @korean λ°©μ–΄κΈ°μƒν‚€ν”„λ ˆμž„\n */\nexport const RECOVERY_DEFENSIVE_KEYFRAMES: readonly RecoveryKeyframe[] = [\n {\n frame: 0,\n torsoRotation: { x: 1.2, y: 0, z: 0 }, // Grounded, arms up\n centerOfMassHeight: 0.05,\n description: {\n korean: \"μ§€λ©΄μ—μ„œ νŒ” 올리기\",\n english: \"Grounded, arms up\",\n },\n vulnerable: true, // 50% damage reduction applies\n },\n {\n frame: 14,\n torsoRotation: { x: 0.9, y: 0, z: 0 }, // Slow rise, guard maintained\n centerOfMassHeight: 0.3,\n description: {\n korean: \"천천히 μΌμ–΄λ‚˜λ©° λ°©μ–΄\",\n english: \"Slow rise, guarded\",\n },\n vulnerable: true, // 50% damage reduction applies\n },\n {\n frame: 28,\n torsoRotation: { x: 0.5, y: 0, z: 0 }, // Gradual stand, guard up\n centerOfMassHeight: 0.6,\n description: {\n korean: \"점차 μ„œλ©° λ°©μ–΄ μœ μ§€\",\n english: \"Gradual stand, guard up\",\n },\n vulnerable: true, // 50% damage reduction applies\n },\n {\n frame: 36,\n torsoRotation: { x: 0.2, y: 0, z: 0 }, // Stance formation, guarded\n centerOfMassHeight: 0.8,\n description: {\n korean: \"μžμ„Έ ν˜•μ„±, λ°©μ–΄ μƒνƒœ\",\n english: \"Stance formation, guarded\",\n },\n vulnerable: false, // Last 6 frames (36-42) entering safe zone (still 50% reduction)\n },\n {\n frame: 41,\n torsoRotation: { x: 0, y: 0, z: 0 }, // Ready stance (interruptible)\n centerOfMassHeight: 0.9,\n description: {\n korean: \"μ€€λΉ„ μžμ„Έ\",\n english: \"Ready stance\",\n },\n vulnerable: false, // Last 6 frames (36-42) are not vulnerable\n },\n] as const;\n\n/**\n * Get keyframes for a specific recovery type\n *\n * @param recoveryType - Type of recovery animation\n * @returns Array of keyframes for that recovery type\n *\n * @public\n * @korean κΈ°μƒν‚€ν”„λ ˆμž„κ°€μ Έμ˜€κΈ°\n */\nexport function getRecoveryKeyframes(\n recoveryType: RecoveryAnimationType\n): readonly RecoveryKeyframe[] {\n switch (recoveryType) {\n case \"prone_standup\":\n return RECOVERY_PRONE_KEYFRAMES;\n case \"supine_standup\":\n return RECOVERY_SUPINE_KEYFRAMES;\n case \"roll_recovery\":\n return RECOVERY_ROLL_KEYFRAMES;\n case \"defensive_getup\":\n return RECOVERY_DEFENSIVE_KEYFRAMES;\n default:\n return RECOVERY_ROLL_KEYFRAMES;\n }\n}\n\n/**\n * Check if a frame in a recovery animation is vulnerable\n *\n * Vulnerability is determined by keyframe data. The last 6 frames\n * of each recovery animation are interruptible and not vulnerable.\n *\n * @param recoveryType - Type of recovery animation\n * @param frame - Current frame number (0-indexed)\n * @returns True if player is vulnerable at this frame\n *\n * @public\n * @korean μ·¨μ•½ν”„λ ˆμž„ν™•μΈ\n */\nexport function isVulnerableFrame(\n recoveryType: RecoveryAnimationType,\n frame: number\n): boolean {\n const keyframes = getRecoveryKeyframes(recoveryType);\n\n // Find the keyframe for this frame or the previous keyframe\n let currentKeyframe = keyframes[0];\n for (const kf of keyframes) {\n if (kf.frame <= frame) {\n currentKeyframe = kf;\n } else {\n break;\n }\n }\n\n return currentKeyframe.vulnerable;\n}\n\n/**\n * Determine appropriate recovery animation from ground state\n *\n * Uses ground state to select default recovery animation.\n * Side positions default to roll recovery for dynamic movement.\n *\n * @param groundState - Current ground position\n * @returns Default recovery animation type\n *\n * @example\n * ```typescript\n * const recoveryType = determineRecoveryType(\"prone\");\n * // Returns: \"prone_standup\"\n *\n * const sideRecovery = determineRecoveryType(\"side_left\");\n * // Returns: \"roll_recovery\" (default for side positions)\n * ```\n *\n * @public\n * @korean κΈ°μƒμœ ν˜•κ²°μ •\n */\nexport function determineRecoveryType(\n groundState: GroundState\n): RecoveryAnimationType {\n return GROUND_STATE_TO_RECOVERY[groundState];\n}\n\n/**\n * Get recovery animation state from recovery type\n *\n * @param recoveryType - Recovery animation type\n * @returns Animation state name\n *\n * @public\n * @korean κΈ°μƒμ• λ‹ˆλ©”μ΄μ…˜μƒνƒœ\n */\nexport function getRecoveryAnimationState(\n recoveryType: RecoveryAnimationType\n): string {\n return RECOVERY_TYPE_TO_ANIMATION[recoveryType];\n}\n\n/**\n * Recovery animation configuration\n *\n * Additional properties for recovery animations beyond base AnimationConfig.\n *\n * @korean 기상섀정\n */\nexport interface RecoveryConfig {\n /** Recovery animation type */\n readonly type: RecoveryAnimationType;\n\n /** Stamina cost to execute (0 for normal recoveries) */\n readonly staminaCost: number;\n\n /** Damage reduction percentage during animation (0-1) */\n readonly damageReduction: number;\n\n /** Number of initial vulnerable frames (first N frames are vulnerable to damage) */\n readonly vulnerableFrames: number;\n\n /** Frame when player becomes interruptible (last 6 frames typically) */\n readonly interruptibleFrame: number;\n}\n\n/**\n * Recovery animation configurations\n *\n * Defines stamina costs, damage reduction, and vulnerability windows.\n *\n * @korean 기상섀정맡\n */\nexport const RECOVERY_CONFIGS: Record<RecoveryAnimationType, RecoveryConfig> = {\n prone_standup: {\n type: \"prone_standup\",\n staminaCost: 0,\n damageReduction: 0,\n vulnerableFrames: 24, // Vulnerable for first 24 frames (80%)\n interruptibleFrame: 24, // Last 6 frames (25-30) are interruptible\n },\n supine_standup: {\n type: \"supine_standup\",\n staminaCost: 0,\n damageReduction: 0,\n vulnerableFrames: 30, // Vulnerable for first 30 frames (83%)\n interruptibleFrame: 30, // Last 6 frames (30-36) are interruptible\n },\n roll_recovery: {\n type: \"roll_recovery\",\n staminaCost: 20, // Costs stamina for speed\n damageReduction: 0,\n vulnerableFrames: 18, // Vulnerable for first 18 frames (75%)\n interruptibleFrame: 18, // Last 6 frames (18-24) are interruptible\n },\n defensive_getup: {\n type: \"defensive_getup\",\n staminaCost: 0,\n damageReduction: 0.5, // 50% damage reduction throughout\n vulnerableFrames: 36, // Vulnerable for first 36 frames (86%)\n interruptibleFrame: 36, // Last 6 frames (36-42) are interruptible\n },\n};\n\n/**\n * Get recovery configuration\n *\n * @param recoveryType - Recovery animation type\n * @returns Recovery configuration\n *\n * @public\n * @korean κΈ°μƒμ„€μ •κ°€μ Έμ˜€κΈ°\n */\nexport function getRecoveryConfig(\n recoveryType: RecoveryAnimationType\n): RecoveryConfig {\n return RECOVERY_CONFIGS[recoveryType];\n}\n"],"mappings":"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"}