blacktrigram 0.7.44 → 0.7.45

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 (746) hide show
  1. package/lib/audio/AudioManager.d.ts +26 -0
  2. package/lib/audio/AudioManager.d.ts.map +1 -1
  3. package/lib/audio/AudioManager.js +26 -0
  4. package/lib/audio/AudioManager.js.map +1 -1
  5. package/lib/audio/index.d.ts.map +1 -1
  6. package/lib/audio/index.js.map +1 -1
  7. package/lib/audio/types.d.ts +18 -2
  8. package/lib/audio/types.d.ts.map +1 -1
  9. package/lib/audio/types.js +1 -0
  10. package/lib/audio/types.js.map +1 -1
  11. package/lib/components/effects/WindParticles3D.d.ts.map +1 -1
  12. package/lib/components/index.d.ts.map +1 -1
  13. package/lib/components/index.js.map +1 -1
  14. package/lib/components/screens/combat/CombatScreen3D.d.ts.map +1 -1
  15. package/lib/components/screens/combat/CombatScreen3D.js.map +1 -1
  16. package/lib/components/screens/combat/components/controls/KeyboardHints.d.ts +0 -1
  17. package/lib/components/screens/combat/components/controls/KeyboardHints.d.ts.map +1 -1
  18. package/lib/components/screens/combat/components/controls/KeyboardHints.js +0 -1
  19. package/lib/components/screens/combat/components/controls/KeyboardHints.js.map +1 -1
  20. package/lib/components/screens/combat/components/controls/PauseMenu.d.ts.map +1 -1
  21. package/lib/components/screens/combat/components/controls/PauseMenu.js.map +1 -1
  22. package/lib/components/screens/combat/components/effects/ArterialSpray3D.d.ts.map +1 -1
  23. package/lib/components/screens/combat/components/effects/BloodDecals3D.d.ts.map +1 -1
  24. package/lib/components/screens/combat/components/effects/BloodDecals3D.js.map +1 -1
  25. package/lib/components/screens/combat/components/effects/BloodLossOverlayHtml.d.ts.map +1 -1
  26. package/lib/components/screens/combat/components/effects/BloodLossOverlayHtml.js.map +1 -1
  27. package/lib/components/screens/combat/components/effects/BloodParticles3D.d.ts.map +1 -1
  28. package/lib/components/screens/combat/components/effects/BloodParticles3D.js.map +1 -1
  29. package/lib/components/screens/combat/components/effects/BloodViscosity3D.d.ts.map +1 -1
  30. package/lib/components/screens/combat/components/effects/BloodViscosity3D.js.map +1 -1
  31. package/lib/components/screens/combat/components/effects/BoneCrackParticles3D.d.ts.map +1 -1
  32. package/lib/components/screens/combat/components/effects/CombatParticleEffects3D.d.ts.map +1 -1
  33. package/lib/components/screens/combat/components/effects/CombatParticleEffects3D.js.map +1 -1
  34. package/lib/components/screens/combat/components/effects/ConsciousnessBlur.d.ts.map +1 -1
  35. package/lib/components/screens/combat/components/effects/ConsciousnessBlur.js.map +1 -1
  36. package/lib/components/screens/combat/components/effects/DustClouds3D.d.ts.map +1 -1
  37. package/lib/components/screens/combat/components/effects/EarthCrackEffect3D.d.ts.map +1 -1
  38. package/lib/components/screens/combat/components/effects/EarthHealingEffect3D.d.ts.map +1 -1
  39. package/lib/components/screens/combat/components/effects/ImpactSparks3D.d.ts.map +1 -1
  40. package/lib/components/screens/combat/components/effects/InternalDamage3D.d.ts.map +1 -1
  41. package/lib/components/screens/combat/components/effects/InternalDamage3D.js.map +1 -1
  42. package/lib/components/screens/combat/components/effects/LiPrecisionTargetingOverlay.d.ts.map +1 -1
  43. package/lib/components/screens/combat/components/effects/NerveStrikeParticles3D.d.ts.map +1 -1
  44. package/lib/components/screens/combat/components/effects/PainVignette.d.ts.map +1 -1
  45. package/lib/components/screens/combat/components/effects/PainVignette.js.map +1 -1
  46. package/lib/components/screens/combat/components/effects/ParticleAudio3D.d.ts.map +1 -1
  47. package/lib/components/screens/combat/components/effects/ParticleAudio3D.js.map +1 -1
  48. package/lib/components/screens/combat/components/effects/TraumaOverlay3D.d.ts.map +1 -1
  49. package/lib/components/screens/combat/components/effects/TraumaOverlay3D.js.map +1 -1
  50. package/lib/components/screens/combat/components/effects/WaterRipple3D.d.ts.map +1 -1
  51. package/lib/components/screens/combat/components/effects/WaterWave3D.d.ts.map +1 -1
  52. package/lib/components/screens/combat/components/effects/index.d.ts.map +1 -1
  53. package/lib/components/screens/combat/components/feedback/MatchCountdown.d.ts.map +1 -1
  54. package/lib/components/screens/combat/components/feedback/MatchCountdown.js.map +1 -1
  55. package/lib/components/screens/combat/components/feedback/RoundAnnouncementOverlayHtml.d.ts.map +1 -1
  56. package/lib/components/screens/combat/components/feedback/RoundAnnouncementOverlayHtml.js.map +1 -1
  57. package/lib/components/screens/combat/components/feedback/RoundStartAnnouncementOverlayHtml.d.ts.map +1 -1
  58. package/lib/components/screens/combat/components/feedback/RoundStartAnnouncementOverlayHtml.js.map +1 -1
  59. package/lib/components/screens/combat/components/hud/CombatBottomHUD.d.ts.map +1 -1
  60. package/lib/components/screens/combat/components/hud/CombatBottomHUD.js.map +1 -1
  61. package/lib/components/screens/combat/components/hud/CombatLeftHUD.d.ts.map +1 -1
  62. package/lib/components/screens/combat/components/hud/CombatLeftHUD.js.map +1 -1
  63. package/lib/components/screens/combat/components/hud/CombatPortraitStatusStrip.d.ts.map +1 -1
  64. package/lib/components/screens/combat/components/hud/CombatPortraitStatusStrip.js.map +1 -1
  65. package/lib/components/screens/combat/components/hud/CombatRightHUD.d.ts.map +1 -1
  66. package/lib/components/screens/combat/components/hud/CombatRightHUD.js.map +1 -1
  67. package/lib/components/screens/combat/components/hud/CombatTopHUD.d.ts.map +1 -1
  68. package/lib/components/screens/combat/components/hud/CombatTopHUD.js.map +1 -1
  69. package/lib/components/screens/combat/components/hud/DifficultyIndicator.d.ts.map +1 -1
  70. package/lib/components/screens/combat/components/hud/DifficultyIndicator.js.map +1 -1
  71. package/lib/components/screens/combat/components/hud/FPSMonitor.d.ts.map +1 -1
  72. package/lib/components/screens/combat/components/hud/FPSMonitor.js.map +1 -1
  73. package/lib/components/screens/combat/components/hud/PlayerStateOverlayHtml.d.ts.map +1 -1
  74. package/lib/components/screens/combat/components/hud/PlayerStateOverlayHtml.js.map +1 -1
  75. package/lib/components/screens/combat/components/indicators/BalanceIndicator.d.ts.map +1 -1
  76. package/lib/components/screens/combat/components/indicators/BalanceIndicator.js.map +1 -1
  77. package/lib/components/screens/combat/components/indicators/InputBufferDisplay.d.ts +0 -1
  78. package/lib/components/screens/combat/components/indicators/InputBufferDisplay.d.ts.map +1 -1
  79. package/lib/components/screens/combat/components/indicators/InputBufferDisplay.js +0 -1
  80. package/lib/components/screens/combat/components/indicators/InputBufferDisplay.js.map +1 -1
  81. package/lib/components/screens/combat/components/indicators/StaminaWarning.d.ts.map +1 -1
  82. package/lib/components/screens/combat/components/indicators/StaminaWarning.js.map +1 -1
  83. package/lib/components/screens/combat/components/indicators/TechniqueNameDisplay.d.ts +0 -2
  84. package/lib/components/screens/combat/components/indicators/TechniqueNameDisplay.d.ts.map +1 -1
  85. package/lib/components/screens/combat/components/indicators/TechniqueNameDisplay.js +0 -1
  86. package/lib/components/screens/combat/components/indicators/TechniqueNameDisplay.js.map +1 -1
  87. package/lib/components/screens/combat/helpers/AnimationUpdater.d.ts.map +1 -1
  88. package/lib/components/screens/combat/helpers/AnimationUpdater.js.map +1 -1
  89. package/lib/components/screens/combat/helpers/combatHelpers.d.ts.map +1 -1
  90. package/lib/components/screens/combat/helpers/combatHelpers.js.map +1 -1
  91. package/lib/components/screens/combat/hooks/useAICombat.d.ts.map +1 -1
  92. package/lib/components/screens/combat/hooks/useAICombat.js.map +1 -1
  93. package/lib/components/screens/combat/hooks/useCombatActions.d.ts.map +1 -1
  94. package/lib/components/screens/combat/hooks/useCombatActions.js.map +1 -1
  95. package/lib/components/screens/combat/hooks/useCombatAttackMovement.d.ts.map +1 -1
  96. package/lib/components/screens/combat/hooks/useCombatAttackMovement.js.map +1 -1
  97. package/lib/components/screens/combat/hooks/useCombatAudio.d.ts.map +1 -1
  98. package/lib/components/screens/combat/hooks/useCombatAudio.js.map +1 -1
  99. package/lib/components/screens/combat/hooks/useCombatLayout.d.ts.map +1 -1
  100. package/lib/components/screens/combat/hooks/useCombatLayout.js.map +1 -1
  101. package/lib/components/screens/combat/hooks/useCombatState.d.ts.map +1 -1
  102. package/lib/components/screens/combat/hooks/useCombatState.js.map +1 -1
  103. package/lib/components/screens/combat/hooks/useGrapplingAudio.d.ts.map +1 -1
  104. package/lib/components/screens/combat/hooks/usePreloadCombatAudio.d.ts.map +1 -1
  105. package/lib/components/screens/controls/ControlsScreen3D.d.ts.map +1 -1
  106. package/lib/components/screens/controls/ControlsScreen3D.js.map +1 -1
  107. package/lib/components/screens/controls/components/ControlBindingsOverlayHtml.d.ts.map +1 -1
  108. package/lib/components/screens/controls/components/ControlBindingsOverlayHtml.js.map +1 -1
  109. package/lib/components/screens/controls/components/GamepadVisualization3D.d.ts.map +1 -1
  110. package/lib/components/screens/controls/components/GamepadVisualization3D.js.map +1 -1
  111. package/lib/components/screens/controls/components/InteractiveControlDemoOverlayHtml.d.ts.map +1 -1
  112. package/lib/components/screens/controls/components/InteractiveControlDemoOverlayHtml.js.map +1 -1
  113. package/lib/components/screens/controls/components/Key3D.d.ts.map +1 -1
  114. package/lib/components/screens/controls/components/Key3D.js.map +1 -1
  115. package/lib/components/screens/controls/components/VisualKeyboard3D.d.ts.map +1 -1
  116. package/lib/components/screens/controls/components/VisualKeyboard3D.js.map +1 -1
  117. package/lib/components/screens/controls/constants/ControlsConstants.d.ts.map +1 -1
  118. package/lib/components/screens/controls/constants/ControlsConstants.js.map +1 -1
  119. package/lib/components/screens/controls/hooks/useControlsState.d.ts.map +1 -1
  120. package/lib/components/screens/controls/hooks/useControlsState.js.map +1 -1
  121. package/lib/components/screens/endscreen/EndScreen3D.d.ts.map +1 -1
  122. package/lib/components/screens/endscreen/EndScreen3D.js.map +1 -1
  123. package/lib/components/screens/endscreen/components/DefeatAnimation3D.d.ts.map +1 -1
  124. package/lib/components/screens/endscreen/components/DefeatAnimation3D.js.map +1 -1
  125. package/lib/components/screens/endscreen/components/NavigationButtonsOverlayHtml.d.ts.map +1 -1
  126. package/lib/components/screens/endscreen/components/NavigationButtonsOverlayHtml.js.map +1 -1
  127. package/lib/components/screens/endscreen/components/PerformanceBreakdownOverlayHtml.d.ts.map +1 -1
  128. package/lib/components/screens/endscreen/components/PerformanceBreakdownOverlayHtml.js.map +1 -1
  129. package/lib/components/screens/endscreen/components/PerformanceRatingOverlayHtml.d.ts.map +1 -1
  130. package/lib/components/screens/endscreen/components/PerformanceRatingOverlayHtml.js.map +1 -1
  131. package/lib/components/screens/endscreen/components/VictoryAnimation3D.d.ts.map +1 -1
  132. package/lib/components/screens/endscreen/components/VictoryAnimation3D.js.map +1 -1
  133. package/lib/components/screens/endscreen/components/WinnerDisplayOverlayHtml.d.ts.map +1 -1
  134. package/lib/components/screens/endscreen/components/WinnerDisplayOverlayHtml.js.map +1 -1
  135. package/lib/components/screens/endscreen/components/index.d.ts.map +1 -1
  136. package/lib/components/screens/endscreen/index.d.ts.map +1 -1
  137. package/lib/components/screens/intro/IntroScreen3D.d.ts.map +1 -1
  138. package/lib/components/screens/intro/IntroScreen3D.js +1 -1
  139. package/lib/components/screens/intro/IntroScreen3D.js.map +1 -1
  140. package/lib/components/screens/intro/components/AbilityListOverlayHtml.d.ts.map +1 -1
  141. package/lib/components/screens/intro/components/AbilityListOverlayHtml.js.map +1 -1
  142. package/lib/components/screens/intro/components/ArchetypeCardGridOverlayHtml.d.ts.map +1 -1
  143. package/lib/components/screens/intro/components/ArchetypeCardGridOverlayHtml.js.map +1 -1
  144. package/lib/components/screens/intro/components/ArchetypeCardOverlayHtml.d.ts.map +1 -1
  145. package/lib/components/screens/intro/components/ArchetypeCardOverlayHtml.js.map +1 -1
  146. package/lib/components/screens/intro/components/ArchetypeDisplayOverlayHtml.d.ts.map +1 -1
  147. package/lib/components/screens/intro/components/ArchetypeDisplayOverlayHtml.js.map +1 -1
  148. package/lib/components/screens/intro/components/EnhancedArchetypeDisplayOverlayHtml.d.ts.map +1 -1
  149. package/lib/components/screens/intro/components/EnhancedArchetypeDisplayOverlayHtml.js.map +1 -1
  150. package/lib/components/screens/intro/components/MenuButtonsOverlayHtml.d.ts.map +1 -1
  151. package/lib/components/screens/intro/components/MenuButtonsOverlayHtml.js.map +1 -1
  152. package/lib/components/screens/intro/components/MenuSectionOverlayHtml.d.ts.map +1 -1
  153. package/lib/components/screens/intro/components/MenuSectionOverlayHtml.js.map +1 -1
  154. package/lib/components/screens/intro/components/StatBarOverlayHtml.d.ts.map +1 -1
  155. package/lib/components/screens/intro/components/StatBarOverlayHtml.js.map +1 -1
  156. package/lib/components/screens/philosophy/PhilosophyScreen3D.d.ts.map +1 -1
  157. package/lib/components/screens/philosophy/PhilosophyScreen3D.js.map +1 -1
  158. package/lib/components/screens/philosophy/components/InteractiveTrigramGridOverlayHtml.d.ts +0 -1
  159. package/lib/components/screens/philosophy/components/InteractiveTrigramGridOverlayHtml.d.ts.map +1 -1
  160. package/lib/components/screens/philosophy/components/PhilosophyNavigationOverlayHtml.d.ts +0 -1
  161. package/lib/components/screens/philosophy/components/PhilosophyNavigationOverlayHtml.d.ts.map +1 -1
  162. package/lib/components/screens/philosophy/components/PhilosophySectionOverlayHtml.d.ts +0 -1
  163. package/lib/components/screens/philosophy/components/PhilosophySectionOverlayHtml.d.ts.map +1 -1
  164. package/lib/components/screens/philosophy/components/PhilosophyTextOverlayHtml.d.ts +0 -1
  165. package/lib/components/screens/philosophy/components/PhilosophyTextOverlayHtml.d.ts.map +1 -1
  166. package/lib/components/screens/philosophy/components/TrigramSymbol3D.d.ts +0 -1
  167. package/lib/components/screens/philosophy/components/TrigramSymbol3D.d.ts.map +1 -1
  168. package/lib/components/screens/philosophy/components/TrigramVisualization3D.d.ts +0 -1
  169. package/lib/components/screens/philosophy/components/TrigramVisualization3D.d.ts.map +1 -1
  170. package/lib/components/screens/philosophy/hooks/usePhilosophyState.d.ts +0 -1
  171. package/lib/components/screens/philosophy/hooks/usePhilosophyState.d.ts.map +1 -1
  172. package/lib/components/screens/training/TrainingScreen3D.d.ts.map +1 -1
  173. package/lib/components/screens/training/TrainingScreen3D.js.map +1 -1
  174. package/lib/components/screens/training/components/AnatomyControlsOverlayHtml.d.ts.map +1 -1
  175. package/lib/components/screens/training/components/AnatomyControlsOverlayHtml.js.map +1 -1
  176. package/lib/components/screens/training/components/AnatomyOverlay3D.d.ts.map +1 -1
  177. package/lib/components/screens/training/components/AnatomyOverlay3D.js.map +1 -1
  178. package/lib/components/screens/training/components/DamageNumber3D.d.ts.map +1 -1
  179. package/lib/components/screens/training/components/FootPlacementMarkers3D.d.ts.map +1 -1
  180. package/lib/components/screens/training/components/FootPlacementMarkers3D.js.map +1 -1
  181. package/lib/components/screens/training/components/FootworkDrillsOverlayHtml.d.ts.map +1 -1
  182. package/lib/components/screens/training/components/FootworkDrillsOverlayHtml.js.map +1 -1
  183. package/lib/components/screens/training/components/HitFeedbackEffect3D.d.ts.map +1 -1
  184. package/lib/components/screens/training/components/HitFeedbackEffect3D.js.map +1 -1
  185. package/lib/components/screens/training/components/TrainingAICharacter3D.d.ts.map +1 -1
  186. package/lib/components/screens/training/components/TrainingArena3D.d.ts.map +1 -1
  187. package/lib/components/screens/training/components/TrainingControlsOverlayHtml.d.ts.map +1 -1
  188. package/lib/components/screens/training/components/TrainingControlsOverlayHtml.js.map +1 -1
  189. package/lib/components/screens/training/components/TrainingDummy3D.d.ts.map +1 -1
  190. package/lib/components/screens/training/components/TrainingDummy3D.js.map +1 -1
  191. package/lib/components/screens/training/components/TrainingFeedbackOverlayHtml.d.ts.map +1 -1
  192. package/lib/components/screens/training/components/TrainingFeedbackOverlayHtml.js.map +1 -1
  193. package/lib/components/screens/training/components/TrainingHitEffects3D.d.ts.map +1 -1
  194. package/lib/components/screens/training/components/TrainingModeSelectorOverlayHtml.d.ts.map +1 -1
  195. package/lib/components/screens/training/components/TrainingModeSelectorOverlayHtml.js.map +1 -1
  196. package/lib/components/screens/training/components/TrainingStatsOverlayHtml.d.ts.map +1 -1
  197. package/lib/components/screens/training/components/TrainingStatsOverlayHtml.js.map +1 -1
  198. package/lib/components/screens/training/components/VitalPointMarker3D.d.ts.map +1 -1
  199. package/lib/components/screens/training/components/VitalPointMarker3D.js.map +1 -1
  200. package/lib/components/screens/training/components/VitalPointTrainingOverlayHtml.d.ts.map +1 -1
  201. package/lib/components/screens/training/components/VitalPointTrainingOverlayHtml.js.map +1 -1
  202. package/lib/components/screens/training/components/hud/TrainingBottomHUD.d.ts.map +1 -1
  203. package/lib/components/screens/training/components/hud/TrainingBottomHUD.js.map +1 -1
  204. package/lib/components/screens/training/components/hud/TrainingLeftHUD.d.ts.map +1 -1
  205. package/lib/components/screens/training/components/hud/TrainingLeftHUD.js.map +1 -1
  206. package/lib/components/screens/training/components/hud/TrainingRightHUD.d.ts.map +1 -1
  207. package/lib/components/screens/training/components/hud/TrainingRightHUD.js.map +1 -1
  208. package/lib/components/screens/training/components/hud/TrainingTopHUD.d.ts.map +1 -1
  209. package/lib/components/screens/training/components/hud/TrainingTopHUD.js.map +1 -1
  210. package/lib/components/screens/training/components/index.d.ts.map +1 -1
  211. package/lib/components/screens/training/hooks/useAttackMovement.d.ts.map +1 -1
  212. package/lib/components/screens/training/hooks/useAttackMovement.js.map +1 -1
  213. package/lib/components/screens/training/hooks/useTrainingActions.d.ts.map +1 -1
  214. package/lib/components/screens/training/hooks/useTrainingActions.js.map +1 -1
  215. package/lib/components/screens/training/hooks/useTrainingLayout.d.ts.map +1 -1
  216. package/lib/components/screens/training/hooks/useTrainingLayout.js.map +1 -1
  217. package/lib/components/screens/training/hooks/useTrainingState.d.ts.map +1 -1
  218. package/lib/components/screens/training/hooks/useTrainingState.js.map +1 -1
  219. package/lib/components/shared/base/AccessibilityProvider.d.ts.map +1 -1
  220. package/lib/components/shared/base/BaseButton.d.ts.map +1 -1
  221. package/lib/components/shared/base/BaseButton.js.map +1 -1
  222. package/lib/components/shared/base/BaseButtonOverlayHtml.d.ts.map +1 -1
  223. package/lib/components/shared/base/BaseButtonOverlayHtml.js.map +1 -1
  224. package/lib/components/shared/base/BasePanel.d.ts.map +1 -1
  225. package/lib/components/shared/base/BasePanel.js.map +1 -1
  226. package/lib/components/shared/base/BaseText.d.ts.map +1 -1
  227. package/lib/components/shared/base/BaseText.js.map +1 -1
  228. package/lib/components/shared/base/ResponsiveContainer.d.ts.map +1 -1
  229. package/lib/components/shared/base/index.d.ts.map +1 -1
  230. package/lib/components/shared/base/useKoreanTheme.d.ts.map +1 -1
  231. package/lib/components/shared/base/useKoreanTheme.js.map +1 -1
  232. package/lib/components/shared/debug/PerformanceDebugOverlayHtml.d.ts.map +1 -1
  233. package/lib/components/shared/debug/PerformanceDebugOverlayHtml.js.map +1 -1
  234. package/lib/components/shared/effects/ScreenFlash.d.ts.map +1 -1
  235. package/lib/components/shared/mobile/ActionButtons.d.ts.map +1 -1
  236. package/lib/components/shared/mobile/ActionButtons.js +0 -1
  237. package/lib/components/shared/mobile/ActionButtons.js.map +1 -1
  238. package/lib/components/shared/mobile/GestureRecognizerPure.d.ts +0 -1
  239. package/lib/components/shared/mobile/GestureRecognizerPure.d.ts.map +1 -1
  240. package/lib/components/shared/mobile/GestureRecognizerPure.js +0 -1
  241. package/lib/components/shared/mobile/GestureRecognizerPure.js.map +1 -1
  242. package/lib/components/shared/mobile/HapticController.d.ts +0 -13
  243. package/lib/components/shared/mobile/HapticController.d.ts.map +1 -1
  244. package/lib/components/shared/mobile/HapticController.js +0 -10
  245. package/lib/components/shared/mobile/HapticController.js.map +1 -1
  246. package/lib/components/shared/mobile/MobileControlsPure.d.ts.map +1 -1
  247. package/lib/components/shared/mobile/MobileControlsPure.js.map +1 -1
  248. package/lib/components/shared/mobile/PerformanceMonitor.d.ts +0 -15
  249. package/lib/components/shared/mobile/PerformanceMonitor.d.ts.map +1 -1
  250. package/lib/components/shared/mobile/StanceWheelPure.d.ts +0 -1
  251. package/lib/components/shared/mobile/StanceWheelPure.d.ts.map +1 -1
  252. package/lib/components/shared/mobile/StanceWheelPure.js +0 -1
  253. package/lib/components/shared/mobile/StanceWheelPure.js.map +1 -1
  254. package/lib/components/shared/mobile/TouchOptimizer.d.ts +0 -4
  255. package/lib/components/shared/mobile/TouchOptimizer.d.ts.map +1 -1
  256. package/lib/components/shared/mobile/TouchOptimizer.js +0 -3
  257. package/lib/components/shared/mobile/TouchOptimizer.js.map +1 -1
  258. package/lib/components/shared/mobile/VirtualDPad.d.ts.map +1 -1
  259. package/lib/components/shared/mobile/VirtualDPad.js +0 -1
  260. package/lib/components/shared/mobile/VirtualDPad.js.map +1 -1
  261. package/lib/components/shared/mobile/index.d.ts.map +1 -1
  262. package/lib/components/shared/three/anatomy/BodySurface.d.ts.map +1 -1
  263. package/lib/components/shared/three/anatomy/BodySurface.js.map +1 -1
  264. package/lib/components/shared/three/anatomy/BoneAttachedMuscles.d.ts.map +1 -1
  265. package/lib/components/shared/three/anatomy/BoneAttachedMuscles.js.map +1 -1
  266. package/lib/components/shared/three/anatomy/BoneClothing.d.ts.map +1 -1
  267. package/lib/components/shared/three/anatomy/BoneClothing.js.map +1 -1
  268. package/lib/components/shared/three/anatomy/BoneRenderer.d.ts +0 -1
  269. package/lib/components/shared/three/anatomy/BoneRenderer.d.ts.map +1 -1
  270. package/lib/components/shared/three/anatomy/BoneRenderer.js.map +1 -1
  271. package/lib/components/shared/three/anatomy/Face3D.d.ts.map +1 -1
  272. package/lib/components/shared/three/anatomy/Face3D.js.map +1 -1
  273. package/lib/components/shared/three/anatomy/Foot3D.d.ts +0 -1
  274. package/lib/components/shared/three/anatomy/Foot3D.d.ts.map +1 -1
  275. package/lib/components/shared/three/anatomy/Foot3D.js.map +1 -1
  276. package/lib/components/shared/three/anatomy/Hand3D.d.ts +0 -1
  277. package/lib/components/shared/three/anatomy/Hand3D.d.ts.map +1 -1
  278. package/lib/components/shared/three/anatomy/Hand3D.js.map +1 -1
  279. package/lib/components/shared/three/effects/ActionFeedback.d.ts.map +1 -1
  280. package/lib/components/shared/three/effects/ActionFeedback.js.map +1 -1
  281. package/lib/components/shared/three/effects/DamageNumbers.d.ts.map +1 -1
  282. package/lib/components/shared/three/effects/DamageNumbers.js.map +1 -1
  283. package/lib/components/shared/three/effects/ExplosiveBurstEffect3D.d.ts.map +1 -1
  284. package/lib/components/shared/three/effects/GrapplingIndicator3D.d.ts.map +1 -1
  285. package/lib/components/shared/three/effects/HitEffects3D.d.ts.map +1 -1
  286. package/lib/components/shared/three/effects/HitEffects3D.js.map +1 -1
  287. package/lib/components/shared/three/effects/LimbExposureIndicator3D.d.ts.map +1 -1
  288. package/lib/components/shared/three/effects/NerveDisruptionEffect3D.d.ts.map +1 -1
  289. package/lib/components/shared/three/effects/PlayerStateIndicators.d.ts.map +1 -1
  290. package/lib/components/shared/three/effects/PlayerStateIndicators.js.map +1 -1
  291. package/lib/components/shared/three/effects/StanceSymbol3D.d.ts.map +1 -1
  292. package/lib/components/shared/three/effects/StanceSymbol3D.js.map +1 -1
  293. package/lib/components/shared/three/effects/StanceTransitionEffect.d.ts.map +1 -1
  294. package/lib/components/shared/three/effects/StanceTransitionEffect.js.map +1 -1
  295. package/lib/components/shared/three/effects/ThunderEffect3D.d.ts.map +1 -1
  296. package/lib/components/shared/three/effects/VitalPointMarkers3D.d.ts.map +1 -1
  297. package/lib/components/shared/three/effects/VitalPointMarkers3D.js.map +1 -1
  298. package/lib/components/shared/three/index.d.ts.map +1 -1
  299. package/lib/components/shared/three/indicators/ElementalColorSystem.d.ts +0 -6
  300. package/lib/components/shared/three/indicators/ElementalColorSystem.d.ts.map +1 -1
  301. package/lib/components/shared/three/indicators/ElementalColorSystem.js +0 -4
  302. package/lib/components/shared/three/indicators/ElementalColorSystem.js.map +1 -1
  303. package/lib/components/shared/three/indicators/GuardIndicator.d.ts +0 -1
  304. package/lib/components/shared/three/indicators/GuardIndicator.d.ts.map +1 -1
  305. package/lib/components/shared/three/indicators/GuardIndicator.js +0 -1
  306. package/lib/components/shared/three/indicators/GuardIndicator.js.map +1 -1
  307. package/lib/components/shared/three/indicators/HapticFeedback.d.ts +0 -7
  308. package/lib/components/shared/three/indicators/HapticFeedback.d.ts.map +1 -1
  309. package/lib/components/shared/three/indicators/HapticFeedback.js +0 -2
  310. package/lib/components/shared/three/indicators/HapticFeedback.js.map +1 -1
  311. package/lib/components/shared/three/indicators/StanceChangeIndicator.d.ts +0 -1
  312. package/lib/components/shared/three/indicators/StanceChangeIndicator.d.ts.map +1 -1
  313. package/lib/components/shared/three/indicators/StanceChangeIndicator.js +0 -1
  314. package/lib/components/shared/three/indicators/StanceChangeIndicator.js.map +1 -1
  315. package/lib/components/shared/three/indicators/TrigramSymbol3D.d.ts +0 -1
  316. package/lib/components/shared/three/indicators/TrigramSymbol3D.d.ts.map +1 -1
  317. package/lib/components/shared/three/models/Player3DWithTransitions.d.ts.map +1 -1
  318. package/lib/components/shared/three/models/Player3DWithTransitions.js.map +1 -1
  319. package/lib/components/shared/three/models/SkeletalPlayer3D.d.ts.map +1 -1
  320. package/lib/components/shared/three/models/SkeletalPlayer3D.js.map +1 -1
  321. package/lib/components/shared/three/optimization/AdaptiveQuality.d.ts.map +1 -1
  322. package/lib/components/shared/three/optimization/AdaptiveQuality.js.map +1 -1
  323. package/lib/components/shared/three/optimization/InstancedGeometry.d.ts.map +1 -1
  324. package/lib/components/shared/three/optimization/LODSystem.d.ts.map +1 -1
  325. package/lib/components/shared/three/scene/AtmosphericParticles3D.d.ts.map +1 -1
  326. package/lib/components/shared/three/scene/AtmosphericParticles3D.js.map +1 -1
  327. package/lib/components/shared/three/scene/BackgroundScene3D.d.ts.map +1 -1
  328. package/lib/components/shared/three/scene/BackgroundScene3D.js.map +1 -1
  329. package/lib/components/shared/three/scene/CombatArena3D.d.ts.map +1 -1
  330. package/lib/components/shared/three/scene/CombatArena3D.js.map +1 -1
  331. package/lib/components/shared/three/scene/DebugCollision.d.ts +0 -2
  332. package/lib/components/shared/three/scene/DebugCollision.d.ts.map +1 -1
  333. package/lib/components/shared/three/scene/KoreanSignage3D.d.ts.map +1 -1
  334. package/lib/components/shared/three/scene/KoreanSignage3D.js.map +1 -1
  335. package/lib/components/shared/three/ui/ArchetypeCard.d.ts.map +1 -1
  336. package/lib/components/shared/three/ui/ArchetypeCard.js.map +1 -1
  337. package/lib/components/shared/three/ui/BodyPartHealthDisplay.d.ts.map +1 -1
  338. package/lib/components/shared/three/ui/BodyPartHealthDisplay.js.map +1 -1
  339. package/lib/components/shared/three/ui/BreathingIndicator.d.ts.map +1 -1
  340. package/lib/components/shared/three/ui/BreathingIndicator2.js.map +1 -1
  341. package/lib/components/shared/three/ui/CombatReadinessBar.d.ts.map +1 -1
  342. package/lib/components/shared/three/ui/CombatReadinessBar.js.map +1 -1
  343. package/lib/components/shared/three/ui/ComboCounter.d.ts.map +1 -1
  344. package/lib/components/shared/three/ui/ComboCounter.js.map +1 -1
  345. package/lib/components/shared/three/ui/HealthBar.d.ts.map +1 -1
  346. package/lib/components/shared/three/ui/HealthBar.js.map +1 -1
  347. package/lib/components/shared/three/ui/KoreanButton.d.ts.map +1 -1
  348. package/lib/components/shared/three/ui/KoreanButton.js.map +1 -1
  349. package/lib/components/shared/three/ui/KoreanPanel.d.ts.map +1 -1
  350. package/lib/components/shared/three/ui/KoreanPanel.js.map +1 -1
  351. package/lib/components/shared/three/ui/KoreanText.d.ts.map +1 -1
  352. package/lib/components/shared/three/ui/KoreanText.js.map +1 -1
  353. package/lib/components/shared/three/ui/MenuList.d.ts.map +1 -1
  354. package/lib/components/shared/three/ui/MenuList.js.map +1 -1
  355. package/lib/components/shared/three/ui/PlayerHUD.d.ts.map +1 -1
  356. package/lib/components/shared/three/ui/PlayerHUD.js.map +1 -1
  357. package/lib/components/shared/three/ui/ProgressBar.d.ts.map +1 -1
  358. package/lib/components/shared/three/ui/ProgressBar.js.map +1 -1
  359. package/lib/components/shared/three/ui/SpeedIndicatorHUD.d.ts +0 -1
  360. package/lib/components/shared/three/ui/SpeedIndicatorHUD.d.ts.map +1 -1
  361. package/lib/components/shared/three/ui/SpeedIndicatorHUD.js +0 -1
  362. package/lib/components/shared/three/ui/SpeedIndicatorHUD.js.map +1 -1
  363. package/lib/components/shared/three/ui/StaminaBar.d.ts.map +1 -1
  364. package/lib/components/shared/three/ui/StaminaBar.js.map +1 -1
  365. package/lib/components/shared/three/ui/TechniqueBar.d.ts.map +1 -1
  366. package/lib/components/shared/three/ui/TechniqueBar.js.map +1 -1
  367. package/lib/components/shared/three/ui/TechniqueBarContainer.d.ts.map +1 -1
  368. package/lib/components/shared/three/ui/TechniqueCard.d.ts.map +1 -1
  369. package/lib/components/shared/three/ui/TechniqueCard.js.map +1 -1
  370. package/lib/components/shared/three/ui/VitalPointOverlayControlsHtml.d.ts.map +1 -1
  371. package/lib/components/shared/three/ui/VitalPointOverlayControlsHtml.js.map +1 -1
  372. package/lib/components/shared/three/ui/VulnerabilityWindowHUD.d.ts.map +1 -1
  373. package/lib/components/shared/ui/BaseHUDContainer.d.ts.map +1 -1
  374. package/lib/components/shared/ui/BaseHUDContainer.js.map +1 -1
  375. package/lib/components/shared/ui/CombatTimer.d.ts.map +1 -1
  376. package/lib/components/shared/ui/CombatTimer.js.map +1 -1
  377. package/lib/components/shared/ui/ErrorBoundary.d.ts.map +1 -1
  378. package/lib/components/shared/ui/ErrorModal.d.ts.map +1 -1
  379. package/lib/components/shared/ui/ErrorModal.js.map +1 -1
  380. package/lib/components/shared/ui/HUDSection.d.ts.map +1 -1
  381. package/lib/components/shared/ui/LoadingState.d.ts.map +1 -1
  382. package/lib/components/shared/ui/LoadingState.js.map +1 -1
  383. package/lib/components/shared/ui/MobileHUDLayout.d.ts +0 -1
  384. package/lib/components/shared/ui/MobileHUDLayout.d.ts.map +1 -1
  385. package/lib/components/shared/ui/ResponsiveContainer.d.ts +0 -1
  386. package/lib/components/shared/ui/ResponsiveContainer.d.ts.map +1 -1
  387. package/lib/components/shared/ui/SplashScreen.d.ts.map +1 -1
  388. package/lib/components/shared/ui/SplashScreen.js +2 -2
  389. package/lib/components/shared/ui/SplashScreen.js.map +1 -1
  390. package/lib/components/shared/ui/StyledHUDPanel.d.ts.map +1 -1
  391. package/lib/components/shared/ui/VitalPointOverlayControlsPure.d.ts.map +1 -1
  392. package/lib/components/shared/ui/VitalPointOverlayControlsPure.js.map +1 -1
  393. package/lib/components/shared/ui/VolumeControl.d.ts.map +1 -1
  394. package/lib/components/shared/ui/VolumeControl.js.map +1 -1
  395. package/lib/components/shared/ui/shared/ConfirmDialog.d.ts.map +1 -1
  396. package/lib/components/shared/ui/shared/ConfirmDialog.js.map +1 -1
  397. package/lib/components/test/Hello3D.d.ts.map +1 -1
  398. package/lib/components/ui/combat/BalanceIndicatorOverlayHtml.d.ts.map +1 -1
  399. package/lib/components/ui/combat/BalanceIndicatorOverlayHtml.js.map +1 -1
  400. package/lib/components/ui/combat/ComboCounter.d.ts.map +1 -1
  401. package/lib/components/ui/combat/PressureMeter.d.ts.map +1 -1
  402. package/lib/systems/CombatSystem.d.ts +0 -6
  403. package/lib/systems/CombatSystem.d.ts.map +1 -1
  404. package/lib/systems/CombatSystem.js +0 -6
  405. package/lib/systems/CombatSystem.js.map +1 -1
  406. package/lib/systems/EffectCalculator.d.ts +0 -7
  407. package/lib/systems/EffectCalculator.d.ts.map +1 -1
  408. package/lib/systems/EffectCalculator.js +0 -4
  409. package/lib/systems/EffectCalculator.js.map +1 -1
  410. package/lib/systems/LayoutSystem.d.ts +0 -1
  411. package/lib/systems/LayoutSystem.d.ts.map +1 -1
  412. package/lib/systems/LayoutSystem.js +0 -1
  413. package/lib/systems/LayoutSystem.js.map +1 -1
  414. package/lib/systems/PlayerEffectManager.d.ts +0 -10
  415. package/lib/systems/PlayerEffectManager.d.ts.map +1 -1
  416. package/lib/systems/PlayerEffectManager.js +0 -3
  417. package/lib/systems/PlayerEffectManager.js.map +1 -1
  418. package/lib/systems/ResponsiveScaling.d.ts +0 -12
  419. package/lib/systems/ResponsiveScaling.d.ts.map +1 -1
  420. package/lib/systems/ResponsiveScaling.js +0 -12
  421. package/lib/systems/ResponsiveScaling.js.map +1 -1
  422. package/lib/systems/TrigramSystem.d.ts +0 -13
  423. package/lib/systems/TrigramSystem.d.ts.map +1 -1
  424. package/lib/systems/TrigramSystem.js +0 -13
  425. package/lib/systems/TrigramSystem.js.map +1 -1
  426. package/lib/systems/VitalPointSystem.d.ts +0 -10
  427. package/lib/systems/VitalPointSystem.d.ts.map +1 -1
  428. package/lib/systems/VitalPointSystem.js +0 -10
  429. package/lib/systems/VitalPointSystem.js.map +1 -1
  430. package/lib/systems/animation/builders/KeyframeInterpolation.d.ts +0 -4
  431. package/lib/systems/animation/builders/KeyframeInterpolation.d.ts.map +1 -1
  432. package/lib/systems/animation/builders/KeyframeInterpolation.js +0 -1
  433. package/lib/systems/animation/builders/KeyframeInterpolation.js.map +1 -1
  434. package/lib/systems/animation/builders/SkeletonRig.d.ts +0 -4
  435. package/lib/systems/animation/builders/SkeletonRig.d.ts.map +1 -1
  436. package/lib/systems/animation/builders/SkeletonRig.js +0 -3
  437. package/lib/systems/animation/builders/SkeletonRig.js.map +1 -1
  438. package/lib/systems/animation/catalogs/RecoveryAnimations.d.ts +0 -5
  439. package/lib/systems/animation/catalogs/RecoveryAnimations.d.ts.map +1 -1
  440. package/lib/systems/animation/catalogs/RecoveryAnimations.js +0 -5
  441. package/lib/systems/animation/catalogs/RecoveryAnimations.js.map +1 -1
  442. package/lib/systems/animation/core/AnimationHitTiming.d.ts +0 -6
  443. package/lib/systems/animation/core/AnimationHitTiming.d.ts.map +1 -1
  444. package/lib/systems/animation/core/AnimationHitTiming.js +0 -4
  445. package/lib/systems/animation/core/AnimationHitTiming.js.map +1 -1
  446. package/lib/systems/animation/core/AnimationTransitions.d.ts +0 -3
  447. package/lib/systems/animation/core/AnimationTransitions.d.ts.map +1 -1
  448. package/lib/systems/animation/core/AnimationTransitions.js.map +1 -1
  449. package/lib/systems/animation/core/LateralityTransform.d.ts +0 -3
  450. package/lib/systems/animation/core/LateralityTransform.d.ts.map +1 -1
  451. package/lib/systems/animation/core/LateralityTransform.js +0 -1
  452. package/lib/systems/animation/core/LateralityTransform.js.map +1 -1
  453. package/lib/systems/animation/core/RecoveryPhaseEnhancer.d.ts +0 -1
  454. package/lib/systems/animation/core/RecoveryPhaseEnhancer.d.ts.map +1 -1
  455. package/lib/systems/animation/core/RecoveryPhaseEnhancer.js.map +1 -1
  456. package/lib/systems/animation/core/TechniqueAnimationMapper.d.ts +0 -10
  457. package/lib/systems/animation/core/TechniqueAnimationMapper.d.ts.map +1 -1
  458. package/lib/systems/animation/core/TechniqueAnimationMapper.js +0 -8
  459. package/lib/systems/animation/core/TechniqueAnimationMapper.js.map +1 -1
  460. package/lib/systems/animation/core/TrigramAnimationMapping.d.ts +0 -10
  461. package/lib/systems/animation/core/TrigramAnimationMapping.d.ts.map +1 -1
  462. package/lib/systems/animation/core/TrigramStanceTransitions.d.ts +0 -2
  463. package/lib/systems/animation/core/TrigramStanceTransitions.d.ts.map +1 -1
  464. package/lib/systems/animation/core/types.d.ts +0 -39
  465. package/lib/systems/animation/core/types.d.ts.map +1 -1
  466. package/lib/systems/animation/core/types.js +0 -9
  467. package/lib/systems/animation/core/types.js.map +1 -1
  468. package/lib/systems/animation/systems/AdvancedJointMovements.d.ts +0 -27
  469. package/lib/systems/animation/systems/AdvancedJointMovements.d.ts.map +1 -1
  470. package/lib/systems/animation/systems/AdvancedJointMovements.js +0 -1
  471. package/lib/systems/animation/systems/AdvancedJointMovements.js.map +1 -1
  472. package/lib/systems/animation/systems/BodyFacingSystem.d.ts +0 -19
  473. package/lib/systems/animation/systems/BodyFacingSystem.d.ts.map +1 -1
  474. package/lib/systems/animation/systems/BodyFacingSystem.js +0 -14
  475. package/lib/systems/animation/systems/BodyFacingSystem.js.map +1 -1
  476. package/lib/systems/animation/systems/FacialExpressions.d.ts +0 -10
  477. package/lib/systems/animation/systems/FacialExpressions.d.ts.map +1 -1
  478. package/lib/systems/animation/systems/FacialExpressions.js +0 -2
  479. package/lib/systems/animation/systems/FacialExpressions.js.map +1 -1
  480. package/lib/systems/animation/systems/FallAnimations.d.ts +0 -4
  481. package/lib/systems/animation/systems/FallAnimations.d.ts.map +1 -1
  482. package/lib/systems/animation/systems/FallAnimations.js +0 -2
  483. package/lib/systems/animation/systems/FallAnimations.js.map +1 -1
  484. package/lib/systems/animation/systems/HeadMovements.d.ts +0 -10
  485. package/lib/systems/animation/systems/HeadMovements.d.ts.map +1 -1
  486. package/lib/systems/bodypart/BodyPartDamageIntegration.d.ts +0 -7
  487. package/lib/systems/bodypart/BodyPartDamageIntegration.d.ts.map +1 -1
  488. package/lib/systems/bodypart/BodyPartDamageIntegration.js +0 -7
  489. package/lib/systems/bodypart/BodyPartDamageIntegration.js.map +1 -1
  490. package/lib/systems/bodypart/BodyPartHealthSystem.d.ts +0 -13
  491. package/lib/systems/bodypart/BodyPartHealthSystem.d.ts.map +1 -1
  492. package/lib/systems/bodypart/BodyPartHealthSystem.js +0 -13
  493. package/lib/systems/bodypart/BodyPartHealthSystem.js.map +1 -1
  494. package/lib/systems/bodypart/BodyPartPositionMapping.d.ts +0 -6
  495. package/lib/systems/bodypart/BodyPartPositionMapping.d.ts.map +1 -1
  496. package/lib/systems/bodypart/BodyPartPositionMapping.js +0 -6
  497. package/lib/systems/bodypart/BodyPartPositionMapping.js.map +1 -1
  498. package/lib/systems/bodypart/CombatInjuryIntegration.d.ts +0 -10
  499. package/lib/systems/bodypart/CombatInjuryIntegration.d.ts.map +1 -1
  500. package/lib/systems/bodypart/CombatInjuryIntegration.js +0 -8
  501. package/lib/systems/bodypart/CombatInjuryIntegration.js.map +1 -1
  502. package/lib/systems/bodypart/InjuryIntegration.d.ts +0 -2
  503. package/lib/systems/bodypart/InjuryIntegration.d.ts.map +1 -1
  504. package/lib/systems/bodypart/InjuryIntegration.js +0 -2
  505. package/lib/systems/bodypart/InjuryIntegration.js.map +1 -1
  506. package/lib/systems/bodypart/InjuryTracker.d.ts +0 -14
  507. package/lib/systems/bodypart/InjuryTracker.d.ts.map +1 -1
  508. package/lib/systems/bodypart/InjuryTracker.js +0 -12
  509. package/lib/systems/bodypart/InjuryTracker.js.map +1 -1
  510. package/lib/systems/bodypart/MovementPenaltySystem.d.ts +0 -8
  511. package/lib/systems/bodypart/MovementPenaltySystem.d.ts.map +1 -1
  512. package/lib/systems/bodypart/MovementPenaltySystem.js +0 -8
  513. package/lib/systems/bodypart/MovementPenaltySystem.js.map +1 -1
  514. package/lib/systems/bodypart/PlayerInjuryTrackingManager.d.ts +0 -8
  515. package/lib/systems/bodypart/PlayerInjuryTrackingManager.d.ts.map +1 -1
  516. package/lib/systems/bodypart/PlayerInjuryTrackingManager.js +0 -8
  517. package/lib/systems/bodypart/PlayerInjuryTrackingManager.js.map +1 -1
  518. package/lib/systems/bodypart/types.d.ts +0 -13
  519. package/lib/systems/bodypart/types.d.ts.map +1 -1
  520. package/lib/systems/bodypart/types.js +0 -5
  521. package/lib/systems/bodypart/types.js.map +1 -1
  522. package/lib/systems/breathing/BreathingDisruptionSystem.d.ts +0 -3
  523. package/lib/systems/breathing/BreathingDisruptionSystem.d.ts.map +1 -1
  524. package/lib/systems/breathing/BreathingDisruptionSystem.js +0 -2
  525. package/lib/systems/breathing/BreathingDisruptionSystem.js.map +1 -1
  526. package/lib/systems/combat/BalanceSystem.d.ts +0 -25
  527. package/lib/systems/combat/BalanceSystem.d.ts.map +1 -1
  528. package/lib/systems/combat/BalanceSystem.js +0 -25
  529. package/lib/systems/combat/BalanceSystem.js.map +1 -1
  530. package/lib/systems/combat/BreakingStatusEffects.d.ts +0 -4
  531. package/lib/systems/combat/BreakingStatusEffects.d.ts.map +1 -1
  532. package/lib/systems/combat/BreakingStatusEffects.js +0 -3
  533. package/lib/systems/combat/BreakingStatusEffects.js.map +1 -1
  534. package/lib/systems/combat/CombatStateSystem.d.ts +0 -9
  535. package/lib/systems/combat/CombatStateSystem.d.ts.map +1 -1
  536. package/lib/systems/combat/CombatStateSystem.js +0 -9
  537. package/lib/systems/combat/CombatStateSystem.js.map +1 -1
  538. package/lib/systems/combat/ConsciousnessSystem.d.ts +0 -16
  539. package/lib/systems/combat/ConsciousnessSystem.d.ts.map +1 -1
  540. package/lib/systems/combat/ConsciousnessSystem.js +0 -16
  541. package/lib/systems/combat/ConsciousnessSystem.js.map +1 -1
  542. package/lib/systems/combat/FallIntegration.d.ts +0 -3
  543. package/lib/systems/combat/FallIntegration.d.ts.map +1 -1
  544. package/lib/systems/combat/FallIntegration.js +0 -3
  545. package/lib/systems/combat/FallIntegration.js.map +1 -1
  546. package/lib/systems/combat/GrappleSystem.d.ts +0 -2
  547. package/lib/systems/combat/GrappleSystem.d.ts.map +1 -1
  548. package/lib/systems/combat/GrappleSystem.js +0 -2
  549. package/lib/systems/combat/GrappleSystem.js.map +1 -1
  550. package/lib/systems/combat/LimbExposureSystem.d.ts +0 -7
  551. package/lib/systems/combat/LimbExposureSystem.d.ts.map +1 -1
  552. package/lib/systems/combat/LimbExposureSystem.js +0 -7
  553. package/lib/systems/combat/LimbExposureSystem.js.map +1 -1
  554. package/lib/systems/combat/PainResponseSystem.d.ts +0 -11
  555. package/lib/systems/combat/PainResponseSystem.d.ts.map +1 -1
  556. package/lib/systems/combat/PainResponseSystem.js +0 -11
  557. package/lib/systems/combat/PainResponseSystem.js.map +1 -1
  558. package/lib/systems/combat/painConsciousnessUtils.d.ts +0 -7
  559. package/lib/systems/combat/painConsciousnessUtils.d.ts.map +1 -1
  560. package/lib/systems/combat/painConsciousnessUtils.js +0 -7
  561. package/lib/systems/combat/painConsciousnessUtils.js.map +1 -1
  562. package/lib/systems/effects.d.ts +11 -0
  563. package/lib/systems/effects.d.ts.map +1 -1
  564. package/lib/systems/effects.js +10 -0
  565. package/lib/systems/effects.js.map +1 -1
  566. package/lib/systems/game.d.ts +16 -0
  567. package/lib/systems/game.d.ts.map +1 -1
  568. package/lib/systems/game.js +1 -0
  569. package/lib/systems/game.js.map +1 -1
  570. package/lib/systems/index.d.ts +5 -1
  571. package/lib/systems/index.d.ts.map +1 -1
  572. package/lib/systems/index.js.map +1 -1
  573. package/lib/systems/movement/InjuryMovementModifier.d.ts +0 -10
  574. package/lib/systems/movement/InjuryMovementModifier.d.ts.map +1 -1
  575. package/lib/systems/movement/InjuryMovementModifier.js +0 -7
  576. package/lib/systems/movement/InjuryMovementModifier.js.map +1 -1
  577. package/lib/systems/movement/integration.d.ts +0 -3
  578. package/lib/systems/movement/integration.d.ts.map +1 -1
  579. package/lib/systems/movement/integration.js +0 -3
  580. package/lib/systems/movement/integration.js.map +1 -1
  581. package/lib/systems/physics/AttackMovementPhysics.d.ts +0 -9
  582. package/lib/systems/physics/AttackMovementPhysics.d.ts.map +1 -1
  583. package/lib/systems/physics/AttackMovementPhysics.js +0 -7
  584. package/lib/systems/physics/AttackMovementPhysics.js.map +1 -1
  585. package/lib/systems/physics/CollisionDetection.d.ts +0 -6
  586. package/lib/systems/physics/CollisionDetection.d.ts.map +1 -1
  587. package/lib/systems/physics/CollisionDetection.js +0 -6
  588. package/lib/systems/physics/CollisionDetection.js.map +1 -1
  589. package/lib/systems/physics/CoordinateMapper.d.ts +0 -1
  590. package/lib/systems/physics/CoordinateMapper.d.ts.map +1 -1
  591. package/lib/systems/physics/CoordinateMapper.js +0 -1
  592. package/lib/systems/physics/CoordinateMapper.js.map +1 -1
  593. package/lib/systems/physics/KnockbackPhysics.d.ts +0 -11
  594. package/lib/systems/physics/KnockbackPhysics.d.ts.map +1 -1
  595. package/lib/systems/physics/KnockbackPhysics.js +0 -8
  596. package/lib/systems/physics/KnockbackPhysics.js.map +1 -1
  597. package/lib/systems/physics/MovementPhysics.d.ts +0 -10
  598. package/lib/systems/physics/MovementPhysics.d.ts.map +1 -1
  599. package/lib/systems/physics/MovementPhysics.js +0 -8
  600. package/lib/systems/physics/MovementPhysics.js.map +1 -1
  601. package/lib/systems/physics/PhysicalReachCalculator.d.ts +0 -6
  602. package/lib/systems/physics/PhysicalReachCalculator.d.ts.map +1 -1
  603. package/lib/systems/physics/PhysicalReachCalculator.js +0 -5
  604. package/lib/systems/physics/PhysicalReachCalculator.js.map +1 -1
  605. package/lib/systems/physics/SpeedModifierSystem.d.ts +0 -5
  606. package/lib/systems/physics/SpeedModifierSystem.d.ts.map +1 -1
  607. package/lib/systems/physics/SpeedModifierSystem.js +0 -4
  608. package/lib/systems/physics/SpeedModifierSystem.js.map +1 -1
  609. package/lib/systems/player.d.ts +0 -5
  610. package/lib/systems/player.d.ts.map +1 -1
  611. package/lib/systems/trigram/TrigramCalculator.d.ts +0 -1
  612. package/lib/systems/trigram/TrigramCalculator.d.ts.map +1 -1
  613. package/lib/systems/trigram/TrigramCalculator.js +0 -1
  614. package/lib/systems/trigram/TrigramCalculator.js.map +1 -1
  615. package/lib/systems/trigram/types.d.ts +0 -4
  616. package/lib/systems/trigram/types.d.ts.map +1 -1
  617. package/lib/systems/trigram/types.js +0 -2
  618. package/lib/systems/trigram/types.js.map +1 -1
  619. package/lib/systems/types.d.ts +7 -2
  620. package/lib/systems/types.d.ts.map +1 -1
  621. package/lib/systems/types.js.map +1 -1
  622. package/lib/systems/vitalpoint/DamageCalculator.d.ts +0 -3
  623. package/lib/systems/vitalpoint/DamageCalculator.d.ts.map +1 -1
  624. package/lib/systems/vitalpoint/DamageCalculator.js +0 -3
  625. package/lib/systems/vitalpoint/DamageCalculator.js.map +1 -1
  626. package/lib/systems/vitalpoint/KoreanVitalPoints.d.ts +0 -8
  627. package/lib/systems/vitalpoint/KoreanVitalPoints.d.ts.map +1 -1
  628. package/lib/systems/vitalpoint/KoreanVitalPoints.js +0 -8
  629. package/lib/systems/vitalpoint/KoreanVitalPoints.js.map +1 -1
  630. package/lib/systems/vitalpoint/VitalPointsData.d.ts +0 -3
  631. package/lib/systems/vitalpoint/VitalPointsData.d.ts.map +1 -1
  632. package/lib/systems/vitalpoint/VitalPointsData.js +0 -1
  633. package/lib/systems/vitalpoint/VitalPointsData.js.map +1 -1
  634. package/lib/types/PhysicsTypes.d.ts +21 -78
  635. package/lib/types/PhysicsTypes.d.ts.map +1 -1
  636. package/lib/types/PhysicsTypes.js +17 -63
  637. package/lib/types/PhysicsTypes.js.map +1 -1
  638. package/lib/types/clothing.d.ts +0 -9
  639. package/lib/types/clothing.d.ts.map +1 -1
  640. package/lib/types/constants/animations.d.ts +35 -1
  641. package/lib/types/constants/animations.d.ts.map +1 -1
  642. package/lib/types/constants/animations.js +12 -1
  643. package/lib/types/constants/animations.js.map +1 -1
  644. package/lib/types/constants/colors.d.ts +28 -2
  645. package/lib/types/constants/colors.d.ts.map +1 -1
  646. package/lib/types/constants/colors.js +30 -4
  647. package/lib/types/constants/colors.js.map +1 -1
  648. package/lib/types/constants/index.d.ts +5 -1
  649. package/lib/types/constants/index.d.ts.map +1 -1
  650. package/lib/types/constants/index.js.map +1 -1
  651. package/lib/types/constants/performance.d.ts +0 -2
  652. package/lib/types/constants/performance.d.ts.map +1 -1
  653. package/lib/types/constants/performance.js +0 -2
  654. package/lib/types/constants/performance.js.map +1 -1
  655. package/lib/types/constants/typography.d.ts +40 -2
  656. package/lib/types/constants/typography.d.ts.map +1 -1
  657. package/lib/types/constants/typography.js +40 -2
  658. package/lib/types/constants/typography.js.map +1 -1
  659. package/lib/types/constants/ui.d.ts +89 -1
  660. package/lib/types/constants/ui.d.ts.map +1 -1
  661. package/lib/types/constants/ui.js +33 -1
  662. package/lib/types/constants/ui.js.map +1 -1
  663. package/lib/types/facial.d.ts +0 -15
  664. package/lib/types/facial.d.ts.map +1 -1
  665. package/lib/types/facial.js +0 -8
  666. package/lib/types/facial.js.map +1 -1
  667. package/lib/types/hand-animation.d.ts +34 -147
  668. package/lib/types/hand-animation.d.ts.map +1 -1
  669. package/lib/types/hand-animation.js +0 -2
  670. package/lib/types/hand-animation.js.map +1 -1
  671. package/lib/types/injury.d.ts +0 -2
  672. package/lib/types/injury.d.ts.map +1 -1
  673. package/lib/types/injury.js +0 -1
  674. package/lib/types/injury.js.map +1 -1
  675. package/lib/types/physics.d.ts +0 -21
  676. package/lib/types/physics.d.ts.map +1 -1
  677. package/lib/types/physics.js +0 -6
  678. package/lib/types/physics.js.map +1 -1
  679. package/lib/types/physicsConstants.d.ts +0 -12
  680. package/lib/types/physicsConstants.d.ts.map +1 -1
  681. package/lib/types/physicsConstants.js +0 -12
  682. package/lib/types/physicsConstants.js.map +1 -1
  683. package/lib/types/player-visual.d.ts +45 -189
  684. package/lib/types/player-visual.d.ts.map +1 -1
  685. package/lib/types/technique.d.ts +1 -5
  686. package/lib/types/technique.d.ts.map +1 -1
  687. package/lib/types/techniqueId.d.ts +0 -1
  688. package/lib/types/techniqueId.d.ts.map +1 -1
  689. package/lib/types/techniqueId.js +0 -1
  690. package/lib/types/techniqueId.js.map +1 -1
  691. package/lib/utils/arenaWorldDimensions.d.ts +0 -11
  692. package/lib/utils/arenaWorldDimensions.d.ts.map +1 -1
  693. package/lib/utils/arenaWorldDimensions.js +0 -6
  694. package/lib/utils/arenaWorldDimensions.js.map +1 -1
  695. package/lib/utils/controlMapping.d.ts +3 -4
  696. package/lib/utils/controlMapping.d.ts.map +1 -1
  697. package/lib/utils/controlMapping.js +1 -2
  698. package/lib/utils/controlMapping.js.map +1 -1
  699. package/lib/utils/deviceDetection.d.ts +0 -5
  700. package/lib/utils/deviceDetection.d.ts.map +1 -1
  701. package/lib/utils/deviceDetection.js +0 -5
  702. package/lib/utils/deviceDetection.js.map +1 -1
  703. package/lib/utils/hapticFeedback.d.ts +23 -95
  704. package/lib/utils/hapticFeedback.d.ts.map +1 -1
  705. package/lib/utils/hapticFeedback.js +9 -39
  706. package/lib/utils/hapticFeedback.js.map +1 -1
  707. package/lib/utils/haptics.d.ts +0 -3
  708. package/lib/utils/haptics.d.ts.map +1 -1
  709. package/lib/utils/haptics.js +0 -1
  710. package/lib/utils/haptics.js.map +1 -1
  711. package/lib/utils/math.d.ts +0 -3
  712. package/lib/utils/math.d.ts.map +1 -1
  713. package/lib/utils/math.js +0 -2
  714. package/lib/utils/math.js.map +1 -1
  715. package/lib/utils/mobileLayoutHelpers.d.ts +0 -3
  716. package/lib/utils/mobileLayoutHelpers.d.ts.map +1 -1
  717. package/lib/utils/mobileLayoutHelpers.js +0 -1
  718. package/lib/utils/mobileLayoutHelpers.js.map +1 -1
  719. package/lib/utils/mobileUIUtils.d.ts +5 -100
  720. package/lib/utils/mobileUIUtils.d.ts.map +1 -1
  721. package/lib/utils/mobileUIUtils.js +0 -9
  722. package/lib/utils/mobileUIUtils.js.map +1 -1
  723. package/lib/utils/physicalAttributeValidation.d.ts.map +1 -1
  724. package/lib/utils/player3DHelpers.d.ts.map +1 -1
  725. package/lib/utils/player3DHelpers.js.map +1 -1
  726. package/lib/utils/responsiveLayoutHelpers.d.ts +0 -65
  727. package/lib/utils/responsiveLayoutHelpers.d.ts.map +1 -1
  728. package/lib/utils/responsiveLayoutHelpers.js +0 -65
  729. package/lib/utils/responsiveLayoutHelpers.js.map +1 -1
  730. package/lib/utils/responsiveOrientationConstants.d.ts +0 -7
  731. package/lib/utils/responsiveOrientationConstants.d.ts.map +1 -1
  732. package/lib/utils/responsiveOrientationConstants.js +0 -7
  733. package/lib/utils/responsiveOrientationConstants.js.map +1 -1
  734. package/lib/utils/safeAreaUtils.d.ts +0 -6
  735. package/lib/utils/safeAreaUtils.d.ts.map +1 -1
  736. package/lib/utils/safeAreaUtils.js +0 -2
  737. package/lib/utils/safeAreaUtils.js.map +1 -1
  738. package/lib/utils/sharedPhysicsConfig.d.ts +0 -4
  739. package/lib/utils/sharedPhysicsConfig.d.ts.map +1 -1
  740. package/lib/utils/sharedPhysicsConfig.js +0 -2
  741. package/lib/utils/sharedPhysicsConfig.js.map +1 -1
  742. package/lib/utils/skeletonScaling.d.ts +0 -9
  743. package/lib/utils/skeletonScaling.d.ts.map +1 -1
  744. package/lib/utils/skeletonScaling.js +0 -1
  745. package/lib/utils/skeletonScaling.js.map +1 -1
  746. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"AnimationHitTiming.js","names":[],"sources":["../../../../src/systems/animation/core/AnimationHitTiming.ts"],"sourcesContent":["/**\n * Animation Hit Timing System\n *\n * **Korean**: 애니메이션 타격 타이밍\n *\n * Defines when visual contact occurs in animations for reality-based hit detection.\n * Hits should only register when the animation visually shows limb contact with target.\n *\n * ## Philosophy\n *\n * Black Trigram emphasizes visual authenticity in combat. Hit detection must align\n * with what the player sees on screen. This system defines the exact frames/timing\n * when each technique's strike phase visually connects.\n *\n * ## Phases\n *\n * Korean martial arts techniques have distinct phases:\n * - **준비 (Chamber)**: Wind-up, no contact possible\n * - **실행 (Extension)**: Strike extending, contact window opens\n * - **정점 (Peak)**: Maximum extension, highest contact probability\n * - **회수 (Retraction)**: Pulling back, contact window closes\n * - **복귀 (Recovery)**: Return to stance, no contact\n *\n * @module systems/animation/AnimationHitTiming\n * @category Animation System\n * @korean 애니메이션타격타이밍\n */\n\nimport { AnimationType } from \"../builders/MartialArtsAnimationBuilder\";\n\n/**\n * Hit window timing for a technique animation.\n *\n * **Korean**: 타격 창 타이밍\n *\n * Defines when during an animation the technique can actually make contact.\n * Based on visual reach during the extension phase.\n *\n * @example\n * ```typescript\n * const jabTiming: AnimationHitWindow = {\n * startTime: 0.10, // Hit window opens at 100ms (after chamber)\n * peakTime: 0.15, // Peak extension at 150ms\n * endTime: 0.20, // Hit window closes at 200ms (before retraction)\n * maxReachMultiplier: 1.0, // 100% of limb length at peak\n * };\n * ```\n *\n * @public\n * @korean 타격창타이밍\n */\nexport interface AnimationHitWindow {\n /**\n * Time when hit window opens (seconds).\n * Start of extension phase where limb begins moving toward target.\n * @korean 시작시간\n */\n readonly startTime: number;\n\n /**\n * Time of maximum extension (seconds).\n * Peak of strike where reach is maximum and damage is highest.\n * @korean 정점시간\n */\n readonly peakTime: number;\n\n /**\n * Time when hit window closes (seconds).\n * End of extension phase where limb begins retracting.\n * @korean 종료시간\n */\n readonly endTime: number;\n\n /**\n * Reach multiplier at peak extension (0.0 - 1.5).\n * - 1.0 = full limb extension (standard strikes)\n * - 0.7 = partial extension (close-range techniques)\n * - 1.2+ = overextended (special techniques, jumping kicks)\n * @korean 최대도달배수\n */\n readonly maxReachMultiplier: number;\n\n /**\n * Optional reach curve during hit window.\n * If not provided, assumes linear interpolation from 0 to maxReachMultiplier.\n * @korean 도달곡선\n */\n readonly reachCurve?: (normalizedTime: number) => number;\n}\n\n/**\n * Complete hit timing configuration for a technique.\n *\n * **Korean**: 기술 타격 타이밍 설정\n *\n * @public\n * @korean 기술타격타이밍\n */\nexport interface TechniqueHitTiming {\n /**\n * Animation type this timing applies to.\n * @korean 애니메이션타입\n */\n readonly animationType: AnimationType;\n\n /**\n * Hit window configuration.\n * @korean 타격창\n */\n readonly hitWindow: AnimationHitWindow;\n\n /**\n * Whether this technique requires precise timing (true) or has a wider window (false).\n * Affects forgiveness in hit detection.\n * @korean 정밀타이밍필요\n */\n readonly requiresPreciseTiming: boolean;\n}\n\n/**\n * Hit timing database for animation types.\n *\n * **Korean**: 애니메이션 타격 타이밍 데이터베이스\n *\n * Based on TECHNIQUE_TIMING constants from MartialArtsAnimationBuilder.\n * Only includes timing for techniques with actual hit windows.\n * Movement and non-combat animations can query this and will get undefined.\n *\n * @public\n * @korean 애니메이션타격타이밍데이터베이스\n */\nexport const ANIMATION_HIT_TIMING: Partial<\n Record<AnimationType, TechniqueHitTiming>\n> = {\n // ═══════════════════════════════════════════════════════════════════════\n // PUNCH TECHNIQUES (주먹 기술)\n // ═══════════════════════════════════════════════════════════════════════\n\n [AnimationType.JAB]: {\n animationType: AnimationType.JAB,\n hitWindow: {\n startTime: 0.1, // Chamber: 100ms, Extension starts\n peakTime: 0.15, // Peak at 150ms (midpoint of 150ms extension)\n endTime: 0.25, // Retraction starts at 250ms\n maxReachMultiplier: 0.95, // Jabs don't fully extend (speed > reach)\n },\n requiresPreciseTiming: false, // Fast technique with forgiving window\n },\n\n [AnimationType.CROSS]: {\n animationType: AnimationType.CROSS,\n hitWindow: {\n startTime: 0.15, // Longer chamber for power\n peakTime: 0.25, // Peak at 250ms\n endTime: 0.35, // Window closes at 350ms\n maxReachMultiplier: 1.0, // Full extension for power\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.HOOK]: {\n animationType: AnimationType.HOOK,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 0.85, // Hooks are shorter range (arc motion)\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.UPPERCUT]: {\n animationType: AnimationType.UPPERCUT,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 0.7, // Close-range technique\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.OVERHAND]: {\n animationType: AnimationType.OVERHAND,\n hitWindow: {\n startTime: 0.2,\n peakTime: 0.3,\n endTime: 0.42,\n maxReachMultiplier: 1.1, // Longer reach from arc\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.BACKFIST]: {\n animationType: AnimationType.BACKFIST,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.18,\n endTime: 0.27,\n maxReachMultiplier: 0.9, // Snapping technique\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.HAMMER_FIST]: {\n animationType: AnimationType.HAMMER_FIST,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 0.85,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.PALM_STRIKE]: {\n animationType: AnimationType.PALM_STRIKE,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 1.0,\n },\n requiresPreciseTiming: false,\n },\n\n // ═══ Specialized Punch Variants ═══\n\n [AnimationType.SPEAR_HAND_STRIKE]: {\n animationType: AnimationType.SPEAR_HAND_STRIKE,\n hitWindow: {\n startTime: 0.08,\n peakTime: 0.13,\n endTime: 0.2,\n maxReachMultiplier: 1.05, // Extended fingers add reach\n },\n requiresPreciseTiming: true, // Precise targeting required\n },\n\n [AnimationType.NERVE_STRIKE]: {\n animationType: AnimationType.NERVE_STRIKE,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.15,\n endTime: 0.22,\n maxReachMultiplier: 0.9,\n },\n requiresPreciseTiming: true, // Must hit exact nerve point\n },\n\n [AnimationType.PRESSURE_POINT_STRIKE]: {\n animationType: AnimationType.PRESSURE_POINT_STRIKE,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.32,\n maxReachMultiplier: 0.85,\n },\n requiresPreciseTiming: true, // Precise pressure point targeting\n },\n\n [AnimationType.LIGHTNING_STRIKE]: {\n animationType: AnimationType.LIGHTNING_STRIKE,\n hitWindow: {\n startTime: 0.06,\n peakTime: 0.1,\n endTime: 0.15,\n maxReachMultiplier: 0.95,\n },\n requiresPreciseTiming: true, // Very fast, small window\n },\n\n [AnimationType.RAPID_BARRAGE]: {\n animationType: AnimationType.RAPID_BARRAGE,\n hitWindow: {\n startTime: 0.05,\n peakTime: 0.12,\n endTime: 0.2,\n maxReachMultiplier: 0.85, // Multiple hits, shorter reach each\n },\n requiresPreciseTiming: false, // Volume of strikes compensates\n },\n\n [AnimationType.RHYTHMIC_STRIKES]: {\n animationType: AnimationType.RHYTHMIC_STRIKES,\n hitWindow: {\n startTime: 0.08,\n peakTime: 0.15,\n endTime: 0.25,\n maxReachMultiplier: 0.9,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.NERVE_PARALYSIS]: {\n animationType: AnimationType.NERVE_PARALYSIS,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.2,\n endTime: 0.28,\n maxReachMultiplier: 0.85,\n },\n requiresPreciseTiming: true,\n },\n\n [AnimationType.THROAT_STRIKE]: {\n animationType: AnimationType.THROAT_STRIKE,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.15,\n endTime: 0.22,\n maxReachMultiplier: 0.95,\n },\n requiresPreciseTiming: true, // Must hit throat precisely\n },\n\n [AnimationType.EYE_GOUGE]: {\n animationType: AnimationType.EYE_GOUGE,\n hitWindow: {\n startTime: 0.08,\n peakTime: 0.12,\n endTime: 0.18,\n maxReachMultiplier: 0.8, // Very close range\n },\n requiresPreciseTiming: true, // Extremely precise target\n },\n\n [AnimationType.HEAVEN_STRIKE]: {\n animationType: AnimationType.HEAVEN_STRIKE,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 1.1, // Powerful extension\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.FLOWING_CROSS]: {\n animationType: AnimationType.FLOWING_CROSS,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.22,\n endTime: 0.32,\n maxReachMultiplier: 1.0,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SOLAR_PLEXUS_STRIKE]: {\n animationType: AnimationType.SOLAR_PLEXUS_STRIKE,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.2,\n endTime: 0.28,\n maxReachMultiplier: 0.95,\n },\n requiresPreciseTiming: true, // Must hit solar plexus\n },\n\n [AnimationType.FLOWING_PUSH]: {\n animationType: AnimationType.FLOWING_PUSH,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.2,\n endTime: 0.3,\n maxReachMultiplier: 1.0,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.LIVER_DISRUPTION]: {\n animationType: AnimationType.LIVER_DISRUPTION,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.33,\n maxReachMultiplier: 0.9,\n },\n requiresPreciseTiming: true, // Must hit liver\n },\n\n [AnimationType.EAR_STRIKE]: {\n animationType: AnimationType.EAR_STRIKE,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.16,\n endTime: 0.24,\n maxReachMultiplier: 0.85,\n },\n requiresPreciseTiming: true, // Must hit ear precisely\n },\n\n // ═══════════════════════════════════════════════════════════════════════\n // KICK TECHNIQUES (발차기 기술)\n // ═══════════════════════════════════════════════════════════════════════\n\n [AnimationType.FRONT_KICK]: {\n animationType: AnimationType.FRONT_KICK,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.27,\n endTime: 0.4,\n maxReachMultiplier: 1.0, // Full leg extension\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.ROUNDHOUSE_KICK]: {\n animationType: AnimationType.ROUNDHOUSE_KICK,\n hitWindow: {\n startTime: 0.2,\n peakTime: 0.32,\n endTime: 0.48,\n maxReachMultiplier: 1.05, // Slight overextension at peak\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SIDE_KICK]: {\n animationType: AnimationType.SIDE_KICK,\n hitWindow: {\n startTime: 0.2,\n peakTime: 0.35,\n endTime: 0.5,\n maxReachMultiplier: 1.1, // Maximum reach technique\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.BACK_KICK]: {\n animationType: AnimationType.BACK_KICK,\n hitWindow: {\n startTime: 0.25,\n peakTime: 0.4,\n endTime: 0.55,\n maxReachMultiplier: 1.15, // Powerful extension backward\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.AXE_KICK]: {\n animationType: AnimationType.AXE_KICK,\n hitWindow: {\n startTime: 0.25,\n peakTime: 0.45,\n endTime: 0.65,\n maxReachMultiplier: 1.2, // High vertical reach\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.CRESCENT_KICK]: {\n animationType: AnimationType.CRESCENT_KICK,\n hitWindow: {\n startTime: 0.18,\n peakTime: 0.32,\n endTime: 0.48,\n maxReachMultiplier: 1.0,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.LOW_KICK]: {\n animationType: AnimationType.LOW_KICK,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.22,\n endTime: 0.35,\n maxReachMultiplier: 0.95, // Lower target, less extension\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.PUSH_KICK]: {\n animationType: AnimationType.PUSH_KICK,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.22,\n endTime: 0.35,\n maxReachMultiplier: 1.0,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.JUMPING_KICK]: {\n animationType: AnimationType.JUMPING_KICK,\n hitWindow: {\n startTime: 0.3,\n peakTime: 0.45,\n endTime: 0.6,\n maxReachMultiplier: 1.3, // Airborne extension\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SPINNING_HEEL_KICK]: {\n animationType: AnimationType.SPINNING_HEEL_KICK,\n hitWindow: {\n startTime: 0.4,\n peakTime: 0.6,\n endTime: 0.8,\n maxReachMultiplier: 1.15, // Spinning adds reach\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.TORNADO_KICK]: {\n animationType: AnimationType.TORNADO_KICK,\n hitWindow: {\n startTime: 0.45,\n peakTime: 0.65,\n endTime: 0.85,\n maxReachMultiplier: 1.25, // Jumping + spinning\n },\n requiresPreciseTiming: false,\n },\n\n // ═══════════════════════════════════════════════════════════════════════\n // ELBOW & KNEE TECHNIQUES (팔꿈치 & 무릎 기술)\n // ═══════════════════════════════════════════════════════════════════════\n\n [AnimationType.ELBOW_STRIKE]: {\n animationType: AnimationType.ELBOW_STRIKE,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.18,\n endTime: 0.28,\n maxReachMultiplier: 0.5, // Very close range\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.ELBOW_UPPERCUT]: {\n animationType: AnimationType.ELBOW_UPPERCUT,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.22,\n endTime: 0.32,\n maxReachMultiplier: 0.45, // Close range upward\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SPINNING_ELBOW]: {\n animationType: AnimationType.SPINNING_ELBOW,\n hitWindow: {\n startTime: 0.3,\n peakTime: 0.5,\n endTime: 0.7,\n maxReachMultiplier: 0.6, // Spinning adds slight reach\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.TEMPLE_ELBOW]: {\n animationType: AnimationType.TEMPLE_ELBOW,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.18,\n endTime: 0.26,\n maxReachMultiplier: 0.5,\n },\n requiresPreciseTiming: true, // Must hit temple\n },\n\n [AnimationType.SPINNING_BACK_ELBOW]: {\n animationType: AnimationType.SPINNING_BACK_ELBOW,\n hitWindow: {\n startTime: 0.28,\n peakTime: 0.45,\n endTime: 0.62,\n maxReachMultiplier: 0.55,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SPINAL_ELBOW]: {\n animationType: AnimationType.SPINAL_ELBOW,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 0.5,\n },\n requiresPreciseTiming: true, // Must hit spine\n },\n\n [AnimationType.BRACHIAL_ELBOW]: {\n animationType: AnimationType.BRACHIAL_ELBOW,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.18,\n endTime: 0.26,\n maxReachMultiplier: 0.5,\n },\n requiresPreciseTiming: true, // Must hit brachial plexus\n },\n\n [AnimationType.KNEE_STRIKE]: {\n animationType: AnimationType.KNEE_STRIKE,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.22,\n endTime: 0.35,\n maxReachMultiplier: 0.4, // Very close range\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.FLYING_KNEE]: {\n animationType: AnimationType.FLYING_KNEE,\n hitWindow: {\n startTime: 0.25,\n peakTime: 0.4,\n endTime: 0.55,\n maxReachMultiplier: 0.65, // Jumping adds reach\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.KIDNEY_KNEE]: {\n animationType: AnimationType.KIDNEY_KNEE,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 0.4,\n },\n requiresPreciseTiming: true, // Must hit kidney\n },\n\n [AnimationType.FEMORAL_KNEE]: {\n animationType: AnimationType.FEMORAL_KNEE,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.25,\n endTime: 0.35,\n maxReachMultiplier: 0.4,\n },\n requiresPreciseTiming: true, // Must hit femoral artery\n },\n\n // ═══════════════════════════════════════════════════════════════════════\n // GRAPPLING TECHNIQUES (잡기 기술)\n // ═══════════════════════════════════════════════════════════════════════\n\n [AnimationType.THROW]: {\n animationType: AnimationType.THROW,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.35,\n endTime: 0.55,\n maxReachMultiplier: 0.7, // Must be close to grab\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.GRAPPLE]: {\n animationType: AnimationType.GRAPPLE,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.3,\n endTime: 0.5,\n maxReachMultiplier: 0.8, // Reach to grab\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SWEEP]: {\n animationType: AnimationType.SWEEP,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.3,\n endTime: 0.45,\n maxReachMultiplier: 0.9, // Low sweep\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SLAM]: {\n animationType: AnimationType.SLAM,\n hitWindow: {\n startTime: 0.2,\n peakTime: 0.4,\n endTime: 0.6,\n maxReachMultiplier: 0.7,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.WRIST_LOCK]: {\n animationType: AnimationType.WRIST_LOCK,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.25,\n endTime: 0.4,\n maxReachMultiplier: 0.75,\n },\n requiresPreciseTiming: true, // Must grab wrist\n },\n\n [AnimationType.ARM_BAR]: {\n animationType: AnimationType.ARM_BAR,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.35,\n endTime: 0.55,\n maxReachMultiplier: 0.8,\n },\n requiresPreciseTiming: true, // Must control arm\n },\n\n [AnimationType.SHOULDER_LOCK]: {\n animationType: AnimationType.SHOULDER_LOCK,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.3,\n endTime: 0.48,\n maxReachMultiplier: 0.75,\n },\n requiresPreciseTiming: true, // Must control shoulder\n },\n\n [AnimationType.HIP_THROW]: {\n animationType: AnimationType.HIP_THROW,\n hitWindow: {\n startTime: 0.18,\n peakTime: 0.38,\n endTime: 0.58,\n maxReachMultiplier: 0.7,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.LEG_REAP]: {\n animationType: AnimationType.LEG_REAP,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.3,\n endTime: 0.45,\n maxReachMultiplier: 0.85,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.SMALL_CIRCLE_LOCK]: {\n animationType: AnimationType.SMALL_CIRCLE_LOCK,\n hitWindow: {\n startTime: 0.12,\n peakTime: 0.28,\n endTime: 0.44,\n maxReachMultiplier: 0.7,\n },\n requiresPreciseTiming: true, // Hapkido precision\n },\n\n [AnimationType.FINGER_LOCK]: {\n animationType: AnimationType.FINGER_LOCK,\n hitWindow: {\n startTime: 0.1,\n peakTime: 0.23,\n endTime: 0.36,\n maxReachMultiplier: 0.75,\n },\n requiresPreciseTiming: true, // Must grab fingers\n },\n\n [AnimationType.ELBOW_LOCK]: {\n animationType: AnimationType.ELBOW_LOCK,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.32,\n endTime: 0.49,\n maxReachMultiplier: 0.8,\n },\n requiresPreciseTiming: true, // Must control elbow\n },\n\n [AnimationType.SHOULDER_MANIPULATION]: {\n animationType: AnimationType.SHOULDER_MANIPULATION,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.32,\n endTime: 0.49,\n maxReachMultiplier: 0.75,\n },\n requiresPreciseTiming: true,\n },\n\n [AnimationType.MOUNTAIN_LOCK]: {\n animationType: AnimationType.MOUNTAIN_LOCK,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.32,\n endTime: 0.49,\n maxReachMultiplier: 0.75,\n },\n requiresPreciseTiming: true,\n },\n\n [AnimationType.EARTH_EMBRACE]: {\n animationType: AnimationType.EARTH_EMBRACE,\n hitWindow: {\n startTime: 0.18,\n peakTime: 0.4,\n endTime: 0.62,\n maxReachMultiplier: 0.8,\n },\n requiresPreciseTiming: false,\n },\n\n [AnimationType.TAKEDOWN]: {\n animationType: AnimationType.TAKEDOWN,\n hitWindow: {\n startTime: 0.15,\n peakTime: 0.35,\n endTime: 0.55,\n maxReachMultiplier: 0.75,\n },\n requiresPreciseTiming: false,\n },\n\n // ═══════════════════════════════════════════════════════════════════════\n // DEFENSIVE TECHNIQUES (방어 기술)\n // ═══════════════════════════════════════════════════════════════════════\n\n [AnimationType.BLOCK]: {\n animationType: AnimationType.BLOCK,\n hitWindow: {\n startTime: 0.03,\n peakTime: 0.05,\n endTime: 0.08,\n maxReachMultiplier: 0.6, // Arms defending\n },\n requiresPreciseTiming: true, // Must time block correctly\n },\n\n [AnimationType.PARRY]: {\n animationType: AnimationType.PARRY,\n hitWindow: {\n startTime: 0.03,\n peakTime: 0.06,\n endTime: 0.1,\n maxReachMultiplier: 0.7,\n },\n requiresPreciseTiming: true, // Precise deflection\n },\n\n [AnimationType.COUNTER_STRIKE]: {\n animationType: AnimationType.COUNTER_STRIKE,\n hitWindow: {\n startTime: 0.08,\n peakTime: 0.15,\n endTime: 0.25,\n maxReachMultiplier: 0.9, // Counter-strike reach\n },\n requiresPreciseTiming: true, // Timing critical for counters\n },\n};\n\n/**\n * Get hit timing configuration for an animation type.\n *\n * **Korean**: 애니메이션 타격 타이밍 가져오기\n *\n * @param animationType - Animation type to get timing for\n * @returns Hit timing configuration, or undefined if not a combat animation\n *\n * @example\n * ```typescript\n * const jabTiming = getAnimationHitTiming(AnimationType.JAB);\n * if (jabTiming) {\n * console.log(`Jab hit window: ${jabTiming.hitWindow.startTime}s - ${jabTiming.hitWindow.endTime}s`);\n * }\n * ```\n *\n * @public\n * @korean 애니메이션타격타이밍가져오기\n */\nexport function getAnimationHitTiming(\n animationType: AnimationType\n): TechniqueHitTiming | undefined {\n return ANIMATION_HIT_TIMING[animationType];\n}\n\n/**\n * Check if a technique can hit at the given animation time.\n *\n * **Korean**: 타격 가능 시간 확인\n *\n * @param animationType - Animation type\n * @param currentTime - Current time in animation (seconds)\n * @returns True if within hit window\n *\n * @example\n * ```typescript\n * const canHit = isWithinHitWindow(AnimationType.JAB, 0.15);\n * // Returns true (0.15s is within jab's 0.10-0.25s window)\n * ```\n *\n * @public\n * @korean 타격가능시간확인\n */\nexport function isWithinHitWindow(\n animationType: AnimationType,\n currentTime: number\n): boolean {\n const timing = ANIMATION_HIT_TIMING[animationType];\n if (!timing) {\n // Not a combat animation (movement, stance change, etc.)\n return false;\n }\n const { startTime, endTime } = timing.hitWindow;\n return currentTime >= startTime && currentTime <= endTime;\n}\n\n/**\n * Calculate current reach multiplier at a specific time in the animation.\n *\n * **Korean**: 현재 도달 배수 계산\n *\n * @param animationType - Animation type\n * @param currentTime - Current time in animation (seconds)\n * @returns Reach multiplier (0.0 - max), or 0 if outside hit window\n *\n * @example\n * ```typescript\n * const reach = getCurrentReachMultiplier(AnimationType.JAB, 0.15);\n * // Returns 0.95 (jab at peak time)\n *\n * const noReach = getCurrentReachMultiplier(AnimationType.JAB, 0.05);\n * // Returns 0 (before hit window starts)\n * ```\n *\n * @public\n * @korean 현재도달배수계산\n */\nexport function getCurrentReachMultiplier(\n animationType: AnimationType,\n currentTime: number\n): number {\n const timing = ANIMATION_HIT_TIMING[animationType];\n if (!timing) {\n // Not a combat animation\n return 0;\n }\n const { startTime, peakTime, endTime, maxReachMultiplier, reachCurve } =\n timing.hitWindow;\n\n // Outside hit window\n if (currentTime < startTime || currentTime > endTime) {\n return 0;\n }\n\n // Normalize time within hit window (0 = start, 0.5 = peak, 1 = end)\n let normalizedTime: number;\n if (currentTime <= peakTime) {\n // Start to peak (0 to 0.5)\n normalizedTime = 0.5 * ((currentTime - startTime) / (peakTime - startTime));\n } else {\n // Peak to end (0.5 to 1)\n normalizedTime =\n 0.5 + 0.5 * ((currentTime - peakTime) / (endTime - peakTime));\n }\n\n // Apply reach curve if provided, otherwise use simple interpolation\n if (reachCurve) {\n return maxReachMultiplier * reachCurve(normalizedTime);\n }\n\n // Default: Peak at center (0.5), taper off at edges\n // Use smooth curve: 1 - (2 * normalizedTime - 1)^2\n const peakFactor = 1 - Math.pow(2 * normalizedTime - 1, 2);\n return maxReachMultiplier * peakFactor;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AnimationHitTiming.js","names":[],"sources":["../../../../src/systems/animation/core/AnimationHitTiming.ts"],"sourcesContent":["/**\n * Animation Hit Timing System\n *\n * **Korean**: 애니메이션 타격 타이밍\n *\n * Defines when visual contact occurs in animations for reality-based hit detection.\n * Hits should only register when the animation visually shows limb contact with target.\n *\n * ## Philosophy\n *\n * Black Trigram emphasizes visual authenticity in combat. Hit detection must align\n * with what the player sees on screen. This system defines the exact frames/timing\n * when each technique's strike phase visually connects.\n *\n * ## Phases\n *\n * Korean martial arts techniques have distinct phases:\n * - **준비 (Chamber)**: Wind-up, no contact possible\n * - **실행 (Extension)**: Strike extending, contact window opens\n * - **정점 (Peak)**: Maximum extension, highest contact probability\n * - **회수 (Retraction)**: Pulling back, contact window closes\n * - **복귀 (Recovery)**: Return to stance, no contact\n *\n * @module systems/animation/AnimationHitTiming\n * @category Animation System\n * @korean 애니메이션타격타이밍\n */\n\nimport { AnimationType } from \"../builders/MartialArtsAnimationBuilder\";\n\n/**\n * Hit window timing for a technique animation.\n *\n * **Korean**: 타격 창 타이밍\n *\n * Defines when during an animation the technique can actually make contact.\n * Based on visual reach during the extension phase.\n *\n * @example\n * ```typescript\n * const jabTiming: AnimationHitWindow = {\n * startTime: 0.10, // Hit window opens at 100ms (after chamber)\n * peakTime: 0.15, // Peak extension at 150ms\n * endTime: 0.20, // Hit window closes at 200ms (before retraction)\n * maxReachMultiplier: 1.0, // 100% of limb length at peak\n * };\n * ```\n *\n * @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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"}
@@ -30,7 +30,6 @@ import { AnimationState, TransitionRule } from "./types";
30
30
  * - **indirect**: Opposite stances (e.g., geon→gon) - requires intermediate neutral position
31
31
  * - **self**: Same stance (no transition needed)
32
32
  *
33
- * @public
34
33
  * @category Animation
35
34
  * @korean 자세전환유형
36
35
  */
@@ -43,7 +42,6 @@ export type StanceTransitionType = "direct" | "indirect" | "self";
43
42
  * Defines a single keyframe in a stance transition animation, specifying
44
43
  * which stance pose to blend and how much weight to apply.
45
44
  *
46
- * @public
47
45
  * @category Animation
48
46
  * @korean 자세전환키프레임
49
47
  */
@@ -63,7 +61,6 @@ export interface StanceTransitionKeyframe {
63
61
  * Defines a complete transition animation between two trigram stances,
64
62
  * including keyframes, timing, and transition type.
65
63
  *
66
- * @public
67
64
  * @category Animation
68
65
  * @korean 자세전환애니메이션
69
66
  */
@@ -1 +1 @@
1
- {"version":3,"file":"AnimationTransitions.d.ts","sourceRoot":"","sources":["../../../../src/systems/animation/core/AnimationTransitions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EACL,cAAc,EAGd,cAAc,EACf,MAAM,SAAS,CAAC;AAiBjB;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;AAElE;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,wBAAwB;IACvC,6CAA6C;IAC7C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,mCAAmC;IACnC,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,SAAS,CAAC;IAC3C,gCAAgC;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,gBAAgB;IAC/B,oBAAoB;IACpB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,oBAAoB;IACpB,QAAQ,CAAC,EAAE,EAAE,aAAa,CAAC;IAC3B,yCAAyC;IACzC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,gDAAgD;IAChD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,0BAA0B;IAC1B,QAAQ,CAAC,SAAS,EAAE,SAAS,wBAAwB,EAAE,CAAC;IACxD,4BAA4B;IAC5B,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;CAClC;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,aAAa,EAShD,CAAC;AAoOX;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,SAAS,cAAc,EA2M/C,CAAC;AAEX;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,cAAc,EACpB,EAAE,EAAE,cAAc,EAClB,WAAW,GAAE,SAAS,cAAc,EAAwB,GAC3D,OAAO,CAmBT;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,cAAc,EACpB,WAAW,GAAE,SAAS,cAAc,EAAwB,GAC3D,cAAc,EAAE,CAKlB;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,GAAE,SAAS,cAAc,EAAwB,GAC3D,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC,CAc1C;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,aAAa,EACnB,EAAE,EAAE,aAAa,GAChB,MAAM,CAgBR;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,aAAa,EACnB,EAAE,EAAE,aAAa,GAChB,oBAAoB,CAMtB;AAyED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,aAAa,EACnB,EAAE,EAAE,aAAa,GAChB,gBAAgB,CAmClB;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAa,CAAC;AAE3E;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,IAAI,IAAI,CAelD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,aAAa,EACnB,EAAE,EAAE,aAAa,GAChB,gBAAgB,GAAG,SAAS,CAG9B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,aAAa,GAClB,gBAAgB,EAAE,CAWpB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C"}
1
+ {"version":3,"file":"AnimationTransitions.d.ts","sourceRoot":"","sources":["../../../../src/systems/animation/core/AnimationTransitions.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AnimationTransitions.js","names":[],"sources":["../../../../src/systems/animation/core/AnimationTransitions.ts"],"sourcesContent":["/**\n * Animation transition rules for Black Trigram\n *\n * Defines valid transitions between animation states.\n * Based on game-design.md specifications and combat flow.\n *\n * Transition rules:\n * - idle ↔ walk ↔ run (movement states)\n * - stance_guard_{stance} ↔ other states (stance-specific guards)\n * - attack → idle (after completion)\n * - defend → idle (after completion)\n * - hit → idle (after completion)\n * - stance_change → idle (after completion)\n * - ko is terminal (no transitions out)\n * - hit can interrupt any non-ko state (high priority)\n *\n * @module systems/animation/AnimationTransitions\n * @category Animation\n * @korean 애니메이션전환\n */\n\nimport { KoreanText } from \"@/types\";\nimport { TrigramStance } from \"@/types/common\";\nimport {\n AnimationState,\n FALL_TO_GROUND_MAP,\n FallType,\n TransitionRule,\n} from \"./types\";\n\n/**\n * Stance guard animation states (팔괘 방어 자세)\n * @korean 자세방어상태들\n */\nconst STANCE_GUARD_STATES: readonly AnimationState[] = [\n AnimationState.STANCE_GUARD_GEON,\n AnimationState.STANCE_GUARD_TAE,\n AnimationState.STANCE_GUARD_LI,\n AnimationState.STANCE_GUARD_JIN,\n AnimationState.STANCE_GUARD_SON,\n AnimationState.STANCE_GUARD_GAM,\n AnimationState.STANCE_GUARD_GAN,\n AnimationState.STANCE_GUARD_GON,\n] as const;\n\n/**\n * Type of stance transition based on stance adjacency\n *\n * **Korean**: 자세 전환 유형\n *\n * - **direct**: Adjacent stances (e.g., geon→tae) - smooth, fast transition\n * - **indirect**: Opposite stances (e.g., geon→gon) - requires intermediate neutral position\n * - **self**: Same stance (no transition needed)\n *\n * @public\n * @category Animation\n * @korean 자세전환유형\n */\nexport type StanceTransitionType = \"direct\" | \"indirect\" | \"self\";\n\n/**\n * Keyframe for stance transition animation with blend weight\n *\n * **Korean**: 자세 전환 키프레임\n *\n * Defines a single keyframe in a stance transition animation, specifying\n * which stance pose to blend and how much weight to apply.\n *\n * @public\n * @category Animation\n * @korean 자세전환키프레임\n */\nexport interface StanceTransitionKeyframe {\n /** Frame number (0-36 for 600ms at 60fps) */\n readonly frame: number;\n /** Stance pose to blend towards */\n readonly stance: TrigramStance | \"neutral\";\n /** Blend weight (0.0 to 1.0) */\n readonly blend: number;\n}\n\n/**\n * Complete stance transition animation configuration\n *\n * **Korean**: 자세 전환 애니메이션\n *\n * Defines a complete transition animation between two trigram stances,\n * including keyframes, timing, and transition type.\n *\n * @public\n * @category Animation\n * @korean 자세전환애니메이션\n */\nexport interface StanceTransition {\n /** Source stance */\n readonly from: TrigramStance;\n /** Target stance */\n readonly to: TrigramStance;\n /** Transition type based on adjacency */\n readonly type: StanceTransitionType;\n /** Duration in milliseconds (600ms standard) */\n readonly duration: number;\n /** Animation keyframes */\n readonly keyframes: readonly StanceTransitionKeyframe[];\n /** Bilingual description */\n readonly description: KoreanText;\n}\n\n/**\n * Order of trigram stances in the stance wheel (circular arrangement)\n *\n * **Korean**: 팔괘 순서\n *\n * The 8 trigrams arranged in traditional order around the Bagua octagon.\n * Adjacent stances in this array are considered \"adjacent\" for transition purposes.\n *\n * @korean 팔괘순서\n */\nexport const TRIGRAM_STANCES_ORDER: readonly TrigramStance[] = [\n TrigramStance.GEON, // ☰ Heaven\n TrigramStance.TAE, // ☱ Lake\n TrigramStance.LI, // ☲ Fire\n TrigramStance.JIN, // ☳ Thunder\n TrigramStance.SON, // ☴ Wind\n TrigramStance.GAM, // ☵ Water\n TrigramStance.GAN, // ☶ Mountain\n TrigramStance.GON, // ☷ Earth\n] as const;\n\n/**\n * Fall animation states (낙법 상태)\n * @korean 낙법상태들\n */\nconst FALL_STATES: readonly AnimationState[] = [\n AnimationState.FALL_FORWARD,\n AnimationState.FALL_BACKWARD,\n AnimationState.FALL_SIDE_LEFT,\n AnimationState.FALL_SIDE_RIGHT,\n] as const;\n\n/**\n * Ground position states (지면 자세)\n * @korean 지면자세들\n */\nconst GROUND_STATES: readonly AnimationState[] = [\n AnimationState.GROUND_PRONE,\n AnimationState.GROUND_SUPINE,\n AnimationState.GROUND_SIDE_LEFT,\n AnimationState.GROUND_SIDE_RIGHT,\n] as const;\n\n/**\n * Recovery animation states (기상 애니메이션)\n * @korean 회복애니메이션들\n */\nconst RECOVERY_STATES: readonly AnimationState[] = [\n AnimationState.RECOVERY_PRONE_STANDUP,\n AnimationState.RECOVERY_SUPINE_STANDUP,\n AnimationState.RECOVERY_ROLL,\n AnimationState.RECOVERY_DEFENSIVE,\n] as const;\n\n/**\n * Generate transition rules for fall animations\n *\n * Fall animations have highest priority and can interrupt any state.\n * Falls automatically transition to ground states upon completion.\n * Ground states can transition to recovery animations.\n * Recovery animations transition to idle upon completion.\n *\n * @korean 낙법전환규칙생성\n */\nfunction generateFallTransitions(): TransitionRule[] {\n const transitions: TransitionRule[] = [];\n\n // All states (except falls and ko) can transition to fall states\n const nonFallStates: AnimationState[] = [\n AnimationState.IDLE,\n AnimationState.WALK,\n AnimationState.RUN,\n AnimationState.ATTACK,\n AnimationState.DEFEND,\n AnimationState.HIT,\n AnimationState.STANCE_CHANGE,\n AnimationState.STANCE_SIDE_SWITCH,\n ...STANCE_GUARD_STATES,\n ];\n\n for (const fromState of nonFallStates) {\n for (const fallState of FALL_STATES) {\n transitions.push({\n from: fromState,\n to: fallState,\n allowed: true,\n });\n }\n }\n\n // Fall states automatically transition to ground states (handled in state machine)\n for (const fallState of FALL_STATES) {\n // Falls can only go to their corresponding ground state\n // Use FALL_TO_GROUND_MAP for type-safe mapping\n const fallType = fallState.replace(\"fall_\", \"\");\n\n // Validate that fallType is a valid FallType before using in map\n if (\n fallType === \"forward\" ||\n fallType === \"backward\" ||\n fallType === \"side_left\" ||\n fallType === \"side_right\"\n ) {\n const groundState = FALL_TO_GROUND_MAP[fallType as FallType];\n const groundAnimState = `ground_${groundState}` as AnimationState;\n transitions.push({\n from: fallState,\n to: groundAnimState,\n allowed: true,\n });\n }\n }\n\n // Ground states can transition to recovery animations\n for (const groundState of GROUND_STATES) {\n // Allow transitions to all recovery types from any ground state\n for (const recoveryState of RECOVERY_STATES) {\n transitions.push({\n from: groundState,\n to: recoveryState,\n allowed: true,\n });\n }\n\n // Ground states can still be interrupted by hit or ko\n transitions.push(\n { from: groundState, to: AnimationState.HIT, allowed: true },\n { from: groundState, to: AnimationState.KO, allowed: true },\n );\n\n // Falls can interrupt ground states (getting hit while down)\n for (const fallState of FALL_STATES) {\n transitions.push({\n from: groundState,\n to: fallState,\n allowed: true,\n });\n }\n }\n\n // Recovery animations can be interrupted by high-priority states\n // (falls, hit, ko) but transition to idle when complete\n for (const recoveryState of RECOVERY_STATES) {\n // Falls can interrupt recovery (getting hit during recovery)\n for (const fallState of FALL_STATES) {\n transitions.push({\n from: recoveryState,\n to: fallState,\n allowed: true,\n });\n }\n\n // Hit and KO can interrupt recovery\n transitions.push(\n { from: recoveryState, to: AnimationState.HIT, allowed: true },\n { from: recoveryState, to: AnimationState.KO, allowed: true },\n );\n\n // Recovery animations automatically transition to idle (handled in state machine)\n transitions.push({\n from: recoveryState,\n to: AnimationState.IDLE,\n allowed: true,\n });\n }\n\n return transitions;\n}\n\n/**\n * Generate transition rules for stance guards\n *\n * Each stance guard can transition to:\n * - walk, run (movement)\n * - attack, defend (combat actions)\n * - step_{direction} (tactical steps while maintaining guard)\n * - stance_change (changing stance)\n * - hit, ko (being hit)\n * - other stance guards (direct stance change with guard)\n *\n * @korean 자세방어전환규칙생성\n */\nfunction generateStanceGuardTransitions(): TransitionRule[] {\n const transitions: TransitionRule[] = [];\n\n // Step directions for guard transitions\n const stepDirections: AnimationState[] = [\n AnimationState.STEP_FORWARD,\n AnimationState.STEP_BACK,\n AnimationState.STEP_LEFT,\n AnimationState.STEP_RIGHT,\n AnimationState.STEP_FORWARD_LEFT,\n AnimationState.STEP_FORWARD_RIGHT,\n AnimationState.STEP_BACK_LEFT,\n AnimationState.STEP_BACK_RIGHT,\n ];\n\n for (const guardState of STANCE_GUARD_STATES) {\n // Guard can transition to movement\n transitions.push(\n { from: guardState, to: AnimationState.IDLE, allowed: true },\n { from: guardState, to: AnimationState.WALK, allowed: true },\n { from: guardState, to: AnimationState.RUN, allowed: true },\n );\n\n // Guard can transition to combat actions\n transitions.push(\n { from: guardState, to: AnimationState.ATTACK, allowed: true },\n { from: guardState, to: AnimationState.DEFEND, allowed: true },\n { from: guardState, to: AnimationState.STANCE_CHANGE, allowed: true },\n );\n\n // Guard can transition to tactical steps (guard maintained during step)\n for (const stepDirection of stepDirections) {\n transitions.push({ from: guardState, to: stepDirection, allowed: true });\n }\n\n // Guard can be interrupted by hits\n transitions.push(\n { from: guardState, to: AnimationState.HIT, allowed: true },\n { from: guardState, to: AnimationState.KO, allowed: true },\n );\n\n // Guards can transition between each other (direct stance change)\n for (const otherGuard of STANCE_GUARD_STATES) {\n if (guardState !== otherGuard) {\n transitions.push({ from: guardState, to: otherGuard, allowed: true });\n }\n }\n\n // Other states can transition to guards\n transitions.push(\n { from: AnimationState.IDLE, to: guardState, allowed: true },\n { from: AnimationState.WALK, to: guardState, allowed: true },\n { from: AnimationState.RUN, to: guardState, allowed: true },\n { from: AnimationState.DEFEND, to: guardState, allowed: true },\n );\n\n // Steps can return to guard (guard maintained throughout step)\n for (const stepDirection of stepDirections) {\n transitions.push({ from: stepDirection, to: guardState, allowed: true });\n }\n }\n\n return transitions;\n}\n\n/**\n * Default transition rules for animation states\n *\n * @korean 기본전환규칙\n */\nexport const DEFAULT_TRANSITIONS: readonly TransitionRule[] = [\n // Idle transitions\n { from: AnimationState.IDLE, to: AnimationState.WALK, allowed: true },\n { from: AnimationState.IDLE, to: AnimationState.RUN, allowed: true },\n { from: AnimationState.IDLE, to: AnimationState.ATTACK, allowed: true },\n { from: AnimationState.IDLE, to: AnimationState.DEFEND, allowed: true },\n {\n from: AnimationState.IDLE,\n to: AnimationState.STANCE_CHANGE,\n allowed: true,\n },\n { from: AnimationState.IDLE, to: AnimationState.HIT, allowed: true },\n { from: AnimationState.IDLE, to: AnimationState.KO, allowed: true },\n\n // Walk transitions\n { from: AnimationState.WALK, to: AnimationState.IDLE, allowed: true },\n { from: AnimationState.WALK, to: AnimationState.RUN, allowed: true },\n { from: AnimationState.WALK, to: AnimationState.ATTACK, allowed: true },\n { from: AnimationState.WALK, to: AnimationState.DEFEND, allowed: true },\n {\n from: AnimationState.WALK,\n to: AnimationState.STANCE_CHANGE,\n allowed: true,\n },\n { from: AnimationState.WALK, to: AnimationState.HIT, allowed: true },\n { from: AnimationState.WALK, to: AnimationState.KO, allowed: true },\n\n // Run transitions\n { from: AnimationState.RUN, to: AnimationState.IDLE, allowed: true },\n { from: AnimationState.RUN, to: AnimationState.WALK, allowed: true },\n { from: AnimationState.RUN, to: AnimationState.ATTACK, allowed: true },\n { from: AnimationState.RUN, to: AnimationState.DEFEND, allowed: true },\n { from: AnimationState.RUN, to: AnimationState.STANCE_CHANGE, allowed: true },\n { from: AnimationState.RUN, to: AnimationState.HIT, allowed: true },\n { from: AnimationState.RUN, to: AnimationState.KO, allowed: true },\n\n // Attack transitions (typically returns to idle after completion)\n { from: AnimationState.ATTACK, to: AnimationState.IDLE, allowed: true },\n { from: AnimationState.ATTACK, to: AnimationState.HIT, allowed: true }, // Can be interrupted by hit\n { from: AnimationState.ATTACK, to: AnimationState.KO, allowed: true },\n\n // Defend transitions (typically returns to idle after completion)\n { from: AnimationState.DEFEND, to: AnimationState.IDLE, allowed: true },\n { from: AnimationState.DEFEND, to: AnimationState.WALK, allowed: true },\n { from: AnimationState.DEFEND, to: AnimationState.HIT, allowed: true }, // Can be interrupted by hit\n { from: AnimationState.DEFEND, to: AnimationState.KO, allowed: true },\n\n // Hit transitions (returns to idle after completion)\n { from: AnimationState.HIT, to: AnimationState.IDLE, allowed: true },\n { from: AnimationState.HIT, to: AnimationState.HIT, allowed: true }, // Can take multiple hits\n { from: AnimationState.HIT, to: AnimationState.KO, allowed: true },\n\n // Stance change transitions (returns to idle after completion)\n {\n from: AnimationState.STANCE_CHANGE,\n to: AnimationState.IDLE,\n allowed: true,\n },\n { from: AnimationState.STANCE_CHANGE, to: AnimationState.HIT, allowed: true }, // Can be interrupted by hit\n { from: AnimationState.STANCE_CHANGE, to: AnimationState.KO, allowed: true },\n\n // Tactical step transitions (non-interruptible, returns to idle/guard after completion)\n // Steps can be initiated from idle, walk, or guard states\n // 전진보법 (Forward Step)\n { from: AnimationState.IDLE, to: AnimationState.STEP_FORWARD, allowed: true },\n { from: AnimationState.WALK, to: AnimationState.STEP_FORWARD, allowed: true },\n { from: AnimationState.STEP_FORWARD, to: AnimationState.IDLE, allowed: true },\n { from: AnimationState.STEP_FORWARD, to: AnimationState.HIT, allowed: true }, // Can be hit during step\n { from: AnimationState.STEP_FORWARD, to: AnimationState.KO, allowed: true },\n\n // 후퇴보법 (Retreat Step)\n { from: AnimationState.IDLE, to: AnimationState.STEP_BACK, allowed: true },\n { from: AnimationState.WALK, to: AnimationState.STEP_BACK, allowed: true },\n { from: AnimationState.STEP_BACK, to: AnimationState.IDLE, allowed: true },\n { from: AnimationState.STEP_BACK, to: AnimationState.HIT, allowed: true },\n { from: AnimationState.STEP_BACK, to: AnimationState.KO, allowed: true },\n\n // 좌측면보법 (Left Side Step)\n { from: AnimationState.IDLE, to: AnimationState.STEP_LEFT, allowed: true },\n { from: AnimationState.WALK, to: AnimationState.STEP_LEFT, allowed: true },\n { from: AnimationState.STEP_LEFT, to: AnimationState.IDLE, allowed: true },\n { from: AnimationState.STEP_LEFT, to: AnimationState.HIT, allowed: true },\n { from: AnimationState.STEP_LEFT, to: AnimationState.KO, allowed: true },\n\n // 우측면보법 (Right Side Step)\n { from: AnimationState.IDLE, to: AnimationState.STEP_RIGHT, allowed: true },\n { from: AnimationState.WALK, to: AnimationState.STEP_RIGHT, allowed: true },\n { from: AnimationState.STEP_RIGHT, to: AnimationState.IDLE, allowed: true },\n { from: AnimationState.STEP_RIGHT, to: AnimationState.HIT, allowed: true },\n { from: AnimationState.STEP_RIGHT, to: AnimationState.KO, allowed: true },\n\n // 전좌측보법 (Forward-Left Diagonal Step)\n {\n from: AnimationState.IDLE,\n to: AnimationState.STEP_FORWARD_LEFT,\n allowed: true,\n },\n {\n from: AnimationState.WALK,\n to: AnimationState.STEP_FORWARD_LEFT,\n allowed: true,\n },\n {\n from: AnimationState.STEP_FORWARD_LEFT,\n to: AnimationState.IDLE,\n allowed: true,\n },\n {\n from: AnimationState.STEP_FORWARD_LEFT,\n to: AnimationState.HIT,\n allowed: true,\n },\n {\n from: AnimationState.STEP_FORWARD_LEFT,\n to: AnimationState.KO,\n allowed: true,\n },\n\n // 전우측보법 (Forward-Right Diagonal Step)\n {\n from: AnimationState.IDLE,\n to: AnimationState.STEP_FORWARD_RIGHT,\n allowed: true,\n },\n {\n from: AnimationState.WALK,\n to: AnimationState.STEP_FORWARD_RIGHT,\n allowed: true,\n },\n {\n from: AnimationState.STEP_FORWARD_RIGHT,\n to: AnimationState.IDLE,\n allowed: true,\n },\n {\n from: AnimationState.STEP_FORWARD_RIGHT,\n to: AnimationState.HIT,\n allowed: true,\n },\n {\n from: AnimationState.STEP_FORWARD_RIGHT,\n to: AnimationState.KO,\n allowed: true,\n },\n\n // 후좌측보법 (Back-Left Diagonal Step)\n {\n from: AnimationState.IDLE,\n to: AnimationState.STEP_BACK_LEFT,\n allowed: true,\n },\n {\n from: AnimationState.WALK,\n to: AnimationState.STEP_BACK_LEFT,\n allowed: true,\n },\n {\n from: AnimationState.STEP_BACK_LEFT,\n to: AnimationState.IDLE,\n allowed: true,\n },\n {\n from: AnimationState.STEP_BACK_LEFT,\n to: AnimationState.HIT,\n allowed: true,\n },\n { from: AnimationState.STEP_BACK_LEFT, to: AnimationState.KO, allowed: true },\n\n // 후우측보법 (Back-Right Diagonal Step)\n {\n from: AnimationState.IDLE,\n to: AnimationState.STEP_BACK_RIGHT,\n allowed: true,\n },\n {\n from: AnimationState.WALK,\n to: AnimationState.STEP_BACK_RIGHT,\n allowed: true,\n },\n {\n from: AnimationState.STEP_BACK_RIGHT,\n to: AnimationState.IDLE,\n allowed: true,\n },\n {\n from: AnimationState.STEP_BACK_RIGHT,\n to: AnimationState.HIT,\n allowed: true,\n },\n {\n from: AnimationState.STEP_BACK_RIGHT,\n to: AnimationState.KO,\n allowed: true,\n },\n\n // KO is terminal - no transitions out\n // (Player must be revived/reset to leave KO state)\n\n // Fall transitions (generated dynamically)\n ...generateFallTransitions(),\n\n // Stance guard transitions (generated dynamically)\n ...generateStanceGuardTransitions(),\n] as const;\n\n/**\n * Check if a transition from one animation state to another is allowed\n *\n * @param from - Source animation state\n * @param to - Target animation state\n * @param transitions - Optional custom transition rules (defaults to DEFAULT_TRANSITIONS)\n * @returns Whether the transition is allowed\n *\n * @example\n * ```typescript\n * // Valid transitions\n * isTransitionAllowed(\"idle\", \"walk\"); // true\n * isTransitionAllowed(\"attack\", \"idle\"); // true\n * isTransitionAllowed(\"hit\", \"idle\"); // true\n *\n * // Invalid transitions\n * isTransitionAllowed(\"ko\", \"idle\"); // false (KO is terminal)\n * isTransitionAllowed(\"attack\", \"walk\"); // false (must return to idle first)\n * ```\n *\n * @korean 전환허용여부확인\n */\nexport function isTransitionAllowed(\n from: AnimationState,\n to: AnimationState,\n transitions: readonly TransitionRule[] = DEFAULT_TRANSITIONS,\n): boolean {\n // Same state is always allowed\n if (from === to) {\n return true;\n }\n\n // Find matching transition rule\n const rule = transitions.find((t) => t.from === from && t.to === to);\n\n if (!rule) {\n return false;\n }\n\n // Check condition if provided\n if (rule.condition) {\n return rule.condition();\n }\n\n return rule.allowed;\n}\n\n/**\n * Get all valid transitions from a given animation state\n *\n * @param from - Source animation state\n * @param transitions - Optional custom transition rules (defaults to DEFAULT_TRANSITIONS)\n * @returns Array of allowed target animation states\n *\n * @example\n * ```typescript\n * getValidTransitions(\"idle\");\n * // Returns: [\"walk\", \"run\", \"attack\", \"defend\", \"stance_change\", \"hit\", \"ko\"]\n *\n * getValidTransitions(\"ko\");\n * // Returns: [] (KO is terminal)\n * ```\n *\n * @korean 유효전환목록가져오기\n */\nexport function getValidTransitions(\n from: AnimationState,\n transitions: readonly TransitionRule[] = DEFAULT_TRANSITIONS,\n): AnimationState[] {\n return transitions\n .filter((t) => t.from === from && t.allowed)\n .map((t) => t.to)\n .filter((to) => isTransitionAllowed(from, to, transitions));\n}\n\n/**\n * Build a transition map for fast lookups\n *\n * @param transitions - Transition rules to build map from\n * @returns Map of from->to->allowed\n *\n * @korean 전환맵생성\n */\nexport function buildTransitionMap(\n transitions: readonly TransitionRule[] = DEFAULT_TRANSITIONS,\n): Map<AnimationState, Set<AnimationState>> {\n const map = new Map<AnimationState, Set<AnimationState>>();\n\n for (const rule of transitions) {\n if (!rule.allowed) continue;\n\n if (!map.has(rule.from)) {\n map.set(rule.from, new Set());\n }\n\n map.get(rule.from)?.add(rule.to);\n }\n\n return map;\n}\n\n/**\n * Calculate stance adjacency (distance around the stance wheel)\n *\n * **Korean**: 자세 인접도 계산\n *\n * Determines how many steps apart two stances are on the octagonal stance wheel.\n * Returns 0 for same stance, 1-3 for adjacent stances, 4 for opposite stances.\n *\n * @param from - Source stance\n * @param to - Target stance\n * @returns Number of steps apart (0-4)\n *\n * @example\n * ```typescript\n * calculateStanceDistance(TrigramStance.GEON, TrigramStance.TAE); // 1 (adjacent)\n * calculateStanceDistance(TrigramStance.GEON, TrigramStance.SON); // 4 (opposite)\n * calculateStanceDistance(TrigramStance.GEON, TrigramStance.GEON); // 0 (same)\n * ```\n *\n * @korean 자세거리계산\n */\nexport function calculateStanceDistance(\n from: TrigramStance,\n to: TrigramStance,\n): number {\n if (from === to) return 0;\n\n const fromIndex = TRIGRAM_STANCES_ORDER.indexOf(from);\n const toIndex = TRIGRAM_STANCES_ORDER.indexOf(to);\n\n if (fromIndex === -1 || toIndex === -1) {\n console.warn(`Invalid stance in distance calculation: ${from} -> ${to}`);\n return 4; // Treat as opposite stance\n }\n\n // Calculate shortest distance around the circular wheel\n const directDistance = Math.abs(toIndex - fromIndex);\n const wrapDistance = TRIGRAM_STANCES_ORDER.length - directDistance;\n\n return Math.min(directDistance, wrapDistance);\n}\n\n/**\n * Determine transition type based on stance distance\n *\n * **Korean**: 전환 유형 결정\n *\n * Classifies transition as direct (adjacent), indirect (opposite), or self.\n *\n * @param from - Source stance\n * @param to - Target stance\n * @returns Transition type\n *\n * @korean 전환유형결정\n */\nexport function determineTransitionType(\n from: TrigramStance,\n to: TrigramStance,\n): StanceTransitionType {\n const distance = calculateStanceDistance(from, to);\n\n if (distance === 0) return \"self\";\n if (distance <= 2) return \"direct\"; // Adjacent or near-adjacent\n return \"indirect\"; // Opposite or far apart\n}\n\n/**\n * Generate keyframes for direct stance transition (adjacent stances)\n *\n * **Korean**: 직접 전환 키프레임 생성\n *\n * Creates smooth keyframes for transitions between adjacent stances.\n * Phase breakdown:\n * - Frames 0-12: Weight shift away from source stance\n * - Frames 12-24: Foot repositioning\n * - Frames 24-36: Guard change to target stance\n *\n * @param from - Source stance\n * @param to - Target stance\n * @returns Array of keyframes\n *\n * @korean 직접전환키프레임생성\n */\nfunction generateDirectTransitionKeyframes(\n from: TrigramStance,\n to: TrigramStance,\n): readonly StanceTransitionKeyframe[] {\n return [\n // Phase 1: Initial weight shift (frames 0-12)\n { frame: 0, stance: from, blend: 1.0 },\n { frame: 6, stance: from, blend: 0.8 },\n { frame: 12, stance: \"neutral\", blend: 0.5 },\n\n // Phase 2: Foot repositioning (frames 12-24)\n { frame: 18, stance: \"neutral\", blend: 0.4 },\n { frame: 24, stance: to, blend: 0.3 },\n\n // Phase 3: Guard position change (frames 24-36)\n { frame: 30, stance: to, blend: 0.7 },\n { frame: 36, stance: to, blend: 1.0 },\n ];\n}\n\n/**\n * Generate keyframes for indirect stance transition (opposite stances)\n *\n * **Korean**: 간접 전환 키프레임 생성\n *\n * Creates keyframes for transitions between opposite stances via neutral position.\n * Longer neutral phase for more complex repositioning.\n *\n * @param from - Source stance\n * @param to - Target stance\n * @returns Array of keyframes\n *\n * @korean 간접전환키프레임생성\n */\nfunction generateIndirectTransitionKeyframes(\n from: TrigramStance,\n to: TrigramStance,\n): readonly StanceTransitionKeyframe[] {\n return [\n // Phase 1: Exit source stance (frames 0-12)\n { frame: 0, stance: from, blend: 1.0 },\n { frame: 6, stance: from, blend: 0.7 },\n { frame: 12, stance: \"neutral\", blend: 0.5 },\n\n // Phase 2: Extended neutral position (frames 12-24)\n { frame: 18, stance: \"neutral\", blend: 0.5 },\n { frame: 24, stance: \"neutral\", blend: 0.4 },\n\n // Phase 3: Enter target stance (frames 24-36)\n { frame: 30, stance: to, blend: 0.6 },\n { frame: 36, stance: to, blend: 1.0 },\n ];\n}\n\n/**\n * Create a stance transition configuration\n *\n * **Korean**: 자세 전환 생성\n *\n * Generates complete transition configuration between two stances.\n *\n * @param from - Source stance\n * @param to - Target stance\n * @returns Complete stance transition configuration\n *\n * @korean 자세전환생성\n */\nexport function createStanceTransition(\n from: TrigramStance,\n to: TrigramStance,\n): StanceTransition {\n const type = determineTransitionType(from, to);\n\n // Self-transition (no animation)\n if (type === \"self\") {\n return {\n from,\n to,\n type: \"self\",\n duration: 0,\n keyframes: [{ frame: 0, stance: from, blend: 1.0 }],\n description: {\n korean: `${from} 자세 유지`,\n english: `Maintain ${from} stance`,\n },\n };\n }\n\n // Generate keyframes based on transition type\n const keyframes =\n type === \"direct\"\n ? generateDirectTransitionKeyframes(from, to)\n : generateIndirectTransitionKeyframes(from, to);\n\n return {\n from,\n to,\n type,\n duration: 600, // 600ms standard transition\n keyframes,\n description: {\n korean: `${from}에서 ${to}로 전환`,\n english: `Transition from ${from} to ${to}`,\n },\n };\n}\n\n/**\n * Stance transition matrix containing all 64 transitions (8x8)\n *\n * **Korean**: 팔괘 전환 행렬\n *\n * Maps from every stance to every other stance, including self-transitions.\n * Key format: \"from_to\" (e.g., \"geon_tae\")\n *\n * Total transitions: 64 (8 source stances × 8 target stances)\n * - 8 self-transitions (0ms)\n * - ~24 direct transitions (600ms, adjacent stances)\n * - ~32 indirect transitions (600ms, opposite stances)\n *\n * @korean 팔괘전환행렬\n */\nexport const STANCE_TRANSITIONS: Map<string, StanceTransition> = new Map();\n\n/**\n * Initialize the stance transition matrix\n *\n * **Korean**: 전환 행렬 초기화\n *\n * Generates all 64 stance transitions and populates the transition map.\n * Call this during system initialization.\n *\n * @korean 전환행렬초기화\n */\nexport function initializeStanceTransitions(): void {\n // Generate all 64 transitions (8 from × 8 to)\n for (const from of TRIGRAM_STANCES_ORDER) {\n for (const to of TRIGRAM_STANCES_ORDER) {\n const key = `${from}_${to}`;\n const transition = createStanceTransition(from, to);\n STANCE_TRANSITIONS.set(key, transition);\n }\n }\n\n if (process.env.NODE_ENV === \"development\") {\n console.log(\n `[StanceTransitions] Initialized ${STANCE_TRANSITIONS.size} stance transitions`,\n );\n }\n}\n\n/**\n * Get stance transition configuration\n *\n * **Korean**: 자세 전환 가져오기\n *\n * Retrieves the transition configuration for moving from one stance to another.\n *\n * @param from - Source stance\n * @param to - Target stance\n * @returns Transition configuration, or undefined if not found\n *\n * @example\n * ```typescript\n * const transition = getStanceTransition(TrigramStance.GEON, TrigramStance.TAE);\n * console.log(transition.duration); // 600\n * console.log(transition.type); // \"direct\"\n * ```\n *\n * @korean 자세전환가져오기\n */\nexport function getStanceTransition(\n from: TrigramStance,\n to: TrigramStance,\n): StanceTransition | undefined {\n const key = `${from}_${to}`;\n return STANCE_TRANSITIONS.get(key);\n}\n\n/**\n * Get all valid transitions from a stance\n *\n * **Korean**: 유효한 전환 목록\n *\n * Returns all possible transitions from the given stance.\n *\n * @param from - Source stance\n * @returns Array of all transitions from this stance\n *\n * @korean 유효한전환목록\n */\nexport function getTransitionsFromStance(\n from: TrigramStance,\n): StanceTransition[] {\n const transitions: StanceTransition[] = [];\n\n for (const to of TRIGRAM_STANCES_ORDER) {\n const transition = getStanceTransition(from, to);\n if (transition) {\n transitions.push(transition);\n }\n }\n\n return transitions;\n}\n\n/**\n * Clear all cached stance transitions\n *\n * **Korean**: 자세 전환 캐시 초기화\n *\n * Clears the stance transition cache to free memory.\n * Useful for session cleanup or hot reloading.\n * Call initializeStanceTransitions() to repopulate after clearing.\n *\n * @korean 자세전환캐시초기화\n */\nexport function clearStanceTransitions(): void {\n STANCE_TRANSITIONS.clear();\n}\n\n// Note: For production use, consider calling initializeStanceTransitions()\n// during application startup to avoid blocking the main thread.\n// For now, initialize on module load for convenience.\ninitializeStanceTransitions();\n"],"mappings":"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"}
1
+ {"version":3,"file":"AnimationTransitions.js","names":[],"sources":["../../../../src/systems/animation/core/AnimationTransitions.ts"],"sourcesContent":["/**\n * Animation transition rules for Black Trigram\n *\n * Defines valid transitions between animation states.\n * Based on game-design.md specifications and combat flow.\n *\n * Transition rules:\n * - idle ↔ walk ↔ run (movement states)\n * - stance_guard_{stance} ↔ other states (stance-specific guards)\n * - attack → idle (after completion)\n * - defend → idle (after completion)\n * - hit → idle (after completion)\n * - stance_change → idle (after completion)\n * - ko is terminal (no transitions out)\n * - hit can interrupt any non-ko state (high priority)\n *\n * @module systems/animation/AnimationTransitions\n * @category Animation\n * @korean 애니메이션전환\n */\n\nimport { KoreanText } from \"@/types\";\nimport { TrigramStance } from \"@/types/common\";\nimport {\n AnimationState,\n FALL_TO_GROUND_MAP,\n FallType,\n TransitionRule,\n} from \"./types\";\n\n/**\n * Stance guard animation states (팔괘 방어 자세)\n * @korean 자세방어상태들\n */\nconst STANCE_GUARD_STATES: readonly AnimationState[] = [\n AnimationState.STANCE_GUARD_GEON,\n AnimationState.STANCE_GUARD_TAE,\n AnimationState.STANCE_GUARD_LI,\n AnimationState.STANCE_GUARD_JIN,\n AnimationState.STANCE_GUARD_SON,\n AnimationState.STANCE_GUARD_GAM,\n AnimationState.STANCE_GUARD_GAN,\n AnimationState.STANCE_GUARD_GON,\n] as const;\n\n/**\n * Type of stance transition based on stance adjacency\n *\n * **Korean**: 자세 전환 유형\n *\n * - **direct**: Adjacent stances (e.g., geon→tae) - smooth, fast transition\n * - **indirect**: Opposite stances (e.g., geon→gon) - requires intermediate neutral position\n * - **self**: Same stance (no transition needed)\n *\n * @category Animation\n * @korean 자세전환유형\n */\nexport type StanceTransitionType = \"direct\" | \"indirect\" | \"self\";\n\n/**\n * Keyframe for stance transition animation with blend weight\n *\n * **Korean**: 자세 전환 키프레임\n *\n * Defines a single keyframe in a stance transition animation, specifying\n * which stance pose to blend and how much weight to apply.\n *\n * @category Animation\n * @korean 자세전환키프레임\n */\nexport interface StanceTransitionKeyframe {\n /** Frame number (0-36 for 600ms at 60fps) */\n readonly frame: number;\n /** Stance pose to blend towards */\n readonly stance: TrigramStance | \"neutral\";\n /** Blend weight (0.0 to 1.0) */\n readonly blend: number;\n}\n\n/**\n * Complete stance transition animation configuration\n *\n * **Korean**: 자세 전환 애니메이션\n *\n * Defines a complete transition animation between two trigram stances,\n * including keyframes, timing, and transition type.\n *\n * @category Animation\n * @korean 자세전환애니메이션\n */\nexport interface StanceTransition {\n /** Source stance */\n readonly from: TrigramStance;\n /** Target stance */\n readonly to: TrigramStance;\n /** Transition type based on adjacency */\n readonly type: StanceTransitionType;\n /** Duration in milliseconds (600ms standard) */\n readonly duration: number;\n /** Animation keyframes */\n readonly keyframes: readonly StanceTransitionKeyframe[];\n /** Bilingual description */\n readonly description: KoreanText;\n}\n\n/**\n * Order of trigram stances in the stance wheel (circular arrangement)\n *\n * **Korean**: 팔괘 순서\n *\n * The 8 trigrams arranged in traditional order around the Bagua octagon.\n * Adjacent stances in this array are considered \"adjacent\" for transition purposes.\n *\n * @korean 팔괘순서\n */\nexport const TRIGRAM_STANCES_ORDER: readonly TrigramStance[] = [\n TrigramStance.GEON, // ☰ Heaven\n TrigramStance.TAE, // ☱ Lake\n TrigramStance.LI, // ☲ Fire\n TrigramStance.JIN, // ☳ Thunder\n TrigramStance.SON, // ☴ Wind\n TrigramStance.GAM, // ☵ Water\n TrigramStance.GAN, // ☶ Mountain\n TrigramStance.GON, // ☷ Earth\n] as const;\n\n/**\n * Fall animation states (낙법 상태)\n * @korean 낙법상태들\n */\nconst FALL_STATES: readonly AnimationState[] = [\n AnimationState.FALL_FORWARD,\n AnimationState.FALL_BACKWARD,\n AnimationState.FALL_SIDE_LEFT,\n AnimationState.FALL_SIDE_RIGHT,\n] as const;\n\n/**\n * Ground position states (지면 자세)\n * @korean 지면자세들\n */\nconst GROUND_STATES: readonly AnimationState[] = [\n AnimationState.GROUND_PRONE,\n AnimationState.GROUND_SUPINE,\n AnimationState.GROUND_SIDE_LEFT,\n AnimationState.GROUND_SIDE_RIGHT,\n] as const;\n\n/**\n * Recovery animation states (기상 애니메이션)\n * @korean 회복애니메이션들\n */\nconst RECOVERY_STATES: readonly AnimationState[] = [\n AnimationState.RECOVERY_PRONE_STANDUP,\n AnimationState.RECOVERY_SUPINE_STANDUP,\n AnimationState.RECOVERY_ROLL,\n AnimationState.RECOVERY_DEFENSIVE,\n] as const;\n\n/**\n * Generate transition rules for fall animations\n *\n * Fall animations have highest priority and can interrupt any state.\n * Falls automatically transition to ground states upon completion.\n * Ground states can transition to recovery animations.\n * Recovery animations transition to idle upon completion.\n *\n * @korean 낙법전환규칙생성\n */\nfunction generateFallTransitions(): TransitionRule[] {\n const transitions: TransitionRule[] = [];\n\n // All states (except falls and ko) can transition to fall states\n const nonFallStates: AnimationState[] = [\n AnimationState.IDLE,\n AnimationState.WALK,\n AnimationState.RUN,\n AnimationState.ATTACK,\n AnimationState.DEFEND,\n AnimationState.HIT,\n AnimationState.STANCE_CHANGE,\n AnimationState.STANCE_SIDE_SWITCH,\n ...STANCE_GUARD_STATES,\n ];\n\n for (const fromState of nonFallStates) {\n for (const fallState of FALL_STATES) {\n transitions.push({\n from: fromState,\n to: fallState,\n allowed: true,\n });\n }\n }\n\n // Fall states automatically transition to ground states (handled in state machine)\n for (const fallState of FALL_STATES) {\n // Falls can only go to their corresponding ground state\n // Use FALL_TO_GROUND_MAP for type-safe mapping\n const fallType = fallState.replace(\"fall_\", \"\");\n\n // Validate that fallType is a valid FallType before using in map\n if (\n fallType === \"forward\" ||\n fallType === \"backward\" ||\n fallType === \"side_left\" ||\n fallType === \"side_right\"\n ) {\n const groundState = FALL_TO_GROUND_MAP[fallType as FallType];\n const groundAnimState = `ground_${groundState}` as AnimationState;\n transitions.push({\n from: fallState,\n to: groundAnimState,\n allowed: true,\n });\n }\n }\n\n // Ground states can transition to recovery animations\n for (const groundState of GROUND_STATES) {\n // Allow transitions to all recovery types from any ground state\n for (const recoveryState of RECOVERY_STATES) {\n transitions.push({\n from: groundState,\n to: recoveryState,\n allowed: true,\n });\n }\n\n // Ground states can still be interrupted by hit or ko\n transitions.push(\n { from: groundState, to: AnimationState.HIT, allowed: true },\n { from: groundState, to: AnimationState.KO, allowed: true },\n );\n\n // Falls can interrupt ground states (getting hit while down)\n for (const fallState of FALL_STATES) {\n transitions.push({\n from: groundState,\n to: fallState,\n allowed: true,\n });\n }\n }\n\n // Recovery animations can be interrupted by high-priority states\n // (falls, hit, ko) but transition to idle when complete\n for (const recoveryState of RECOVERY_STATES) {\n // Falls can interrupt recovery (getting hit during recovery)\n for (const fallState of FALL_STATES) {\n transitions.push({\n from: recoveryState,\n to: fallState,\n allowed: true,\n });\n }\n\n // Hit and KO can interrupt recovery\n transitions.push(\n { from: recoveryState, to: AnimationState.HIT, allowed: true },\n { from: recoveryState, to: AnimationState.KO, allowed: true },\n );\n\n // Recovery animations automatically transition to idle (handled in state machine)\n transitions.push({\n from: recoveryState,\n to: AnimationState.IDLE,\n allowed: true,\n });\n }\n\n return transitions;\n}\n\n/**\n * Generate transition rules for stance guards\n *\n * Each stance guard can transition to:\n * - walk, run (movement)\n * - attack, defend (combat actions)\n * - step_{direction} (tactical steps while maintaining guard)\n * - stance_change (changing stance)\n * - hit, ko (being hit)\n * - other stance guards (direct stance change with guard)\n *\n * @korean 자세방어전환규칙생성\n */\nfunction generateStanceGuardTransitions(): TransitionRule[] {\n const transitions: TransitionRule[] = [];\n\n // Step directions for guard transitions\n const stepDirections: AnimationState[] = [\n AnimationState.STEP_FORWARD,\n AnimationState.STEP_BACK,\n AnimationState.STEP_LEFT,\n AnimationState.STEP_RIGHT,\n AnimationState.STEP_FORWARD_LEFT,\n AnimationState.STEP_FORWARD_RIGHT,\n AnimationState.STEP_BACK_LEFT,\n AnimationState.STEP_BACK_RIGHT,\n ];\n\n for (const guardState of STANCE_GUARD_STATES) {\n // Guard can transition to movement\n transitions.push(\n { from: guardState, to: AnimationState.IDLE, allowed: true },\n { from: guardState, to: AnimationState.WALK, allowed: true },\n { from: guardState, to: AnimationState.RUN, allowed: true },\n );\n\n // Guard can transition to combat actions\n transitions.push(\n { from: guardState, to: AnimationState.ATTACK, allowed: true },\n { from: guardState, to: AnimationState.DEFEND, allowed: true },\n { from: guardState, to: AnimationState.STANCE_CHANGE, allowed: true },\n );\n\n // Guard can transition to tactical steps (guard maintained during step)\n for (const stepDirection of stepDirections) {\n transitions.push({ from: guardState, to: stepDirection, allowed: true });\n }\n\n // Guard can be interrupted by hits\n transitions.push(\n { from: guardState, to: AnimationState.HIT, allowed: true },\n { from: guardState, to: AnimationState.KO, allowed: true },\n );\n\n // Guards can transition between each other (direct stance change)\n for (const otherGuard of STANCE_GUARD_STATES) {\n if (guardState !== otherGuard) {\n transitions.push({ from: guardState, to: otherGuard, allowed: true });\n }\n }\n\n // Other states can transition to guards\n transitions.push(\n { from: AnimationState.IDLE, to: guardState, allowed: true },\n { from: AnimationState.WALK, to: guardState, allowed: true },\n { from: AnimationState.RUN, to: guardState, allowed: true },\n { from: AnimationState.DEFEND, to: guardState, allowed: true },\n );\n\n // Steps can return to guard (guard maintained throughout step)\n for (const stepDirection of stepDirections) {\n transitions.push({ from: stepDirection, to: guardState, allowed: true });\n }\n }\n\n return transitions;\n}\n\n/**\n * Default transition rules for animation states\n *\n * @korean 기본전환규칙\n */\nexport const DEFAULT_TRANSITIONS: readonly TransitionRule[] = [\n // Idle transitions\n { from: AnimationState.IDLE, to: AnimationState.WALK, allowed: true },\n { from: AnimationState.IDLE, to: AnimationState.RUN, allowed: true },\n { from: AnimationState.IDLE, to: AnimationState.ATTACK, allowed: true },\n { from: AnimationState.IDLE, to: AnimationState.DEFEND, allowed: true },\n {\n from: AnimationState.IDLE,\n to: AnimationState.STANCE_CHANGE,\n allowed: true,\n },\n { from: AnimationState.IDLE, to: AnimationState.HIT, allowed: true },\n { from: AnimationState.IDLE, to: AnimationState.KO, allowed: true },\n\n // Walk transitions\n { from: AnimationState.WALK, to: AnimationState.IDLE, allowed: true },\n { from: AnimationState.WALK, to: AnimationState.RUN, allowed: true },\n { from: AnimationState.WALK, to: AnimationState.ATTACK, allowed: true },\n { from: AnimationState.WALK, to: AnimationState.DEFEND, allowed: true },\n {\n from: AnimationState.WALK,\n to: AnimationState.STANCE_CHANGE,\n allowed: true,\n },\n { from: AnimationState.WALK, to: AnimationState.HIT, allowed: true },\n { from: AnimationState.WALK, to: AnimationState.KO, allowed: true },\n\n // Run transitions\n { from: AnimationState.RUN, to: AnimationState.IDLE, allowed: true },\n { from: AnimationState.RUN, to: AnimationState.WALK, allowed: true },\n { from: AnimationState.RUN, to: AnimationState.ATTACK, allowed: true },\n { from: AnimationState.RUN, to: AnimationState.DEFEND, allowed: true },\n { from: AnimationState.RUN, to: AnimationState.STANCE_CHANGE, allowed: true },\n { from: AnimationState.RUN, to: AnimationState.HIT, allowed: true },\n { from: AnimationState.RUN, to: AnimationState.KO, allowed: true },\n\n // Attack transitions (typically returns to idle after completion)\n { from: AnimationState.ATTACK, to: AnimationState.IDLE, allowed: true },\n { from: AnimationState.ATTACK, to: AnimationState.HIT, allowed: true }, // Can be interrupted by hit\n { from: AnimationState.ATTACK, to: AnimationState.KO, allowed: true },\n\n // Defend transitions (typically returns to idle after completion)\n { from: AnimationState.DEFEND, to: AnimationState.IDLE, allowed: true },\n { from: AnimationState.DEFEND, to: AnimationState.WALK, allowed: true },\n { from: AnimationState.DEFEND, to: AnimationState.HIT, allowed: true }, // Can be interrupted by hit\n { from: AnimationState.DEFEND, to: AnimationState.KO, allowed: true },\n\n // Hit transitions (returns to idle after completion)\n { from: AnimationState.HIT, to: AnimationState.IDLE, allowed: true },\n { from: AnimationState.HIT, to: AnimationState.HIT, allowed: true }, // Can take multiple hits\n { from: AnimationState.HIT, to: AnimationState.KO, allowed: true },\n\n // Stance change transitions (returns to idle after completion)\n {\n from: AnimationState.STANCE_CHANGE,\n to: AnimationState.IDLE,\n allowed: true,\n },\n { from: AnimationState.STANCE_CHANGE, to: AnimationState.HIT, allowed: true }, // Can be interrupted by hit\n { from: AnimationState.STANCE_CHANGE, to: AnimationState.KO, allowed: true },\n\n // Tactical step transitions (non-interruptible, returns to idle/guard after completion)\n // Steps can be initiated from idle, walk, or guard states\n // 전진보법 (Forward Step)\n { from: AnimationState.IDLE, to: AnimationState.STEP_FORWARD, allowed: true },\n { from: AnimationState.WALK, to: AnimationState.STEP_FORWARD, allowed: true },\n { from: AnimationState.STEP_FORWARD, to: AnimationState.IDLE, allowed: true },\n { from: AnimationState.STEP_FORWARD, to: AnimationState.HIT, allowed: true }, // Can be hit during step\n { from: AnimationState.STEP_FORWARD, to: AnimationState.KO, allowed: true },\n\n // 후퇴보법 (Retreat Step)\n { from: AnimationState.IDLE, to: AnimationState.STEP_BACK, allowed: true },\n { from: AnimationState.WALK, to: AnimationState.STEP_BACK, allowed: true },\n { from: AnimationState.STEP_BACK, to: AnimationState.IDLE, allowed: true },\n { from: AnimationState.STEP_BACK, to: AnimationState.HIT, allowed: true },\n { from: AnimationState.STEP_BACK, to: AnimationState.KO, allowed: true },\n\n // 좌측면보법 (Left Side Step)\n { from: AnimationState.IDLE, to: AnimationState.STEP_LEFT, allowed: true },\n { from: AnimationState.WALK, to: AnimationState.STEP_LEFT, allowed: true },\n { from: AnimationState.STEP_LEFT, to: AnimationState.IDLE, allowed: true },\n { from: AnimationState.STEP_LEFT, to: AnimationState.HIT, allowed: true },\n { from: AnimationState.STEP_LEFT, to: AnimationState.KO, allowed: true },\n\n // 우측면보법 (Right Side Step)\n { from: AnimationState.IDLE, to: AnimationState.STEP_RIGHT, allowed: true },\n { from: AnimationState.WALK, to: AnimationState.STEP_RIGHT, allowed: true },\n { from: AnimationState.STEP_RIGHT, to: AnimationState.IDLE, allowed: true },\n { from: AnimationState.STEP_RIGHT, to: AnimationState.HIT, allowed: true },\n { from: AnimationState.STEP_RIGHT, to: AnimationState.KO, allowed: true },\n\n // 전좌측보법 (Forward-Left Diagonal Step)\n {\n from: AnimationState.IDLE,\n to: AnimationState.STEP_FORWARD_LEFT,\n allowed: true,\n },\n {\n from: AnimationState.WALK,\n to: AnimationState.STEP_FORWARD_LEFT,\n allowed: true,\n },\n {\n from: AnimationState.STEP_FORWARD_LEFT,\n to: AnimationState.IDLE,\n allowed: true,\n },\n {\n from: AnimationState.STEP_FORWARD_LEFT,\n to: AnimationState.HIT,\n allowed: true,\n },\n {\n from: AnimationState.STEP_FORWARD_LEFT,\n to: AnimationState.KO,\n allowed: true,\n },\n\n // 전우측보법 (Forward-Right Diagonal Step)\n {\n from: AnimationState.IDLE,\n to: AnimationState.STEP_FORWARD_RIGHT,\n allowed: true,\n },\n {\n from: AnimationState.WALK,\n to: AnimationState.STEP_FORWARD_RIGHT,\n allowed: true,\n },\n {\n from: AnimationState.STEP_FORWARD_RIGHT,\n to: AnimationState.IDLE,\n allowed: true,\n },\n {\n from: AnimationState.STEP_FORWARD_RIGHT,\n to: AnimationState.HIT,\n allowed: true,\n },\n {\n from: AnimationState.STEP_FORWARD_RIGHT,\n to: AnimationState.KO,\n allowed: true,\n },\n\n // 후좌측보법 (Back-Left Diagonal Step)\n {\n from: AnimationState.IDLE,\n to: AnimationState.STEP_BACK_LEFT,\n allowed: true,\n },\n {\n from: AnimationState.WALK,\n to: AnimationState.STEP_BACK_LEFT,\n allowed: true,\n },\n {\n from: AnimationState.STEP_BACK_LEFT,\n to: AnimationState.IDLE,\n allowed: true,\n },\n {\n from: AnimationState.STEP_BACK_LEFT,\n to: AnimationState.HIT,\n allowed: true,\n },\n { from: AnimationState.STEP_BACK_LEFT, to: AnimationState.KO, allowed: true },\n\n // 후우측보법 (Back-Right Diagonal Step)\n {\n from: AnimationState.IDLE,\n to: AnimationState.STEP_BACK_RIGHT,\n allowed: true,\n },\n {\n from: AnimationState.WALK,\n to: AnimationState.STEP_BACK_RIGHT,\n allowed: true,\n },\n {\n from: AnimationState.STEP_BACK_RIGHT,\n to: AnimationState.IDLE,\n allowed: true,\n },\n {\n from: AnimationState.STEP_BACK_RIGHT,\n to: AnimationState.HIT,\n allowed: true,\n },\n {\n from: AnimationState.STEP_BACK_RIGHT,\n to: AnimationState.KO,\n allowed: true,\n },\n\n // KO is terminal - no transitions out\n // (Player must be revived/reset to leave KO state)\n\n // Fall transitions (generated dynamically)\n ...generateFallTransitions(),\n\n // Stance guard transitions (generated dynamically)\n ...generateStanceGuardTransitions(),\n] as const;\n\n/**\n * Check if a transition from one animation state to another is allowed\n *\n * @param from - Source animation state\n * @param to - Target animation state\n * @param transitions - Optional custom transition rules (defaults to DEFAULT_TRANSITIONS)\n * @returns Whether the transition is allowed\n *\n * @example\n * ```typescript\n * // Valid transitions\n * isTransitionAllowed(\"idle\", \"walk\"); // true\n * isTransitionAllowed(\"attack\", \"idle\"); // true\n * isTransitionAllowed(\"hit\", \"idle\"); // true\n *\n * // Invalid transitions\n * isTransitionAllowed(\"ko\", \"idle\"); // false (KO is terminal)\n * isTransitionAllowed(\"attack\", \"walk\"); // false (must return to idle first)\n * ```\n *\n * @korean 전환허용여부확인\n */\nexport function isTransitionAllowed(\n from: AnimationState,\n to: AnimationState,\n transitions: readonly TransitionRule[] = DEFAULT_TRANSITIONS,\n): boolean {\n // Same state is always allowed\n if (from === to) {\n return true;\n }\n\n // Find matching transition rule\n const rule = transitions.find((t) => t.from === from && t.to === to);\n\n if (!rule) {\n return false;\n }\n\n // Check condition if provided\n if (rule.condition) {\n return rule.condition();\n }\n\n return rule.allowed;\n}\n\n/**\n * Get all valid transitions from a given animation state\n *\n * @param from - Source animation state\n * @param transitions - Optional custom transition rules (defaults to DEFAULT_TRANSITIONS)\n * @returns Array of allowed target animation states\n *\n * @example\n * ```typescript\n * getValidTransitions(\"idle\");\n * // Returns: [\"walk\", \"run\", \"attack\", \"defend\", \"stance_change\", \"hit\", \"ko\"]\n *\n * getValidTransitions(\"ko\");\n * // Returns: [] (KO is terminal)\n * ```\n *\n * @korean 유효전환목록가져오기\n */\nexport function getValidTransitions(\n from: AnimationState,\n transitions: readonly TransitionRule[] = DEFAULT_TRANSITIONS,\n): AnimationState[] {\n return transitions\n .filter((t) => t.from === from && t.allowed)\n .map((t) => t.to)\n .filter((to) => isTransitionAllowed(from, to, transitions));\n}\n\n/**\n * Build a transition map for fast lookups\n *\n * @param transitions - Transition rules to build map from\n * @returns Map of from->to->allowed\n *\n * @korean 전환맵생성\n */\nexport function buildTransitionMap(\n transitions: readonly TransitionRule[] = DEFAULT_TRANSITIONS,\n): Map<AnimationState, Set<AnimationState>> {\n const map = new Map<AnimationState, Set<AnimationState>>();\n\n for (const rule of transitions) {\n if (!rule.allowed) continue;\n\n if (!map.has(rule.from)) {\n map.set(rule.from, new Set());\n }\n\n map.get(rule.from)?.add(rule.to);\n }\n\n return map;\n}\n\n/**\n * Calculate stance adjacency (distance around the stance wheel)\n *\n * **Korean**: 자세 인접도 계산\n *\n * Determines how many steps apart two stances are on the octagonal stance wheel.\n * Returns 0 for same stance, 1-3 for adjacent stances, 4 for opposite stances.\n *\n * @param from - Source stance\n * @param to - Target stance\n * @returns Number of steps apart (0-4)\n *\n * @example\n * ```typescript\n * calculateStanceDistance(TrigramStance.GEON, TrigramStance.TAE); // 1 (adjacent)\n * calculateStanceDistance(TrigramStance.GEON, TrigramStance.SON); // 4 (opposite)\n * calculateStanceDistance(TrigramStance.GEON, TrigramStance.GEON); // 0 (same)\n * ```\n *\n * @korean 자세거리계산\n */\nexport function calculateStanceDistance(\n from: TrigramStance,\n to: TrigramStance,\n): number {\n if (from === to) return 0;\n\n const fromIndex = TRIGRAM_STANCES_ORDER.indexOf(from);\n const toIndex = TRIGRAM_STANCES_ORDER.indexOf(to);\n\n if (fromIndex === -1 || toIndex === -1) {\n console.warn(`Invalid stance in distance calculation: ${from} -> ${to}`);\n return 4; // Treat as opposite stance\n }\n\n // Calculate shortest distance around the circular wheel\n const directDistance = Math.abs(toIndex - fromIndex);\n const wrapDistance = TRIGRAM_STANCES_ORDER.length - directDistance;\n\n return Math.min(directDistance, wrapDistance);\n}\n\n/**\n * Determine transition type based on stance distance\n *\n * **Korean**: 전환 유형 결정\n *\n * Classifies transition as direct (adjacent), indirect (opposite), or self.\n *\n * @param from - Source stance\n * @param to - Target stance\n * @returns Transition type\n *\n * @korean 전환유형결정\n */\nexport function determineTransitionType(\n from: TrigramStance,\n to: TrigramStance,\n): StanceTransitionType {\n const distance = calculateStanceDistance(from, to);\n\n if (distance === 0) return \"self\";\n if (distance <= 2) return \"direct\"; // Adjacent or near-adjacent\n return \"indirect\"; // Opposite or far apart\n}\n\n/**\n * Generate keyframes for direct stance transition (adjacent stances)\n *\n * **Korean**: 직접 전환 키프레임 생성\n *\n * Creates smooth keyframes for transitions between adjacent stances.\n * Phase breakdown:\n * - Frames 0-12: Weight shift away from source stance\n * - Frames 12-24: Foot repositioning\n * - Frames 24-36: Guard change to target stance\n *\n * @param from - Source stance\n * @param to - Target stance\n * @returns Array of keyframes\n *\n * @korean 직접전환키프레임생성\n */\nfunction generateDirectTransitionKeyframes(\n from: TrigramStance,\n to: TrigramStance,\n): readonly StanceTransitionKeyframe[] {\n return [\n // Phase 1: Initial weight shift (frames 0-12)\n { frame: 0, stance: from, blend: 1.0 },\n { frame: 6, stance: from, blend: 0.8 },\n { frame: 12, stance: \"neutral\", blend: 0.5 },\n\n // Phase 2: Foot repositioning (frames 12-24)\n { frame: 18, stance: \"neutral\", blend: 0.4 },\n { frame: 24, stance: to, blend: 0.3 },\n\n // Phase 3: Guard position change (frames 24-36)\n { frame: 30, stance: to, blend: 0.7 },\n { frame: 36, stance: to, blend: 1.0 },\n ];\n}\n\n/**\n * Generate keyframes for indirect stance transition (opposite stances)\n *\n * **Korean**: 간접 전환 키프레임 생성\n *\n * Creates keyframes for transitions between opposite stances via neutral position.\n * Longer neutral phase for more complex repositioning.\n *\n * @param from - Source stance\n * @param to - Target stance\n * @returns Array of keyframes\n *\n * @korean 간접전환키프레임생성\n */\nfunction generateIndirectTransitionKeyframes(\n from: TrigramStance,\n to: TrigramStance,\n): readonly StanceTransitionKeyframe[] {\n return [\n // Phase 1: Exit source stance (frames 0-12)\n { frame: 0, stance: from, blend: 1.0 },\n { frame: 6, stance: from, blend: 0.7 },\n { frame: 12, stance: \"neutral\", blend: 0.5 },\n\n // Phase 2: Extended neutral position (frames 12-24)\n { frame: 18, stance: \"neutral\", blend: 0.5 },\n { frame: 24, stance: \"neutral\", blend: 0.4 },\n\n // Phase 3: Enter target stance (frames 24-36)\n { frame: 30, stance: to, blend: 0.6 },\n { frame: 36, stance: to, blend: 1.0 },\n ];\n}\n\n/**\n * Create a stance transition configuration\n *\n * **Korean**: 자세 전환 생성\n *\n * Generates complete transition configuration between two stances.\n *\n * @param from - Source stance\n * @param to - Target stance\n * @returns Complete stance transition configuration\n *\n * @korean 자세전환생성\n */\nexport function createStanceTransition(\n from: TrigramStance,\n to: TrigramStance,\n): StanceTransition {\n const type = determineTransitionType(from, to);\n\n // Self-transition (no animation)\n if (type === \"self\") {\n return {\n from,\n to,\n type: \"self\",\n duration: 0,\n keyframes: [{ frame: 0, stance: from, blend: 1.0 }],\n description: {\n korean: `${from} 자세 유지`,\n english: `Maintain ${from} stance`,\n },\n };\n }\n\n // Generate keyframes based on transition type\n const keyframes =\n type === \"direct\"\n ? generateDirectTransitionKeyframes(from, to)\n : generateIndirectTransitionKeyframes(from, to);\n\n return {\n from,\n to,\n type,\n duration: 600, // 600ms standard transition\n keyframes,\n description: {\n korean: `${from}에서 ${to}로 전환`,\n english: `Transition from ${from} to ${to}`,\n },\n };\n}\n\n/**\n * Stance transition matrix containing all 64 transitions (8x8)\n *\n * **Korean**: 팔괘 전환 행렬\n *\n * Maps from every stance to every other stance, including self-transitions.\n * Key format: \"from_to\" (e.g., \"geon_tae\")\n *\n * Total transitions: 64 (8 source stances × 8 target stances)\n * - 8 self-transitions (0ms)\n * - ~24 direct transitions (600ms, adjacent stances)\n * - ~32 indirect transitions (600ms, opposite stances)\n *\n * @korean 팔괘전환행렬\n */\nexport const STANCE_TRANSITIONS: Map<string, StanceTransition> = new Map();\n\n/**\n * Initialize the stance transition matrix\n *\n * **Korean**: 전환 행렬 초기화\n *\n * Generates all 64 stance transitions and populates the transition map.\n * Call this during system initialization.\n *\n * @korean 전환행렬초기화\n */\nexport function initializeStanceTransitions(): void {\n // Generate all 64 transitions (8 from × 8 to)\n for (const from of TRIGRAM_STANCES_ORDER) {\n for (const to of TRIGRAM_STANCES_ORDER) {\n const key = `${from}_${to}`;\n const transition = createStanceTransition(from, to);\n STANCE_TRANSITIONS.set(key, transition);\n }\n }\n\n if (process.env.NODE_ENV === \"development\") {\n console.log(\n `[StanceTransitions] Initialized ${STANCE_TRANSITIONS.size} stance transitions`,\n );\n }\n}\n\n/**\n * Get stance transition configuration\n *\n * **Korean**: 자세 전환 가져오기\n *\n * Retrieves the transition configuration for moving from one stance to another.\n *\n * @param from - Source stance\n * @param to - Target stance\n * @returns Transition configuration, or undefined if not found\n *\n * @example\n * ```typescript\n * const transition = getStanceTransition(TrigramStance.GEON, TrigramStance.TAE);\n * console.log(transition.duration); // 600\n * console.log(transition.type); // \"direct\"\n * ```\n *\n * @korean 자세전환가져오기\n */\nexport function getStanceTransition(\n from: TrigramStance,\n to: TrigramStance,\n): StanceTransition | undefined {\n const key = `${from}_${to}`;\n return STANCE_TRANSITIONS.get(key);\n}\n\n/**\n * Get all valid transitions from a stance\n *\n * **Korean**: 유효한 전환 목록\n *\n * Returns all possible transitions from the given stance.\n *\n * @param from - Source stance\n * @returns Array of all transitions from this stance\n *\n * @korean 유효한전환목록\n */\nexport function getTransitionsFromStance(\n from: TrigramStance,\n): StanceTransition[] {\n const transitions: StanceTransition[] = [];\n\n for (const to of TRIGRAM_STANCES_ORDER) {\n const transition = getStanceTransition(from, to);\n if (transition) {\n transitions.push(transition);\n }\n }\n\n return transitions;\n}\n\n/**\n * Clear all cached stance transitions\n *\n * **Korean**: 자세 전환 캐시 초기화\n *\n * Clears the stance transition cache to free memory.\n * Useful for session cleanup or hot reloading.\n * Call initializeStanceTransitions() to repopulate after clearing.\n *\n * @korean 자세전환캐시초기화\n */\nexport function clearStanceTransitions(): void {\n STANCE_TRANSITIONS.clear();\n}\n\n// Note: For production use, consider calling initializeStanceTransitions()\n// during application startup to avoid blocking the main thread.\n// For now, initialize on module load for convenience.\ninitializeStanceTransitions();\n"],"mappings":"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"}
@@ -60,7 +60,6 @@ import type { StanceLaterality } from "../../trigram/types";
60
60
  * // sameAnimation === rightPunch (same reference)
61
61
  * ```
62
62
  *
63
- * @public
64
63
  * @category Animation Transform
65
64
  * @korean 애니메이션측면성적용
66
65
  */
@@ -85,7 +84,6 @@ export declare function applyLaterality(animation: SkeletalAnimation, laterality
85
84
  * getAnimationLaterality(leftAnim); // → "left"
86
85
  * ```
87
86
  *
88
- * @public
89
87
  * @category Animation Query
90
88
  * @korean 애니메이션측면성식별
91
89
  */
@@ -112,7 +110,6 @@ export declare function getAnimationLaterality(animation: SkeletalAnimation): St
112
110
  * areLateralityVariants(rightPunch, otherMove); // → false
113
111
  * ```
114
112
  *
115
- * @public
116
113
  * @category Animation Query
117
114
  * @korean 애니메이션측면성변형확인
118
115
  */
@@ -1 +1 @@
1
- {"version":3,"file":"LateralityTransform.d.ts","sourceRoot":"","sources":["../../../../src/systems/animation/core/LateralityTransform.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAqB,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE7E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,iBAAiB,EAC5B,UAAU,EAAE,gBAAgB,GAC3B,iBAAiB,CAkBnB;AA0LD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,iBAAiB,GAC3B,gBAAgB,CAElB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,iBAAiB,EACxB,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAUT"}
1
+ {"version":3,"file":"LateralityTransform.d.ts","sourceRoot":"","sources":["../../../../src/systems/animation/core/LateralityTransform.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAqB,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE7E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,iBAAiB,EAC5B,UAAU,EAAE,gBAAgB,GAC3B,iBAAiB,CAkBnB;AA0LD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,iBAAiB,GAC3B,gBAAgB,CAElB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,iBAAiB,EACxB,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAUT"}
@@ -36,7 +36,6 @@ import * as THREE from "three";
36
36
  * // sameAnimation === rightPunch (same reference)
37
37
  * ```
38
38
  *
39
- * @public
40
39
  * @category Animation Transform
41
40
  * @korean 애니메이션측면성적용
42
41
  */
@@ -1 +1 @@
1
- {"version":3,"file":"LateralityTransform.js","names":[],"sources":["../../../../src/systems/animation/core/LateralityTransform.ts"],"sourcesContent":["/**\n * Laterality Transform System for Animation Pipeline\n *\n * **Korean**: 측면성 변환 시스템\n *\n * Extends the animation system to support StanceLaterality (왼발서기/오른발서기),\n * enabling authentic Korean martial arts stance mirroring across all animations.\n * Creates 16 distinct stance configurations (8 trigrams × 2 sides).\n *\n * Key Features:\n * - Transform skeletal animations for left/right laterality\n * - Mirror bone rotations (swap left ↔ right, negate Y/Z axes)\n * - Preserve animation timing and type information\n * - Performance optimized (<1ms transformation time)\n *\n * Korean Terminology:\n * - **왼발서기 (Oenbal Seogi)**: Left foot forward, left guard high\n * - **오른발서기 (Oreun Bal Seogi)**: Right foot forward, right guard high\n * - **측면성 (Cheugmyeonseong)**: Laterality/sidedness in martial arts\n *\n * @module systems/animation/LateralityTransform\n * @category Animation\n * @korean 측면성변환\n */\n\nimport type { AnimationKeyframe, SkeletalAnimation } from \"@/types/skeletal\";\nimport * as THREE from \"three\";\nimport type { StanceLaterality } from \"../../trigram/types\";\n\n/**\n * Apply laterality transformation to a skeletal animation.\n *\n * **Korean**: 애니메이션 측면성 적용\n *\n * Transforms a skeletal animation to match the specified laterality (left/right stance).\n * Right laterality returns the original animation; left laterality creates a mirrored version\n * with left/right bones swapped and lateral rotations negated.\n *\n * Transformation Rules:\n * - Swap left ↔ right bone names (e.g., \"shoulder_L\" ↔ \"shoulder_R\")\n * - Negate Y rotation (lateral twist around vertical axis)\n * - Negate Z rotation (roll around forward-back axis)\n * - Preserve X rotation (forward/back bend)\n * - Maintain timing, duration, and easing information\n *\n * Performance: <1ms for typical animation (verified in tests)\n *\n * @param animation - Source skeletal animation to transform\n * @param laterality - Target laterality: \"left\" or \"right\"\n * @returns Transformed animation with mirrored bone rotations for left laterality\n *\n * @example\n * ```typescript\n * // Get right-handed punch animation\n * const rightPunch = GEON_BONE_BREAKING_STRIKE_1;\n *\n * // Create left-handed version\n * const leftPunch = applyLaterality(rightPunch, \"left\");\n * // leftPunch has left hand as striking hand, mirrored rotations\n *\n * // Right laterality returns original (no transformation cost)\n * const sameAnimation = applyLaterality(rightPunch, \"right\");\n * // sameAnimation === rightPunch (same reference)\n * ```\n *\n * @public\n * @category Animation Transform\n * @korean 애니메이션측면성적용\n */\nexport function applyLaterality(\n animation: SkeletalAnimation,\n laterality: StanceLaterality,\n): SkeletalAnimation {\n // Right laterality returns original animation (no transformation)\n if (laterality === \"right\") {\n return animation;\n }\n\n // Left laterality: mirror all keyframes\n const mirroredKeyframes = animation.keyframes.map((keyframe) =>\n mirrorAnimationKeyframe(keyframe),\n );\n\n // Return transformed animation with updated name\n return {\n ...animation,\n name: `${animation.name}_left`,\n koreanName: `${animation.koreanName} (왼발)`,\n keyframes: mirroredKeyframes,\n };\n}\n\n/**\n * Mirror a single animation keyframe for left laterality.\n *\n * **Korean**: 키프레임 좌우 대칭\n *\n * Creates a mirrored version of an animation keyframe by:\n * 1. Swapping left and right bone names\n * 2. Negating Y and Z rotations (lateral twist and roll)\n * 3. Preserving X rotation (forward/back bend)\n * 4. Maintaining timing and easing information\n *\n * Bone Name Swapping:\n * - \"_L\" suffix → \"_R\" suffix\n * - \"_R\" suffix → \"_L\" suffix\n * - \"left_\" prefix → \"right_\" prefix\n * - \"right_\" prefix → \"left_\" prefix\n *\n * @param keyframe - Original animation keyframe\n * @returns Mirrored keyframe with swapped bones and negated rotations\n *\n * @internal\n * @korean 키프레임대칭\n */\nfunction mirrorAnimationKeyframe(\n keyframe: AnimationKeyframe,\n): AnimationKeyframe {\n // Mirror bone rotations\n const mirroredRotations = new Map<string, THREE.Euler>();\n\n keyframe.boneRotations.forEach((rotation, boneName) => {\n const mirroredBoneName = mirrorBoneName(boneName);\n const mirroredRotation = mirrorEuler(rotation);\n mirroredRotations.set(mirroredBoneName, mirroredRotation);\n });\n\n // Mirror bone positions (if present)\n const mirroredPositions = new Map<string, THREE.Vector3>();\n\n if (keyframe.bonePositions) {\n keyframe.bonePositions.forEach((position, boneName) => {\n const mirroredBoneName = mirrorBoneName(boneName);\n const mirroredPosition = mirrorPosition(position);\n mirroredPositions.set(mirroredBoneName, mirroredPosition);\n });\n }\n\n return {\n time: keyframe.time,\n boneRotations: mirroredRotations,\n bonePositions: mirroredPositions,\n easing: keyframe.easing,\n };\n}\n\n/**\n * Mirror a bone name by swapping left/right suffixes and prefixes.\n *\n * **Korean**: 뼈 이름 대칭\n *\n * Transforms bone names to their mirrored counterparts:\n * - \"shoulder_L\" → \"shoulder_R\"\n * - \"upper_arm_R\" → \"upper_arm_L\"\n * - \"left_hand\" → \"right_hand\"\n * - \"right_foot\" → \"left_foot\"\n *\n * If bone has no laterality marker (e.g., \"spine\", \"pelvis\"),\n * returns the original name unchanged.\n *\n * @param boneName - Original bone name\n * @returns Mirrored bone name with swapped left/right markers\n *\n * @example\n * ```typescript\n * mirrorBoneName(\"shoulder_L\") // → \"shoulder_R\"\n * mirrorBoneName(\"upper_arm_R\") // → \"upper_arm_L\"\n * mirrorBoneName(\"left_hand\") // → \"right_hand\"\n * mirrorBoneName(\"spine_upper\") // → \"spine_upper\" (no change)\n * ```\n *\n * @internal\n * @korean 뼈이름대칭\n */\nfunction mirrorBoneName(boneName: string): string {\n // Handle _L and _R suffixes (most common pattern)\n if (boneName.endsWith(\"_L\")) {\n return boneName.slice(0, -2) + \"_R\";\n }\n if (boneName.endsWith(\"_R\")) {\n return boneName.slice(0, -2) + \"_L\";\n }\n\n // Handle left_ and right_ prefixes\n if (boneName.startsWith(\"left_\")) {\n return \"right_\" + boneName.slice(5);\n }\n if (boneName.startsWith(\"right_\")) {\n return \"left_\" + boneName.slice(6);\n }\n\n // No laterality marker - return unchanged (e.g., spine, pelvis, neck)\n return boneName;\n}\n\n/**\n * Mirror a bone rotation by negating Y and Z axes.\n *\n * **Korean**: 뼈 회전 대칭\n *\n * Transforms rotation for left/right mirroring:\n * - X rotation: Preserved (forward/back bend is symmetric)\n * - Y rotation: Negated (lateral twist direction reverses)\n * - Z rotation: Negated (roll direction reverses)\n *\n * This creates anatomically correct mirrored poses where:\n * - Right arm punch becomes left arm punch\n * - Left leg kick becomes right leg kick\n * - Torso twist direction reverses appropriately\n *\n * @param euler - Original bone rotation\n * @returns Mirrored rotation with negated Y and Z axes\n *\n * @example\n * ```typescript\n * // Right arm forward punch: shoulder rotates forward and inward\n * const rightPunch = new THREE.Euler(-1.2, 0.5, 0.6);\n * const leftPunch = mirrorEuler(rightPunch);\n * // leftPunch: (-1.2, -0.5, -0.6) - forward bend preserved, twist/roll negated\n * ```\n *\n * @internal\n * @korean 뼈회전대칭\n */\nfunction mirrorEuler(euler: THREE.Euler): THREE.Euler {\n return new THREE.Euler(\n euler.x, // Preserve forward/back bend\n -euler.y, // Negate lateral twist\n -euler.z, // Negate roll\n euler.order, // Preserve rotation order\n );\n}\n\n/**\n * Mirror a bone position by negating the X coordinate.\n *\n * **Korean**: 뼈 위치 대칭\n *\n * Mirrors position across the YZ plane (body centerline).\n *\n * **World-Space Coordinate System (matching AnimationMirror):**\n * Skeletal animations use world-space coordinates consistent with the 28-bone rig:\n * - X coordinate: Left/right (arms extend along ±X)\n * - Y coordinate: Up/down (pelvis at Y=1.1, legs extend -Y)\n * - Z coordinate: Forward/back (character faces +Z)\n *\n * For mirroring:\n * - X: Negated (left ↔ right)\n * - Y: Preserved (up/down is symmetric)\n * - Z: Preserved (forward/back is symmetric)\n *\n * Used for IK targets and special move positioning where\n * absolute bone positions are specified.\n *\n * @param position - Original bone position offset\n * @returns Mirrored position with negated X coordinate\n *\n * @example\n * ```typescript\n * // Right hand extends to the right (+X)\n * const rightHandPos = new THREE.Vector3(0.5, 1.5, 0.3);\n * const leftHandPos = mirrorPosition(rightHandPos);\n * // leftHandPos: (-0.5, 1.5, 0.3) - extends to the left (-X)\n * ```\n *\n * @internal\n * @korean 뼈위치대칭\n */\nfunction mirrorPosition(position: THREE.Vector3): THREE.Vector3 {\n return new THREE.Vector3(\n -position.x, // Negate left/right (X axis = lateral in world-space rig)\n position.y, // Preserve vertical\n position.z, // Preserve forward/back\n );\n}\n\n/**\n * Get the laterality identifier for an animation.\n *\n * **Korean**: 애니메이션 측면성 식별\n *\n * Determines if an animation is configured for left or right laterality\n * based on its name suffix.\n *\n * @param animation - Skeletal animation to inspect\n * @returns \"left\" if animation has \"_left\" suffix, otherwise \"right\"\n *\n * @example\n * ```typescript\n * const rightAnim = { name: \"geon_punch\", ... };\n * const leftAnim = { name: \"geon_punch_left\", ... };\n *\n * getAnimationLaterality(rightAnim); // → \"right\"\n * getAnimationLaterality(leftAnim); // → \"left\"\n * ```\n *\n * @public\n * @category Animation Query\n * @korean 애니메이션측면성식별\n */\nexport function getAnimationLaterality(\n animation: SkeletalAnimation,\n): StanceLaterality {\n return animation.name.endsWith(\"_left\") ? \"left\" : \"right\";\n}\n\n/**\n * Check if two animations are laterality variants of each other.\n *\n * **Korean**: 애니메이션 측면성 변형 확인\n *\n * Determines if two animations represent the same technique but\n * with different laterality (left vs right stance).\n *\n * @param anim1 - First animation\n * @param anim2 - Second animation\n * @returns True if animations are laterality variants of the same base animation\n *\n * @example\n * ```typescript\n * const rightPunch = { name: \"geon_punch\", ... };\n * const leftPunch = { name: \"geon_punch_left\", ... };\n * const otherMove = { name: \"tae_throw\", ... };\n *\n * areLateralityVariants(rightPunch, leftPunch); // → true\n * areLateralityVariants(rightPunch, otherMove); // → false\n * ```\n *\n * @public\n * @category Animation Query\n * @korean 애니메이션측면성변형확인\n */\nexport function areLateralityVariants(\n anim1: SkeletalAnimation,\n anim2: SkeletalAnimation,\n): boolean {\n // Get base names (remove _left suffix if present)\n const baseName1 = anim1.name.replace(/_left$/, \"\");\n const baseName2 = anim2.name.replace(/_left$/, \"\");\n\n // Check if base names match and laterality differs\n return (\n baseName1 === baseName2 &&\n getAnimationLaterality(anim1) !== getAnimationLaterality(anim2)\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqEA,SAAgB,gBACd,WACA,YACmB;CAEnB,IAAI,eAAe,SACjB,OAAO;CAIT,MAAM,oBAAoB,UAAU,UAAU,KAAK,aACjD,wBAAwB,SAAS,CAClC;CAGD,OAAO;EACL,GAAG;EACH,MAAM,GAAG,UAAU,KAAK;EACxB,YAAY,GAAG,UAAU,WAAW;EACpC,WAAW;EACZ;;;;;;;;;;;;;;;;;;;;;;;;;AA0BH,SAAS,wBACP,UACmB;CAEnB,MAAM,oCAAoB,IAAI,KAA0B;CAExD,SAAS,cAAc,SAAS,UAAU,aAAa;EACrD,MAAM,mBAAmB,eAAe,SAAS;EACjD,MAAM,mBAAmB,YAAY,SAAS;EAC9C,kBAAkB,IAAI,kBAAkB,iBAAiB;GACzD;CAGF,MAAM,oCAAoB,IAAI,KAA4B;CAE1D,IAAI,SAAS,eACX,SAAS,cAAc,SAAS,UAAU,aAAa;EACrD,MAAM,mBAAmB,eAAe,SAAS;EACjD,MAAM,mBAAmB,eAAe,SAAS;EACjD,kBAAkB,IAAI,kBAAkB,iBAAiB;GACzD;CAGJ,OAAO;EACL,MAAM,SAAS;EACf,eAAe;EACf,eAAe;EACf,QAAQ,SAAS;EAClB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BH,SAAS,eAAe,UAA0B;CAEhD,IAAI,SAAS,SAAS,KAAK,EACzB,OAAO,SAAS,MAAM,GAAG,GAAG,GAAG;CAEjC,IAAI,SAAS,SAAS,KAAK,EACzB,OAAO,SAAS,MAAM,GAAG,GAAG,GAAG;CAIjC,IAAI,SAAS,WAAW,QAAQ,EAC9B,OAAO,WAAW,SAAS,MAAM,EAAE;CAErC,IAAI,SAAS,WAAW,SAAS,EAC/B,OAAO,UAAU,SAAS,MAAM,EAAE;CAIpC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCT,SAAS,YAAY,OAAiC;CACpD,OAAO,IAAI,MAAM,MACf,MAAM,GACN,CAAC,MAAM,GACP,CAAC,MAAM,GACP,MAAM,MACP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCH,SAAS,eAAe,UAAwC;CAC9D,OAAO,IAAI,MAAM,QACf,CAAC,SAAS,GACV,SAAS,GACT,SAAS,EACV"}
1
+ {"version":3,"file":"LateralityTransform.js","names":[],"sources":["../../../../src/systems/animation/core/LateralityTransform.ts"],"sourcesContent":["/**\n * Laterality Transform System for Animation Pipeline\n *\n * **Korean**: 측면성 변환 시스템\n *\n * Extends the animation system to support StanceLaterality (왼발서기/오른발서기),\n * enabling authentic Korean martial arts stance mirroring across all animations.\n * Creates 16 distinct stance configurations (8 trigrams × 2 sides).\n *\n * Key Features:\n * - Transform skeletal animations for left/right laterality\n * - Mirror bone rotations (swap left ↔ right, negate Y/Z axes)\n * - Preserve animation timing and type information\n * - Performance optimized (<1ms transformation time)\n *\n * Korean Terminology:\n * - **왼발서기 (Oenbal Seogi)**: Left foot forward, left guard high\n * - **오른발서기 (Oreun Bal Seogi)**: Right foot forward, right guard high\n * - **측면성 (Cheugmyeonseong)**: Laterality/sidedness in martial arts\n *\n * @module systems/animation/LateralityTransform\n * @category Animation\n * @korean 측면성변환\n */\n\nimport type { AnimationKeyframe, SkeletalAnimation } from \"@/types/skeletal\";\nimport * as THREE from \"three\";\nimport type { StanceLaterality } from \"../../trigram/types\";\n\n/**\n * Apply laterality transformation to a skeletal animation.\n *\n * **Korean**: 애니메이션 측면성 적용\n *\n * Transforms a skeletal animation to match the specified laterality (left/right stance).\n * Right laterality returns the original animation; left laterality creates a mirrored version\n * with left/right bones swapped and lateral rotations negated.\n *\n * Transformation Rules:\n * - Swap left ↔ right bone names (e.g., \"shoulder_L\" ↔ \"shoulder_R\")\n * - Negate Y rotation (lateral twist around vertical axis)\n * - Negate Z rotation (roll around forward-back axis)\n * - Preserve X rotation (forward/back bend)\n * - Maintain timing, duration, and easing information\n *\n * Performance: <1ms for typical animation (verified in tests)\n *\n * @param animation - Source skeletal animation to transform\n * @param laterality - Target laterality: \"left\" or \"right\"\n * @returns Transformed animation with mirrored bone rotations for left laterality\n *\n * @example\n * ```typescript\n * // Get right-handed punch animation\n * const rightPunch = GEON_BONE_BREAKING_STRIKE_1;\n *\n * // Create left-handed version\n * const leftPunch = applyLaterality(rightPunch, \"left\");\n * // leftPunch has left hand as striking hand, mirrored rotations\n *\n * // Right laterality returns original (no transformation cost)\n * const sameAnimation = applyLaterality(rightPunch, \"right\");\n * // sameAnimation === rightPunch (same reference)\n * ```\n *\n * @category Animation Transform\n * @korean 애니메이션측면성적용\n */\nexport function applyLaterality(\n animation: SkeletalAnimation,\n laterality: StanceLaterality,\n): SkeletalAnimation {\n // Right laterality returns original animation (no transformation)\n if (laterality === \"right\") {\n return animation;\n }\n\n // Left laterality: mirror all keyframes\n const mirroredKeyframes = animation.keyframes.map((keyframe) =>\n mirrorAnimationKeyframe(keyframe),\n );\n\n // Return transformed animation with updated name\n return {\n ...animation,\n name: `${animation.name}_left`,\n koreanName: `${animation.koreanName} (왼발)`,\n keyframes: mirroredKeyframes,\n };\n}\n\n/**\n * Mirror a single animation keyframe for left laterality.\n *\n * **Korean**: 키프레임 좌우 대칭\n *\n * Creates a mirrored version of an animation keyframe by:\n * 1. Swapping left and right bone names\n * 2. Negating Y and Z rotations (lateral twist and roll)\n * 3. Preserving X rotation (forward/back bend)\n * 4. Maintaining timing and easing information\n *\n * Bone Name Swapping:\n * - \"_L\" suffix → \"_R\" suffix\n * - \"_R\" suffix → \"_L\" suffix\n * - \"left_\" prefix → \"right_\" prefix\n * - \"right_\" prefix → \"left_\" prefix\n *\n * @param keyframe - Original animation keyframe\n * @returns Mirrored keyframe with swapped bones and negated rotations\n *\n * @internal\n * @korean 키프레임대칭\n */\nfunction mirrorAnimationKeyframe(\n keyframe: AnimationKeyframe,\n): AnimationKeyframe {\n // Mirror bone rotations\n const mirroredRotations = new Map<string, THREE.Euler>();\n\n keyframe.boneRotations.forEach((rotation, boneName) => {\n const mirroredBoneName = mirrorBoneName(boneName);\n const mirroredRotation = mirrorEuler(rotation);\n mirroredRotations.set(mirroredBoneName, mirroredRotation);\n });\n\n // Mirror bone positions (if present)\n const mirroredPositions = new Map<string, THREE.Vector3>();\n\n if (keyframe.bonePositions) {\n keyframe.bonePositions.forEach((position, boneName) => {\n const mirroredBoneName = mirrorBoneName(boneName);\n const mirroredPosition = mirrorPosition(position);\n mirroredPositions.set(mirroredBoneName, mirroredPosition);\n });\n }\n\n return {\n time: keyframe.time,\n boneRotations: mirroredRotations,\n bonePositions: mirroredPositions,\n easing: keyframe.easing,\n };\n}\n\n/**\n * Mirror a bone name by swapping left/right suffixes and prefixes.\n *\n * **Korean**: 뼈 이름 대칭\n *\n * Transforms bone names to their mirrored counterparts:\n * - \"shoulder_L\" → \"shoulder_R\"\n * - \"upper_arm_R\" → \"upper_arm_L\"\n * - \"left_hand\" → \"right_hand\"\n * - \"right_foot\" → \"left_foot\"\n *\n * If bone has no laterality marker (e.g., \"spine\", \"pelvis\"),\n * returns the original name unchanged.\n *\n * @param boneName - Original bone name\n * @returns Mirrored bone name with swapped left/right markers\n *\n * @example\n * ```typescript\n * mirrorBoneName(\"shoulder_L\") // → \"shoulder_R\"\n * mirrorBoneName(\"upper_arm_R\") // → \"upper_arm_L\"\n * mirrorBoneName(\"left_hand\") // → \"right_hand\"\n * mirrorBoneName(\"spine_upper\") // → \"spine_upper\" (no change)\n * ```\n *\n * @internal\n * @korean 뼈이름대칭\n */\nfunction mirrorBoneName(boneName: string): string {\n // Handle _L and _R suffixes (most common pattern)\n if (boneName.endsWith(\"_L\")) {\n return boneName.slice(0, -2) + \"_R\";\n }\n if (boneName.endsWith(\"_R\")) {\n return boneName.slice(0, -2) + \"_L\";\n }\n\n // Handle left_ and right_ prefixes\n if (boneName.startsWith(\"left_\")) {\n return \"right_\" + boneName.slice(5);\n }\n if (boneName.startsWith(\"right_\")) {\n return \"left_\" + boneName.slice(6);\n }\n\n // No laterality marker - return unchanged (e.g., spine, pelvis, neck)\n return boneName;\n}\n\n/**\n * Mirror a bone rotation by negating Y and Z axes.\n *\n * **Korean**: 뼈 회전 대칭\n *\n * Transforms rotation for left/right mirroring:\n * - X rotation: Preserved (forward/back bend is symmetric)\n * - Y rotation: Negated (lateral twist direction reverses)\n * - Z rotation: Negated (roll direction reverses)\n *\n * This creates anatomically correct mirrored poses where:\n * - Right arm punch becomes left arm punch\n * - Left leg kick becomes right leg kick\n * - Torso twist direction reverses appropriately\n *\n * @param euler - Original bone rotation\n * @returns Mirrored rotation with negated Y and Z axes\n *\n * @example\n * ```typescript\n * // Right arm forward punch: shoulder rotates forward and inward\n * const rightPunch = new THREE.Euler(-1.2, 0.5, 0.6);\n * const leftPunch = mirrorEuler(rightPunch);\n * // leftPunch: (-1.2, -0.5, -0.6) - forward bend preserved, twist/roll negated\n * ```\n *\n * @internal\n * @korean 뼈회전대칭\n */\nfunction mirrorEuler(euler: THREE.Euler): THREE.Euler {\n return new THREE.Euler(\n euler.x, // Preserve forward/back bend\n -euler.y, // Negate lateral twist\n -euler.z, // Negate roll\n euler.order, // Preserve rotation order\n );\n}\n\n/**\n * Mirror a bone position by negating the X coordinate.\n *\n * **Korean**: 뼈 위치 대칭\n *\n * Mirrors position across the YZ plane (body centerline).\n *\n * **World-Space Coordinate System (matching AnimationMirror):**\n * Skeletal animations use world-space coordinates consistent with the 28-bone rig:\n * - X coordinate: Left/right (arms extend along ±X)\n * - Y coordinate: Up/down (pelvis at Y=1.1, legs extend -Y)\n * - Z coordinate: Forward/back (character faces +Z)\n *\n * For mirroring:\n * - X: Negated (left ↔ right)\n * - Y: Preserved (up/down is symmetric)\n * - Z: Preserved (forward/back is symmetric)\n *\n * Used for IK targets and special move positioning where\n * absolute bone positions are specified.\n *\n * @param position - Original bone position offset\n * @returns Mirrored position with negated X coordinate\n *\n * @example\n * ```typescript\n * // Right hand extends to the right (+X)\n * const rightHandPos = new THREE.Vector3(0.5, 1.5, 0.3);\n * const leftHandPos = mirrorPosition(rightHandPos);\n * // leftHandPos: (-0.5, 1.5, 0.3) - extends to the left (-X)\n * ```\n *\n * @internal\n * @korean 뼈위치대칭\n */\nfunction mirrorPosition(position: THREE.Vector3): THREE.Vector3 {\n return new THREE.Vector3(\n -position.x, // Negate left/right (X axis = lateral in world-space rig)\n position.y, // Preserve vertical\n position.z, // Preserve forward/back\n );\n}\n\n/**\n * Get the laterality identifier for an animation.\n *\n * **Korean**: 애니메이션 측면성 식별\n *\n * Determines if an animation is configured for left or right laterality\n * based on its name suffix.\n *\n * @param animation - Skeletal animation to inspect\n * @returns \"left\" if animation has \"_left\" suffix, otherwise \"right\"\n *\n * @example\n * ```typescript\n * const rightAnim = { name: \"geon_punch\", ... };\n * const leftAnim = { name: \"geon_punch_left\", ... };\n *\n * getAnimationLaterality(rightAnim); // → \"right\"\n * getAnimationLaterality(leftAnim); // → \"left\"\n * ```\n *\n * @category Animation Query\n * @korean 애니메이션측면성식별\n */\nexport function getAnimationLaterality(\n animation: SkeletalAnimation,\n): StanceLaterality {\n return animation.name.endsWith(\"_left\") ? \"left\" : \"right\";\n}\n\n/**\n * Check if two animations are laterality variants of each other.\n *\n * **Korean**: 애니메이션 측면성 변형 확인\n *\n * Determines if two animations represent the same technique but\n * with different laterality (left vs right stance).\n *\n * @param anim1 - First animation\n * @param anim2 - Second animation\n * @returns True if animations are laterality variants of the same base animation\n *\n * @example\n * ```typescript\n * const rightPunch = { name: \"geon_punch\", ... };\n * const leftPunch = { name: \"geon_punch_left\", ... };\n * const otherMove = { name: \"tae_throw\", ... };\n *\n * areLateralityVariants(rightPunch, leftPunch); // → true\n * areLateralityVariants(rightPunch, otherMove); // → false\n * ```\n *\n * @category Animation Query\n * @korean 애니메이션측면성변형확인\n */\nexport function areLateralityVariants(\n anim1: SkeletalAnimation,\n anim2: SkeletalAnimation,\n): boolean {\n // Get base names (remove _left suffix if present)\n const baseName1 = anim1.name.replace(/_left$/, \"\");\n const baseName2 = anim2.name.replace(/_left$/, \"\");\n\n // Check if base names match and laterality differs\n return (\n baseName1 === baseName2 &&\n getAnimationLaterality(anim1) !== getAnimationLaterality(anim2)\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoEA,SAAgB,gBACd,WACA,YACmB;CAEnB,IAAI,eAAe,SACjB,OAAO;CAIT,MAAM,oBAAoB,UAAU,UAAU,KAAK,aACjD,wBAAwB,SAAS,CAClC;CAGD,OAAO;EACL,GAAG;EACH,MAAM,GAAG,UAAU,KAAK;EACxB,YAAY,GAAG,UAAU,WAAW;EACpC,WAAW;EACZ;;;;;;;;;;;;;;;;;;;;;;;;;AA0BH,SAAS,wBACP,UACmB;CAEnB,MAAM,oCAAoB,IAAI,KAA0B;CAExD,SAAS,cAAc,SAAS,UAAU,aAAa;EACrD,MAAM,mBAAmB,eAAe,SAAS;EACjD,MAAM,mBAAmB,YAAY,SAAS;EAC9C,kBAAkB,IAAI,kBAAkB,iBAAiB;GACzD;CAGF,MAAM,oCAAoB,IAAI,KAA4B;CAE1D,IAAI,SAAS,eACX,SAAS,cAAc,SAAS,UAAU,aAAa;EACrD,MAAM,mBAAmB,eAAe,SAAS;EACjD,MAAM,mBAAmB,eAAe,SAAS;EACjD,kBAAkB,IAAI,kBAAkB,iBAAiB;GACzD;CAGJ,OAAO;EACL,MAAM,SAAS;EACf,eAAe;EACf,eAAe;EACf,QAAQ,SAAS;EAClB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BH,SAAS,eAAe,UAA0B;CAEhD,IAAI,SAAS,SAAS,KAAK,EACzB,OAAO,SAAS,MAAM,GAAG,GAAG,GAAG;CAEjC,IAAI,SAAS,SAAS,KAAK,EACzB,OAAO,SAAS,MAAM,GAAG,GAAG,GAAG;CAIjC,IAAI,SAAS,WAAW,QAAQ,EAC9B,OAAO,WAAW,SAAS,MAAM,EAAE;CAErC,IAAI,SAAS,WAAW,SAAS,EAC/B,OAAO,UAAU,SAAS,MAAM,EAAE;CAIpC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCT,SAAS,YAAY,OAAiC;CACpD,OAAO,IAAI,MAAM,MACf,MAAM,GACN,CAAC,MAAM,GACP,CAAC,MAAM,GACP,MAAM,MACP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCH,SAAS,eAAe,UAAwC;CAC9D,OAAO,IAAI,MAAM,QACf,CAAC,SAAS,GACV,SAAS,GACT,SAAS,EACV"}
@@ -17,7 +17,6 @@ import type { SkeletalAnimation } from "../../../types/skeletal";
17
17
  *
18
18
  * **Korean**: 복귀 설정
19
19
  *
20
- * @public
21
20
  * @category Animation
22
21
  * @korean 복귀설정
23
22
  */
@@ -1 +1 @@
1
- {"version":3,"file":"RecoveryPhaseEnhancer.d.ts","sourceRoot":"","sources":["../../../../src/systems/animation/core/RecoveryPhaseEnhancer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAEV,iBAAiB,EAClB,MAAM,kBAAkB,CAAC;AAE1B;;;;;;;;GAQG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAE3B;;;OAGG;IACH,QAAQ,CAAC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IAE5C;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAEpC;;;OAGG;IACH,QAAQ,CAAC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IAE5C;;;OAGG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAErC;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;CAC/B;AAiBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,iBAAiB,EAC5B,MAAM,GAAE,mBAAwB,GAC/B,iBAAiB,CA6FnB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,iBAAiB,EAChC,MAAM,GAAE,mBAAwB,GAC/B,iBAAiB,CAEnB;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,wBAAwB;IACvC,iDAAiD;IACjD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,8BAA8B;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAC1B,wCAAwC;IACxC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,mCAAmC;IACnC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACpC;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,iBAAiB,GAC3B,wBAAwB,CAqE1B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,iBAAiB,EAC5B,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,mBAAwB,GAC/B,MAAM,CA6CR"}
1
+ {"version":3,"file":"RecoveryPhaseEnhancer.d.ts","sourceRoot":"","sources":["../../../../src/systems/animation/core/RecoveryPhaseEnhancer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAEV,iBAAiB,EAClB,MAAM,kBAAkB,CAAC;AAE1B;;;;;;;GAOG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAE3B;;;OAGG;IACH,QAAQ,CAAC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IAE5C;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAEpC;;;OAGG;IACH,QAAQ,CAAC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IAE5C;;;OAGG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAErC;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;CAC/B;AAiBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,iBAAiB,EAC5B,MAAM,GAAE,mBAAwB,GAC/B,iBAAiB,CA6FnB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,iBAAiB,EAChC,MAAM,GAAE,mBAAwB,GAC/B,iBAAiB,CAEnB;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,wBAAwB;IACvC,iDAAiD;IACjD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,8BAA8B;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAC1B,wCAAwC;IACxC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,mCAAmC;IACnC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACpC;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,iBAAiB,GAC3B,wBAAwB,CAqE1B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,iBAAiB,EAC5B,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,mBAAwB,GAC/B,MAAM,CA6CR"}