blacktrigram 0.7.47 → 0.7.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (471) 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.d.ts.map +1 -1
  14. package/lib/components/screens/combat/CombatScreen3D.js +29 -25
  15. package/lib/components/screens/combat/CombatScreen3D.js.map +1 -1
  16. package/lib/components/screens/combat/components/controls/CombatButtons.js.map +1 -1
  17. package/lib/components/screens/combat/components/controls/CombatControlsPanel.js.map +1 -1
  18. package/lib/components/screens/combat/components/controls/ControlsGuide.js.map +1 -1
  19. package/lib/components/screens/combat/components/controls/KeyboardHints.js.map +1 -1
  20. package/lib/components/screens/combat/components/controls/PauseMenu.js.map +1 -1
  21. package/lib/components/screens/combat/components/controls/PauseMenuButton.js.map +1 -1
  22. package/lib/components/screens/combat/components/controls/QuickSettings.js.map +1 -1
  23. package/lib/components/screens/combat/components/effects/BloodDecals3D.js.map +1 -1
  24. package/lib/components/screens/combat/components/effects/BloodLossOverlayHtml.js.map +1 -1
  25. package/lib/components/screens/combat/components/effects/BloodParticles3D.js.map +1 -1
  26. package/lib/components/screens/combat/components/effects/BloodViscosity3D.js.map +1 -1
  27. package/lib/components/screens/combat/components/effects/CombatParticleEffects3D.js.map +1 -1
  28. package/lib/components/screens/combat/components/effects/ConsciousnessBlur.js.map +1 -1
  29. package/lib/components/screens/combat/components/effects/InternalDamage3D.js.map +1 -1
  30. package/lib/components/screens/combat/components/effects/PainVignette.js.map +1 -1
  31. package/lib/components/screens/combat/components/effects/ParticleAudio3D.js.map +1 -1
  32. package/lib/components/screens/combat/components/effects/TraumaOverlay3D.js.map +1 -1
  33. package/lib/components/screens/combat/components/feedback/MatchCountdown.js.map +1 -1
  34. package/lib/components/screens/combat/components/feedback/RoundAnnouncementOverlayHtml.js.map +1 -1
  35. package/lib/components/screens/combat/components/feedback/RoundDisplayStatus.js.map +1 -1
  36. package/lib/components/screens/combat/components/feedback/RoundStartAnnouncementOverlayHtml.js.map +1 -1
  37. package/lib/components/screens/combat/components/hud/CombatBottomHUD.d.ts.map +1 -1
  38. package/lib/components/screens/combat/components/hud/CombatBottomHUD.js +2 -2
  39. package/lib/components/screens/combat/components/hud/CombatBottomHUD.js.map +1 -1
  40. package/lib/components/screens/combat/components/hud/CombatLeftHUD.js.map +1 -1
  41. package/lib/components/screens/combat/components/hud/CombatPortraitStatusStrip.js +1 -1
  42. package/lib/components/screens/combat/components/hud/CombatPortraitStatusStrip.js.map +1 -1
  43. package/lib/components/screens/combat/components/hud/CombatRightHUD.js.map +1 -1
  44. package/lib/components/screens/combat/components/hud/CombatTopHUD.d.ts.map +1 -1
  45. package/lib/components/screens/combat/components/hud/CombatTopHUD.js +2 -1
  46. package/lib/components/screens/combat/components/hud/CombatTopHUD.js.map +1 -1
  47. package/lib/components/screens/combat/components/hud/DifficultyIndicator.js.map +1 -1
  48. package/lib/components/screens/combat/components/hud/FPSMonitor.js.map +1 -1
  49. package/lib/components/screens/combat/components/hud/MobileControlsWrapper.js.map +1 -1
  50. package/lib/components/screens/combat/components/hud/PlayerStateOverlayHtml.js.map +1 -1
  51. package/lib/components/screens/combat/components/indicators/BalanceIndicator.js.map +1 -1
  52. package/lib/components/screens/combat/components/indicators/InputBufferDisplay.js.map +1 -1
  53. package/lib/components/screens/combat/components/indicators/StaminaWarning.js.map +1 -1
  54. package/lib/components/screens/combat/components/indicators/TechniqueNameDisplay.js.map +1 -1
  55. package/lib/components/screens/combat/helpers/AnimationUpdater.d.ts.map +1 -1
  56. package/lib/components/screens/combat/helpers/AnimationUpdater.js +4 -2
  57. package/lib/components/screens/combat/helpers/AnimationUpdater.js.map +1 -1
  58. package/lib/components/screens/combat/helpers/combatHelpers.js.map +1 -1
  59. package/lib/components/screens/combat/hooks/useAICombat.js.map +1 -1
  60. package/lib/components/screens/combat/hooks/useCombatActions.js.map +1 -1
  61. package/lib/components/screens/combat/hooks/useCombatAttackMovement.js.map +1 -1
  62. package/lib/components/screens/combat/hooks/useCombatAudio.js.map +1 -1
  63. package/lib/components/screens/combat/hooks/useCombatLayout.d.ts.map +1 -1
  64. package/lib/components/screens/combat/hooks/useCombatLayout.js +11 -5
  65. package/lib/components/screens/combat/hooks/useCombatLayout.js.map +1 -1
  66. package/lib/components/screens/combat/hooks/useCombatState.js.map +1 -1
  67. package/lib/components/screens/controls/ControlsScreen3D.js +1 -1
  68. package/lib/components/screens/controls/ControlsScreen3D.js.map +1 -1
  69. package/lib/components/screens/controls/components/ControlBindingsOverlayHtml.js.map +1 -1
  70. package/lib/components/screens/controls/components/ControlCategoryTabsOverlayHtml.js.map +1 -1
  71. package/lib/components/screens/controls/components/GamepadVisualization3D.js.map +1 -1
  72. package/lib/components/screens/controls/components/InteractiveControlDemoOverlayHtml.js.map +1 -1
  73. package/lib/components/screens/controls/components/Key3D.js.map +1 -1
  74. package/lib/components/screens/controls/components/VisualKeyboard3D.js.map +1 -1
  75. package/lib/components/screens/controls/constants/ControlsConstants.js.map +1 -1
  76. package/lib/components/screens/controls/hooks/useControlsState.js.map +1 -1
  77. package/lib/components/screens/endscreen/EndScreen3D.js.map +1 -1
  78. package/lib/components/screens/endscreen/components/DefeatAnimation3D.js.map +1 -1
  79. package/lib/components/screens/endscreen/components/MatchStatisticsDisplayOverlayHtml.js.map +1 -1
  80. package/lib/components/screens/endscreen/components/NavigationButtonsOverlayHtml.js.map +1 -1
  81. package/lib/components/screens/endscreen/components/PerformanceBreakdownOverlayHtml.js.map +1 -1
  82. package/lib/components/screens/endscreen/components/PerformanceRatingOverlayHtml.js.map +1 -1
  83. package/lib/components/screens/endscreen/components/VictoryAnimation3D.js.map +1 -1
  84. package/lib/components/screens/endscreen/components/WinnerDisplayOverlayHtml.js.map +1 -1
  85. package/lib/components/screens/intro/IntroScreen3D.js +1 -1
  86. package/lib/components/screens/intro/IntroScreen3D.js.map +1 -1
  87. package/lib/components/screens/intro/components/AbilityListOverlayHtml.js.map +1 -1
  88. package/lib/components/screens/intro/components/ArchetypeCardGridOverlayHtml.js.map +1 -1
  89. package/lib/components/screens/intro/components/ArchetypeCardOverlayHtml.js.map +1 -1
  90. package/lib/components/screens/intro/components/ArchetypeDisplayOverlayHtml.js.map +1 -1
  91. package/lib/components/screens/intro/components/EnhancedArchetypeDisplayOverlayHtml.js.map +1 -1
  92. package/lib/components/screens/intro/components/MenuButtonsOverlayHtml.js.map +1 -1
  93. package/lib/components/screens/intro/components/MenuSectionOverlayHtml.js.map +1 -1
  94. package/lib/components/screens/intro/components/StatBarOverlayHtml.js.map +1 -1
  95. package/lib/components/screens/philosophy/PhilosophyScreen3D.js +1 -1
  96. package/lib/components/screens/philosophy/PhilosophyScreen3D.js.map +1 -1
  97. package/lib/components/screens/training/TrainingScreen3D.d.ts.map +1 -1
  98. package/lib/components/screens/training/TrainingScreen3D.js +3 -11
  99. package/lib/components/screens/training/TrainingScreen3D.js.map +1 -1
  100. package/lib/components/screens/training/components/AnatomyControlsOverlayHtml.js.map +1 -1
  101. package/lib/components/screens/training/components/AnatomyOverlay3D.js.map +1 -1
  102. package/lib/components/screens/training/components/FootPlacementMarkers3D.js.map +1 -1
  103. package/lib/components/screens/training/components/FootworkDrillsOverlayHtml.js.map +1 -1
  104. package/lib/components/screens/training/components/HitFeedbackEffect3D.js.map +1 -1
  105. package/lib/components/screens/training/components/TrainingButtonsOverlayHtml.js.map +1 -1
  106. package/lib/components/screens/training/components/TrainingControlsOverlayHtml.js.map +1 -1
  107. package/lib/components/screens/training/components/TrainingDummy3D.js.map +1 -1
  108. package/lib/components/screens/training/components/TrainingFeedbackOverlayHtml.js.map +1 -1
  109. package/lib/components/screens/training/components/TrainingModeSelectorOverlayHtml.js.map +1 -1
  110. package/lib/components/screens/training/components/TrainingStatsOverlayHtml.js.map +1 -1
  111. package/lib/components/screens/training/components/VitalPointMarker3D.js.map +1 -1
  112. package/lib/components/screens/training/components/VitalPointTrainingOverlayHtml.js.map +1 -1
  113. package/lib/components/screens/training/components/hud/TrainingBottomHUD.d.ts.map +1 -1
  114. package/lib/components/screens/training/components/hud/TrainingBottomHUD.js +2 -2
  115. package/lib/components/screens/training/components/hud/TrainingBottomHUD.js.map +1 -1
  116. package/lib/components/screens/training/components/hud/TrainingLeftHUD.js.map +1 -1
  117. package/lib/components/screens/training/components/hud/TrainingRightHUD.js.map +1 -1
  118. package/lib/components/screens/training/components/hud/TrainingTopHUD.js.map +1 -1
  119. package/lib/components/screens/training/hooks/useAttackMovement.js.map +1 -1
  120. package/lib/components/screens/training/hooks/useTrainingActions.d.ts +1 -0
  121. package/lib/components/screens/training/hooks/useTrainingActions.d.ts.map +1 -1
  122. package/lib/components/screens/training/hooks/useTrainingActions.js +6 -4
  123. package/lib/components/screens/training/hooks/useTrainingActions.js.map +1 -1
  124. package/lib/components/screens/training/hooks/useTrainingLayout.d.ts.map +1 -1
  125. package/lib/components/screens/training/hooks/useTrainingLayout.js +11 -5
  126. package/lib/components/screens/training/hooks/useTrainingLayout.js.map +1 -1
  127. package/lib/components/screens/training/hooks/useTrainingState.js.map +1 -1
  128. package/lib/components/shared/base/BaseButton.js.map +1 -1
  129. package/lib/components/shared/base/BaseButtonOverlayHtml.js.map +1 -1
  130. package/lib/components/shared/base/BasePanel.js.map +1 -1
  131. package/lib/components/shared/base/BaseText.js.map +1 -1
  132. package/lib/components/shared/base/useKoreanTheme.js.map +1 -1
  133. package/lib/components/shared/debug/PerformanceDebugOverlayHtml.js.map +1 -1
  134. package/lib/components/shared/mobile/ActionButtons.js.map +1 -1
  135. package/lib/components/shared/mobile/GestureRecognizerPure.js.map +1 -1
  136. package/lib/components/shared/mobile/HapticController.js.map +1 -1
  137. package/lib/components/shared/mobile/MobileControlsPure.js.map +1 -1
  138. package/lib/components/shared/mobile/StanceWheelPure.js.map +1 -1
  139. package/lib/components/shared/mobile/TouchOptimizer.js.map +1 -1
  140. package/lib/components/shared/mobile/VirtualDPad.js.map +1 -1
  141. package/lib/components/shared/three/anatomy/BodySurface.js.map +1 -1
  142. package/lib/components/shared/three/anatomy/BoneAttachedMuscles.js.map +1 -1
  143. package/lib/components/shared/three/anatomy/BoneClothing.js.map +1 -1
  144. package/lib/components/shared/three/anatomy/BoneRenderer.js.map +1 -1
  145. package/lib/components/shared/three/anatomy/Face3D.js.map +1 -1
  146. package/lib/components/shared/three/anatomy/Foot3D.js.map +1 -1
  147. package/lib/components/shared/three/anatomy/Hand3D.js.map +1 -1
  148. package/lib/components/shared/three/effects/ActionFeedback.js.map +1 -1
  149. package/lib/components/shared/three/effects/DamageNumbers.js.map +1 -1
  150. package/lib/components/shared/three/effects/HitEffects3D.js.map +1 -1
  151. package/lib/components/shared/three/effects/PlayerStateIndicators.js.map +1 -1
  152. package/lib/components/shared/three/effects/StanceSymbol3D.js.map +1 -1
  153. package/lib/components/shared/three/effects/StanceTransitionEffect.js.map +1 -1
  154. package/lib/components/shared/three/effects/VitalPointMarkers3D.js.map +1 -1
  155. package/lib/components/shared/three/indicators/ElementalColorSystem.js.map +1 -1
  156. package/lib/components/shared/three/indicators/GuardIndicator.js.map +1 -1
  157. package/lib/components/shared/three/indicators/HapticFeedback.js.map +1 -1
  158. package/lib/components/shared/three/indicators/StanceChangeIndicator.js.map +1 -1
  159. package/lib/components/shared/three/models/Player3DWithTransitions.js.map +1 -1
  160. package/lib/components/shared/three/models/SkeletalPlayer3D.d.ts.map +1 -1
  161. package/lib/components/shared/three/models/SkeletalPlayer3D.js +7 -5
  162. package/lib/components/shared/three/models/SkeletalPlayer3D.js.map +1 -1
  163. package/lib/components/shared/three/optimization/AdaptiveQuality.js.map +1 -1
  164. package/lib/components/shared/three/scene/AtmosphericParticles3D.js.map +1 -1
  165. package/lib/components/shared/three/scene/BackgroundScene3D.js.map +1 -1
  166. package/lib/components/shared/three/scene/CombatArena3D.js.map +1 -1
  167. package/lib/components/shared/three/scene/KoreanSignage3D.js.map +1 -1
  168. package/lib/components/shared/three/ui/ArchetypeCard.js.map +1 -1
  169. package/lib/components/shared/three/ui/BodyPartHealthDisplay.js.map +1 -1
  170. package/lib/components/shared/three/ui/BreathingIndicator2.js.map +1 -1
  171. package/lib/components/shared/three/ui/CombatReadinessBar.js.map +1 -1
  172. package/lib/components/shared/three/ui/ComboCounter.js.map +1 -1
  173. package/lib/components/shared/three/ui/HealthBar.js.map +1 -1
  174. package/lib/components/shared/three/ui/KoreanButton.js.map +1 -1
  175. package/lib/components/shared/three/ui/KoreanPanel.js.map +1 -1
  176. package/lib/components/shared/three/ui/KoreanText.js.map +1 -1
  177. package/lib/components/shared/three/ui/MenuList.js.map +1 -1
  178. package/lib/components/shared/three/ui/PlayerHUD.js.map +1 -1
  179. package/lib/components/shared/three/ui/ProgressBar.js.map +1 -1
  180. package/lib/components/shared/three/ui/SpeedIndicatorHUD.js.map +1 -1
  181. package/lib/components/shared/three/ui/StaminaBar.js.map +1 -1
  182. package/lib/components/shared/three/ui/TechniqueBar.js.map +1 -1
  183. package/lib/components/shared/three/ui/TechniqueCard.js.map +1 -1
  184. package/lib/components/shared/three/ui/VitalPointOverlayControlsHtml.js.map +1 -1
  185. package/lib/components/shared/ui/BackButton.js.map +1 -1
  186. package/lib/components/shared/ui/BaseHUDContainer.js.map +1 -1
  187. package/lib/components/shared/ui/CombatTimer.js.map +1 -1
  188. package/lib/components/shared/ui/ErrorModal.js.map +1 -1
  189. package/lib/components/shared/ui/LoadingState.js.map +1 -1
  190. package/lib/components/shared/ui/SplashScreen.js +2 -2
  191. package/lib/components/shared/ui/SplashScreen.js.map +1 -1
  192. package/lib/components/shared/ui/VitalPointOverlayControlsPure.js.map +1 -1
  193. package/lib/components/shared/ui/VolumeControl.js.map +1 -1
  194. package/lib/components/shared/ui/shared/ConfirmDialog.js.map +1 -1
  195. package/lib/components/ui/combat/BalanceIndicatorOverlayHtml.js.map +1 -1
  196. package/lib/constants/bodyDimensions.js.map +1 -1
  197. package/lib/constants/bodyRenderingConstants.js.map +1 -1
  198. package/lib/data/archetypeClothing.js.map +1 -1
  199. package/lib/data/archetypePhysicalAttributes.js.map +1 -1
  200. package/lib/data/techniqueMappings.js.map +1 -1
  201. package/lib/data/techniques.js.map +1 -1
  202. package/lib/hooks/useActionFeedback.js.map +1 -1
  203. package/lib/hooks/useBalanceAnimations.js.map +1 -1
  204. package/lib/hooks/useCombatTimer.js.map +1 -1
  205. package/lib/hooks/useDebounce.js.map +1 -1
  206. package/lib/hooks/useHUDLayout.d.ts.map +1 -1
  207. package/lib/hooks/useHUDLayout.js +3 -2
  208. package/lib/hooks/useHUDLayout.js.map +1 -1
  209. package/lib/hooks/useHandPoseTransitions.js.map +1 -1
  210. package/lib/hooks/useKeyboardControls.js.map +1 -1
  211. package/lib/hooks/useMatchCountdown.js.map +1 -1
  212. package/lib/hooks/useMuscleActivation.js.map +1 -1
  213. package/lib/hooks/usePauseMenu.js.map +1 -1
  214. package/lib/hooks/usePlayerAnimation.js.map +1 -1
  215. package/lib/hooks/useResponsiveLayout.js.map +1 -1
  216. package/lib/hooks/useRoundTransition.js.map +1 -1
  217. package/lib/hooks/useSkeletalAnimation.d.ts.map +1 -1
  218. package/lib/hooks/useSkeletalAnimation.js +1 -1
  219. package/lib/hooks/useSkeletalAnimation.js.map +1 -1
  220. package/lib/hooks/useTechniqueSelection.js.map +1 -1
  221. package/lib/hooks/useThrottle.js.map +1 -1
  222. package/lib/hooks/useTouchControls.js.map +1 -1
  223. package/lib/hooks/useWebGLContextLossHandler.js.map +1 -1
  224. package/lib/hooks/useWindowSize.js.map +1 -1
  225. package/lib/systems/CombatSystem.js.map +1 -1
  226. package/lib/systems/EffectCalculator.js.map +1 -1
  227. package/lib/systems/LayoutSystem.js.map +1 -1
  228. package/lib/systems/PlayerEffectManager.js.map +1 -1
  229. package/lib/systems/ResponsiveScaling.js.map +1 -1
  230. package/lib/systems/TrigramSystem.js.map +1 -1
  231. package/lib/systems/VitalPointSystem.js.map +1 -1
  232. package/lib/systems/ai/AIPersonality.js.map +1 -1
  233. package/lib/systems/ai/AdaptiveDifficulty.js +16 -16
  234. package/lib/systems/ai/AdaptiveDifficulty.js.map +1 -1
  235. package/lib/systems/ai/ArchetypeEnforcer.js.map +1 -1
  236. package/lib/systems/ai/ComboSystem.js.map +1 -1
  237. package/lib/systems/ai/DecisionTree.js.map +1 -1
  238. package/lib/systems/ai/TrainingAI.js.map +1 -1
  239. package/lib/systems/ai/types.js.map +1 -1
  240. package/lib/systems/animation/builders/AnimationBuilder.js.map +1 -1
  241. package/lib/systems/animation/builders/HandPoseApplicator.js.map +1 -1
  242. package/lib/systems/animation/builders/HandPoses.js.map +1 -1
  243. package/lib/systems/animation/builders/KeyframeConfig.js.map +1 -1
  244. package/lib/systems/animation/builders/KeyframeInterpolation.js.map +1 -1
  245. package/lib/systems/animation/builders/KickPhaseApplicator.d.ts +6 -0
  246. package/lib/systems/animation/builders/KickPhaseApplicator.d.ts.map +1 -1
  247. package/lib/systems/animation/builders/KickPhaseApplicator.js +16 -9
  248. package/lib/systems/animation/builders/KickPhaseApplicator.js.map +1 -1
  249. package/lib/systems/animation/builders/KoreanGuardPositions.d.ts +4 -4
  250. package/lib/systems/animation/builders/KoreanGuardPositions.js.map +1 -1
  251. package/lib/systems/animation/builders/MartialArtsAnimationBuilder.d.ts +1 -1
  252. package/lib/systems/animation/builders/MartialArtsAnimationBuilder.d.ts.map +1 -1
  253. package/lib/systems/animation/builders/MartialArtsAnimationBuilder.js +5 -5
  254. package/lib/systems/animation/builders/MartialArtsAnimationBuilder.js.map +1 -1
  255. package/lib/systems/animation/builders/MartialArtsConstants.d.ts +112 -71
  256. package/lib/systems/animation/builders/MartialArtsConstants.d.ts.map +1 -1
  257. package/lib/systems/animation/builders/MartialArtsConstants.js +113 -72
  258. package/lib/systems/animation/builders/MartialArtsConstants.js.map +1 -1
  259. package/lib/systems/animation/builders/MartialPoseApplicator.js.map +1 -1
  260. package/lib/systems/animation/builders/PunchPhaseApplicator.js.map +1 -1
  261. package/lib/systems/animation/builders/SkeletonRig.js.map +1 -1
  262. package/lib/systems/animation/builders/TrigramGuardApplicator.js.map +1 -1
  263. package/lib/systems/animation/catalogs/AttackAnimations.js.map +1 -1
  264. package/lib/systems/animation/catalogs/BasicAnimations.js.map +1 -1
  265. package/lib/systems/animation/catalogs/ComboAnimations.js.map +1 -1
  266. package/lib/systems/animation/catalogs/DarkOpsAnimations.js.map +1 -1
  267. package/lib/systems/animation/catalogs/DefensiveAnimations.js.map +1 -1
  268. package/lib/systems/animation/catalogs/ElbowKneeAnimations.js.map +1 -1
  269. package/lib/systems/animation/catalogs/EnhancedAttackAnimations.js.map +1 -1
  270. package/lib/systems/animation/catalogs/EnhancedElbowKneeAnimations.js.map +1 -1
  271. package/lib/systems/animation/catalogs/FootworkSkeletalAnimations.js.map +1 -1
  272. package/lib/systems/animation/catalogs/GamRedirectionAnimations.js.map +1 -1
  273. package/lib/systems/animation/catalogs/GamStanceAnimations.js +21 -0
  274. package/lib/systems/animation/catalogs/GamStanceAnimations.js.map +1 -0
  275. package/lib/systems/animation/catalogs/GamTechniqueAnimations.js +34 -2
  276. package/lib/systems/animation/catalogs/GamTechniqueAnimations.js.map +1 -1
  277. package/lib/systems/animation/catalogs/GanStanceAnimations.js.map +1 -1
  278. package/lib/systems/animation/catalogs/GanTechniqueAnimations.js.map +1 -1
  279. package/lib/systems/animation/catalogs/GeonStanceAnimations.js.map +1 -1
  280. package/lib/systems/animation/catalogs/GonTechniqueAnimations.d.ts +9 -0
  281. package/lib/systems/animation/catalogs/GonTechniqueAnimations.d.ts.map +1 -1
  282. package/lib/systems/animation/catalogs/GonTechniqueAnimations.js +288 -0
  283. package/lib/systems/animation/catalogs/GonTechniqueAnimations.js.map +1 -0
  284. package/lib/systems/animation/catalogs/GrapplingAnimations.js.map +1 -1
  285. package/lib/systems/animation/catalogs/JinStanceAnimations.js.map +1 -1
  286. package/lib/systems/animation/catalogs/JinTechniqueAnimations.js.map +1 -1
  287. package/lib/systems/animation/catalogs/KickAnimations.d.ts +2 -2
  288. package/lib/systems/animation/catalogs/KickAnimations.js +2 -2
  289. package/lib/systems/animation/catalogs/KickAnimations.js.map +1 -1
  290. package/lib/systems/animation/catalogs/LiStanceAnimations.js +14 -1
  291. package/lib/systems/animation/catalogs/LiStanceAnimations.js.map +1 -1
  292. package/lib/systems/animation/catalogs/LiTechniqueAnimations.js.map +1 -1
  293. package/lib/systems/animation/catalogs/MovementAnimations.js.map +1 -1
  294. package/lib/systems/animation/catalogs/PunchAnimations.d.ts +1 -1
  295. package/lib/systems/animation/catalogs/PunchAnimations.js +1 -1
  296. package/lib/systems/animation/catalogs/PunchAnimations.js.map +1 -1
  297. package/lib/systems/animation/catalogs/RecoveryAnimations.js.map +1 -1
  298. package/lib/systems/animation/catalogs/SonStanceAnimations.js.map +1 -1
  299. package/lib/systems/animation/catalogs/SonTechniqueAnimations.js.map +1 -1
  300. package/lib/systems/animation/catalogs/SpecializedPunchAnimations.js.map +1 -1
  301. package/lib/systems/animation/catalogs/StanceAnimations.js.map +1 -1
  302. package/lib/systems/animation/catalogs/StanceAttackAnimations.js.map +1 -1
  303. package/lib/systems/animation/catalogs/StanceGuardPoses.d.ts +6 -6
  304. package/lib/systems/animation/catalogs/StanceGuardPoses.js +36 -36
  305. package/lib/systems/animation/catalogs/StanceGuardPoses.js.map +1 -1
  306. package/lib/systems/animation/catalogs/StanceIdleAnimations.js.map +1 -1
  307. package/lib/systems/animation/catalogs/StanceLocomotionAnimations.js.map +1 -1
  308. package/lib/systems/animation/catalogs/StepSkeletalAnimations.js.map +1 -1
  309. package/lib/systems/animation/catalogs/TaeJointLockAnimations.js.map +1 -1
  310. package/lib/systems/animation/catalogs/TaeStanceAnimations.js.map +1 -1
  311. package/lib/systems/animation/constants/AnatomicalLimits.js.map +1 -1
  312. package/lib/systems/animation/core/AnimationHitTiming.js.map +1 -1
  313. package/lib/systems/animation/core/AnimationOptimizations.js.map +1 -1
  314. package/lib/systems/animation/core/AnimationPriority.js +15 -15
  315. package/lib/systems/animation/core/AnimationPriority.js.map +1 -1
  316. package/lib/systems/animation/core/AnimationRegistry.d.ts +30 -0
  317. package/lib/systems/animation/core/AnimationRegistry.d.ts.map +1 -1
  318. package/lib/systems/animation/core/AnimationRegistry.js +74 -12
  319. package/lib/systems/animation/core/AnimationRegistry.js.map +1 -1
  320. package/lib/systems/animation/core/AnimationStateMachine.js +16 -16
  321. package/lib/systems/animation/core/AnimationStateMachine.js.map +1 -1
  322. package/lib/systems/animation/core/AnimationTransitions.d.ts.map +1 -1
  323. package/lib/systems/animation/core/AnimationTransitions.js +34 -0
  324. package/lib/systems/animation/core/AnimationTransitions.js.map +1 -1
  325. package/lib/systems/animation/core/LateralityTransform.js.map +1 -1
  326. package/lib/systems/animation/core/RecoveryPhaseEnhancer.js.map +1 -1
  327. package/lib/systems/animation/core/TechniqueAnimationMapper.js.map +1 -1
  328. package/lib/systems/animation/core/TechniqueAnimationMapping.js.map +1 -1
  329. package/lib/systems/animation/core/index.d.ts +1 -1
  330. package/lib/systems/animation/core/index.d.ts.map +1 -1
  331. package/lib/systems/animation/core/types.d.ts +24 -0
  332. package/lib/systems/animation/core/types.d.ts.map +1 -1
  333. package/lib/systems/animation/core/types.js +27 -11
  334. package/lib/systems/animation/core/types.js.map +1 -1
  335. package/lib/systems/animation/systems/AdvancedJointMovements.js.map +1 -1
  336. package/lib/systems/animation/systems/BodyFacingSystem.js.map +1 -1
  337. package/lib/systems/animation/systems/FacialExpressions.js.map +1 -1
  338. package/lib/systems/animation/systems/FallAnimations.js.map +1 -1
  339. package/lib/systems/animation/systems/MuscleActivation.js.map +1 -1
  340. package/lib/systems/bodypart/BodyPartDamageIntegration.js.map +1 -1
  341. package/lib/systems/bodypart/BodyPartHealthSystem.js.map +1 -1
  342. package/lib/systems/bodypart/BodyPartPositionMapping.js.map +1 -1
  343. package/lib/systems/bodypart/CombatInjuryIntegration.js.map +1 -1
  344. package/lib/systems/bodypart/InjuryIntegration.js.map +1 -1
  345. package/lib/systems/bodypart/InjuryTracker.js.map +1 -1
  346. package/lib/systems/bodypart/MovementPenaltySystem.js.map +1 -1
  347. package/lib/systems/bodypart/PlayerInjuryTrackingManager.js.map +1 -1
  348. package/lib/systems/bodypart/types.js.map +1 -1
  349. package/lib/systems/breathing/BreathingDisruptionSystem.js +19 -19
  350. package/lib/systems/breathing/BreathingDisruptionSystem.js.map +1 -1
  351. package/lib/systems/breathing/feedback.js.map +1 -1
  352. package/lib/systems/breathing/integration.js.map +1 -1
  353. package/lib/systems/combat/BalanceSystem.js +19 -19
  354. package/lib/systems/combat/BalanceSystem.js.map +1 -1
  355. package/lib/systems/combat/BreakingStatusEffects.js.map +1 -1
  356. package/lib/systems/combat/CombatStateSystem.js +17 -17
  357. package/lib/systems/combat/CombatStateSystem.js.map +1 -1
  358. package/lib/systems/combat/ConsciousnessSystem.js +24 -24
  359. package/lib/systems/combat/ConsciousnessSystem.js.map +1 -1
  360. package/lib/systems/combat/FallIntegration.js.map +1 -1
  361. package/lib/systems/combat/GrappleSystem.js.map +1 -1
  362. package/lib/systems/combat/LimbExposureSystem.js.map +1 -1
  363. package/lib/systems/combat/PainResponseSystem.js +21 -21
  364. package/lib/systems/combat/PainResponseSystem.js.map +1 -1
  365. package/lib/systems/combat/TrainingCombatSystem.js.map +1 -1
  366. package/lib/systems/combat/painConsciousnessUtils.js.map +1 -1
  367. package/lib/systems/combat/typeGuards.js.map +1 -1
  368. package/lib/systems/effects.js.map +1 -1
  369. package/lib/systems/game.js.map +1 -1
  370. package/lib/systems/movement/InjuryMovementModifier.js.map +1 -1
  371. package/lib/systems/movement/helpers/AccelerationUpdater.js.map +1 -1
  372. package/lib/systems/movement/helpers/accelerationUtils.js.map +1 -1
  373. package/lib/systems/movement/integration.js.map +1 -1
  374. package/lib/systems/physics/AttackMovementPhysics.js.map +1 -1
  375. package/lib/systems/physics/CollisionDetection.js.map +1 -1
  376. package/lib/systems/physics/CoordinateMapper.js.map +1 -1
  377. package/lib/systems/physics/KnockbackPhysics.js.map +1 -1
  378. package/lib/systems/physics/MovementPhysics.js.map +1 -1
  379. package/lib/systems/physics/PhysicalReachCalculator.js.map +1 -1
  380. package/lib/systems/physics/SpeedModifierSystem.js +6 -6
  381. package/lib/systems/physics/SpeedModifierSystem.js.map +1 -1
  382. package/lib/systems/trigram/KoreanCulture.js.map +1 -1
  383. package/lib/systems/trigram/KoreanTechniques.js.map +1 -1
  384. package/lib/systems/trigram/StanceManager.js.map +1 -1
  385. package/lib/systems/trigram/TransitionCalculator.js.map +1 -1
  386. package/lib/systems/trigram/TrigramCalculator.js.map +1 -1
  387. package/lib/systems/trigram/techniques/DarkOpsTechniques.js.map +1 -1
  388. package/lib/systems/trigram/techniques/GamTechniques.js.map +1 -1
  389. package/lib/systems/trigram/techniques/GanTechniques.js.map +1 -1
  390. package/lib/systems/trigram/techniques/GeonTechniques.js.map +1 -1
  391. package/lib/systems/trigram/techniques/GonTechniques.js.map +1 -1
  392. package/lib/systems/trigram/techniques/JinTechniques.js.map +1 -1
  393. package/lib/systems/trigram/techniques/LiTechniques.js.map +1 -1
  394. package/lib/systems/trigram/techniques/SonTechniques.js.map +1 -1
  395. package/lib/systems/trigram/techniques/TaeTechniques.js.map +1 -1
  396. package/lib/systems/trigram/techniques/TechniqueConfig.js.map +1 -1
  397. package/lib/systems/trigram/techniques/index.js.map +1 -1
  398. package/lib/systems/trigram/types/GonTechniqueExtensions.js.map +1 -1
  399. package/lib/systems/trigram/types.js.map +1 -1
  400. package/lib/systems/types.js.map +1 -1
  401. package/lib/systems/vitalpoint/DamageCalculator.js.map +1 -1
  402. package/lib/systems/vitalpoint/HitDetection.js.map +1 -1
  403. package/lib/systems/vitalpoint/KoreanAnatomy.js.map +1 -1
  404. package/lib/systems/vitalpoint/KoreanVitalPoints.js.map +1 -1
  405. package/lib/systems/vitalpoint/MeridianVitalPointMapping.js.map +1 -1
  406. package/lib/systems/vitalpoint/VitalPointsData.js.map +1 -1
  407. package/lib/types/AccessibilityTypes.js.map +1 -1
  408. package/lib/types/LayoutTypes.js.map +1 -1
  409. package/lib/types/PhysicsTypes.js.map +1 -1
  410. package/lib/types/common.js.map +1 -1
  411. package/lib/types/constants/animations.js.map +1 -1
  412. package/lib/types/constants/colors.js.map +1 -1
  413. package/lib/types/constants/designSystem.js.map +1 -1
  414. package/lib/types/constants/index.js.map +1 -1
  415. package/lib/types/constants/layout.d.ts +21 -0
  416. package/lib/types/constants/layout.d.ts.map +1 -1
  417. package/lib/types/constants/layout.js +22 -1
  418. package/lib/types/constants/layout.js.map +1 -1
  419. package/lib/types/constants/performance.js.map +1 -1
  420. package/lib/types/constants/typography.js.map +1 -1
  421. package/lib/types/constants/ui.js.map +1 -1
  422. package/lib/types/facial.js +19 -19
  423. package/lib/types/facial.js.map +1 -1
  424. package/lib/types/hand-animation.js.map +1 -1
  425. package/lib/types/injury.js.map +1 -1
  426. package/lib/types/muscle.js.map +1 -1
  427. package/lib/types/physics.js.map +1 -1
  428. package/lib/types/physicsConstants.js.map +1 -1
  429. package/lib/types/player-visual.d.ts +1 -1
  430. package/lib/types/player-visual.d.ts.map +1 -1
  431. package/lib/types/skeletal.js.map +1 -1
  432. package/lib/types/techniqueId.js.map +1 -1
  433. package/lib/utils/accessibility.js.map +1 -1
  434. package/lib/utils/arenaWorldDimensions.js.map +1 -1
  435. package/lib/utils/assetConfig.js.map +1 -1
  436. package/lib/utils/characterScaling.js.map +1 -1
  437. package/lib/utils/colorHelpers.js.map +1 -1
  438. package/lib/utils/colorUtils.js.map +1 -1
  439. package/lib/utils/combatReadiness.js.map +1 -1
  440. package/lib/utils/controlMapping.js.map +1 -1
  441. package/lib/utils/deviceDetection.js +6 -7
  442. package/lib/utils/deviceDetection.js.map +1 -1
  443. package/lib/utils/effectUtils.js.map +1 -1
  444. package/lib/utils/fabricTextures.js.map +1 -1
  445. package/lib/utils/hapticFeedback.js.map +1 -1
  446. package/lib/utils/haptics.js.map +1 -1
  447. package/lib/utils/htmlOverlayHelpers.js.map +1 -1
  448. package/lib/utils/inputSystem.js.map +1 -1
  449. package/lib/utils/koreanThemeHelpers.js.map +1 -1
  450. package/lib/utils/math.js.map +1 -1
  451. package/lib/utils/mobileLayoutHelpers.js.map +1 -1
  452. package/lib/utils/mobileUIUtils.js.map +1 -1
  453. package/lib/utils/performance/PerformanceMonitor.js.map +1 -1
  454. package/lib/utils/performance/PerformanceOverlay3D.js.map +1 -1
  455. package/lib/utils/performance/usePerformanceMonitor.js.map +1 -1
  456. package/lib/utils/performanceOptimization.js.map +1 -1
  457. package/lib/utils/player3DHelpers.js.map +1 -1
  458. package/lib/utils/playerUtils.js.map +1 -1
  459. package/lib/utils/responsiveLayout.js.map +1 -1
  460. package/lib/utils/responsiveLayoutHelpers.d.ts +7 -0
  461. package/lib/utils/responsiveLayoutHelpers.d.ts.map +1 -1
  462. package/lib/utils/responsiveLayoutHelpers.js +16 -2
  463. package/lib/utils/responsiveLayoutHelpers.js.map +1 -1
  464. package/lib/utils/responsiveOrientationConstants.js.map +1 -1
  465. package/lib/utils/safeAreaUtils.js.map +1 -1
  466. package/lib/utils/sharedPhysicsConfig.js.map +1 -1
  467. package/lib/utils/skeletonScaling.js.map +1 -1
  468. package/lib/utils/stanceHelpers.js.map +1 -1
  469. package/lib/utils/threeObjectPool.js.map +1 -1
  470. package/lib/utils/visualEffects.js.map +1 -1
  471. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"StepSkeletalAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/StepSkeletalAnimations.ts"],"sourcesContent":["/**\n * Korean martial arts step movement animations with skeletal keyframes\n *\n * Defines realistic tactical step animation sequences for precise footwork\n * with 30cm distance, 300ms duration, and guard maintenance.\n *\n * All step animations are implemented using the MartialArtsAnimationBuilder pattern.\n *\n * @module systems/animation/StepSkeletalAnimations\n * @category Animation System\n * @korean 발걸음애니메이션\n */\n\nimport type { SkeletalAnimation } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\n\n/**\n * FORWARD STEP Animation (전진보법)\n *\n * Tactical forward step with weight transfer and guard maintenance.\n *\n * Animation phases:\n * 1. Preparation (0-0.1s): Weight shifts to back foot, crouch slightly\n * 2. Movement (0.1-0.2s): Front foot lifts and extends forward\n * 3. Landing (0.2-0.25s): Front foot plants, weight transfers forward\n * 4. Stabilization (0.25-0.3s): Back foot follows, body straightens\n *\n * Distance: 30cm forward\n * Duration: 300ms\n * Guard: Maintained throughout\n *\n * @korean 전진보법애니메이션\n */\nexport const STEP_FORWARD_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"step_forward\", \"전진보법\")\n .asMovement(0.3, false)\n .stance()\n .forwardStep(0.12, \"ease-out\")\n .forwardStep(0.1, \"linear\")\n .recover(0.08, \"ease-in\")\n .build();\n\n/**\n * BACKWARD STEP Animation (후진보법)\n *\n * Tactical backward step for defensive retreat while maintaining guard.\n *\n * Animation phases:\n * 1. Preparation (0-0.1s): Weight shifts to front foot\n * 2. Movement (0.1-0.2s): Back foot lifts and extends backward\n * 3. Landing (0.2-0.25s): Back foot plants, weight transfers\n * 4. Stabilization (0.25-0.3s): Front foot follows, guard maintained\n *\n * Distance: 30cm backward\n * Duration: 300ms\n * Guard: Maintained throughout\n *\n * @korean 후진보법애니메이션\n */\nexport const STEP_BACK_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"step_back\", \"후진보법\")\n .asMovement(0.3, false)\n .stance()\n .backwardStep(0.12, \"ease-out\")\n .backwardStep(0.1, \"linear\")\n .recover(0.08, \"ease-in\")\n .build();\n\n/**\n * STEP LEFT Animation (좌측보법)\n *\n * Lateral step to the left while maintaining forward-facing guard.\n *\n * Animation phases:\n * 1. Preparation (0-0.1s): Weight shifts to right foot\n * 2. Movement (0.1-0.2s): Left foot lifts and extends laterally\n * 3. Landing (0.2-0.25s): Left foot plants, weight transfers\n * 4. Stabilization (0.25-0.3s): Right foot follows, stance width maintained\n *\n * Distance: 30cm lateral (left)\n * Duration: 300ms\n * Guard: Maintained forward-facing\n *\n * @korean 좌측보법애니메이션\n */\nexport const STEP_LEFT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"step_left\", \"좌측보법\")\n .asMovement(0.3, false)\n .stance()\n .sideStepLeft(0.12, \"ease-out\")\n .sideStepLeft(0.1, \"linear\")\n .recover(0.08, \"ease-in\")\n .build();\n\n/**\n * STEP RIGHT Animation (우측보법)\n *\n * Lateral step to the right while maintaining forward-facing guard.\n * Mirror of step left.\n *\n * Distance: 30cm lateral (right)\n * Duration: 300ms\n * Guard: Maintained forward-facing\n *\n * @korean 우측보법애니메이션\n */\nexport const STEP_RIGHT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"step_right\", \"우측보법\")\n .asMovement(0.3, false)\n .stance()\n .sideStepRight(0.12, \"ease-out\")\n .sideStepRight(0.1, \"linear\")\n .recover(0.08, \"ease-in\")\n .build();\n\n/**\n * Map of all step animations by name\n *\n * Provides quick lookup for step movement animations.\n *\n * @korean 발걸음애니메이션맵\n */\nexport const STEP_ANIMATIONS = new Map<string, SkeletalAnimation>([\n [\"step_forward\", STEP_FORWARD_ANIMATION],\n [\"step_back\", STEP_BACK_ANIMATION],\n [\"step_left\", STEP_LEFT_ANIMATION],\n [\"step_right\", STEP_RIGHT_ANIMATION],\n]);\n\n/**\n * Get step animation by name\n *\n * Returns the skeletal animation for the specified step direction.\n * Returns undefined if animation not found.\n *\n * @param animationName - Animation state name (e.g., \"step_forward\")\n * @returns Skeletal animation or undefined\n * @korean 발걸음애니메이션가져오기\n */\nexport function getStepAnimation(\n animationName: string\n): SkeletalAnimation | undefined {\n return STEP_ANIMATIONS.get(animationName);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAiCA,IAAa,yBACX,4BAA4B,OAAO,gBAAgB,OAAO,CACvD,WAAW,IAAK,MAAM,CACtB,QAAQ,CACR,YAAY,KAAM,WAAW,CAC7B,YAAY,IAAK,SAAS,CAC1B,QAAQ,KAAM,UAAU,CACxB,OAAO;;;;;;;;;;;;;;;;;;AAmBZ,IAAa,sBACX,4BAA4B,OAAO,aAAa,OAAO,CACpD,WAAW,IAAK,MAAM,CACtB,QAAQ,CACR,aAAa,KAAM,WAAW,CAC9B,aAAa,IAAK,SAAS,CAC3B,QAAQ,KAAM,UAAU,CACxB,OAAO;;;;;;;;;;;;;;;;;;AAmBZ,IAAa,sBACX,4BAA4B,OAAO,aAAa,OAAO,CACpD,WAAW,IAAK,MAAM,CACtB,QAAQ,CACR,aAAa,KAAM,WAAW,CAC9B,aAAa,IAAK,SAAS,CAC3B,QAAQ,KAAM,UAAU,CACxB,OAAO;;;;;;;;;;;;;AAcZ,IAAa,uBACX,4BAA4B,OAAO,cAAc,OAAO,CACrD,WAAW,IAAK,MAAM,CACtB,QAAQ,CACR,cAAc,KAAM,WAAW,CAC/B,cAAc,IAAK,SAAS,CAC5B,QAAQ,KAAM,UAAU,CACxB,OAAO;;;;;;;;AASZ,IAAa,kBAAkB,IAAI,IAA+B;CAChE,CAAC,gBAAgB,uBAAuB;CACxC,CAAC,aAAa,oBAAoB;CAClC,CAAC,aAAa,oBAAoB;CAClC,CAAC,cAAc,qBAAqB;CACrC,CAAC;;;;;;;;;;;AAYF,SAAgB,iBACd,eAC+B;CAC/B,OAAO,gBAAgB,IAAI,cAAc"}
1
+ {"version":3,"file":"StepSkeletalAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/StepSkeletalAnimations.ts"],"sourcesContent":["/**\n * Korean martial arts step movement animations with skeletal keyframes\n *\n * Defines realistic tactical step animation sequences for precise footwork\n * with 30cm distance, 300ms duration, and guard maintenance.\n *\n * All step animations are implemented using the MartialArtsAnimationBuilder pattern.\n *\n * @module systems/animation/StepSkeletalAnimations\n * @category Animation System\n * @korean 발걸음애니메이션\n */\n\nimport type { SkeletalAnimation } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\n\n/**\n * FORWARD STEP Animation (전진보법)\n *\n * Tactical forward step with weight transfer and guard maintenance.\n *\n * Animation phases:\n * 1. Preparation (0-0.1s): Weight shifts to back foot, crouch slightly\n * 2. Movement (0.1-0.2s): Front foot lifts and extends forward\n * 3. Landing (0.2-0.25s): Front foot plants, weight transfers forward\n * 4. Stabilization (0.25-0.3s): Back foot follows, body straightens\n *\n * Distance: 30cm forward\n * Duration: 300ms\n * Guard: Maintained throughout\n *\n * @korean 전진보법애니메이션\n */\nexport const STEP_FORWARD_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"step_forward\", \"전진보법\")\n .asMovement(0.3, false)\n .stance()\n .forwardStep(0.12, \"ease-out\")\n .forwardStep(0.1, \"linear\")\n .recover(0.08, \"ease-in\")\n .build();\n\n/**\n * BACKWARD STEP Animation (후진보법)\n *\n * Tactical backward step for defensive retreat while maintaining guard.\n *\n * Animation phases:\n * 1. Preparation (0-0.1s): Weight shifts to front foot\n * 2. Movement (0.1-0.2s): Back foot lifts and extends backward\n * 3. Landing (0.2-0.25s): Back foot plants, weight transfers\n * 4. Stabilization (0.25-0.3s): Front foot follows, guard maintained\n *\n * Distance: 30cm backward\n * Duration: 300ms\n * Guard: Maintained throughout\n *\n * @korean 후진보법애니메이션\n */\nexport const STEP_BACK_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"step_back\", \"후진보법\")\n .asMovement(0.3, false)\n .stance()\n .backwardStep(0.12, \"ease-out\")\n .backwardStep(0.1, \"linear\")\n .recover(0.08, \"ease-in\")\n .build();\n\n/**\n * STEP LEFT Animation (좌측보법)\n *\n * Lateral step to the left while maintaining forward-facing guard.\n *\n * Animation phases:\n * 1. Preparation (0-0.1s): Weight shifts to right foot\n * 2. Movement (0.1-0.2s): Left foot lifts and extends laterally\n * 3. Landing (0.2-0.25s): Left foot plants, weight transfers\n * 4. Stabilization (0.25-0.3s): Right foot follows, stance width maintained\n *\n * Distance: 30cm lateral (left)\n * Duration: 300ms\n * Guard: Maintained forward-facing\n *\n * @korean 좌측보법애니메이션\n */\nexport const STEP_LEFT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"step_left\", \"좌측보법\")\n .asMovement(0.3, false)\n .stance()\n .sideStepLeft(0.12, \"ease-out\")\n .sideStepLeft(0.1, \"linear\")\n .recover(0.08, \"ease-in\")\n .build();\n\n/**\n * STEP RIGHT Animation (우측보법)\n *\n * Lateral step to the right while maintaining forward-facing guard.\n * Mirror of step left.\n *\n * Distance: 30cm lateral (right)\n * Duration: 300ms\n * Guard: Maintained forward-facing\n *\n * @korean 우측보법애니메이션\n */\nexport const STEP_RIGHT_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"step_right\", \"우측보법\")\n .asMovement(0.3, false)\n .stance()\n .sideStepRight(0.12, \"ease-out\")\n .sideStepRight(0.1, \"linear\")\n .recover(0.08, \"ease-in\")\n .build();\n\n/**\n * Map of all step animations by name\n *\n * Provides quick lookup for step movement animations.\n *\n * @korean 발걸음애니메이션맵\n */\nexport const STEP_ANIMATIONS = new Map<string, SkeletalAnimation>([\n [\"step_forward\", STEP_FORWARD_ANIMATION],\n [\"step_back\", STEP_BACK_ANIMATION],\n [\"step_left\", STEP_LEFT_ANIMATION],\n [\"step_right\", STEP_RIGHT_ANIMATION],\n]);\n\n/**\n * Get step animation by name\n *\n * Returns the skeletal animation for the specified step direction.\n * Returns undefined if animation not found.\n *\n * @param animationName - Animation state name (e.g., \"step_forward\")\n * @returns Skeletal animation or undefined\n * @korean 발걸음애니메이션가져오기\n */\nexport function getStepAnimation(\n animationName: string\n): SkeletalAnimation | undefined {\n return STEP_ANIMATIONS.get(animationName);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAiCA,IAAa,yBACX,4BAA4B,OAAO,gBAAgB,MAAM,EACtD,WAAW,IAAK,KAAK,EACrB,OAAO,EACP,YAAY,KAAM,UAAU,EAC5B,YAAY,IAAK,QAAQ,EACzB,QAAQ,KAAM,SAAS,EACvB,MAAM;;;;;;;;;;;;;;;;;;AAmBX,IAAa,sBACX,4BAA4B,OAAO,aAAa,MAAM,EACnD,WAAW,IAAK,KAAK,EACrB,OAAO,EACP,aAAa,KAAM,UAAU,EAC7B,aAAa,IAAK,QAAQ,EAC1B,QAAQ,KAAM,SAAS,EACvB,MAAM;;;;;;;;;;;;;;;;;;AAmBX,IAAa,sBACX,4BAA4B,OAAO,aAAa,MAAM,EACnD,WAAW,IAAK,KAAK,EACrB,OAAO,EACP,aAAa,KAAM,UAAU,EAC7B,aAAa,IAAK,QAAQ,EAC1B,QAAQ,KAAM,SAAS,EACvB,MAAM;;;;;;;;;;;;;AAcX,IAAa,uBACX,4BAA4B,OAAO,cAAc,MAAM,EACpD,WAAW,IAAK,KAAK,EACrB,OAAO,EACP,cAAc,KAAM,UAAU,EAC9B,cAAc,IAAK,QAAQ,EAC3B,QAAQ,KAAM,SAAS,EACvB,MAAM;;;;;;;;AASX,IAAa,kBAAkB,IAAI,IAA+B;CAChE,CAAC,gBAAgB,sBAAsB;CACvC,CAAC,aAAa,mBAAmB;CACjC,CAAC,aAAa,mBAAmB;CACjC,CAAC,cAAc,oBAAoB;AACrC,CAAC;;;;;;;;;;;AAYD,SAAgB,iBACd,eAC+B;CAC/B,OAAO,gBAAgB,IAAI,aAAa;AAC1C"}
@@ -1 +1 @@
1
- {"version":3,"file":"TaeJointLockAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/TaeJointLockAnimations.ts"],"sourcesContent":["import { BoneName } from \"@/types/skeletal\";\nimport type { SkeletalAnimation } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\n\n/**\n * Anatomical safety constants for Tae (Lake) joint lock animations\n *\n * These limits document safe physiological ranges for joint manipulation techniques.\n * The constants serve as reference documentation validated by Korean martial arts experts\n * and inform the design of all joint lock animations to ensure realistic Hapkido mechanics\n * without exceeding anatomical safety thresholds.\n *\n * Note: These are documentation constants. The actual animation rotations are designed\n * to stay within these limits naturally through authentic joint lock biomechanics.\n */\nexport const ANATOMICAL_LIMITS_TAE_JOINT_LOCKS = {\n /**\n * Maximum safe wrist hyperextension: 70° (1.22 radians)\n * \n * Typical wrist extension limit is 70-90°. We use 70° as a safe\n * threshold for realistic joint locks without causing injury.\n */\n MAX_WRIST_HYPEREXTENSION: 1.22, // 70° in radians\n \n /**\n * Maximum safe elbow flexion: 145° (2.53 radians)\n * \n * Full elbow flexion is approximately 145-150°, allowing natural\n * bending and manipulation in joint lock techniques.\n */\n MAX_ELBOW_FLEXION: 2.53, // 145° in radians\n \n /**\n * Maximum safe shoulder rotation: ±90° (±1.57 radians)\n * \n * Safe shoulder rotation range for circular Hapkido movements\n * without risking impingement or structural damage.\n */\n MAX_SHOULDER_ROTATION: 1.57, // ±90° in radians\n} as const;\n\n// ═══════════════════════════════════════════════════════════════════════════\n// TAE TRIGRAM (☱ 태) - LAKE: JOINT MANIPULATION (관절기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * TAE WRIST LOCK SEQUENCE - 손목꺾기 (Wrist Lock Sequence)\n *\n * Simplified 3-phase Hapkido wrist lock sequence with circular small-circle technique.\n * \n * Phases:\n * - Setup (0-600ms): Reach and grasp opponent's wrist\n * - Control (600-1200ms): Apply circular pressure with small-circle rotation\n * - Finish (1200-1800ms): Lock wrist at hyperextension, opponent controlled\n *\n * Hapkido biomechanics:\n * - Small circular wrist motion generates torque\n * - Hip rotation powers the lock\n * - Wrist hyperextends to 70° (1.22 rad) safely\n * - Natural flowing movement, not jerky\n *\n * Target vital points: Wrist joint, elbow joint\n *\n * @korean 손목꺾기\n * @duration 1800ms (1.8 seconds)\n * @category Joint Lock Animation\n */\nexport const TAE_WRIST_LOCK_SEQUENCE: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"tae_wrist_lock_sequence\", \"손목꺾기\")\n .asAttack(1.8)\n // Phase 1: Setup - Reach and grasp wrist (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26) // -30°, 10°, -15° (Tae mid-level guard)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4) // 80° (flexed guard)\n .rotate(BoneName.WRIST_R, 0, 0, 0) // Neutral\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26) // -30°, -10°, 15°\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4) // -80° (flexed)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Control - Apply circular pressure (600ms)\n .at(0.6)\n .rotate(BoneName.SHOULDER_R, -0.17, 0.52, 0) // -10°, 30°, 0° (shoulder rises for leverage)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.05) // 60° (elbow in circular arc)\n .rotate(BoneName.WRIST_R, 0.35, 0.26, -0.44) // 20°, 15°, -25° (small-circle rotation peak)\n .rotate(BoneName.SPINE_UPPER, 0, 0.26, 0) // 0°, 15° (torso rotation)\n .rotate(BoneName.PELVIS, 0, 0.26, 0) // 0°, 15° (hip power)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (rear leg drive)\n .position(BoneName.PELVIS, 0, -0.03, 0.15) // Body drops slightly for pressure\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Finish - Lock at hyperextension (1200ms)\n .at(1.2)\n .rotate(BoneName.SHOULDER_R, 0.17, 0.7, 0.26) // 10°, 40°, 15° (shoulder locked high)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4) // 80° (elbow locked)\n .rotate(BoneName.WRIST_R, 0.61, 0.44, -0.61) // 35°, 25°, -35° (wrist hyperextension - lock!)\n .rotate(BoneName.SPINE_UPPER, 0, 0.44, 0) // 0°, 25° (full rotation)\n .rotate(BoneName.PELVIS, 0, 0.44, 0) // 0°, 25° (hip maximized)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20° (full leg drive)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (front leg stable)\n .position(BoneName.PELVIS, 0, -0.06, 0.2) // Body drop for maximum pressure\n .done<MartialArtsAnimationBuilder>()\n // Hold - Maintain control (1800ms)\n .at(1.8)\n .rotate(BoneName.SHOULDER_R, 0.17, 0.61, 0.26) // 10°, 35°, 15° (holding)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.22) // 70° (control)\n .rotate(BoneName.WRIST_R, 0.52, 0.35, -0.52) // 30°, 20°, -30° (maintained)\n .rotate(BoneName.SPINE_UPPER, 0, 0.35, 0) // 0°, 20° (stable)\n .rotate(BoneName.PELVIS, 0, 0.35, 0) // 0°, 20° (stable)\n .position(BoneName.PELVIS, 0, -0.05, 0.18) // Control position\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * TAE ELBOW CONTROL - 팔꿈치 제어 (Elbow Control)\n *\n * Simplified 3-phase Hapkido elbow lock with circular pressure application.\n *\n * Phases:\n * - Capture (0-500ms): Seize opponent's extended arm with both hands\n * - Control (500-1100ms): Apply circular pressure on elbow joint\n * - Lock (1100-1650ms): Lock elbow at hyperextension angle\n *\n * Hapkido biomechanics:\n * - Right hand rises, left hand pushes down (circular arc)\n * - Hip rotation generates power\n * - Natural flowing movement for joint manipulation\n *\n * Target vital points: Elbow joint\n *\n * @korean 팔꿈치 제어\n * @duration 1650ms (1.65 seconds)\n * @category Attack Animation\n */\nexport const TAE_ELBOW_CONTROL: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"tae_elbow_control\", \"팔꿈치 제어\")\n .asAttack(1.65)\n // Phase 1: Capture - Seize opponent's arm (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26) // Tae guard\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4) // 80° guard\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Control - Apply circular pressure (550ms)\n .at(0.55)\n .rotate(BoneName.SHOULDER_R, -0.17, 0.7, 0.09) // -10°, 40°, 5° (right hand rises)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.87) // 50° (creating leverage)\n .rotate(BoneName.SHOULDER_L, -0.09, 0.79, 0.35) // -5°, 45°, 20° (left hand pushes down)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.52) // -30° (pushing elbow joint)\n .rotate(BoneName.SPINE_UPPER, 0, 0.26, 0) // 0°, 15° (rotation)\n .rotate(BoneName.PELVIS, 0, 0.17, 0) // 0°, 10° (hip engagement)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (rear leg drive)\n .position(BoneName.PELVIS, 0, -0.03, 0.18) // Body drops for pressure\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Lock - Elbow hyperextension (1100ms)\n .at(1.1)\n .rotate(BoneName.SHOULDER_R, 0.17, 1.05, 0.35) // 10°, 60°, 20° (locked high)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4) // 80° (locked position)\n .rotate(BoneName.WRIST_R, 0.44, 0.35, -0.52) // 25°, 20°, -30° (control)\n .rotate(BoneName.SHOULDER_L, 0.26, 1.22, 0.61) // 15°, 70°, 35° (pushing down)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.87) // -50° (full pressure)\n .rotate(BoneName.WRIST_L, 0.35, 0, 0.44) // Maximum downward pressure\n .rotate(BoneName.SPINE_UPPER, 0, 0.44, 0) // 0°, 25° (full rotation)\n .rotate(BoneName.PELVIS, 0, 0.35, 0) // 0°, 20° (hip maximized)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20° (maximum drive)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable base)\n .position(BoneName.PELVIS, 0, -0.06, 0.22) // Body drops for leverage\n .done<MartialArtsAnimationBuilder>()\n // Hold - Maintain lock (1650ms)\n .at(1.65)\n .rotate(BoneName.SHOULDER_R, 0.09, 0.96, 0.26) // 5°, 55°, 15° (holding)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.22) // 70° (control)\n .rotate(BoneName.WRIST_R, 0.35, 0.26, -0.44) // Control maintained\n .rotate(BoneName.SHOULDER_L, 0.17, 1.13, 0.52) // 10°, 65°, 30° (pressure held)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.7) // -40° (pressure maintained)\n .rotate(BoneName.SPINE_UPPER, 0, 0.35, 0) // Stable control\n .rotate(BoneName.PELVIS, 0, 0.35, 0)\n .position(BoneName.PELVIS, 0, -0.05, 0.2)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * Finger Manipulation - 손가락제압\n *\n * Quick small joint manipulation for pain compliance.\n * Hapkido principle: Control through small joint isolation.\n *\n * @korean 손가락제압\n * @duration 500ms\n * @category Attack Animation\n */\nexport const TAE_FINGER_LOCK: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"finger_lock\", \"손가락제압\")\n .asAttack(0.5)\n // Start: Tae guard (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4)\n .rotate(BoneName.WRIST_R, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Grasp: Hand extends to grasp fingers (200ms)\n .at(0.2)\n .rotate(BoneName.SHOULDER_R, -0.35, 0.26, -0.17)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.7)\n .rotate(BoneName.WRIST_R, 0.26, 0.17, -0.35)\n .done<MartialArtsAnimationBuilder>()\n // Lock: Apply pressure on small joint (350ms)\n .at(0.35)\n .rotate(BoneName.SHOULDER_R, -0.26, 0.35, -0.09)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.52)\n .rotate(BoneName.WRIST_R, 0.44, 0.26, -0.52) // Maximum wrist bend for finger lock\n .done<MartialArtsAnimationBuilder>()\n // Release: Return to guard (500ms)\n .at(0.5)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4)\n .rotate(BoneName.WRIST_R, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * Flowing Joint Lock Defense - 유수관절기방어\n *\n * Counter-technique: Turning opponent's grab into a lock.\n * Hapkido principle: Yielding (Yu-Sool) - redirect force into control.\n *\n * @korean 유수관절기방어\n * @duration 650ms\n * @category Defense Animation\n */\nexport const TAE_FLOWING_COUNTER: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"flowing_lock_counter\", \"유수관절기방어\")\n .asDefense(0.65)\n // Start: Tae guard (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Yield: Begin circular redirection (250ms)\n .at(0.25)\n .rotate(BoneName.SHOULDER_L, -0.17, 0.52, 0.52) // -10°, 30°, 30° (circular motion)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.7) // -40° (flexing for control)\n .rotate(BoneName.SPINE_UPPER, 0, 0.26, 0) // 0°, 15° (rotation begins)\n .done<MartialArtsAnimationBuilder>()\n // Lock: Complete counter-lock (450ms)\n .at(0.45)\n .rotate(BoneName.SHOULDER_L, 0.17, 0.96, 0.7) // 10°, 55°, 40° (lock applied)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.52) // -30° (control position)\n .rotate(BoneName.SPINE_UPPER, 0, 0.44, 0) // 0°, 25° (full rotation)\n .done<MartialArtsAnimationBuilder>()\n // Release: Return to guard (650ms)\n .at(0.65)\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ADDITIONAL TAE COMBAT TECHNIQUES\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * TAE FLOWING STRIKES - 유수연타 (Flowing Water Strikes)\n *\n * Continuous palm strikes with fluid transitions between attacks.\n * This is a flowing strike sequence (연타), not a wrist-lock chain;\n * wrist-lock flows are modeled separately as 손목꺾기 (Wrist Lock).\n *\n * Hapkido principle: Flowing like water, never stopping.\n *\n * Phases:\n * - Setup (0-200ms): Initial palm strike\n * - Flow (200-400ms): Transition to second strike\n * - Finish (400-600ms): Final palm heel strike\n *\n * @korean 유수연타\n * @duration 600ms\n * @category Attack Animation\n */\nexport const TAE_FLOWING_STRIKES: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"tae_flowing_strikes\", \"유수연타\")\n .asAttack(0.6)\n // Phase 1: First palm strike (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26) // Guard position\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Flow to second strike (300ms)\n .at(0.3)\n .rotate(BoneName.SHOULDER_R, -0.17, 0.44, -0.09) // -10°, 25°, -5° (palm out)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.52) // 30° (extended)\n .rotate(BoneName.SHOULDER_L, -0.26, -0.35, 0.17) // -15°, -20°, 10° (preparing)\n .rotate(BoneName.SPINE_UPPER, 0, 0.17, 0) // 0°, 10° (rotation)\n .rotate(BoneName.PELVIS, 0, 0.17, 0) // 0°, 10° (hip power)\n .position(BoneName.PELVIS, 0, 0, 0.1) // Forward\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Final palm heel strike (600ms)\n .at(0.6)\n .rotate(BoneName.SHOULDER_L, -0.09, 0.52, 0.09) // -5°, 30°, 5° (strike)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.44) // -25° (extended)\n .rotate(BoneName.SPINE_UPPER, 0, -0.17, 0) // 0°, -10° (counter-rotation)\n .rotate(BoneName.PELVIS, 0, -0.09, 0) // 0°, -5° (return)\n .position(BoneName.PELVIS, 0, 0, 0.15) // Maximum reach\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * TAE SMALL CIRCLE TECHNIQUE - 소원법 (Small Circle Method)\n *\n * Advanced Hapkido technique using minimal circular motion for maximum leverage.\n * Controls both wrist and elbow simultaneously with small-circle manipulation.\n *\n * Phases:\n * - Contact (0-250ms): Grasp wrist and elbow\n * - Circle (250-550ms): Apply small-circle pressure\n * - Lock (550-750ms): Lock both joints\n *\n * @korean 소원법\n * @duration 750ms\n * @category Attack Animation\n */\nexport const TAE_SMALL_CIRCLE: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"tae_small_circle\", \"소원법\")\n .asAttack(0.75)\n // Phase 1: Contact - Grasp wrist and elbow (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26) // Guard\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4)\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Circle - Small-circle pressure (400ms)\n .at(0.4)\n .rotate(BoneName.SHOULDER_R, -0.26, 0.61, 0.17) // -15°, 35°, 10° (wrist control)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.87) // 50° (circular motion)\n .rotate(BoneName.WRIST_R, 0.26, 0.17, -0.35) // 15°, 10°, -20° (small circle)\n .rotate(BoneName.SHOULDER_L, -0.17, 0.7, 0.35) // -10°, 40°, 20° (elbow control)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.61) // -35° (pressure)\n .rotate(BoneName.SPINE_UPPER, 0, 0.26, 0) // 0°, 15° (rotation)\n .rotate(BoneName.PELVIS, 0, 0.17, 0) // 0°, 10° (hip power)\n .position(BoneName.PELVIS, 0, -0.02, 0.12) // Body drops\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Lock - Both joints locked (750ms)\n .at(0.75)\n .rotate(BoneName.SHOULDER_R, 0.09, 0.79, 0.35) // 5°, 45°, 20° (wrist locked)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.22) // 70° (locked)\n .rotate(BoneName.WRIST_R, 0.52, 0.35, -0.52) // 30°, 20°, -30° (hyperextension)\n .rotate(BoneName.SHOULDER_L, 0.17, 0.96, 0.52) // 10°, 55°, 30° (elbow locked)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.79) // -45° (maximum pressure)\n .rotate(BoneName.SPINE_UPPER, 0, 0.35, 0) // 0°, 20° (full rotation)\n .rotate(BoneName.PELVIS, 0, 0.26, 0) // 0°, 15° (hip maximized)\n .position(BoneName.PELVIS, 0, -0.04, 0.15) // Maximum control\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * TAE SHOULDER LOCK - 어깨꺾기 (Shoulder Manipulation)\n *\n * Hapkido shoulder lock twisting arm behind back.\n * Extremely effective control technique causing severe pain and compliance.\n *\n * Phases:\n * - Capture (0-300ms): Seize arm\n * - Twist (300-650ms): Rotate arm behind back\n * - Lock (650-850ms): Lock shoulder joint\n *\n * @korean 어깨꺾기\n * @duration 850ms\n * @category Attack Animation\n */\nexport const TAE_SHOULDER_LOCK: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"tae_shoulder_lock\", \"어깨꺾기\")\n .asAttack(0.85)\n // Phase 1: Capture - Seize arm (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26) // Guard\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4)\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Twist - Rotate arm behind (500ms)\n .at(0.5)\n .rotate(BoneName.SHOULDER_R, 0.26, 0.87, -0.52) // 15°, 50°, -30° (twisting motion)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.57) // 90° (behind back)\n .rotate(BoneName.WRIST_R, -0.35, 0.52, 0.79) // -20°, 30°, 45° (twisted)\n .rotate(BoneName.SHOULDER_L, -0.09, -0.44, 0.61) // -5°, -25°, 35° (assisting)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.87) // -50° (pushing)\n .rotate(BoneName.SPINE_UPPER, 0, 0.44, 0) // 0°, 25° (rotation for leverage)\n .rotate(BoneName.PELVIS, 0, 0.35, 0) // 0°, 20° (hip power)\n .position(BoneName.PELVIS, 0, -0.03, 0.1) // Body position\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Lock - Shoulder joint locked (850ms)\n .at(0.85)\n .rotate(BoneName.SHOULDER_R, 0.44, 1.05, -0.79) // 25°, 60°, -45° (locked behind)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.92) // 110° (extreme angle)\n .rotate(BoneName.WRIST_R, -0.52, 0.61, 1.05) // -30°, 35°, 60° (locked)\n .rotate(BoneName.SHOULDER_L, 0.09, -0.52, 0.79) // 5°, -30°, 45° (controlling)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.05) // -60° (maximum pressure)\n .rotate(BoneName.SPINE_UPPER, 0, 0.52, 0) // 0°, 30° (full rotation)\n .rotate(BoneName.PELVIS, 0, 0.44, 0) // 0°, 25° (hip maximized)\n .position(BoneName.PELVIS, 0, -0.05, 0.12) // Control position\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * TAE ARM BAR - 팔꺾기 (Arm Bar Submission)\n *\n * Hapkido arm bar immobilizing elbow for submission.\n * Most powerful Tae technique - forces opponent submission or risks arm break.\n *\n * Phases:\n * - Control (0-350ms): Secure arm extension\n * - Position (350-700ms): Pivot body for leverage\n * - Submit (700-900ms): Apply hyperextension pressure\n *\n * @korean 팔꺾기\n * @duration 900ms\n * @category Attack Animation\n */\nexport const TAE_ARM_BAR: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"tae_arm_bar\", \"팔꺾기\")\n .asAttack(0.9)\n // Phase 1: Control - Secure extended arm (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26) // Guard\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4)\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Position - Pivot for leverage (550ms)\n .at(0.55)\n .rotate(BoneName.SHOULDER_R, 0.17, 0.96, 0.44) // 10°, 55°, 25° (securing)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.52) // 30° (control)\n .rotate(BoneName.WRIST_R, 0.26, 0.17, -0.26) // 15°, 10°, -15° (grip)\n .rotate(BoneName.SHOULDER_L, 0.26, 1.13, 0.61) // 15°, 65°, 35° (holding)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.44) // -25° (positioning)\n .rotate(BoneName.SPINE_UPPER, 0, 0.61, 0) // 0°, 35° (pivot)\n .rotate(BoneName.PELVIS, 0, 0.52, 0) // 0°, 30° (hip rotation)\n .rotate(BoneName.KNEE_R, -0.44, 0, 0) // -25° (body drop)\n .position(BoneName.PELVIS, 0, -0.08, 0.15) // Low position for leverage\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Submit - Hyperextension pressure (900ms)\n .at(0.9)\n .rotate(BoneName.SHOULDER_R, 0.35, 1.22, 0.61) // 20°, 70°, 35° (locked)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.17) // 10° (slight bend for control)\n .rotate(BoneName.WRIST_R, 0.44, 0.26, -0.35) // 25°, 15°, -20° (firm grip)\n .rotate(BoneName.SHOULDER_L, 0.44, 1.4, 0.79) // 25°, 80°, 45° (maximum pressure)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.26) // -15° (locked position)\n .rotate(BoneName.WRIST_L, 0.35, 0, 0.44) // Downward pressure\n .rotate(BoneName.SPINE_UPPER, 0, 0.79, 0) // 0°, 45° (full pivot)\n .rotate(BoneName.PELVIS, 0, 0.7, 0) // 0°, 40° (maximum rotation)\n .rotate(BoneName.KNEE_R, -0.61, 0, 0) // -35° (full body weight)\n .rotate(BoneName.KNEE_L, -0.52, 0, 0) // -30° (grounded)\n .position(BoneName.PELVIS, 0, -0.12, 0.18) // Maximum leverage position\n .done<MartialArtsAnimationBuilder>()\n .build();\n"],"mappings":"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"}
1
+ {"version":3,"file":"TaeJointLockAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/TaeJointLockAnimations.ts"],"sourcesContent":["import { BoneName } from \"@/types/skeletal\";\nimport type { SkeletalAnimation } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\n\n/**\n * Anatomical safety constants for Tae (Lake) joint lock animations\n *\n * These limits document safe physiological ranges for joint manipulation techniques.\n * The constants serve as reference documentation validated by Korean martial arts experts\n * and inform the design of all joint lock animations to ensure realistic Hapkido mechanics\n * without exceeding anatomical safety thresholds.\n *\n * Note: These are documentation constants. The actual animation rotations are designed\n * to stay within these limits naturally through authentic joint lock biomechanics.\n */\nexport const ANATOMICAL_LIMITS_TAE_JOINT_LOCKS = {\n /**\n * Maximum safe wrist hyperextension: 70° (1.22 radians)\n * \n * Typical wrist extension limit is 70-90°. We use 70° as a safe\n * threshold for realistic joint locks without causing injury.\n */\n MAX_WRIST_HYPEREXTENSION: 1.22, // 70° in radians\n \n /**\n * Maximum safe elbow flexion: 145° (2.53 radians)\n * \n * Full elbow flexion is approximately 145-150°, allowing natural\n * bending and manipulation in joint lock techniques.\n */\n MAX_ELBOW_FLEXION: 2.53, // 145° in radians\n \n /**\n * Maximum safe shoulder rotation: ±90° (±1.57 radians)\n * \n * Safe shoulder rotation range for circular Hapkido movements\n * without risking impingement or structural damage.\n */\n MAX_SHOULDER_ROTATION: 1.57, // ±90° in radians\n} as const;\n\n// ═══════════════════════════════════════════════════════════════════════════\n// TAE TRIGRAM (☱ 태) - LAKE: JOINT MANIPULATION (관절기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * TAE WRIST LOCK SEQUENCE - 손목꺾기 (Wrist Lock Sequence)\n *\n * Simplified 3-phase Hapkido wrist lock sequence with circular small-circle technique.\n * \n * Phases:\n * - Setup (0-600ms): Reach and grasp opponent's wrist\n * - Control (600-1200ms): Apply circular pressure with small-circle rotation\n * - Finish (1200-1800ms): Lock wrist at hyperextension, opponent controlled\n *\n * Hapkido biomechanics:\n * - Small circular wrist motion generates torque\n * - Hip rotation powers the lock\n * - Wrist hyperextends to 70° (1.22 rad) safely\n * - Natural flowing movement, not jerky\n *\n * Target vital points: Wrist joint, elbow joint\n *\n * @korean 손목꺾기\n * @duration 1800ms (1.8 seconds)\n * @category Joint Lock Animation\n */\nexport const TAE_WRIST_LOCK_SEQUENCE: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"tae_wrist_lock_sequence\", \"손목꺾기\")\n .asAttack(1.8)\n // Phase 1: Setup - Reach and grasp wrist (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26) // -30°, 10°, -15° (Tae mid-level guard)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4) // 80° (flexed guard)\n .rotate(BoneName.WRIST_R, 0, 0, 0) // Neutral\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26) // -30°, -10°, 15°\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4) // -80° (flexed)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Control - Apply circular pressure (600ms)\n .at(0.6)\n .rotate(BoneName.SHOULDER_R, -0.17, 0.52, 0) // -10°, 30°, 0° (shoulder rises for leverage)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.05) // 60° (elbow in circular arc)\n .rotate(BoneName.WRIST_R, 0.35, 0.26, -0.44) // 20°, 15°, -25° (small-circle rotation peak)\n .rotate(BoneName.SPINE_UPPER, 0, 0.26, 0) // 0°, 15° (torso rotation)\n .rotate(BoneName.PELVIS, 0, 0.26, 0) // 0°, 15° (hip power)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (rear leg drive)\n .position(BoneName.PELVIS, 0, -0.03, 0.15) // Body drops slightly for pressure\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Finish - Lock at hyperextension (1200ms)\n .at(1.2)\n .rotate(BoneName.SHOULDER_R, 0.17, 0.7, 0.26) // 10°, 40°, 15° (shoulder locked high)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4) // 80° (elbow locked)\n .rotate(BoneName.WRIST_R, 0.61, 0.44, -0.61) // 35°, 25°, -35° (wrist hyperextension - lock!)\n .rotate(BoneName.SPINE_UPPER, 0, 0.44, 0) // 0°, 25° (full rotation)\n .rotate(BoneName.PELVIS, 0, 0.44, 0) // 0°, 25° (hip maximized)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20° (full leg drive)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (front leg stable)\n .position(BoneName.PELVIS, 0, -0.06, 0.2) // Body drop for maximum pressure\n .done<MartialArtsAnimationBuilder>()\n // Hold - Maintain control (1800ms)\n .at(1.8)\n .rotate(BoneName.SHOULDER_R, 0.17, 0.61, 0.26) // 10°, 35°, 15° (holding)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.22) // 70° (control)\n .rotate(BoneName.WRIST_R, 0.52, 0.35, -0.52) // 30°, 20°, -30° (maintained)\n .rotate(BoneName.SPINE_UPPER, 0, 0.35, 0) // 0°, 20° (stable)\n .rotate(BoneName.PELVIS, 0, 0.35, 0) // 0°, 20° (stable)\n .position(BoneName.PELVIS, 0, -0.05, 0.18) // Control position\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * TAE ELBOW CONTROL - 팔꿈치 제어 (Elbow Control)\n *\n * Simplified 3-phase Hapkido elbow lock with circular pressure application.\n *\n * Phases:\n * - Capture (0-500ms): Seize opponent's extended arm with both hands\n * - Control (500-1100ms): Apply circular pressure on elbow joint\n * - Lock (1100-1650ms): Lock elbow at hyperextension angle\n *\n * Hapkido biomechanics:\n * - Right hand rises, left hand pushes down (circular arc)\n * - Hip rotation generates power\n * - Natural flowing movement for joint manipulation\n *\n * Target vital points: Elbow joint\n *\n * @korean 팔꿈치 제어\n * @duration 1650ms (1.65 seconds)\n * @category Attack Animation\n */\nexport const TAE_ELBOW_CONTROL: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"tae_elbow_control\", \"팔꿈치 제어\")\n .asAttack(1.65)\n // Phase 1: Capture - Seize opponent's arm (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26) // Tae guard\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4) // 80° guard\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Control - Apply circular pressure (550ms)\n .at(0.55)\n .rotate(BoneName.SHOULDER_R, -0.17, 0.7, 0.09) // -10°, 40°, 5° (right hand rises)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.87) // 50° (creating leverage)\n .rotate(BoneName.SHOULDER_L, -0.09, 0.79, 0.35) // -5°, 45°, 20° (left hand pushes down)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.52) // -30° (pushing elbow joint)\n .rotate(BoneName.SPINE_UPPER, 0, 0.26, 0) // 0°, 15° (rotation)\n .rotate(BoneName.PELVIS, 0, 0.17, 0) // 0°, 10° (hip engagement)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (rear leg drive)\n .position(BoneName.PELVIS, 0, -0.03, 0.18) // Body drops for pressure\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Lock - Elbow hyperextension (1100ms)\n .at(1.1)\n .rotate(BoneName.SHOULDER_R, 0.17, 1.05, 0.35) // 10°, 60°, 20° (locked high)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4) // 80° (locked position)\n .rotate(BoneName.WRIST_R, 0.44, 0.35, -0.52) // 25°, 20°, -30° (control)\n .rotate(BoneName.SHOULDER_L, 0.26, 1.22, 0.61) // 15°, 70°, 35° (pushing down)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.87) // -50° (full pressure)\n .rotate(BoneName.WRIST_L, 0.35, 0, 0.44) // Maximum downward pressure\n .rotate(BoneName.SPINE_UPPER, 0, 0.44, 0) // 0°, 25° (full rotation)\n .rotate(BoneName.PELVIS, 0, 0.35, 0) // 0°, 20° (hip maximized)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20° (maximum drive)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable base)\n .position(BoneName.PELVIS, 0, -0.06, 0.22) // Body drops for leverage\n .done<MartialArtsAnimationBuilder>()\n // Hold - Maintain lock (1650ms)\n .at(1.65)\n .rotate(BoneName.SHOULDER_R, 0.09, 0.96, 0.26) // 5°, 55°, 15° (holding)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.22) // 70° (control)\n .rotate(BoneName.WRIST_R, 0.35, 0.26, -0.44) // Control maintained\n .rotate(BoneName.SHOULDER_L, 0.17, 1.13, 0.52) // 10°, 65°, 30° (pressure held)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.7) // -40° (pressure maintained)\n .rotate(BoneName.SPINE_UPPER, 0, 0.35, 0) // Stable control\n .rotate(BoneName.PELVIS, 0, 0.35, 0)\n .position(BoneName.PELVIS, 0, -0.05, 0.2)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * Finger Manipulation - 손가락제압\n *\n * Quick small joint manipulation for pain compliance.\n * Hapkido principle: Control through small joint isolation.\n *\n * @korean 손가락제압\n * @duration 500ms\n * @category Attack Animation\n */\nexport const TAE_FINGER_LOCK: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"finger_lock\", \"손가락제압\")\n .asAttack(0.5)\n // Start: Tae guard (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4)\n .rotate(BoneName.WRIST_R, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Grasp: Hand extends to grasp fingers (200ms)\n .at(0.2)\n .rotate(BoneName.SHOULDER_R, -0.35, 0.26, -0.17)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.7)\n .rotate(BoneName.WRIST_R, 0.26, 0.17, -0.35)\n .done<MartialArtsAnimationBuilder>()\n // Lock: Apply pressure on small joint (350ms)\n .at(0.35)\n .rotate(BoneName.SHOULDER_R, -0.26, 0.35, -0.09)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.52)\n .rotate(BoneName.WRIST_R, 0.44, 0.26, -0.52) // Maximum wrist bend for finger lock\n .done<MartialArtsAnimationBuilder>()\n // Release: Return to guard (500ms)\n .at(0.5)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4)\n .rotate(BoneName.WRIST_R, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * Flowing Joint Lock Defense - 유수관절기방어\n *\n * Counter-technique: Turning opponent's grab into a lock.\n * Hapkido principle: Yielding (Yu-Sool) - redirect force into control.\n *\n * @korean 유수관절기방어\n * @duration 650ms\n * @category Defense Animation\n */\nexport const TAE_FLOWING_COUNTER: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"flowing_lock_counter\", \"유수관절기방어\")\n .asDefense(0.65)\n // Start: Tae guard (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Yield: Begin circular redirection (250ms)\n .at(0.25)\n .rotate(BoneName.SHOULDER_L, -0.17, 0.52, 0.52) // -10°, 30°, 30° (circular motion)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.7) // -40° (flexing for control)\n .rotate(BoneName.SPINE_UPPER, 0, 0.26, 0) // 0°, 15° (rotation begins)\n .done<MartialArtsAnimationBuilder>()\n // Lock: Complete counter-lock (450ms)\n .at(0.45)\n .rotate(BoneName.SHOULDER_L, 0.17, 0.96, 0.7) // 10°, 55°, 40° (lock applied)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.52) // -30° (control position)\n .rotate(BoneName.SPINE_UPPER, 0, 0.44, 0) // 0°, 25° (full rotation)\n .done<MartialArtsAnimationBuilder>()\n // Release: Return to guard (650ms)\n .at(0.65)\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ADDITIONAL TAE COMBAT TECHNIQUES\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * TAE FLOWING STRIKES - 유수연타 (Flowing Water Strikes)\n *\n * Continuous palm strikes with fluid transitions between attacks.\n * This is a flowing strike sequence (연타), not a wrist-lock chain;\n * wrist-lock flows are modeled separately as 손목꺾기 (Wrist Lock).\n *\n * Hapkido principle: Flowing like water, never stopping.\n *\n * Phases:\n * - Setup (0-200ms): Initial palm strike\n * - Flow (200-400ms): Transition to second strike\n * - Finish (400-600ms): Final palm heel strike\n *\n * @korean 유수연타\n * @duration 600ms\n * @category Attack Animation\n */\nexport const TAE_FLOWING_STRIKES: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"tae_flowing_strikes\", \"유수연타\")\n .asAttack(0.6)\n // Phase 1: First palm strike (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26) // Guard position\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Flow to second strike (300ms)\n .at(0.3)\n .rotate(BoneName.SHOULDER_R, -0.17, 0.44, -0.09) // -10°, 25°, -5° (palm out)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.52) // 30° (extended)\n .rotate(BoneName.SHOULDER_L, -0.26, -0.35, 0.17) // -15°, -20°, 10° (preparing)\n .rotate(BoneName.SPINE_UPPER, 0, 0.17, 0) // 0°, 10° (rotation)\n .rotate(BoneName.PELVIS, 0, 0.17, 0) // 0°, 10° (hip power)\n .position(BoneName.PELVIS, 0, 0, 0.1) // Forward\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Final palm heel strike (600ms)\n .at(0.6)\n .rotate(BoneName.SHOULDER_L, -0.09, 0.52, 0.09) // -5°, 30°, 5° (strike)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.44) // -25° (extended)\n .rotate(BoneName.SPINE_UPPER, 0, -0.17, 0) // 0°, -10° (counter-rotation)\n .rotate(BoneName.PELVIS, 0, -0.09, 0) // 0°, -5° (return)\n .position(BoneName.PELVIS, 0, 0, 0.15) // Maximum reach\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * TAE SMALL CIRCLE TECHNIQUE - 소원법 (Small Circle Method)\n *\n * Advanced Hapkido technique using minimal circular motion for maximum leverage.\n * Controls both wrist and elbow simultaneously with small-circle manipulation.\n *\n * Phases:\n * - Contact (0-250ms): Grasp wrist and elbow\n * - Circle (250-550ms): Apply small-circle pressure\n * - Lock (550-750ms): Lock both joints\n *\n * @korean 소원법\n * @duration 750ms\n * @category Attack Animation\n */\nexport const TAE_SMALL_CIRCLE: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"tae_small_circle\", \"소원법\")\n .asAttack(0.75)\n // Phase 1: Contact - Grasp wrist and elbow (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26) // Guard\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4)\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Circle - Small-circle pressure (400ms)\n .at(0.4)\n .rotate(BoneName.SHOULDER_R, -0.26, 0.61, 0.17) // -15°, 35°, 10° (wrist control)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.87) // 50° (circular motion)\n .rotate(BoneName.WRIST_R, 0.26, 0.17, -0.35) // 15°, 10°, -20° (small circle)\n .rotate(BoneName.SHOULDER_L, -0.17, 0.7, 0.35) // -10°, 40°, 20° (elbow control)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.61) // -35° (pressure)\n .rotate(BoneName.SPINE_UPPER, 0, 0.26, 0) // 0°, 15° (rotation)\n .rotate(BoneName.PELVIS, 0, 0.17, 0) // 0°, 10° (hip power)\n .position(BoneName.PELVIS, 0, -0.02, 0.12) // Body drops\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Lock - Both joints locked (750ms)\n .at(0.75)\n .rotate(BoneName.SHOULDER_R, 0.09, 0.79, 0.35) // 5°, 45°, 20° (wrist locked)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.22) // 70° (locked)\n .rotate(BoneName.WRIST_R, 0.52, 0.35, -0.52) // 30°, 20°, -30° (hyperextension)\n .rotate(BoneName.SHOULDER_L, 0.17, 0.96, 0.52) // 10°, 55°, 30° (elbow locked)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.79) // -45° (maximum pressure)\n .rotate(BoneName.SPINE_UPPER, 0, 0.35, 0) // 0°, 20° (full rotation)\n .rotate(BoneName.PELVIS, 0, 0.26, 0) // 0°, 15° (hip maximized)\n .position(BoneName.PELVIS, 0, -0.04, 0.15) // Maximum control\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * TAE SHOULDER LOCK - 어깨꺾기 (Shoulder Manipulation)\n *\n * Hapkido shoulder lock twisting arm behind back.\n * Extremely effective control technique causing severe pain and compliance.\n *\n * Phases:\n * - Capture (0-300ms): Seize arm\n * - Twist (300-650ms): Rotate arm behind back\n * - Lock (650-850ms): Lock shoulder joint\n *\n * @korean 어깨꺾기\n * @duration 850ms\n * @category Attack Animation\n */\nexport const TAE_SHOULDER_LOCK: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"tae_shoulder_lock\", \"어깨꺾기\")\n .asAttack(0.85)\n // Phase 1: Capture - Seize arm (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26) // Guard\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4)\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Twist - Rotate arm behind (500ms)\n .at(0.5)\n .rotate(BoneName.SHOULDER_R, 0.26, 0.87, -0.52) // 15°, 50°, -30° (twisting motion)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.57) // 90° (behind back)\n .rotate(BoneName.WRIST_R, -0.35, 0.52, 0.79) // -20°, 30°, 45° (twisted)\n .rotate(BoneName.SHOULDER_L, -0.09, -0.44, 0.61) // -5°, -25°, 35° (assisting)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.87) // -50° (pushing)\n .rotate(BoneName.SPINE_UPPER, 0, 0.44, 0) // 0°, 25° (rotation for leverage)\n .rotate(BoneName.PELVIS, 0, 0.35, 0) // 0°, 20° (hip power)\n .position(BoneName.PELVIS, 0, -0.03, 0.1) // Body position\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Lock - Shoulder joint locked (850ms)\n .at(0.85)\n .rotate(BoneName.SHOULDER_R, 0.44, 1.05, -0.79) // 25°, 60°, -45° (locked behind)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.92) // 110° (extreme angle)\n .rotate(BoneName.WRIST_R, -0.52, 0.61, 1.05) // -30°, 35°, 60° (locked)\n .rotate(BoneName.SHOULDER_L, 0.09, -0.52, 0.79) // 5°, -30°, 45° (controlling)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.05) // -60° (maximum pressure)\n .rotate(BoneName.SPINE_UPPER, 0, 0.52, 0) // 0°, 30° (full rotation)\n .rotate(BoneName.PELVIS, 0, 0.44, 0) // 0°, 25° (hip maximized)\n .position(BoneName.PELVIS, 0, -0.05, 0.12) // Control position\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n/**\n * TAE ARM BAR - 팔꺾기 (Arm Bar Submission)\n *\n * Hapkido arm bar immobilizing elbow for submission.\n * Most powerful Tae technique - forces opponent submission or risks arm break.\n *\n * Phases:\n * - Control (0-350ms): Secure arm extension\n * - Position (350-700ms): Pivot body for leverage\n * - Submit (700-900ms): Apply hyperextension pressure\n *\n * @korean 팔꺾기\n * @duration 900ms\n * @category Attack Animation\n */\nexport const TAE_ARM_BAR: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"tae_arm_bar\", \"팔꺾기\")\n .asAttack(0.9)\n // Phase 1: Control - Secure extended arm (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26) // Guard\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4)\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Position - Pivot for leverage (550ms)\n .at(0.55)\n .rotate(BoneName.SHOULDER_R, 0.17, 0.96, 0.44) // 10°, 55°, 25° (securing)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.52) // 30° (control)\n .rotate(BoneName.WRIST_R, 0.26, 0.17, -0.26) // 15°, 10°, -15° (grip)\n .rotate(BoneName.SHOULDER_L, 0.26, 1.13, 0.61) // 15°, 65°, 35° (holding)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.44) // -25° (positioning)\n .rotate(BoneName.SPINE_UPPER, 0, 0.61, 0) // 0°, 35° (pivot)\n .rotate(BoneName.PELVIS, 0, 0.52, 0) // 0°, 30° (hip rotation)\n .rotate(BoneName.KNEE_R, -0.44, 0, 0) // -25° (body drop)\n .position(BoneName.PELVIS, 0, -0.08, 0.15) // Low position for leverage\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Submit - Hyperextension pressure (900ms)\n .at(0.9)\n .rotate(BoneName.SHOULDER_R, 0.35, 1.22, 0.61) // 20°, 70°, 35° (locked)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.17) // 10° (slight bend for control)\n .rotate(BoneName.WRIST_R, 0.44, 0.26, -0.35) // 25°, 15°, -20° (firm grip)\n .rotate(BoneName.SHOULDER_L, 0.44, 1.4, 0.79) // 25°, 80°, 45° (maximum pressure)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.26) // -15° (locked position)\n .rotate(BoneName.WRIST_L, 0.35, 0, 0.44) // Downward pressure\n .rotate(BoneName.SPINE_UPPER, 0, 0.79, 0) // 0°, 45° (full pivot)\n .rotate(BoneName.PELVIS, 0, 0.7, 0) // 0°, 40° (maximum rotation)\n .rotate(BoneName.KNEE_R, -0.61, 0, 0) // -35° (full body weight)\n .rotate(BoneName.KNEE_L, -0.52, 0, 0) // -30° (grounded)\n .position(BoneName.PELVIS, 0, -0.12, 0.18) // Maximum leverage position\n .done<MartialArtsAnimationBuilder>()\n .build();\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAmEA,IAAa,0BACX,4BAA4B,OAAO,2BAA2B,MAAM,EACjE,SAAS,GAAG,EAEZ,GAAG,CAAC,EACJ,OAAO,SAAS,YAAY,MAAO,KAAM,IAAK,EAC9C,OAAO,SAAS,SAAS,GAAG,GAAG,GAAG,EAClC,OAAO,SAAS,SAAS,GAAG,GAAG,CAAC,EAChC,OAAO,SAAS,YAAY,MAAO,MAAO,GAAI,EAC9C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,EACnC,OAAO,SAAS,aAAa,GAAG,GAAG,CAAC,EACpC,OAAO,SAAS,QAAQ,GAAG,GAAG,CAAC,EAC/B,SAAS,SAAS,QAAQ,GAAG,GAAG,CAAC,EACjC,KAAkC,EAElC,GAAG,EAAG,EACN,OAAO,SAAS,YAAY,MAAO,KAAM,CAAC,EAC1C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,EACnC,OAAO,SAAS,SAAS,KAAM,KAAM,IAAK,EAC1C,OAAO,SAAS,aAAa,GAAG,KAAM,CAAC,EACvC,OAAO,SAAS,QAAQ,GAAG,KAAM,CAAC,EAClC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,SAAS,SAAS,QAAQ,GAAG,MAAO,GAAI,EACxC,KAAkC,EAElC,GAAG,GAAG,EACN,OAAO,SAAS,YAAY,KAAM,IAAK,GAAI,EAC3C,OAAO,SAAS,SAAS,GAAG,GAAG,GAAG,EAClC,OAAO,SAAS,SAAS,KAAM,KAAM,IAAK,EAC1C,OAAO,SAAS,aAAa,GAAG,KAAM,CAAC,EACvC,OAAO,SAAS,QAAQ,GAAG,KAAM,CAAC,EAClC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,SAAS,SAAS,QAAQ,GAAG,MAAO,EAAG,EACvC,KAAkC,EAElC,GAAG,GAAG,EACN,OAAO,SAAS,YAAY,KAAM,KAAM,GAAI,EAC5C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,EACnC,OAAO,SAAS,SAAS,KAAM,KAAM,IAAK,EAC1C,OAAO,SAAS,aAAa,GAAG,KAAM,CAAC,EACvC,OAAO,SAAS,QAAQ,GAAG,KAAM,CAAC,EAClC,SAAS,SAAS,QAAQ,GAAG,MAAO,GAAI,EACxC,KAAkC,EAClC,MAAM;;;;;;;;;;;;;;;;;;;;;;AAuBX,IAAa,oBACX,4BAA4B,OAAO,qBAAqB,QAAQ,EAC7D,SAAS,IAAI,EAEb,GAAG,CAAC,EACJ,OAAO,SAAS,YAAY,MAAO,KAAM,IAAK,EAC9C,OAAO,SAAS,SAAS,GAAG,GAAG,GAAG,EAClC,OAAO,SAAS,YAAY,MAAO,MAAO,GAAI,EAC9C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,EACnC,OAAO,SAAS,aAAa,GAAG,GAAG,CAAC,EACpC,OAAO,SAAS,QAAQ,GAAG,GAAG,CAAC,EAC/B,SAAS,SAAS,QAAQ,GAAG,GAAG,CAAC,EACjC,KAAkC,EAElC,GAAG,GAAI,EACP,OAAO,SAAS,YAAY,MAAO,IAAK,GAAI,EAC5C,OAAO,SAAS,SAAS,GAAG,GAAG,GAAI,EACnC,OAAO,SAAS,YAAY,MAAO,KAAM,GAAI,EAC7C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAK,EACpC,OAAO,SAAS,aAAa,GAAG,KAAM,CAAC,EACvC,OAAO,SAAS,QAAQ,GAAG,KAAM,CAAC,EAClC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,SAAS,SAAS,QAAQ,GAAG,MAAO,GAAI,EACxC,KAAkC,EAElC,GAAG,GAAG,EACN,OAAO,SAAS,YAAY,KAAM,MAAM,GAAI,EAC5C,OAAO,SAAS,SAAS,GAAG,GAAG,GAAG,EAClC,OAAO,SAAS,SAAS,KAAM,KAAM,IAAK,EAC1C,OAAO,SAAS,YAAY,KAAM,MAAM,GAAI,EAC5C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAK,EACpC,OAAO,SAAS,SAAS,KAAM,GAAG,GAAI,EACtC,OAAO,SAAS,aAAa,GAAG,KAAM,CAAC,EACvC,OAAO,SAAS,QAAQ,GAAG,KAAM,CAAC,EAClC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,SAAS,SAAS,QAAQ,GAAG,MAAO,GAAI,EACxC,KAAkC,EAElC,GAAG,IAAI,EACP,OAAO,SAAS,YAAY,KAAM,KAAM,GAAI,EAC5C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,EACnC,OAAO,SAAS,SAAS,KAAM,KAAM,IAAK,EAC1C,OAAO,SAAS,YAAY,KAAM,MAAM,GAAI,EAC5C,OAAO,SAAS,SAAS,GAAG,GAAG,GAAI,EACnC,OAAO,SAAS,aAAa,GAAG,KAAM,CAAC,EACvC,OAAO,SAAS,QAAQ,GAAG,KAAM,CAAC,EAClC,SAAS,SAAS,QAAQ,GAAG,MAAO,EAAG,EACvC,KAAkC,EAClC,MAAM;;;;;;;;;;;AAYX,IAAa,kBACX,4BAA4B,OAAO,eAAe,OAAO,EACtD,SAAS,EAAG,EAEZ,GAAG,CAAC,EACJ,OAAO,SAAS,YAAY,MAAO,KAAM,IAAK,EAC9C,OAAO,SAAS,SAAS,GAAG,GAAG,GAAG,EAClC,OAAO,SAAS,SAAS,GAAG,GAAG,CAAC,EAChC,KAAkC,EAElC,GAAG,EAAG,EACN,OAAO,SAAS,YAAY,MAAO,KAAM,IAAK,EAC9C,OAAO,SAAS,SAAS,GAAG,GAAG,EAAG,EAClC,OAAO,SAAS,SAAS,KAAM,KAAM,IAAK,EAC1C,KAAkC,EAElC,GAAG,GAAI,EACP,OAAO,SAAS,YAAY,MAAO,KAAM,IAAK,EAC9C,OAAO,SAAS,SAAS,GAAG,GAAG,GAAI,EACnC,OAAO,SAAS,SAAS,KAAM,KAAM,IAAK,EAC1C,KAAkC,EAElC,GAAG,EAAG,EACN,OAAO,SAAS,YAAY,MAAO,KAAM,IAAK,EAC9C,OAAO,SAAS,SAAS,GAAG,GAAG,GAAG,EAClC,OAAO,SAAS,SAAS,GAAG,GAAG,CAAC,EAChC,KAAkC,EAClC,MAAM;;;;;;;;;;;AAYX,IAAa,sBACX,4BAA4B,OAAO,wBAAwB,SAAS,EACjE,UAAU,GAAI,EAEd,GAAG,CAAC,EACJ,OAAO,SAAS,YAAY,MAAO,MAAO,GAAI,EAC9C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,EACnC,OAAO,SAAS,aAAa,GAAG,GAAG,CAAC,EACpC,KAAkC,EAElC,GAAG,GAAI,EACP,OAAO,SAAS,YAAY,MAAO,KAAM,GAAI,EAC7C,OAAO,SAAS,SAAS,GAAG,GAAG,GAAI,EACnC,OAAO,SAAS,aAAa,GAAG,KAAM,CAAC,EACvC,KAAkC,EAElC,GAAG,GAAI,EACP,OAAO,SAAS,YAAY,KAAM,KAAM,EAAG,EAC3C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAK,EACpC,OAAO,SAAS,aAAa,GAAG,KAAM,CAAC,EACvC,KAAkC,EAElC,GAAG,GAAI,EACP,OAAO,SAAS,YAAY,MAAO,MAAO,GAAI,EAC9C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,EACnC,OAAO,SAAS,aAAa,GAAG,GAAG,CAAC,EACpC,KAAkC,EAClC,MAAM;;;;;;;;;;;;;;;;;;;AAwBX,IAAa,sBACX,4BAA4B,OAAO,uBAAuB,MAAM,EAC7D,SAAS,EAAG,EAEZ,GAAG,CAAC,EACJ,OAAO,SAAS,YAAY,MAAO,KAAM,IAAK,EAC9C,OAAO,SAAS,SAAS,GAAG,GAAG,GAAG,EAClC,OAAO,SAAS,aAAa,GAAG,GAAG,CAAC,EACpC,OAAO,SAAS,QAAQ,GAAG,GAAG,CAAC,EAC/B,KAAkC,EAElC,GAAG,EAAG,EACN,OAAO,SAAS,YAAY,MAAO,KAAM,IAAK,EAC9C,OAAO,SAAS,SAAS,GAAG,GAAG,GAAI,EACnC,OAAO,SAAS,YAAY,MAAO,MAAO,GAAI,EAC9C,OAAO,SAAS,aAAa,GAAG,KAAM,CAAC,EACvC,OAAO,SAAS,QAAQ,GAAG,KAAM,CAAC,EAClC,SAAS,SAAS,QAAQ,GAAG,GAAG,EAAG,EACnC,KAAkC,EAElC,GAAG,EAAG,EACN,OAAO,SAAS,YAAY,MAAO,KAAM,GAAI,EAC7C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAK,EACpC,OAAO,SAAS,aAAa,GAAG,MAAO,CAAC,EACxC,OAAO,SAAS,QAAQ,GAAG,MAAO,CAAC,EACnC,SAAS,SAAS,QAAQ,GAAG,GAAG,GAAI,EACpC,KAAkC,EAClC,MAAM;;;;;;;;;;;;;;;;AAiBX,IAAa,mBACX,4BAA4B,OAAO,oBAAoB,KAAK,EACzD,SAAS,GAAI,EAEb,GAAG,CAAC,EACJ,OAAO,SAAS,YAAY,MAAO,KAAM,IAAK,EAC9C,OAAO,SAAS,SAAS,GAAG,GAAG,GAAG,EAClC,OAAO,SAAS,YAAY,MAAO,MAAO,GAAI,EAC9C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,EACnC,KAAkC,EAElC,GAAG,EAAG,EACN,OAAO,SAAS,YAAY,MAAO,KAAM,GAAI,EAC7C,OAAO,SAAS,SAAS,GAAG,GAAG,GAAI,EACnC,OAAO,SAAS,SAAS,KAAM,KAAM,IAAK,EAC1C,OAAO,SAAS,YAAY,MAAO,IAAK,GAAI,EAC5C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAK,EACpC,OAAO,SAAS,aAAa,GAAG,KAAM,CAAC,EACvC,OAAO,SAAS,QAAQ,GAAG,KAAM,CAAC,EAClC,SAAS,SAAS,QAAQ,GAAG,MAAO,GAAI,EACxC,KAAkC,EAElC,GAAG,GAAI,EACP,OAAO,SAAS,YAAY,KAAM,KAAM,GAAI,EAC5C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,EACnC,OAAO,SAAS,SAAS,KAAM,KAAM,IAAK,EAC1C,OAAO,SAAS,YAAY,KAAM,KAAM,GAAI,EAC5C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAK,EACpC,OAAO,SAAS,aAAa,GAAG,KAAM,CAAC,EACvC,OAAO,SAAS,QAAQ,GAAG,KAAM,CAAC,EAClC,SAAS,SAAS,QAAQ,GAAG,MAAO,GAAI,EACxC,KAAkC,EAClC,MAAM;;;;;;;;;;;;;;;;AAiBX,IAAa,oBACX,4BAA4B,OAAO,qBAAqB,MAAM,EAC3D,SAAS,GAAI,EAEb,GAAG,CAAC,EACJ,OAAO,SAAS,YAAY,MAAO,KAAM,IAAK,EAC9C,OAAO,SAAS,SAAS,GAAG,GAAG,GAAG,EAClC,OAAO,SAAS,YAAY,MAAO,MAAO,GAAI,EAC9C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,EACnC,KAAkC,EAElC,GAAG,EAAG,EACN,OAAO,SAAS,YAAY,KAAM,KAAM,IAAK,EAC7C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,EACnC,OAAO,SAAS,SAAS,MAAO,KAAM,GAAI,EAC1C,OAAO,SAAS,YAAY,MAAO,MAAO,GAAI,EAC9C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAK,EACpC,OAAO,SAAS,aAAa,GAAG,KAAM,CAAC,EACvC,OAAO,SAAS,QAAQ,GAAG,KAAM,CAAC,EAClC,SAAS,SAAS,QAAQ,GAAG,MAAO,EAAG,EACvC,KAAkC,EAElC,GAAG,GAAI,EACP,OAAO,SAAS,YAAY,KAAM,MAAM,IAAK,EAC7C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,EACnC,OAAO,SAAS,SAAS,MAAO,KAAM,IAAI,EAC1C,OAAO,SAAS,YAAY,KAAM,MAAO,GAAI,EAC7C,OAAO,SAAS,SAAS,GAAG,GAAG,KAAK,EACpC,OAAO,SAAS,aAAa,GAAG,KAAM,CAAC,EACvC,OAAO,SAAS,QAAQ,GAAG,KAAM,CAAC,EAClC,SAAS,SAAS,QAAQ,GAAG,MAAO,GAAI,EACxC,KAAkC,EAClC,MAAM;;;;;;;;;;;;;;;;AAiBX,IAAa,cACX,4BAA4B,OAAO,eAAe,KAAK,EACpD,SAAS,EAAG,EAEZ,GAAG,CAAC,EACJ,OAAO,SAAS,YAAY,MAAO,KAAM,IAAK,EAC9C,OAAO,SAAS,SAAS,GAAG,GAAG,GAAG,EAClC,OAAO,SAAS,YAAY,MAAO,MAAO,GAAI,EAC9C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,EACnC,KAAkC,EAElC,GAAG,GAAI,EACP,OAAO,SAAS,YAAY,KAAM,KAAM,GAAI,EAC5C,OAAO,SAAS,SAAS,GAAG,GAAG,GAAI,EACnC,OAAO,SAAS,SAAS,KAAM,KAAM,IAAK,EAC1C,OAAO,SAAS,YAAY,KAAM,MAAM,GAAI,EAC5C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAK,EACpC,OAAO,SAAS,aAAa,GAAG,KAAM,CAAC,EACvC,OAAO,SAAS,QAAQ,GAAG,KAAM,CAAC,EAClC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,SAAS,SAAS,QAAQ,GAAG,MAAO,GAAI,EACxC,KAAkC,EAElC,GAAG,EAAG,EACN,OAAO,SAAS,YAAY,KAAM,MAAM,GAAI,EAC5C,OAAO,SAAS,SAAS,GAAG,GAAG,GAAI,EACnC,OAAO,SAAS,SAAS,KAAM,KAAM,IAAK,EAC1C,OAAO,SAAS,YAAY,KAAM,KAAK,GAAI,EAC3C,OAAO,SAAS,SAAS,GAAG,GAAG,IAAK,EACpC,OAAO,SAAS,SAAS,KAAM,GAAG,GAAI,EACtC,OAAO,SAAS,aAAa,GAAG,KAAM,CAAC,EACvC,OAAO,SAAS,QAAQ,GAAG,IAAK,CAAC,EACjC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,SAAS,SAAS,QAAQ,GAAG,MAAO,GAAI,EACxC,KAAkC,EAClC,MAAM"}
@@ -1 +1 @@
1
- {"version":3,"file":"TaeStanceAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/TaeStanceAnimations.ts"],"sourcesContent":["/**\n * ☱ Tae (Lake) Stance-Specific Animations\n *\n * Specialized idle, movement, and guard animations for the Tae (태/Lake) trigram.\n * Embodies fluid joint manipulation and circular motion from Hapkido techniques.\n *\n * **Korean Martial Arts Context:**\n * - **무술**: 합기도 관절기 (Hapkido Joint Manipulation)\n * - **특성**: 유동적 관절기 (Fluid Joint Locks), 소원 기술 (Small Circle Techniques)\n * - **철학**: 물처럼 흐르는 힘 (Flowing Power Like Water), 호수의 적응 (Lake's Adaptation)\n * - **대표 기술**: 유수연타 (Flowing Water Strikes), 손목꺾기 (Wrist Lock), 팔꿈치 제어 (Elbow Control)\n *\n * @module systems/animation/catalogs/TaeStanceAnimations\n * @category Animation\n * @korean 태괘자세애니메이션\n */\n\nimport { BoneName, type SkeletalAnimation } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\n\n// Import Hapkido joint lock techniques (합기도 관절기)\nimport {\n TAE_WRIST_LOCK_SEQUENCE,\n TAE_ELBOW_CONTROL,\n TAE_FINGER_LOCK,\n TAE_FLOWING_COUNTER,\n TAE_FLOWING_STRIKES,\n TAE_SMALL_CIRCLE,\n TAE_SHOULDER_LOCK,\n TAE_ARM_BAR,\n} from \"./TaeJointLockAnimations\";\n\n/**\n * Anatomical safety constants for Tae (Lake) trigram animations\n *\n * These limits document safe physiological ranges for Korean martial arts movements.\n * The constants serve as reference documentation validated by Korean martial arts experts\n * and inform the design of all Tae animations to ensure realistic, safe joint mechanics.\n *\n * Note: These are documentation constants. The actual animation rotations are designed\n * to stay well within these limits naturally through authentic Hapkido biomechanics.\n */\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☱ TAE IDLE FLOWING ANIMATION (태괘 유동 자세)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Tae Idle Flowing Animation\n *\n * **Korean**: 태괘 유동 자세 (Tae-gwae Yudong Jase)\n * **Philosophy**: Embodying lake's fluidity through gentle circular breathing\n *\n * Characteristics:\n * - Gentle circular shoulder movement\n * - Relaxed mid-level guard position\n * - Weight centered and stable\n * - Hands open and ready to grasp\n *\n * Animation Cycle:\n * - 0ms: Neutral position with mid-level guard\n * - 1250ms: Circular shift (left shoulder forward, right back)\n * - 2500ms: Return to neutral (complete cycle)\n *\n * @korean 태괘유동자세\n * @duration 2500ms (2.5 second cycle)\n * @category Idle Animation\n */\nexport const TAE_IDLE_FLOWING: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"tae_idle_flowing\",\n \"태괘 유동 자세\"\n )\n .asIdle(2.5, true)\n // Keyframe 0ms: Neutral mid-level guard (baseline)\n .at(0)\n .rotate(BoneName.PELVIS, 0, 0, 0) // Neutral pelvis\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0) // Neutral spine\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26) // -30°, -10°, 15° (mid-level flexible guard)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26) // -30°, 10°, -15°\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4) // -80° (flexed guard)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4) // 80° (flexed guard)\n .rotate(BoneName.WRIST_L, 0, 0, 0) // Neutral wrists\n .rotate(BoneName.WRIST_R, 0, 0, 0)\n .rotate(BoneName.HEAD, 0, 0, 0) // Head neutral, aware\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Keyframe 1250ms: Circular shift (subtle flowing motion)\n .at(1.25)\n .rotate(BoneName.SPINE_UPPER, 0, 0.09, 0) // 0°, 5° (slight rotation creating circular feel)\n .rotate(BoneName.SHOULDER_L, -0.48, -0.09, 0.17) // -27.5°, -5°, 10° (left forward slightly)\n .rotate(BoneName.SHOULDER_R, -0.57, 0.26, -0.17) // -32.5°, 15°, -10° (right back slightly)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.31) // -75° (slight extension)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.48) // 85° (slight flexion)\n .rotate(BoneName.WRIST_L, 0, 0.09, 0) // 0°, 5° (gentle circular motion)\n .rotate(BoneName.WRIST_R, 0, -0.09, 0) // 0°, -5°\n .rotate(BoneName.PELVIS, 0, 0.05, 0) // 0°, 3° (subtle weight shift)\n .position(BoneName.PELVIS, -0.02, 0, 0) // Minimal lateral shift\n .done<MartialArtsAnimationBuilder>()\n // Keyframe 2500ms: Return to neutral (complete cycle)\n .at(2.5)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4)\n .rotate(BoneName.WRIST_L, 0, 0, 0)\n .rotate(BoneName.WRIST_R, 0, 0, 0)\n .rotate(BoneName.HEAD, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☱ TAE CIRCULAR SIDESTEP (원형 측면보)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Tae Circular Sidestep Animation\n *\n * **Korean**: 원형 측면보 (Wonhyeong Cheukmyeonbo) - Circular Sidestep\n * **Technique**: Arc-shaped lateral movement, hip-led\n *\n * Characteristics:\n * - Circular arc path (not straight lateral)\n * - Hip leads the movement\n * - Maintains flexible guard throughout\n * - Weight shifts smoothly\n *\n * Animation Phases:\n * - 0-180ms: Weight shift and hip initiation\n * - 180-400ms: Circular arc movement\n * - 400-550ms: Landing and settling\n *\n * @korean 원형측면보\n * @duration 550ms\n * @category Movement Animation\n */\nexport const TAE_CIRCULAR_SIDESTEP: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"tae_circular_sidestep\",\n \"원형 측면보\"\n )\n .asMovement(0.55, false)\n // Phase 1: Initial weight shift (0ms)\n .at(0)\n .rotate(BoneName.PELVIS, 0, -0.17, 0) // 0°, -10° (hip begins rotation)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (rear leg loads)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° (lead leg ready)\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26) // Guard maintained\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Circular arc movement (275ms)\n .at(0.275)\n .rotate(BoneName.PELVIS, 0, -0.35, 0) // 0°, -20° (maximum hip rotation)\n .rotate(BoneName.KNEE_R, -0.17, 0, 0) // -10° (rear leg extends)\n .rotate(BoneName.KNEE_L, -0.44, 0, 0) // -25° (lead leg pushes)\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26) // Guard stable\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26)\n .position(BoneName.PELVIS, -0.18, 0.02, -0.03) // Arc trajectory (lateral + slight back)\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Landing and settling (550ms)\n .at(0.55)\n .rotate(BoneName.PELVIS, 0, -0.26, 0) // 0°, -15° (settled)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (stable)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° (grounded)\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26) // Guard maintained\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4)\n .position(BoneName.PELVIS, -0.25, 0, 0) // Final lateral position\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☱ TAE DIAGONAL CIRCULAR APPROACH (대각선 원형 접근)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Tae Diagonal Circular Approach Animation\n *\n * **Korean**: 대각선 원형 접근 (Daegakseon Wonhyeong Jeobgeun)\n * **Technique**: 45° curved approach with hands extending\n *\n * Characteristics:\n * - 45° diagonal angle with curved path\n * - Hands extend forward for joint control\n * - Hip rotation coordinates with step\n * - Smooth weight transfer\n *\n * Animation Phases:\n * - 0-233ms: Initial diagonal pivot\n * - 233-500ms: Curved approach with extending hands\n * - 500-667ms: Landing in engagement position\n *\n * @korean 대각선원형접근\n * @duration 667ms\n * @category Movement Animation\n */\nexport const TAE_DIAGONAL_CIRCULAR_APPROACH: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"tae_diagonal_circular_approach\",\n \"대각선 원형 접근\"\n )\n .asMovement(0.667, false)\n // Phase 1: Initial diagonal pivot (0ms)\n .at(0)\n .rotate(BoneName.PELVIS, 0, -0.79, 0) // 0°, -45° (diagonal rotation)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20° (rear leg ready)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (lead leg ready)\n .rotate(BoneName.SHOULDER_L, -0.44, -0.26, 0.35) // -25°, -15°, 20° (hands begin extending)\n .rotate(BoneName.SHOULDER_R, -0.44, 0.26, -0.35) // -25°, 15°, -20°\n .rotate(BoneName.ELBOW_L, 0, 0, -1.05) // -60° (extending)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.05) // 60° (extending)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Curved approach with extending hands (361ms)\n .at(0.361)\n .rotate(BoneName.PELVIS, 0, -0.61, 0) // 0°, -35° (unwinding)\n .rotate(BoneName.KNEE_R, -0.17, 0, 0) // -10° (extending)\n .rotate(BoneName.KNEE_L, -0.44, 0, 0) // -25° (pushing)\n .rotate(BoneName.SHOULDER_L, -0.35, -0.35, 0.44) // -20°, -20°, 25° (reaching)\n .rotate(BoneName.SHOULDER_R, -0.35, 0.35, -0.44) // -20°, 20°, -25°\n .rotate(BoneName.ELBOW_L, 0, 0, -0.7) // -40° (extending more)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.7) // 40° (extending more)\n .position(BoneName.PELVIS, -0.2, 0.02, 0.2) // Curved diagonal path\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Landing in engagement position (667ms)\n .at(0.667)\n .rotate(BoneName.PELVIS, 0, -0.79, 0) // 0°, -45° (settled diagonal)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (stable)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° (grounded)\n .rotate(BoneName.SHOULDER_L, -0.26, -0.44, 0.52) // -15°, -25°, 30° (hands extended)\n .rotate(BoneName.SHOULDER_R, -0.26, 0.44, -0.52) // -15°, 25°, -30°\n .rotate(BoneName.ELBOW_L, 0, 0, -0.52) // -30° (ready to engage)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.52) // 30° (ready to engage)\n .rotate(BoneName.WRIST_L, 0.09, 0, -0.09) // 5°, 0°, -5° (hands ready to grasp)\n .rotate(BoneName.WRIST_R, 0.09, 0, 0.09) // 5°, 0°, 5°\n .position(BoneName.PELVIS, -0.3, 0, 0.3) // Diagonal 45° position\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☱ TAE FLEXIBLE GUARD TRANSITION (호수 방어 전환)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Tae Flexible Guard Transition Animation\n *\n * **Korean**: 호수 방어 전환 (Hosu Bangeo Jeonhwan) - Lake Guard Transition\n * **Technique**: Transition into Tae's characteristic flexible mid-level guard\n *\n * Characteristics:\n * - Smooth transition to mid-level guard\n * - Hands at chest/solar plexus height\n * - Elbows bent at 80° for flexibility\n * - Weight evenly distributed\n *\n * Animation Phases:\n * - 0-150ms: Begin transition\n * - 150-300ms: Settle into Tae guard\n *\n * @korean 호수방어전환\n * @duration 300ms\n * @category Stance Animation\n */\nexport const TAE_FLEXIBLE_GUARD_TRANSITION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"tae_flexible_guard_transition\",\n \"호수 방어 전환\"\n )\n .asStance(0.3, false)\n // Phase 1: Begin transition (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_L, -0.44, -0.09, 0.22) // -25°, -5°, 12.5° (moving toward guard)\n .rotate(BoneName.SHOULDER_R, -0.44, 0.09, -0.22) // -25°, 5°, -12.5°\n .rotate(BoneName.ELBOW_L, 0, 0, -1.22) // -70° (transitioning)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.22) // 70° (transitioning)\n .rotate(BoneName.PELVIS, 0, 0, 0) // Neutral pelvis\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Settle into Tae guard (300ms)\n .at(0.3)\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26) // -30°, -10°, 15° (Tae guard)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26) // -30°, 10°, -15°\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4) // -80° (Tae guard angle)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4) // 80° (Tae guard angle)\n .rotate(BoneName.WRIST_L, 0, 0, 0) // Neutral wrists\n .rotate(BoneName.WRIST_R, 0, 0, 0)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable stance)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (stable stance)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// EXPORTS\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Map of all Tae stance-specific animations for easy access\n * @korean 태괘자세애니메이션맵\n */\nexport const TAE_STANCE_ANIMATIONS: ReadonlyMap<string, SkeletalAnimation> = new Map([\n // Idle & Movement\n [\"tae_idle_flowing\", TAE_IDLE_FLOWING],\n [\"tae_circular_sidestep\", TAE_CIRCULAR_SIDESTEP],\n [\"tae_diagonal_circular_approach\", TAE_DIAGONAL_CIRCULAR_APPROACH],\n \n // Stance Transitions\n [\"tae_flexible_guard_transition\", TAE_FLEXIBLE_GUARD_TRANSITION],\n \n // Hapkido Joint Lock Techniques (합기도 관절기)\n [\"tae_wrist_lock_sequence\", TAE_WRIST_LOCK_SEQUENCE],\n [\"tae_elbow_control\", TAE_ELBOW_CONTROL],\n [\"tae_finger_lock\", TAE_FINGER_LOCK],\n [\"tae_flowing_counter\", TAE_FLOWING_COUNTER],\n [\"tae_flowing_strikes\", TAE_FLOWING_STRIKES],\n [\"tae_small_circle\", TAE_SMALL_CIRCLE],\n [\"tae_shoulder_lock\", TAE_SHOULDER_LOCK],\n [\"tae_arm_bar\", TAE_ARM_BAR],\n]);\n"],"mappings":"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"}
1
+ {"version":3,"file":"TaeStanceAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/TaeStanceAnimations.ts"],"sourcesContent":["/**\n * ☱ Tae (Lake) Stance-Specific Animations\n *\n * Specialized idle, movement, and guard animations for the Tae (태/Lake) trigram.\n * Embodies fluid joint manipulation and circular motion from Hapkido techniques.\n *\n * **Korean Martial Arts Context:**\n * - **무술**: 합기도 관절기 (Hapkido Joint Manipulation)\n * - **특성**: 유동적 관절기 (Fluid Joint Locks), 소원 기술 (Small Circle Techniques)\n * - **철학**: 물처럼 흐르는 힘 (Flowing Power Like Water), 호수의 적응 (Lake's Adaptation)\n * - **대표 기술**: 유수연타 (Flowing Water Strikes), 손목꺾기 (Wrist Lock), 팔꿈치 제어 (Elbow Control)\n *\n * @module systems/animation/catalogs/TaeStanceAnimations\n * @category Animation\n * @korean 태괘자세애니메이션\n */\n\nimport { BoneName, type SkeletalAnimation } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\n\n// Import Hapkido joint lock techniques (합기도 관절기)\nimport {\n TAE_WRIST_LOCK_SEQUENCE,\n TAE_ELBOW_CONTROL,\n TAE_FINGER_LOCK,\n TAE_FLOWING_COUNTER,\n TAE_FLOWING_STRIKES,\n TAE_SMALL_CIRCLE,\n TAE_SHOULDER_LOCK,\n TAE_ARM_BAR,\n} from \"./TaeJointLockAnimations\";\n\n/**\n * Anatomical safety constants for Tae (Lake) trigram animations\n *\n * These limits document safe physiological ranges for Korean martial arts movements.\n * The constants serve as reference documentation validated by Korean martial arts experts\n * and inform the design of all Tae animations to ensure realistic, safe joint mechanics.\n *\n * Note: These are documentation constants. The actual animation rotations are designed\n * to stay well within these limits naturally through authentic Hapkido biomechanics.\n */\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☱ TAE IDLE FLOWING ANIMATION (태괘 유동 자세)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Tae Idle Flowing Animation\n *\n * **Korean**: 태괘 유동 자세 (Tae-gwae Yudong Jase)\n * **Philosophy**: Embodying lake's fluidity through gentle circular breathing\n *\n * Characteristics:\n * - Gentle circular shoulder movement\n * - Relaxed mid-level guard position\n * - Weight centered and stable\n * - Hands open and ready to grasp\n *\n * Animation Cycle:\n * - 0ms: Neutral position with mid-level guard\n * - 1250ms: Circular shift (left shoulder forward, right back)\n * - 2500ms: Return to neutral (complete cycle)\n *\n * @korean 태괘유동자세\n * @duration 2500ms (2.5 second cycle)\n * @category Idle Animation\n */\nexport const TAE_IDLE_FLOWING: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"tae_idle_flowing\",\n \"태괘 유동 자세\"\n )\n .asIdle(2.5, true)\n // Keyframe 0ms: Neutral mid-level guard (baseline)\n .at(0)\n .rotate(BoneName.PELVIS, 0, 0, 0) // Neutral pelvis\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0) // Neutral spine\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26) // -30°, -10°, 15° (mid-level flexible guard)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26) // -30°, 10°, -15°\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4) // -80° (flexed guard)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4) // 80° (flexed guard)\n .rotate(BoneName.WRIST_L, 0, 0, 0) // Neutral wrists\n .rotate(BoneName.WRIST_R, 0, 0, 0)\n .rotate(BoneName.HEAD, 0, 0, 0) // Head neutral, aware\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Keyframe 1250ms: Circular shift (subtle flowing motion)\n .at(1.25)\n .rotate(BoneName.SPINE_UPPER, 0, 0.09, 0) // 0°, 5° (slight rotation creating circular feel)\n .rotate(BoneName.SHOULDER_L, -0.48, -0.09, 0.17) // -27.5°, -5°, 10° (left forward slightly)\n .rotate(BoneName.SHOULDER_R, -0.57, 0.26, -0.17) // -32.5°, 15°, -10° (right back slightly)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.31) // -75° (slight extension)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.48) // 85° (slight flexion)\n .rotate(BoneName.WRIST_L, 0, 0.09, 0) // 0°, 5° (gentle circular motion)\n .rotate(BoneName.WRIST_R, 0, -0.09, 0) // 0°, -5°\n .rotate(BoneName.PELVIS, 0, 0.05, 0) // 0°, 3° (subtle weight shift)\n .position(BoneName.PELVIS, -0.02, 0, 0) // Minimal lateral shift\n .done<MartialArtsAnimationBuilder>()\n // Keyframe 2500ms: Return to neutral (complete cycle)\n .at(2.5)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4)\n .rotate(BoneName.WRIST_L, 0, 0, 0)\n .rotate(BoneName.WRIST_R, 0, 0, 0)\n .rotate(BoneName.HEAD, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☱ TAE CIRCULAR SIDESTEP (원형 측면보)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Tae Circular Sidestep Animation\n *\n * **Korean**: 원형 측면보 (Wonhyeong Cheukmyeonbo) - Circular Sidestep\n * **Technique**: Arc-shaped lateral movement, hip-led\n *\n * Characteristics:\n * - Circular arc path (not straight lateral)\n * - Hip leads the movement\n * - Maintains flexible guard throughout\n * - Weight shifts smoothly\n *\n * Animation Phases:\n * - 0-180ms: Weight shift and hip initiation\n * - 180-400ms: Circular arc movement\n * - 400-550ms: Landing and settling\n *\n * @korean 원형측면보\n * @duration 550ms\n * @category Movement Animation\n */\nexport const TAE_CIRCULAR_SIDESTEP: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"tae_circular_sidestep\",\n \"원형 측면보\"\n )\n .asMovement(0.55, false)\n // Phase 1: Initial weight shift (0ms)\n .at(0)\n .rotate(BoneName.PELVIS, 0, -0.17, 0) // 0°, -10° (hip begins rotation)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (rear leg loads)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° (lead leg ready)\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26) // Guard maintained\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Circular arc movement (275ms)\n .at(0.275)\n .rotate(BoneName.PELVIS, 0, -0.35, 0) // 0°, -20° (maximum hip rotation)\n .rotate(BoneName.KNEE_R, -0.17, 0, 0) // -10° (rear leg extends)\n .rotate(BoneName.KNEE_L, -0.44, 0, 0) // -25° (lead leg pushes)\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26) // Guard stable\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26)\n .position(BoneName.PELVIS, -0.18, 0.02, -0.03) // Arc trajectory (lateral + slight back)\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Landing and settling (550ms)\n .at(0.55)\n .rotate(BoneName.PELVIS, 0, -0.26, 0) // 0°, -15° (settled)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (stable)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° (grounded)\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26) // Guard maintained\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4)\n .position(BoneName.PELVIS, -0.25, 0, 0) // Final lateral position\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☱ TAE DIAGONAL CIRCULAR APPROACH (대각선 원형 접근)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Tae Diagonal Circular Approach Animation\n *\n * **Korean**: 대각선 원형 접근 (Daegakseon Wonhyeong Jeobgeun)\n * **Technique**: 45° curved approach with hands extending\n *\n * Characteristics:\n * - 45° diagonal angle with curved path\n * - Hands extend forward for joint control\n * - Hip rotation coordinates with step\n * - Smooth weight transfer\n *\n * Animation Phases:\n * - 0-233ms: Initial diagonal pivot\n * - 233-500ms: Curved approach with extending hands\n * - 500-667ms: Landing in engagement position\n *\n * @korean 대각선원형접근\n * @duration 667ms\n * @category Movement Animation\n */\nexport const TAE_DIAGONAL_CIRCULAR_APPROACH: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"tae_diagonal_circular_approach\",\n \"대각선 원형 접근\"\n )\n .asMovement(0.667, false)\n // Phase 1: Initial diagonal pivot (0ms)\n .at(0)\n .rotate(BoneName.PELVIS, 0, -0.79, 0) // 0°, -45° (diagonal rotation)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20° (rear leg ready)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (lead leg ready)\n .rotate(BoneName.SHOULDER_L, -0.44, -0.26, 0.35) // -25°, -15°, 20° (hands begin extending)\n .rotate(BoneName.SHOULDER_R, -0.44, 0.26, -0.35) // -25°, 15°, -20°\n .rotate(BoneName.ELBOW_L, 0, 0, -1.05) // -60° (extending)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.05) // 60° (extending)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Curved approach with extending hands (361ms)\n .at(0.361)\n .rotate(BoneName.PELVIS, 0, -0.61, 0) // 0°, -35° (unwinding)\n .rotate(BoneName.KNEE_R, -0.17, 0, 0) // -10° (extending)\n .rotate(BoneName.KNEE_L, -0.44, 0, 0) // -25° (pushing)\n .rotate(BoneName.SHOULDER_L, -0.35, -0.35, 0.44) // -20°, -20°, 25° (reaching)\n .rotate(BoneName.SHOULDER_R, -0.35, 0.35, -0.44) // -20°, 20°, -25°\n .rotate(BoneName.ELBOW_L, 0, 0, -0.7) // -40° (extending more)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.7) // 40° (extending more)\n .position(BoneName.PELVIS, -0.2, 0.02, 0.2) // Curved diagonal path\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Landing in engagement position (667ms)\n .at(0.667)\n .rotate(BoneName.PELVIS, 0, -0.79, 0) // 0°, -45° (settled diagonal)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (stable)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° (grounded)\n .rotate(BoneName.SHOULDER_L, -0.26, -0.44, 0.52) // -15°, -25°, 30° (hands extended)\n .rotate(BoneName.SHOULDER_R, -0.26, 0.44, -0.52) // -15°, 25°, -30°\n .rotate(BoneName.ELBOW_L, 0, 0, -0.52) // -30° (ready to engage)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.52) // 30° (ready to engage)\n .rotate(BoneName.WRIST_L, 0.09, 0, -0.09) // 5°, 0°, -5° (hands ready to grasp)\n .rotate(BoneName.WRIST_R, 0.09, 0, 0.09) // 5°, 0°, 5°\n .position(BoneName.PELVIS, -0.3, 0, 0.3) // Diagonal 45° position\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☱ TAE FLEXIBLE GUARD TRANSITION (호수 방어 전환)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Tae Flexible Guard Transition Animation\n *\n * **Korean**: 호수 방어 전환 (Hosu Bangeo Jeonhwan) - Lake Guard Transition\n * **Technique**: Transition into Tae's characteristic flexible mid-level guard\n *\n * Characteristics:\n * - Smooth transition to mid-level guard\n * - Hands at chest/solar plexus height\n * - Elbows bent at 80° for flexibility\n * - Weight evenly distributed\n *\n * Animation Phases:\n * - 0-150ms: Begin transition\n * - 150-300ms: Settle into Tae guard\n *\n * @korean 호수방어전환\n * @duration 300ms\n * @category Stance Animation\n */\nexport const TAE_FLEXIBLE_GUARD_TRANSITION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"tae_flexible_guard_transition\",\n \"호수 방어 전환\"\n )\n .asStance(0.3, false)\n // Phase 1: Begin transition (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_L, -0.44, -0.09, 0.22) // -25°, -5°, 12.5° (moving toward guard)\n .rotate(BoneName.SHOULDER_R, -0.44, 0.09, -0.22) // -25°, 5°, -12.5°\n .rotate(BoneName.ELBOW_L, 0, 0, -1.22) // -70° (transitioning)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.22) // 70° (transitioning)\n .rotate(BoneName.PELVIS, 0, 0, 0) // Neutral pelvis\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Settle into Tae guard (300ms)\n .at(0.3)\n .rotate(BoneName.SHOULDER_L, -0.52, -0.17, 0.26) // -30°, -10°, 15° (Tae guard)\n .rotate(BoneName.SHOULDER_R, -0.52, 0.17, -0.26) // -30°, 10°, -15°\n .rotate(BoneName.ELBOW_L, 0, 0, -1.4) // -80° (Tae guard angle)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4) // 80° (Tae guard angle)\n .rotate(BoneName.WRIST_L, 0, 0, 0) // Neutral wrists\n .rotate(BoneName.WRIST_R, 0, 0, 0)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable stance)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (stable stance)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// EXPORTS\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Map of all Tae stance-specific animations for easy access\n * @korean 태괘자세애니메이션맵\n */\nexport const TAE_STANCE_ANIMATIONS: ReadonlyMap<string, SkeletalAnimation> = new Map([\n // Idle & Movement\n [\"tae_idle_flowing\", TAE_IDLE_FLOWING],\n [\"tae_circular_sidestep\", TAE_CIRCULAR_SIDESTEP],\n [\"tae_diagonal_circular_approach\", TAE_DIAGONAL_CIRCULAR_APPROACH],\n \n // Stance Transitions\n [\"tae_flexible_guard_transition\", TAE_FLEXIBLE_GUARD_TRANSITION],\n \n // Hapkido Joint Lock Techniques (합기도 관절기)\n [\"tae_wrist_lock_sequence\", TAE_WRIST_LOCK_SEQUENCE],\n [\"tae_elbow_control\", TAE_ELBOW_CONTROL],\n [\"tae_finger_lock\", TAE_FINGER_LOCK],\n [\"tae_flowing_counter\", TAE_FLOWING_COUNTER],\n [\"tae_flowing_strikes\", TAE_FLOWING_STRIKES],\n [\"tae_small_circle\", TAE_SMALL_CIRCLE],\n [\"tae_shoulder_lock\", TAE_SHOULDER_LOCK],\n [\"tae_arm_bar\", TAE_ARM_BAR],\n]);\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AnatomicalLimits.js","names":[],"sources":["../../../../src/systems/animation/constants/AnatomicalLimits.ts"],"sourcesContent":["/**\n * Anatomical Limits Constants\n *\n * Centralized biomechanical safety limits for Korean martial arts animations.\n * These constants document safe physiological ranges for joint movements,\n * validated by Korean martial arts experts and biomechanical research.\n *\n * **Korean Martial Arts Context:**\n * - 한국 무술 생체역학 안전 기준 (Korean Martial Arts Biomechanical Safety Standards)\n * - 관절 안전 범위 (Joint Safety Ranges)\n * - 실전 기술 적용 (Practical Technique Application)\n *\n * **Purpose:**\n * These limits serve as reference documentation and inform animation design\n * to ensure realistic, safe joint mechanics. Actual animations are designed\n * to stay well within these limits through authentic martial arts biomechanics.\n *\n * **Note:** All values are in radians for Three.js compatibility.\n * Convert degrees to radians: degrees * (π / 180)\n *\n * @module systems/animation/constants\n * @category Animation Constants\n * @korean 생체역학안전상수\n */\n\n/**\n * Anatomical Limits for Joint Rotations\n *\n * Comprehensive set of safe physiological ranges for all major joints\n * used in Korean martial arts movements.\n */\nexport const ANATOMICAL_LIMITS = {\n // ═══════════════════════════════════════════════════════════════════════════\n // UPPER BODY LIMITS (상체 관절 제한)\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Shoulder Joint Limits (어깨 관절)\n */\n SHOULDER: {\n /**\n * Maximum safe shoulder overhead rotation: -135° (-2.35 radians)\n *\n * Shoulder flexion limit is approximately 150-180°, making -135° a safe\n * threshold for dramatic overhead positioning (used in Geon/Heaven stance)\n * without risking constraint violations.\n *\n * **Used in:** Geon (건) overhead strikes, powerful techniques\n */\n MAX_OVERHEAD: -2.35, // -135° in radians\n\n /**\n * Maximum safe shoulder rotation: ±90° (±1.57 radians)\n *\n * Safe shoulder rotation range for circular movements without risking\n * impingement or constraint violations (used in Tae/Lake, Son/Wind stances).\n *\n * **Used in:** Tae (태) circular motions, Son (손) continuous attacks\n */\n MAX_ROTATION: 1.57, // ±90° in radians\n\n /**\n * Maximum safe shoulder elevation: -35° (-0.61 radians)\n *\n * Conservative shoulder elevation for defensive positions\n * (used in Gan/Mountain guard stance).\n *\n * **Used in:** Gan (간) defensive guard positioning\n */\n MAX_ELEVATION: -0.61, // -35° in radians\n },\n\n /**\n * Elbow Joint Limits (팔꿈치 관절)\n */\n ELBOW: {\n /**\n * Maximum safe elbow bend: ±125° (±2.18 radians)\n *\n * Typical elbow flexion limit is 145-160°, making 125° a conservative\n * threshold for powerful chambering positions (used in Geon/Heaven strikes).\n *\n * **Used in:** Geon (건) powerful overhead chambering\n */\n MAX_BEND: 2.18, // ±125° in radians\n\n /**\n * Maximum safe elbow flexion: 145° (2.53 radians)\n *\n * Full elbow flexion for natural guard positions and joint manipulation\n * techniques (used in Tae/Lake, Son/Wind stances).\n *\n * **Used in:** Tae (태) joint locks, Son (손) guard positions\n */\n MAX_FLEXION: 2.53, // 145° in radians\n\n /**\n * Maximum safe elbow bend for guard: 120° (2.09 radians)\n *\n * Conservative elbow flexion for defensive guard positions\n * (used in Gan/Mountain defensive stance).\n *\n * **Used in:** Gan (간) defensive guard\n */\n MAX_BEND_GUARD: 2.09, // 120° in radians\n },\n\n /**\n * Wrist Joint Limits (손목 관절)\n */\n WRIST: {\n /**\n * Maximum safe wrist flexion/extension: ±70° (±1.22 radians)\n *\n * Typical wrist range is 70-90° flexion/extension. We use 70° as a safe\n * threshold for joint lock techniques (used in Tae/Lake Hapkido techniques).\n *\n * **Used in:** Tae (태) wrist locks and joint manipulation\n */\n MAX_BEND: 1.22, // ±70° in radians\n },\n\n // ═══════════════════════════════════════════════════════════════════════════\n // LOWER BODY LIMITS (하체 관절 제한)\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Hip Joint Limits (엉덩이 관절)\n */\n HIP: {\n /**\n * Maximum safe hip flexion: 110° (1.92 radians)\n *\n * Hip flexion for ground techniques and takedowns\n * (used in Gon/Earth ground control stance).\n *\n * **Used in:** Gon (곤) ground techniques, throws\n */\n MAX_FLEXION: 1.92, // 110° in radians\n\n /**\n * Maximum safe hip rotation: ±70° (±1.22 radians)\n *\n * Safe hip rotation range for continuous flowing movements\n * (used in Son/Wind circular attacks).\n *\n * **Used in:** Son (손) circular movements, flow techniques\n */\n MAX_ROTATION: 1.22, // ±70° in radians\n },\n\n /**\n * Knee Joint Limits (무릎 관절)\n */\n KNEE: {\n /**\n * Maximum safe knee flexion: 90° (1.57 radians)\n *\n * Deep horse stance knee bend for explosive power generation\n * (used in Jin/Thunder explosive stance).\n *\n * **Used in:** Jin (진) explosive power generation\n */\n MAX_FLEXION: 1.57, // 90° in radians\n\n /**\n * Maximum safe knee bend: 130° (2.27 radians)\n *\n * Deep knee bend for ground control and takedown positioning\n * (used in Gon/Earth ground techniques).\n *\n * **Used in:** Gon (곤) ground control, low positioning\n */\n MAX_BEND: 2.27, // 130° in radians\n\n /**\n * Maximum safe knee bend for rooted stance: 25° (0.44 radians)\n *\n * Conservative knee bend for defensive rooted positions\n * (used in Gan/Mountain defensive stance).\n *\n * **Used in:** Gan (간) rooted defensive positioning\n */\n MAX_BEND_ROOTED: 0.44, // 25° in radians\n },\n\n /**\n * Ankle Joint Limits (발목 관절)\n */\n ANKLE: {\n /**\n * Maximum safe ankle dorsiflexion: 25° (0.44 radians)\n *\n * Heel raising for explosive launch and power generation\n * (used in Jin/Thunder explosive techniques).\n *\n * **Used in:** Jin (진) explosive heel raises\n */\n MAX_DORSIFLEXION: 0.44, // 25° in radians\n\n /**\n * Maximum safe ankle dorsiflex: 20° (0.35 radians)\n *\n * Conservative ankle flexion for ground control positioning\n * (used in Gon/Earth ground techniques).\n *\n * **Used in:** Gon (곤) stable ground positioning\n */\n MAX_DORSIFLEX: 0.35, // 20° in radians\n },\n} as const;\n\n/**\n * Type-safe access to anatomical limits\n */\nexport type AnatomicalLimits = typeof ANATOMICAL_LIMITS;\n\n/**\n * Helper function to get anatomical limit by body part and movement type\n *\n * Type-safe function that ensures valid body part and limit type combinations\n * are used at compile time, catching typos before runtime.\n *\n * @param bodyPart - Body part category (SHOULDER, ELBOW, WRIST, HIP, KNEE, ANKLE)\n * @param limitType - Specific limit type (MAX_BEND, MAX_FLEXION, etc.)\n * @returns The anatomical limit value in radians\n *\n * @example\n * ```typescript\n * const maxElbowBend = getAnatomicalLimit('ELBOW', 'MAX_BEND'); // 2.18 radians\n * ```\n */\nexport function getAnatomicalLimit<\n B extends keyof AnatomicalLimits,\n L extends keyof AnatomicalLimits[B] & string\n>(\n bodyPart: B,\n limitType: L\n): AnatomicalLimits[B][L] {\n const part = ANATOMICAL_LIMITS[bodyPart];\n const value = part[limitType];\n\n if (typeof value !== \"number\") {\n throw new Error(\n `Invalid anatomical limit: ${String(bodyPart)}.${String(limitType)}`\n );\n }\n\n return value;\n}\n\n/**\n * Convert degrees to radians for animation calculations\n *\n * @param degrees - Angle in degrees\n * @returns Angle in radians\n *\n * @example\n * ```typescript\n * const radians = degreesToRadians(90); // 1.5708 (π/2)\n * ```\n */\nexport function degreesToRadians(degrees: number): number {\n return degrees * (Math.PI / 180);\n}\n\n/**\n * Convert radians to degrees for human-readable output\n *\n * @param radians - Angle in radians\n * @returns Angle in degrees\n *\n * @example\n * ```typescript\n * const degrees = radiansToDegrees(1.5708); // 90\n * ```\n */\nexport function radiansToDegrees(radians: number): number {\n return radians * (180 / Math.PI);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,IAAa,oBAAoB;;;;CAQ/B,UAAU;;;;;;;;;;EAUR,cAAc;;;;;;;;;EAUd,cAAc;;;;;;;;;EAUd,eAAe;EAChB;;;;CAKD,OAAO;;;;;;;;;EASL,UAAU;;;;;;;;;EAUV,aAAa;;;;;;;;;EAUb,gBAAgB;EACjB;;;;CAKD,OAAO;;;;;;;;;AASL,UAAU,MACX;;;;CASD,KAAK;;;;;;;;;EASH,aAAa;;;;;;;;;EAUb,cAAc;EACf;;;;CAKD,MAAM;;;;;;;;;EASJ,aAAa;;;;;;;;;EAUb,UAAU;;;;;;;;;EAUV,iBAAiB;EAClB;;;;CAKD,OAAO;;;;;;;;;EASL,kBAAkB;;;;;;;;;EAUlB,eAAe;EAChB;CACF"}
1
+ {"version":3,"file":"AnatomicalLimits.js","names":[],"sources":["../../../../src/systems/animation/constants/AnatomicalLimits.ts"],"sourcesContent":["/**\n * Anatomical Limits Constants\n *\n * Centralized biomechanical safety limits for Korean martial arts animations.\n * These constants document safe physiological ranges for joint movements,\n * validated by Korean martial arts experts and biomechanical research.\n *\n * **Korean Martial Arts Context:**\n * - 한국 무술 생체역학 안전 기준 (Korean Martial Arts Biomechanical Safety Standards)\n * - 관절 안전 범위 (Joint Safety Ranges)\n * - 실전 기술 적용 (Practical Technique Application)\n *\n * **Purpose:**\n * These limits serve as reference documentation and inform animation design\n * to ensure realistic, safe joint mechanics. Actual animations are designed\n * to stay well within these limits through authentic martial arts biomechanics.\n *\n * **Note:** All values are in radians for Three.js compatibility.\n * Convert degrees to radians: degrees * (π / 180)\n *\n * @module systems/animation/constants\n * @category Animation Constants\n * @korean 생체역학안전상수\n */\n\n/**\n * Anatomical Limits for Joint Rotations\n *\n * Comprehensive set of safe physiological ranges for all major joints\n * used in Korean martial arts movements.\n */\nexport const ANATOMICAL_LIMITS = {\n // ═══════════════════════════════════════════════════════════════════════════\n // UPPER BODY LIMITS (상체 관절 제한)\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Shoulder Joint Limits (어깨 관절)\n */\n SHOULDER: {\n /**\n * Maximum safe shoulder overhead rotation: -135° (-2.35 radians)\n *\n * Shoulder flexion limit is approximately 150-180°, making -135° a safe\n * threshold for dramatic overhead positioning (used in Geon/Heaven stance)\n * without risking constraint violations.\n *\n * **Used in:** Geon (건) overhead strikes, powerful techniques\n */\n MAX_OVERHEAD: -2.35, // -135° in radians\n\n /**\n * Maximum safe shoulder rotation: ±90° (±1.57 radians)\n *\n * Safe shoulder rotation range for circular movements without risking\n * impingement or constraint violations (used in Tae/Lake, Son/Wind stances).\n *\n * **Used in:** Tae (태) circular motions, Son (손) continuous attacks\n */\n MAX_ROTATION: 1.57, // ±90° in radians\n\n /**\n * Maximum safe shoulder elevation: -35° (-0.61 radians)\n *\n * Conservative shoulder elevation for defensive positions\n * (used in Gan/Mountain guard stance).\n *\n * **Used in:** Gan (간) defensive guard positioning\n */\n MAX_ELEVATION: -0.61, // -35° in radians\n },\n\n /**\n * Elbow Joint Limits (팔꿈치 관절)\n */\n ELBOW: {\n /**\n * Maximum safe elbow bend: ±125° (±2.18 radians)\n *\n * Typical elbow flexion limit is 145-160°, making 125° a conservative\n * threshold for powerful chambering positions (used in Geon/Heaven strikes).\n *\n * **Used in:** Geon (건) powerful overhead chambering\n */\n MAX_BEND: 2.18, // ±125° in radians\n\n /**\n * Maximum safe elbow flexion: 145° (2.53 radians)\n *\n * Full elbow flexion for natural guard positions and joint manipulation\n * techniques (used in Tae/Lake, Son/Wind stances).\n *\n * **Used in:** Tae (태) joint locks, Son (손) guard positions\n */\n MAX_FLEXION: 2.53, // 145° in radians\n\n /**\n * Maximum safe elbow bend for guard: 120° (2.09 radians)\n *\n * Conservative elbow flexion for defensive guard positions\n * (used in Gan/Mountain defensive stance).\n *\n * **Used in:** Gan (간) defensive guard\n */\n MAX_BEND_GUARD: 2.09, // 120° in radians\n },\n\n /**\n * Wrist Joint Limits (손목 관절)\n */\n WRIST: {\n /**\n * Maximum safe wrist flexion/extension: ±70° (±1.22 radians)\n *\n * Typical wrist range is 70-90° flexion/extension. We use 70° as a safe\n * threshold for joint lock techniques (used in Tae/Lake Hapkido techniques).\n *\n * **Used in:** Tae (태) wrist locks and joint manipulation\n */\n MAX_BEND: 1.22, // ±70° in radians\n },\n\n // ═══════════════════════════════════════════════════════════════════════════\n // LOWER BODY LIMITS (하체 관절 제한)\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Hip Joint Limits (엉덩이 관절)\n */\n HIP: {\n /**\n * Maximum safe hip flexion: 110° (1.92 radians)\n *\n * Hip flexion for ground techniques and takedowns\n * (used in Gon/Earth ground control stance).\n *\n * **Used in:** Gon (곤) ground techniques, throws\n */\n MAX_FLEXION: 1.92, // 110° in radians\n\n /**\n * Maximum safe hip rotation: ±70° (±1.22 radians)\n *\n * Safe hip rotation range for continuous flowing movements\n * (used in Son/Wind circular attacks).\n *\n * **Used in:** Son (손) circular movements, flow techniques\n */\n MAX_ROTATION: 1.22, // ±70° in radians\n },\n\n /**\n * Knee Joint Limits (무릎 관절)\n */\n KNEE: {\n /**\n * Maximum safe knee flexion: 90° (1.57 radians)\n *\n * Deep horse stance knee bend for explosive power generation\n * (used in Jin/Thunder explosive stance).\n *\n * **Used in:** Jin (진) explosive power generation\n */\n MAX_FLEXION: 1.57, // 90° in radians\n\n /**\n * Maximum safe knee bend: 130° (2.27 radians)\n *\n * Deep knee bend for ground control and takedown positioning\n * (used in Gon/Earth ground techniques).\n *\n * **Used in:** Gon (곤) ground control, low positioning\n */\n MAX_BEND: 2.27, // 130° in radians\n\n /**\n * Maximum safe knee bend for rooted stance: 25° (0.44 radians)\n *\n * Conservative knee bend for defensive rooted positions\n * (used in Gan/Mountain defensive stance).\n *\n * **Used in:** Gan (간) rooted defensive positioning\n */\n MAX_BEND_ROOTED: 0.44, // 25° in radians\n },\n\n /**\n * Ankle Joint Limits (발목 관절)\n */\n ANKLE: {\n /**\n * Maximum safe ankle dorsiflexion: 25° (0.44 radians)\n *\n * Heel raising for explosive launch and power generation\n * (used in Jin/Thunder explosive techniques).\n *\n * **Used in:** Jin (진) explosive heel raises\n */\n MAX_DORSIFLEXION: 0.44, // 25° in radians\n\n /**\n * Maximum safe ankle dorsiflex: 20° (0.35 radians)\n *\n * Conservative ankle flexion for ground control positioning\n * (used in Gon/Earth ground techniques).\n *\n * **Used in:** Gon (곤) stable ground positioning\n */\n MAX_DORSIFLEX: 0.35, // 20° in radians\n },\n} as const;\n\n/**\n * Type-safe access to anatomical limits\n */\nexport type AnatomicalLimits = typeof ANATOMICAL_LIMITS;\n\n/**\n * Helper function to get anatomical limit by body part and movement type\n *\n * Type-safe function that ensures valid body part and limit type combinations\n * are used at compile time, catching typos before runtime.\n *\n * @param bodyPart - Body part category (SHOULDER, ELBOW, WRIST, HIP, KNEE, ANKLE)\n * @param limitType - Specific limit type (MAX_BEND, MAX_FLEXION, etc.)\n * @returns The anatomical limit value in radians\n *\n * @example\n * ```typescript\n * const maxElbowBend = getAnatomicalLimit('ELBOW', 'MAX_BEND'); // 2.18 radians\n * ```\n */\nexport function getAnatomicalLimit<\n B extends keyof AnatomicalLimits,\n L extends keyof AnatomicalLimits[B] & string\n>(\n bodyPart: B,\n limitType: L\n): AnatomicalLimits[B][L] {\n const part = ANATOMICAL_LIMITS[bodyPart];\n const value = part[limitType];\n\n if (typeof value !== \"number\") {\n throw new Error(\n `Invalid anatomical limit: ${String(bodyPart)}.${String(limitType)}`\n );\n }\n\n return value;\n}\n\n/**\n * Convert degrees to radians for animation calculations\n *\n * @param degrees - Angle in degrees\n * @returns Angle in radians\n *\n * @example\n * ```typescript\n * const radians = degreesToRadians(90); // 1.5708 (π/2)\n * ```\n */\nexport function degreesToRadians(degrees: number): number {\n return degrees * (Math.PI / 180);\n}\n\n/**\n * Convert radians to degrees for human-readable output\n *\n * @param radians - Angle in radians\n * @returns Angle in degrees\n *\n * @example\n * ```typescript\n * const degrees = radiansToDegrees(1.5708); // 90\n * ```\n */\nexport function radiansToDegrees(radians: number): number {\n return radians * (180 / Math.PI);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,IAAa,oBAAoB;;;;CAQ/B,UAAU;;;;;;;;;;EAUR,cAAc;;;;;;;;;EAUd,cAAc;;;;;;;;;EAUd,eAAe;CACjB;;;;CAKA,OAAO;;;;;;;;;EASL,UAAU;;;;;;;;;EAUV,aAAa;;;;;;;;;EAUb,gBAAgB;CAClB;;;;CAKA,OAAO;;;;;;;;;AASL,UAAU,KACZ;;;;CASA,KAAK;;;;;;;;;EASH,aAAa;;;;;;;;;EAUb,cAAc;CAChB;;;;CAKA,MAAM;;;;;;;;;EASJ,aAAa;;;;;;;;;EAUb,UAAU;;;;;;;;;EAUV,iBAAiB;CACnB;;;;CAKA,OAAO;;;;;;;;;EASL,kBAAkB;;;;;;;;;EAUlB,eAAe;CACjB;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"AnimationHitTiming.js","names":[],"sources":["../../../../src/systems/animation/core/AnimationHitTiming.ts"],"sourcesContent":["/**\n * Animation Hit Timing System\n *\n * **Korean**: 애니메이션 타격 타이밍\n *\n * Defines when visual contact occurs in animations for reality-based hit detection.\n * Hits should only register when the animation visually shows limb contact with target.\n *\n * ## Philosophy\n *\n * Black Trigram emphasizes visual authenticity in combat. Hit detection must align\n * with what the player sees on screen. This system defines the exact frames/timing\n * when each technique's strike phase visually connects.\n *\n * ## Phases\n *\n * Korean martial arts techniques have distinct phases:\n * - **준비 (Chamber)**: Wind-up, no contact possible\n * - **실행 (Extension)**: Strike extending, contact window opens\n * - **정점 (Peak)**: Maximum extension, highest contact probability\n * - **회수 (Retraction)**: Pulling back, contact window closes\n * - **복귀 (Recovery)**: Return to stance, no contact\n *\n * @module systems/animation/AnimationHitTiming\n * @category Animation System\n * @korean 애니메이션타격타이밍\n */\n\nimport { AnimationType } from \"../builders/MartialArtsAnimationBuilder\";\n\n/**\n * Hit window timing for a technique animation.\n *\n * **Korean**: 타격 창 타이밍\n *\n * Defines when during an animation the technique can actually make contact.\n * Based on visual reach during the extension phase.\n *\n * @example\n * ```typescript\n * const jabTiming: AnimationHitWindow = {\n * startTime: 0.10, // Hit window opens at 100ms (after chamber)\n * peakTime: 0.15, // Peak extension at 150ms\n * endTime: 0.20, // Hit window closes at 200ms (before retraction)\n * maxReachMultiplier: 1.0, // 100% of limb length at peak\n * };\n * ```\n *\n * @korean 타격창타이밍\n */\nexport interface AnimationHitWindow {\n /**\n * Time when hit window opens (seconds).\n * Start of extension phase where limb begins moving toward target.\n * @korean 시작시간\n */\n readonly startTime: number;\n\n /**\n * Time of maximum extension (seconds).\n * Peak of strike where reach is maximum and damage is highest.\n * @korean 정점시간\n */\n readonly peakTime: number;\n\n /**\n * Time when hit window closes (seconds).\n * End of extension phase where limb begins retracting.\n * @korean 종료시간\n */\n readonly endTime: number;\n\n /**\n * Reach multiplier at peak extension (0.0 - 1.5).\n * - 1.0 = full limb extension (standard strikes)\n * - 0.7 = partial extension (close-range techniques)\n * - 1.2+ = overextended (special techniques, jumping kicks)\n * @korean 최대도달배수\n */\n readonly maxReachMultiplier: number;\n\n /**\n * Optional reach curve during hit window.\n * If not provided, assumes linear interpolation from 0 to maxReachMultiplier.\n * @korean 도달곡선\n */\n readonly reachCurve?: (normalizedTime: number) => number;\n}\n\n/**\n * Complete hit timing configuration for a technique.\n *\n * **Korean**: 기술 타격 타이밍 설정\n *\n * @korean 기술타격타이밍\n */\nexport interface TechniqueHitTiming {\n /**\n * Animation type this timing applies to.\n * @korean 애니메이션타입\n */\n readonly animationType: AnimationType;\n\n /**\n * Hit window configuration.\n * @korean 타격창\n */\n readonly hitWindow: AnimationHitWindow;\n\n /**\n * Whether this technique requires precise timing (true) or has a wider window (false).\n * Affects forgiveness in hit detection.\n * @korean 정밀타이밍필요\n */\n readonly requiresPreciseTiming: boolean;\n}\n\n/**\n * Hit timing database for animation types.\n *\n * **Korean**: 애니메이션 타격 타이밍 데이터베이스\n *\n * Based on TECHNIQUE_TIMING constants from MartialArtsAnimationBuilder.\n * Only includes timing for techniques with actual hit windows.\n * Movement and non-combat animations can query this and will get undefined.\n *\n * @korean 애니메이션타격타이밍데이터베이스\n */\nexport const ANIMATION_HIT_TIMING: Partial<\n Record<AnimationType, TechniqueHitTiming>\n> = {\n // ═══════════════════════════════════════════════════════════════════════\n // PUNCH TECHNIQUES (주먹 기술)\n // ═══════════════════════════════════════════════════════════════════════\n\n [AnimationType.JAB]: {\n animationType: AnimationType.JAB,\n hitWindow: {\n startTime: 0.1, // Chamber: 100ms, Extension starts\n peakTime: 0.15, // Peak at 150ms (midpoint of 150ms extension)\n endTime: 0.25, // Retraction starts at 250ms\n maxReachMultiplier: 0.95, // Jabs don't fully extend (speed > reach)\n },\n requiresPreciseTiming: false, // Fast technique with forgiving window\n },\n\n [AnimationType.CROSS]: {\n animationType: AnimationType.CROSS,\n hitWindow: {\n startTime: 0.15, // Longer chamber for power\n peakTime: 0.25, // Peak at 250ms\n endTime: 0.35, // Window closes at 350ms\n maxReachMultiplier: 1.0, // Full extension for power\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.HOOK]: {\n animationType: AnimationType.HOOK,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 0.85, // Hooks are shorter range (arc motion)\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.UPPERCUT]: {\n animationType: AnimationType.UPPERCUT,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 0.7, // Close-range technique\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.OVERHAND]: {\n animationType: AnimationType.OVERHAND,\n hitWindow: {\n startTime: 0.2,\n peakTime: 0.3,\n endTime: 0.42,\n maxReachMultiplier: 1.1, // Longer reach from arc\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.BACKFIST]: {\n animationType: AnimationType.BACKFIST,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.18,\n endTime: 0.27,\n maxReachMultiplier: 0.9, // Snapping technique\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.HAMMER_FIST]: {\n animationType: AnimationType.HAMMER_FIST,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 0.85,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.PALM_STRIKE]: {\n animationType: AnimationType.PALM_STRIKE,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 1.0,\n },\n requiresPreciseTiming: false,\n },\n\n // ═══ Specialized Punch Variants ═══\n\n [AnimationType.SPEAR_HAND_STRIKE]: {\n animationType: AnimationType.SPEAR_HAND_STRIKE,\n hitWindow: {\n startTime: 0.08,\n peakTime: 0.13,\n endTime: 0.2,\n maxReachMultiplier: 1.05, // Extended fingers add reach\n },\n requiresPreciseTiming: true, // Precise targeting required\n },\n\n [AnimationType.NERVE_STRIKE]: {\n animationType: AnimationType.NERVE_STRIKE,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.15,\n endTime: 0.22,\n maxReachMultiplier: 0.9,\n },\n requiresPreciseTiming: true, // Must hit exact nerve point\n },\n\n [AnimationType.PRESSURE_POINT_STRIKE]: {\n animationType: AnimationType.PRESSURE_POINT_STRIKE,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.32,\n maxReachMultiplier: 0.85,\n },\n requiresPreciseTiming: true, // Precise pressure point targeting\n },\n\n [AnimationType.LIGHTNING_STRIKE]: {\n animationType: AnimationType.LIGHTNING_STRIKE,\n hitWindow: {\n startTime: 0.06,\n peakTime: 0.1,\n endTime: 0.15,\n maxReachMultiplier: 0.95,\n },\n requiresPreciseTiming: true, // Very fast, small window\n },\n\n [AnimationType.RAPID_BARRAGE]: {\n animationType: AnimationType.RAPID_BARRAGE,\n hitWindow: {\n startTime: 0.05,\n peakTime: 0.12,\n endTime: 0.2,\n maxReachMultiplier: 0.85, // Multiple hits, shorter reach each\n },\n requiresPreciseTiming: false, // Volume of strikes compensates\n },\n\n [AnimationType.RHYTHMIC_STRIKES]: {\n animationType: AnimationType.RHYTHMIC_STRIKES,\n hitWindow: {\n startTime: 0.08,\n peakTime: 0.15,\n endTime: 0.25,\n maxReachMultiplier: 0.9,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.NERVE_PARALYSIS]: {\n animationType: AnimationType.NERVE_PARALYSIS,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.2,\n endTime: 0.28,\n maxReachMultiplier: 0.85,\n },\n requiresPreciseTiming: true,\n },\n\n [AnimationType.THROAT_STRIKE]: {\n animationType: AnimationType.THROAT_STRIKE,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.15,\n endTime: 0.22,\n maxReachMultiplier: 0.95,\n },\n requiresPreciseTiming: true, // Must hit throat precisely\n },\n\n [AnimationType.EYE_GOUGE]: {\n animationType: AnimationType.EYE_GOUGE,\n hitWindow: {\n startTime: 0.08,\n peakTime: 0.12,\n endTime: 0.18,\n maxReachMultiplier: 0.8, // Very close range\n },\n requiresPreciseTiming: true, // Extremely precise target\n },\n\n [AnimationType.HEAVEN_STRIKE]: {\n animationType: AnimationType.HEAVEN_STRIKE,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 1.1, // Powerful extension\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.FLOWING_CROSS]: {\n animationType: AnimationType.FLOWING_CROSS,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.22,\n endTime: 0.32,\n maxReachMultiplier: 1.0,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SOLAR_PLEXUS_STRIKE]: {\n animationType: AnimationType.SOLAR_PLEXUS_STRIKE,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.2,\n endTime: 0.28,\n maxReachMultiplier: 0.95,\n },\n requiresPreciseTiming: true, // Must hit solar plexus\n },\n\n [AnimationType.FLOWING_PUSH]: {\n animationType: AnimationType.FLOWING_PUSH,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.2,\n endTime: 0.3,\n maxReachMultiplier: 1.0,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.LIVER_DISRUPTION]: {\n animationType: AnimationType.LIVER_DISRUPTION,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.33,\n maxReachMultiplier: 0.9,\n },\n requiresPreciseTiming: true, // Must hit liver\n },\n\n [AnimationType.EAR_STRIKE]: {\n animationType: AnimationType.EAR_STRIKE,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.16,\n endTime: 0.24,\n maxReachMultiplier: 0.85,\n },\n requiresPreciseTiming: true, // Must hit ear precisely\n },\n\n // ═══════════════════════════════════════════════════════════════════════\n // KICK TECHNIQUES (발차기 기술)\n // ═══════════════════════════════════════════════════════════════════════\n\n [AnimationType.FRONT_KICK]: {\n animationType: AnimationType.FRONT_KICK,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.27,\n endTime: 0.4,\n maxReachMultiplier: 1.0, // Full leg extension\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.ROUNDHOUSE_KICK]: {\n animationType: AnimationType.ROUNDHOUSE_KICK,\n hitWindow: {\n startTime: 0.2,\n peakTime: 0.32,\n endTime: 0.48,\n maxReachMultiplier: 1.05, // Slight overextension at peak\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SIDE_KICK]: {\n animationType: AnimationType.SIDE_KICK,\n hitWindow: {\n startTime: 0.2,\n peakTime: 0.35,\n endTime: 0.5,\n maxReachMultiplier: 1.1, // Maximum reach technique\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.BACK_KICK]: {\n animationType: AnimationType.BACK_KICK,\n hitWindow: {\n startTime: 0.25,\n peakTime: 0.4,\n endTime: 0.55,\n maxReachMultiplier: 1.15, // Powerful extension backward\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.AXE_KICK]: {\n animationType: AnimationType.AXE_KICK,\n hitWindow: {\n startTime: 0.25,\n peakTime: 0.45,\n endTime: 0.65,\n maxReachMultiplier: 1.2, // High vertical reach\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.CRESCENT_KICK]: {\n animationType: AnimationType.CRESCENT_KICK,\n hitWindow: {\n startTime: 0.18,\n peakTime: 0.32,\n endTime: 0.48,\n maxReachMultiplier: 1.0,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.LOW_KICK]: {\n animationType: AnimationType.LOW_KICK,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.22,\n endTime: 0.35,\n maxReachMultiplier: 0.95, // Lower target, less extension\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.PUSH_KICK]: {\n animationType: AnimationType.PUSH_KICK,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.22,\n endTime: 0.35,\n maxReachMultiplier: 1.0,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.JUMPING_KICK]: {\n animationType: AnimationType.JUMPING_KICK,\n hitWindow: {\n startTime: 0.3,\n peakTime: 0.45,\n endTime: 0.6,\n maxReachMultiplier: 1.3, // Airborne extension\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SPINNING_HEEL_KICK]: {\n animationType: AnimationType.SPINNING_HEEL_KICK,\n hitWindow: {\n startTime: 0.4,\n peakTime: 0.6,\n endTime: 0.8,\n maxReachMultiplier: 1.15, // Spinning adds reach\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.TORNADO_KICK]: {\n animationType: AnimationType.TORNADO_KICK,\n hitWindow: {\n startTime: 0.45,\n peakTime: 0.65,\n endTime: 0.85,\n maxReachMultiplier: 1.25, // Jumping + spinning\n },\n requiresPreciseTiming: false,\n },\n\n // ═══════════════════════════════════════════════════════════════════════\n // ELBOW & KNEE TECHNIQUES (팔꿈치 & 무릎 기술)\n // ═══════════════════════════════════════════════════════════════════════\n\n [AnimationType.ELBOW_STRIKE]: {\n animationType: AnimationType.ELBOW_STRIKE,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.18,\n endTime: 0.28,\n maxReachMultiplier: 0.5, // Very close range\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.ELBOW_UPPERCUT]: {\n animationType: AnimationType.ELBOW_UPPERCUT,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.22,\n endTime: 0.32,\n maxReachMultiplier: 0.45, // Close range upward\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SPINNING_ELBOW]: {\n animationType: AnimationType.SPINNING_ELBOW,\n hitWindow: {\n startTime: 0.3,\n peakTime: 0.5,\n endTime: 0.7,\n maxReachMultiplier: 0.6, // Spinning adds slight reach\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.TEMPLE_ELBOW]: {\n animationType: AnimationType.TEMPLE_ELBOW,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.18,\n endTime: 0.26,\n maxReachMultiplier: 0.5,\n },\n requiresPreciseTiming: true, // Must hit temple\n },\n\n [AnimationType.SPINNING_BACK_ELBOW]: {\n animationType: AnimationType.SPINNING_BACK_ELBOW,\n hitWindow: {\n startTime: 0.28,\n peakTime: 0.45,\n endTime: 0.62,\n maxReachMultiplier: 0.55,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SPINAL_ELBOW]: {\n animationType: AnimationType.SPINAL_ELBOW,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 0.5,\n },\n requiresPreciseTiming: true, // Must hit spine\n },\n\n [AnimationType.BRACHIAL_ELBOW]: {\n animationType: AnimationType.BRACHIAL_ELBOW,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.18,\n endTime: 0.26,\n maxReachMultiplier: 0.5,\n },\n requiresPreciseTiming: true, // Must hit brachial plexus\n },\n\n [AnimationType.KNEE_STRIKE]: {\n animationType: AnimationType.KNEE_STRIKE,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.22,\n endTime: 0.35,\n maxReachMultiplier: 0.4, // Very close range\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.FLYING_KNEE]: {\n animationType: AnimationType.FLYING_KNEE,\n hitWindow: {\n startTime: 0.25,\n peakTime: 0.4,\n endTime: 0.55,\n maxReachMultiplier: 0.65, // Jumping adds reach\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.KIDNEY_KNEE]: {\n animationType: AnimationType.KIDNEY_KNEE,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 0.4,\n },\n requiresPreciseTiming: true, // Must hit kidney\n },\n\n [AnimationType.FEMORAL_KNEE]: {\n animationType: AnimationType.FEMORAL_KNEE,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 0.4,\n },\n requiresPreciseTiming: true, // Must hit femoral artery\n },\n\n // ═══════════════════════════════════════════════════════════════════════\n // GRAPPLING TECHNIQUES (잡기 기술)\n // ═══════════════════════════════════════════════════════════════════════\n\n [AnimationType.THROW]: {\n animationType: AnimationType.THROW,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.35,\n endTime: 0.55,\n maxReachMultiplier: 0.7, // Must be close to grab\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.GRAPPLE]: {\n animationType: AnimationType.GRAPPLE,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.3,\n endTime: 0.5,\n maxReachMultiplier: 0.8, // Reach to grab\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SWEEP]: {\n animationType: AnimationType.SWEEP,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.3,\n endTime: 0.45,\n maxReachMultiplier: 0.9, // Low sweep\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SLAM]: {\n animationType: AnimationType.SLAM,\n hitWindow: {\n startTime: 0.2,\n peakTime: 0.4,\n endTime: 0.6,\n maxReachMultiplier: 0.7,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.WRIST_LOCK]: {\n animationType: AnimationType.WRIST_LOCK,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.25,\n endTime: 0.4,\n maxReachMultiplier: 0.75,\n },\n requiresPreciseTiming: true, // Must grab wrist\n },\n\n [AnimationType.ARM_BAR]: {\n animationType: AnimationType.ARM_BAR,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.35,\n endTime: 0.55,\n maxReachMultiplier: 0.8,\n },\n requiresPreciseTiming: true, // Must control arm\n },\n\n [AnimationType.SHOULDER_LOCK]: {\n animationType: AnimationType.SHOULDER_LOCK,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.3,\n endTime: 0.48,\n maxReachMultiplier: 0.75,\n },\n requiresPreciseTiming: true, // Must control shoulder\n },\n\n [AnimationType.HIP_THROW]: {\n animationType: AnimationType.HIP_THROW,\n hitWindow: {\n startTime: 0.18,\n peakTime: 0.38,\n endTime: 0.58,\n maxReachMultiplier: 0.7,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.LEG_REAP]: {\n animationType: AnimationType.LEG_REAP,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.3,\n endTime: 0.45,\n maxReachMultiplier: 0.85,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SMALL_CIRCLE_LOCK]: {\n animationType: AnimationType.SMALL_CIRCLE_LOCK,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.28,\n endTime: 0.44,\n maxReachMultiplier: 0.7,\n },\n requiresPreciseTiming: true, // Hapkido precision\n },\n\n [AnimationType.FINGER_LOCK]: {\n animationType: AnimationType.FINGER_LOCK,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.23,\n endTime: 0.36,\n maxReachMultiplier: 0.75,\n },\n requiresPreciseTiming: true, // Must grab fingers\n },\n\n [AnimationType.ELBOW_LOCK]: {\n animationType: AnimationType.ELBOW_LOCK,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.32,\n endTime: 0.49,\n maxReachMultiplier: 0.8,\n },\n requiresPreciseTiming: true, // Must control elbow\n },\n\n [AnimationType.SHOULDER_MANIPULATION]: {\n animationType: AnimationType.SHOULDER_MANIPULATION,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.32,\n endTime: 0.49,\n maxReachMultiplier: 0.75,\n },\n requiresPreciseTiming: true,\n },\n\n [AnimationType.MOUNTAIN_LOCK]: {\n animationType: AnimationType.MOUNTAIN_LOCK,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.32,\n endTime: 0.49,\n maxReachMultiplier: 0.75,\n },\n requiresPreciseTiming: true,\n },\n\n [AnimationType.EARTH_EMBRACE]: {\n animationType: AnimationType.EARTH_EMBRACE,\n hitWindow: {\n startTime: 0.18,\n peakTime: 0.4,\n endTime: 0.62,\n maxReachMultiplier: 0.8,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.TAKEDOWN]: {\n animationType: AnimationType.TAKEDOWN,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.35,\n endTime: 0.55,\n maxReachMultiplier: 0.75,\n },\n requiresPreciseTiming: false,\n },\n\n // ═══════════════════════════════════════════════════════════════════════\n // DEFENSIVE TECHNIQUES (방어 기술)\n // ═══════════════════════════════════════════════════════════════════════\n\n [AnimationType.BLOCK]: {\n animationType: AnimationType.BLOCK,\n hitWindow: {\n startTime: 0.03,\n peakTime: 0.05,\n endTime: 0.08,\n maxReachMultiplier: 0.6, // Arms defending\n },\n requiresPreciseTiming: true, // Must time block correctly\n },\n\n [AnimationType.PARRY]: {\n animationType: AnimationType.PARRY,\n hitWindow: {\n startTime: 0.03,\n peakTime: 0.06,\n endTime: 0.1,\n maxReachMultiplier: 0.7,\n },\n requiresPreciseTiming: true, // Precise deflection\n },\n\n [AnimationType.COUNTER_STRIKE]: {\n animationType: AnimationType.COUNTER_STRIKE,\n hitWindow: {\n startTime: 0.08,\n peakTime: 0.15,\n endTime: 0.25,\n maxReachMultiplier: 0.9, // Counter-strike reach\n },\n requiresPreciseTiming: true, // Timing critical for counters\n },\n};\n\n/**\n * Get hit timing configuration for an animation type.\n *\n * **Korean**: 애니메이션 타격 타이밍 가져오기\n *\n * @param animationType - Animation type to get timing for\n * @returns Hit timing configuration, or undefined if not a combat animation\n *\n * @example\n * ```typescript\n * const jabTiming = getAnimationHitTiming(AnimationType.JAB);\n * if (jabTiming) {\n * console.log(`Jab hit window: ${jabTiming.hitWindow.startTime}s - ${jabTiming.hitWindow.endTime}s`);\n * }\n * ```\n *\n * @korean 애니메이션타격타이밍가져오기\n */\nexport function getAnimationHitTiming(\n animationType: AnimationType\n): TechniqueHitTiming | undefined {\n return ANIMATION_HIT_TIMING[animationType];\n}\n\n/**\n * Check if a technique can hit at the given animation time.\n *\n * **Korean**: 타격 가능 시간 확인\n *\n * @param animationType - Animation type\n * @param currentTime - Current time in animation (seconds)\n * @returns True if within hit window\n *\n * @example\n * ```typescript\n * const canHit = isWithinHitWindow(AnimationType.JAB, 0.15);\n * // Returns true (0.15s is within jab's 0.10-0.25s window)\n * ```\n *\n * @korean 타격가능시간확인\n */\nexport function isWithinHitWindow(\n animationType: AnimationType,\n currentTime: number\n): boolean {\n const timing = ANIMATION_HIT_TIMING[animationType];\n if (!timing) {\n // Not a combat animation (movement, stance change, etc.)\n return false;\n }\n const { startTime, endTime } = timing.hitWindow;\n return currentTime >= startTime && currentTime <= endTime;\n}\n\n/**\n * Calculate current reach multiplier at a specific time in the animation.\n *\n * **Korean**: 현재 도달 배수 계산\n *\n * @param animationType - Animation type\n * @param currentTime - Current time in animation (seconds)\n * @returns Reach multiplier (0.0 - max), or 0 if outside hit window\n *\n * @example\n * ```typescript\n * const reach = getCurrentReachMultiplier(AnimationType.JAB, 0.15);\n * // Returns 0.95 (jab at peak time)\n *\n * const noReach = getCurrentReachMultiplier(AnimationType.JAB, 0.05);\n * // Returns 0 (before hit window starts)\n * ```\n *\n * @korean 현재도달배수계산\n */\nexport function getCurrentReachMultiplier(\n animationType: AnimationType,\n currentTime: number\n): number {\n const timing = ANIMATION_HIT_TIMING[animationType];\n if (!timing) {\n // Not a combat animation\n return 0;\n }\n const { startTime, peakTime, endTime, maxReachMultiplier, reachCurve } =\n timing.hitWindow;\n\n // Outside hit window\n if (currentTime < startTime || currentTime > endTime) {\n return 0;\n }\n\n // Normalize time within hit window (0 = start, 0.5 = peak, 1 = end)\n let normalizedTime: number;\n if (currentTime <= peakTime) {\n // Start to peak (0 to 0.5)\n normalizedTime = 0.5 * ((currentTime - startTime) / (peakTime - startTime));\n } else {\n // Peak to end (0.5 to 1)\n normalizedTime =\n 0.5 + 0.5 * ((currentTime - peakTime) / (endTime - peakTime));\n }\n\n // Apply reach curve if provided, otherwise use simple interpolation\n if (reachCurve) {\n return maxReachMultiplier * reachCurve(normalizedTime);\n }\n\n // Default: Peak at center (0.5), taper off at edges\n // Use smooth curve: 1 - (2 * normalizedTime - 1)^2\n const peakFactor = 1 - Math.pow(2 * normalizedTime - 1, 2);\n return maxReachMultiplier * peakFactor;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AnimationHitTiming.js","names":[],"sources":["../../../../src/systems/animation/core/AnimationHitTiming.ts"],"sourcesContent":["/**\n * Animation Hit Timing System\n *\n * **Korean**: 애니메이션 타격 타이밍\n *\n * Defines when visual contact occurs in animations for reality-based hit detection.\n * Hits should only register when the animation visually shows limb contact with target.\n *\n * ## Philosophy\n *\n * Black Trigram emphasizes visual authenticity in combat. Hit detection must align\n * with what the player sees on screen. This system defines the exact frames/timing\n * when each technique's strike phase visually connects.\n *\n * ## Phases\n *\n * Korean martial arts techniques have distinct phases:\n * - **준비 (Chamber)**: Wind-up, no contact possible\n * - **실행 (Extension)**: Strike extending, contact window opens\n * - **정점 (Peak)**: Maximum extension, highest contact probability\n * - **회수 (Retraction)**: Pulling back, contact window closes\n * - **복귀 (Recovery)**: Return to stance, no contact\n *\n * @module systems/animation/AnimationHitTiming\n * @category Animation System\n * @korean 애니메이션타격타이밍\n */\n\nimport { AnimationType } from \"../builders/MartialArtsAnimationBuilder\";\n\n/**\n * Hit window timing for a technique animation.\n *\n * **Korean**: 타격 창 타이밍\n *\n * Defines when during an animation the technique can actually make contact.\n * Based on visual reach during the extension phase.\n *\n * @example\n * ```typescript\n * const jabTiming: AnimationHitWindow = {\n * startTime: 0.10, // Hit window opens at 100ms (after chamber)\n * peakTime: 0.15, // Peak extension at 150ms\n * endTime: 0.20, // Hit window closes at 200ms (before retraction)\n * maxReachMultiplier: 1.0, // 100% of limb length at peak\n * };\n * ```\n *\n * @korean 타격창타이밍\n */\nexport interface AnimationHitWindow {\n /**\n * Time when hit window opens (seconds).\n * Start of extension phase where limb begins moving toward target.\n * @korean 시작시간\n */\n readonly startTime: number;\n\n /**\n * Time of maximum extension (seconds).\n * Peak of strike where reach is maximum and damage is highest.\n * @korean 정점시간\n */\n readonly peakTime: number;\n\n /**\n * Time when hit window closes (seconds).\n * End of extension phase where limb begins retracting.\n * @korean 종료시간\n */\n readonly endTime: number;\n\n /**\n * Reach multiplier at peak extension (0.0 - 1.5).\n * - 1.0 = full limb extension (standard strikes)\n * - 0.7 = partial extension (close-range techniques)\n * - 1.2+ = overextended (special techniques, jumping kicks)\n * @korean 최대도달배수\n */\n readonly maxReachMultiplier: number;\n\n /**\n * Optional reach curve during hit window.\n * If not provided, assumes linear interpolation from 0 to maxReachMultiplier.\n * @korean 도달곡선\n */\n readonly reachCurve?: (normalizedTime: number) => number;\n}\n\n/**\n * Complete hit timing configuration for a technique.\n *\n * **Korean**: 기술 타격 타이밍 설정\n *\n * @korean 기술타격타이밍\n */\nexport interface TechniqueHitTiming {\n /**\n * Animation type this timing applies to.\n * @korean 애니메이션타입\n */\n readonly animationType: AnimationType;\n\n /**\n * Hit window configuration.\n * @korean 타격창\n */\n readonly hitWindow: AnimationHitWindow;\n\n /**\n * Whether this technique requires precise timing (true) or has a wider window (false).\n * Affects forgiveness in hit detection.\n * @korean 정밀타이밍필요\n */\n readonly requiresPreciseTiming: boolean;\n}\n\n/**\n * Hit timing database for animation types.\n *\n * **Korean**: 애니메이션 타격 타이밍 데이터베이스\n *\n * Based on TECHNIQUE_TIMING constants from MartialArtsAnimationBuilder.\n * Only includes timing for techniques with actual hit windows.\n * Movement and non-combat animations can query this and will get undefined.\n *\n * @korean 애니메이션타격타이밍데이터베이스\n */\nexport const ANIMATION_HIT_TIMING: Partial<\n Record<AnimationType, TechniqueHitTiming>\n> = {\n // ═══════════════════════════════════════════════════════════════════════\n // PUNCH TECHNIQUES (주먹 기술)\n // ═══════════════════════════════════════════════════════════════════════\n\n [AnimationType.JAB]: {\n animationType: AnimationType.JAB,\n hitWindow: {\n startTime: 0.1, // Chamber: 100ms, Extension starts\n peakTime: 0.15, // Peak at 150ms (midpoint of 150ms extension)\n endTime: 0.25, // Retraction starts at 250ms\n maxReachMultiplier: 0.95, // Jabs don't fully extend (speed > reach)\n },\n requiresPreciseTiming: false, // Fast technique with forgiving window\n },\n\n [AnimationType.CROSS]: {\n animationType: AnimationType.CROSS,\n hitWindow: {\n startTime: 0.15, // Longer chamber for power\n peakTime: 0.25, // Peak at 250ms\n endTime: 0.35, // Window closes at 350ms\n maxReachMultiplier: 1.0, // Full extension for power\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.HOOK]: {\n animationType: AnimationType.HOOK,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 0.85, // Hooks are shorter range (arc motion)\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.UPPERCUT]: {\n animationType: AnimationType.UPPERCUT,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 0.7, // Close-range technique\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.OVERHAND]: {\n animationType: AnimationType.OVERHAND,\n hitWindow: {\n startTime: 0.2,\n peakTime: 0.3,\n endTime: 0.42,\n maxReachMultiplier: 1.1, // Longer reach from arc\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.BACKFIST]: {\n animationType: AnimationType.BACKFIST,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.18,\n endTime: 0.27,\n maxReachMultiplier: 0.9, // Snapping technique\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.HAMMER_FIST]: {\n animationType: AnimationType.HAMMER_FIST,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 0.85,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.PALM_STRIKE]: {\n animationType: AnimationType.PALM_STRIKE,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 1.0,\n },\n requiresPreciseTiming: false,\n },\n\n // ═══ Specialized Punch Variants ═══\n\n [AnimationType.SPEAR_HAND_STRIKE]: {\n animationType: AnimationType.SPEAR_HAND_STRIKE,\n hitWindow: {\n startTime: 0.08,\n peakTime: 0.13,\n endTime: 0.2,\n maxReachMultiplier: 1.05, // Extended fingers add reach\n },\n requiresPreciseTiming: true, // Precise targeting required\n },\n\n [AnimationType.NERVE_STRIKE]: {\n animationType: AnimationType.NERVE_STRIKE,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.15,\n endTime: 0.22,\n maxReachMultiplier: 0.9,\n },\n requiresPreciseTiming: true, // Must hit exact nerve point\n },\n\n [AnimationType.PRESSURE_POINT_STRIKE]: {\n animationType: AnimationType.PRESSURE_POINT_STRIKE,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.32,\n maxReachMultiplier: 0.85,\n },\n requiresPreciseTiming: true, // Precise pressure point targeting\n },\n\n [AnimationType.LIGHTNING_STRIKE]: {\n animationType: AnimationType.LIGHTNING_STRIKE,\n hitWindow: {\n startTime: 0.06,\n peakTime: 0.1,\n endTime: 0.15,\n maxReachMultiplier: 0.95,\n },\n requiresPreciseTiming: true, // Very fast, small window\n },\n\n [AnimationType.RAPID_BARRAGE]: {\n animationType: AnimationType.RAPID_BARRAGE,\n hitWindow: {\n startTime: 0.05,\n peakTime: 0.12,\n endTime: 0.2,\n maxReachMultiplier: 0.85, // Multiple hits, shorter reach each\n },\n requiresPreciseTiming: false, // Volume of strikes compensates\n },\n\n [AnimationType.RHYTHMIC_STRIKES]: {\n animationType: AnimationType.RHYTHMIC_STRIKES,\n hitWindow: {\n startTime: 0.08,\n peakTime: 0.15,\n endTime: 0.25,\n maxReachMultiplier: 0.9,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.NERVE_PARALYSIS]: {\n animationType: AnimationType.NERVE_PARALYSIS,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.2,\n endTime: 0.28,\n maxReachMultiplier: 0.85,\n },\n requiresPreciseTiming: true,\n },\n\n [AnimationType.THROAT_STRIKE]: {\n animationType: AnimationType.THROAT_STRIKE,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.15,\n endTime: 0.22,\n maxReachMultiplier: 0.95,\n },\n requiresPreciseTiming: true, // Must hit throat precisely\n },\n\n [AnimationType.EYE_GOUGE]: {\n animationType: AnimationType.EYE_GOUGE,\n hitWindow: {\n startTime: 0.08,\n peakTime: 0.12,\n endTime: 0.18,\n maxReachMultiplier: 0.8, // Very close range\n },\n requiresPreciseTiming: true, // Extremely precise target\n },\n\n [AnimationType.HEAVEN_STRIKE]: {\n animationType: AnimationType.HEAVEN_STRIKE,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 1.1, // Powerful extension\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.FLOWING_CROSS]: {\n animationType: AnimationType.FLOWING_CROSS,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.22,\n endTime: 0.32,\n maxReachMultiplier: 1.0,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SOLAR_PLEXUS_STRIKE]: {\n animationType: AnimationType.SOLAR_PLEXUS_STRIKE,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.2,\n endTime: 0.28,\n maxReachMultiplier: 0.95,\n },\n requiresPreciseTiming: true, // Must hit solar plexus\n },\n\n [AnimationType.FLOWING_PUSH]: {\n animationType: AnimationType.FLOWING_PUSH,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.2,\n endTime: 0.3,\n maxReachMultiplier: 1.0,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.LIVER_DISRUPTION]: {\n animationType: AnimationType.LIVER_DISRUPTION,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.33,\n maxReachMultiplier: 0.9,\n },\n requiresPreciseTiming: true, // Must hit liver\n },\n\n [AnimationType.EAR_STRIKE]: {\n animationType: AnimationType.EAR_STRIKE,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.16,\n endTime: 0.24,\n maxReachMultiplier: 0.85,\n },\n requiresPreciseTiming: true, // Must hit ear precisely\n },\n\n // ═══════════════════════════════════════════════════════════════════════\n // KICK TECHNIQUES (발차기 기술)\n // ═══════════════════════════════════════════════════════════════════════\n\n [AnimationType.FRONT_KICK]: {\n animationType: AnimationType.FRONT_KICK,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.27,\n endTime: 0.4,\n maxReachMultiplier: 1.0, // Full leg extension\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.ROUNDHOUSE_KICK]: {\n animationType: AnimationType.ROUNDHOUSE_KICK,\n hitWindow: {\n startTime: 0.2,\n peakTime: 0.32,\n endTime: 0.48,\n maxReachMultiplier: 1.05, // Slight overextension at peak\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SIDE_KICK]: {\n animationType: AnimationType.SIDE_KICK,\n hitWindow: {\n startTime: 0.2,\n peakTime: 0.35,\n endTime: 0.5,\n maxReachMultiplier: 1.1, // Maximum reach technique\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.BACK_KICK]: {\n animationType: AnimationType.BACK_KICK,\n hitWindow: {\n startTime: 0.25,\n peakTime: 0.4,\n endTime: 0.55,\n maxReachMultiplier: 1.15, // Powerful extension backward\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.AXE_KICK]: {\n animationType: AnimationType.AXE_KICK,\n hitWindow: {\n startTime: 0.25,\n peakTime: 0.45,\n endTime: 0.65,\n maxReachMultiplier: 1.2, // High vertical reach\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.CRESCENT_KICK]: {\n animationType: AnimationType.CRESCENT_KICK,\n hitWindow: {\n startTime: 0.18,\n peakTime: 0.32,\n endTime: 0.48,\n maxReachMultiplier: 1.0,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.LOW_KICK]: {\n animationType: AnimationType.LOW_KICK,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.22,\n endTime: 0.35,\n maxReachMultiplier: 0.95, // Lower target, less extension\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.PUSH_KICK]: {\n animationType: AnimationType.PUSH_KICK,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.22,\n endTime: 0.35,\n maxReachMultiplier: 1.0,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.JUMPING_KICK]: {\n animationType: AnimationType.JUMPING_KICK,\n hitWindow: {\n startTime: 0.3,\n peakTime: 0.45,\n endTime: 0.6,\n maxReachMultiplier: 1.3, // Airborne extension\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SPINNING_HEEL_KICK]: {\n animationType: AnimationType.SPINNING_HEEL_KICK,\n hitWindow: {\n startTime: 0.4,\n peakTime: 0.6,\n endTime: 0.8,\n maxReachMultiplier: 1.15, // Spinning adds reach\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.TORNADO_KICK]: {\n animationType: AnimationType.TORNADO_KICK,\n hitWindow: {\n startTime: 0.45,\n peakTime: 0.65,\n endTime: 0.85,\n maxReachMultiplier: 1.25, // Jumping + spinning\n },\n requiresPreciseTiming: false,\n },\n\n // ═══════════════════════════════════════════════════════════════════════\n // ELBOW & KNEE TECHNIQUES (팔꿈치 & 무릎 기술)\n // ═══════════════════════════════════════════════════════════════════════\n\n [AnimationType.ELBOW_STRIKE]: {\n animationType: AnimationType.ELBOW_STRIKE,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.18,\n endTime: 0.28,\n maxReachMultiplier: 0.5, // Very close range\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.ELBOW_UPPERCUT]: {\n animationType: AnimationType.ELBOW_UPPERCUT,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.22,\n endTime: 0.32,\n maxReachMultiplier: 0.45, // Close range upward\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SPINNING_ELBOW]: {\n animationType: AnimationType.SPINNING_ELBOW,\n hitWindow: {\n startTime: 0.3,\n peakTime: 0.5,\n endTime: 0.7,\n maxReachMultiplier: 0.6, // Spinning adds slight reach\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.TEMPLE_ELBOW]: {\n animationType: AnimationType.TEMPLE_ELBOW,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.18,\n endTime: 0.26,\n maxReachMultiplier: 0.5,\n },\n requiresPreciseTiming: true, // Must hit temple\n },\n\n [AnimationType.SPINNING_BACK_ELBOW]: {\n animationType: AnimationType.SPINNING_BACK_ELBOW,\n hitWindow: {\n startTime: 0.28,\n peakTime: 0.45,\n endTime: 0.62,\n maxReachMultiplier: 0.55,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SPINAL_ELBOW]: {\n animationType: AnimationType.SPINAL_ELBOW,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 0.5,\n },\n requiresPreciseTiming: true, // Must hit spine\n },\n\n [AnimationType.BRACHIAL_ELBOW]: {\n animationType: AnimationType.BRACHIAL_ELBOW,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.18,\n endTime: 0.26,\n maxReachMultiplier: 0.5,\n },\n requiresPreciseTiming: true, // Must hit brachial plexus\n },\n\n [AnimationType.KNEE_STRIKE]: {\n animationType: AnimationType.KNEE_STRIKE,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.22,\n endTime: 0.35,\n maxReachMultiplier: 0.4, // Very close range\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.FLYING_KNEE]: {\n animationType: AnimationType.FLYING_KNEE,\n hitWindow: {\n startTime: 0.25,\n peakTime: 0.4,\n endTime: 0.55,\n maxReachMultiplier: 0.65, // Jumping adds reach\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.KIDNEY_KNEE]: {\n animationType: AnimationType.KIDNEY_KNEE,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 0.4,\n },\n requiresPreciseTiming: true, // Must hit kidney\n },\n\n [AnimationType.FEMORAL_KNEE]: {\n animationType: AnimationType.FEMORAL_KNEE,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 0.4,\n },\n requiresPreciseTiming: true, // Must hit femoral artery\n },\n\n // ═══════════════════════════════════════════════════════════════════════\n // GRAPPLING TECHNIQUES (잡기 기술)\n // ═══════════════════════════════════════════════════════════════════════\n\n [AnimationType.THROW]: {\n animationType: AnimationType.THROW,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.35,\n endTime: 0.55,\n maxReachMultiplier: 0.7, // Must be close to grab\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.GRAPPLE]: {\n animationType: AnimationType.GRAPPLE,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.3,\n endTime: 0.5,\n maxReachMultiplier: 0.8, // Reach to grab\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SWEEP]: {\n animationType: AnimationType.SWEEP,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.3,\n endTime: 0.45,\n maxReachMultiplier: 0.9, // Low sweep\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SLAM]: {\n animationType: AnimationType.SLAM,\n hitWindow: {\n startTime: 0.2,\n peakTime: 0.4,\n endTime: 0.6,\n maxReachMultiplier: 0.7,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.WRIST_LOCK]: {\n animationType: AnimationType.WRIST_LOCK,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.25,\n endTime: 0.4,\n maxReachMultiplier: 0.75,\n },\n requiresPreciseTiming: true, // Must grab wrist\n },\n\n [AnimationType.ARM_BAR]: {\n animationType: AnimationType.ARM_BAR,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.35,\n endTime: 0.55,\n maxReachMultiplier: 0.8,\n },\n requiresPreciseTiming: true, // Must control arm\n },\n\n [AnimationType.SHOULDER_LOCK]: {\n animationType: AnimationType.SHOULDER_LOCK,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.3,\n endTime: 0.48,\n maxReachMultiplier: 0.75,\n },\n requiresPreciseTiming: true, // Must control shoulder\n },\n\n [AnimationType.HIP_THROW]: {\n animationType: AnimationType.HIP_THROW,\n hitWindow: {\n startTime: 0.18,\n peakTime: 0.38,\n endTime: 0.58,\n maxReachMultiplier: 0.7,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.LEG_REAP]: {\n animationType: AnimationType.LEG_REAP,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.3,\n endTime: 0.45,\n maxReachMultiplier: 0.85,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SMALL_CIRCLE_LOCK]: {\n animationType: AnimationType.SMALL_CIRCLE_LOCK,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.28,\n endTime: 0.44,\n maxReachMultiplier: 0.7,\n },\n requiresPreciseTiming: true, // Hapkido precision\n },\n\n [AnimationType.FINGER_LOCK]: {\n animationType: AnimationType.FINGER_LOCK,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.23,\n endTime: 0.36,\n maxReachMultiplier: 0.75,\n },\n requiresPreciseTiming: true, // Must grab fingers\n },\n\n [AnimationType.ELBOW_LOCK]: {\n animationType: AnimationType.ELBOW_LOCK,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.32,\n endTime: 0.49,\n maxReachMultiplier: 0.8,\n },\n requiresPreciseTiming: true, // Must control elbow\n },\n\n [AnimationType.SHOULDER_MANIPULATION]: {\n animationType: AnimationType.SHOULDER_MANIPULATION,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.32,\n endTime: 0.49,\n maxReachMultiplier: 0.75,\n },\n requiresPreciseTiming: true,\n },\n\n [AnimationType.MOUNTAIN_LOCK]: {\n animationType: AnimationType.MOUNTAIN_LOCK,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.32,\n endTime: 0.49,\n maxReachMultiplier: 0.75,\n },\n requiresPreciseTiming: true,\n },\n\n [AnimationType.EARTH_EMBRACE]: {\n animationType: AnimationType.EARTH_EMBRACE,\n hitWindow: {\n startTime: 0.18,\n peakTime: 0.4,\n endTime: 0.62,\n maxReachMultiplier: 0.8,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.TAKEDOWN]: {\n animationType: AnimationType.TAKEDOWN,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.35,\n endTime: 0.55,\n maxReachMultiplier: 0.75,\n },\n requiresPreciseTiming: false,\n },\n\n // ═══════════════════════════════════════════════════════════════════════\n // DEFENSIVE TECHNIQUES (방어 기술)\n // ═══════════════════════════════════════════════════════════════════════\n\n [AnimationType.BLOCK]: {\n animationType: AnimationType.BLOCK,\n hitWindow: {\n startTime: 0.03,\n peakTime: 0.05,\n endTime: 0.08,\n maxReachMultiplier: 0.6, // Arms defending\n },\n requiresPreciseTiming: true, // Must time block correctly\n },\n\n [AnimationType.PARRY]: {\n animationType: AnimationType.PARRY,\n hitWindow: {\n startTime: 0.03,\n peakTime: 0.06,\n endTime: 0.1,\n maxReachMultiplier: 0.7,\n },\n requiresPreciseTiming: true, // Precise deflection\n },\n\n [AnimationType.COUNTER_STRIKE]: {\n animationType: AnimationType.COUNTER_STRIKE,\n hitWindow: {\n startTime: 0.08,\n peakTime: 0.15,\n endTime: 0.25,\n maxReachMultiplier: 0.9, // Counter-strike reach\n },\n requiresPreciseTiming: true, // Timing critical for counters\n },\n};\n\n/**\n * Get hit timing configuration for an animation type.\n *\n * **Korean**: 애니메이션 타격 타이밍 가져오기\n *\n * @param animationType - Animation type to get timing for\n * @returns Hit timing configuration, or undefined if not a combat animation\n *\n * @example\n * ```typescript\n * const jabTiming = getAnimationHitTiming(AnimationType.JAB);\n * if (jabTiming) {\n * console.log(`Jab hit window: ${jabTiming.hitWindow.startTime}s - ${jabTiming.hitWindow.endTime}s`);\n * }\n * ```\n *\n * @korean 애니메이션타격타이밍가져오기\n */\nexport function getAnimationHitTiming(\n animationType: AnimationType\n): TechniqueHitTiming | undefined {\n return ANIMATION_HIT_TIMING[animationType];\n}\n\n/**\n * Check if a technique can hit at the given animation time.\n *\n * **Korean**: 타격 가능 시간 확인\n *\n * @param animationType - Animation type\n * @param currentTime - Current time in animation (seconds)\n * @returns True if within hit window\n *\n * @example\n * ```typescript\n * const canHit = isWithinHitWindow(AnimationType.JAB, 0.15);\n * // Returns true (0.15s is within jab's 0.10-0.25s window)\n * ```\n *\n * @korean 타격가능시간확인\n */\nexport function isWithinHitWindow(\n animationType: AnimationType,\n currentTime: number\n): boolean {\n const timing = ANIMATION_HIT_TIMING[animationType];\n if (!timing) {\n // Not a combat animation (movement, stance change, etc.)\n return false;\n }\n const { startTime, endTime } = timing.hitWindow;\n return currentTime >= startTime && currentTime <= endTime;\n}\n\n/**\n * Calculate current reach multiplier at a specific time in the animation.\n *\n * **Korean**: 현재 도달 배수 계산\n *\n * @param animationType - Animation type\n * @param currentTime - Current time in animation (seconds)\n * @returns Reach multiplier (0.0 - max), or 0 if outside hit window\n *\n * @example\n * ```typescript\n * const reach = getCurrentReachMultiplier(AnimationType.JAB, 0.15);\n * // Returns 0.95 (jab at peak time)\n *\n * const noReach = getCurrentReachMultiplier(AnimationType.JAB, 0.05);\n * // Returns 0 (before hit window starts)\n * ```\n *\n * @korean 현재도달배수계산\n */\nexport function getCurrentReachMultiplier(\n animationType: AnimationType,\n currentTime: number\n): number {\n const timing = ANIMATION_HIT_TIMING[animationType];\n if (!timing) {\n // Not a combat animation\n return 0;\n }\n const { startTime, peakTime, endTime, maxReachMultiplier, reachCurve } =\n timing.hitWindow;\n\n // Outside hit window\n if (currentTime < startTime || currentTime > endTime) {\n return 0;\n }\n\n // Normalize time within hit window (0 = start, 0.5 = peak, 1 = end)\n let normalizedTime: number;\n if (currentTime <= peakTime) {\n // Start to peak (0 to 0.5)\n normalizedTime = 0.5 * ((currentTime - startTime) / (peakTime - startTime));\n } else {\n // Peak to end (0.5 to 1)\n normalizedTime =\n 0.5 + 0.5 * ((currentTime - peakTime) / (endTime - peakTime));\n }\n\n // Apply reach curve if provided, otherwise use simple interpolation\n if (reachCurve) {\n return maxReachMultiplier * reachCurve(normalizedTime);\n }\n\n // Default: Peak at center (0.5), taper off at edges\n // Use smooth curve: 1 - (2 * normalizedTime - 1)^2\n const peakFactor = 1 - Math.pow(2 * normalizedTime - 1, 2);\n return maxReachMultiplier * peakFactor;\n}\n"],"mappings":"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"}