blacktrigram 0.7.44 → 0.7.47

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 +8 -8
@@ -1 +1 @@
1
- {"version":3,"file":"RecoveryPhaseEnhancer.js","names":[],"sources":["../../../../src/systems/animation/core/RecoveryPhaseEnhancer.ts"],"sourcesContent":["/**\n * Recovery Phase Enhancement for Black Trigram Animations\n *\n * Implements realistic recovery animations following Korean martial arts principles:\n * - 균형회복 (Gyunhyeong Hoebog) - Balance restoration\n * - 자세복귀 (Jase Bokgwi) - Stance return\n * - 호흡조절 (Hoheup Jojoel) - Breath control during recovery\n * - 근육이완 (Geunryuk Ihwan) - Muscle relaxation after tension\n *\n * @module systems/animation/RecoveryPhaseEnhancer\n * @category Animation System\n * @korean 복귀애니메이션강화\n */\n\nimport * as THREE from \"three\";\nimport type {\n AnimationKeyframe,\n SkeletalAnimation,\n} from \"@/types/skeletal\";\n\n/**\n * Recovery phase configuration options\n *\n * **Korean**: 복귀 설정\n *\n * @public\n * @category Animation\n * @korean 복귀설정\n */\nexport interface RecoveryPhaseConfig {\n /**\n * Duration of recovery phase in seconds (default: 0.2s = 200ms)\n * Recommended range: 0.15 - 0.25 seconds\n * **Korean**: 복귀 시간\n */\n readonly duration?: number;\n\n /**\n * Percentage of return in intermediate keyframe (default: 0.8 = 80%)\n * **Korean**: 중간 복귀 비율\n */\n readonly intermediateReturnPercent?: number;\n\n /**\n * Initial muscle tension level at peak technique (default: 1.0 = 100%)\n * **Korean**: 최대 근육 긴장도\n */\n readonly peakMuscleTension?: number;\n\n /**\n * Muscle tension at intermediate recovery (default: 0.4 = 40%)\n * **Korean**: 중간 근육 긴장도\n */\n readonly intermediateMuscleTension?: number;\n\n /**\n * Final muscle tension in relaxed state (default: 0.1 = 10%)\n * **Korean**: 최종 근육 긴장도\n */\n readonly finalMuscleTension?: number;\n\n /**\n * Whether to use ease-out interpolation (default: true)\n * **Korean**: 부드러운 감속 사용\n */\n readonly useEaseOut?: boolean;\n}\n\n/**\n * Default recovery phase configuration\n * Based on Korean martial arts recovery principles\n *\n * **Korean**: 기본 복귀 설정\n */\nconst DEFAULT_RECOVERY_CONFIG: Required<RecoveryPhaseConfig> = {\n duration: 0.22, // 220ms - optimal for realistic recovery\n intermediateReturnPercent: 0.8, // 80% back to neutral\n peakMuscleTension: 1.0, // 100% tension at technique peak\n intermediateMuscleTension: 0.4, // 40% tension during recovery\n finalMuscleTension: 0.1, // 10% relaxed state\n useEaseOut: true,\n};\n\n/**\n * Add realistic recovery phase to technique animation\n *\n * **Korean**: 기술 애니메이션에 복귀 단계 추가\n *\n * Enhances technique animations with proper recovery phases following\n * Korean martial arts principles of 복귀 (Bokgwi - recovery/return).\n *\n * The recovery phase consists of two keyframes:\n * 1. **Intermediate recovery** (60% of recovery duration):\n * - Returns 80% toward neutral position\n * - Reduces muscle tension to 40%\n * - Uses ease-out for gradual deceleration\n *\n * 2. **Final recovery** (100% of recovery duration):\n * - Fully returns to neutral stance\n * - Relaxes muscle tension to 10%\n * - Completes breath cycle\n *\n * @param animation - Base technique animation\n * @param config - Recovery phase configuration options\n * @returns Enhanced animation with recovery phase\n *\n * @example\n * ```typescript\n * // Add default 220ms recovery to front kick\n * const kickWithRecovery = addRecoveryPhase(FRONT_KICK_ANIMATION);\n *\n * // Add custom 180ms recovery with faster muscle release\n * const quickRecovery = addRecoveryPhase(JAB_ANIMATION, {\n * duration: 0.18,\n * intermediateMuscleTension: 0.3,\n * finalMuscleTension: 0.05,\n * });\n * ```\n *\n * @korean 복귀단계추가\n */\nexport function addRecoveryPhase(\n animation: SkeletalAnimation,\n config: RecoveryPhaseConfig = {}\n): SkeletalAnimation {\n // Merge with defaults\n const finalConfig: Required<RecoveryPhaseConfig> = {\n ...DEFAULT_RECOVERY_CONFIG,\n ...config,\n };\n\n // Validate animation has at least 2 keyframes\n if (animation.keyframes.length < 2) {\n // In production, this would use proper logging system\n // For now, using console.warn is acceptable for development\n // Suppress console output during tests to avoid cluttering test output\n // Note: In test environments, proper assertions should validate this condition\n if (process.env.NODE_ENV !== \"test\") {\n console.warn(\n `Animation \"${animation.name}\" has fewer than 2 keyframes. Recovery phase not added.`\n );\n }\n return animation;\n }\n\n const lastKeyframe = animation.keyframes[animation.keyframes.length - 1];\n const peakKeyframe = animation.keyframes[animation.keyframes.length - 2];\n\n // Calculate recovery timing\n const recoveryStartTime = lastKeyframe.time;\n const intermediateTime = recoveryStartTime + finalConfig.duration * 0.6;\n const finalTime = recoveryStartTime + finalConfig.duration;\n\n // Create intermediate recovery keyframe (80% back to neutral)\n const intermediateFrame: AnimationKeyframe = {\n time: intermediateTime,\n easing: finalConfig.useEaseOut ? \"ease-out\" : \"linear\",\n boneRotations: new Map(),\n bonePositions: new Map(),\n };\n\n // Interpolate bone rotations 80% toward neutral\n peakKeyframe.boneRotations.forEach((rotation, bone) => {\n const intermediate = new THREE.Euler(\n rotation.x * (1 - finalConfig.intermediateReturnPercent),\n rotation.y * (1 - finalConfig.intermediateReturnPercent),\n rotation.z * (1 - finalConfig.intermediateReturnPercent),\n rotation.order\n );\n intermediateFrame.boneRotations.set(bone, intermediate);\n });\n\n // Interpolate bone positions 80% toward rest\n if (peakKeyframe.bonePositions) {\n peakKeyframe.bonePositions.forEach((position, bone) => {\n // Manual interpolation instead of Vector3.lerp() because bonePositions map\n // may contain objects that aren't true THREE.Vector3 instances with prototype methods.\n // This approach ensures compatibility with any object having x, y, z properties.\n const returnPercent = finalConfig.intermediateReturnPercent;\n const intermediate = new THREE.Vector3(\n position.x * (1 - returnPercent),\n position.y * (1 - returnPercent),\n position.z * (1 - returnPercent)\n );\n intermediateFrame.bonePositions.set(bone, intermediate);\n });\n }\n\n // Create final recovery frame (100% neutral)\n const finalFrame: AnimationKeyframe = {\n time: finalTime,\n easing: finalConfig.useEaseOut ? \"ease-out\" : \"linear\",\n boneRotations: new Map(),\n bonePositions: new Map(),\n };\n\n // All bones return to neutral (0 rotation)\n peakKeyframe.boneRotations.forEach((rotation, bone) => {\n finalFrame.boneRotations.set(\n bone,\n new THREE.Euler(0, 0, 0, rotation.order)\n );\n });\n\n // All positions return to rest\n if (peakKeyframe.bonePositions) {\n peakKeyframe.bonePositions.forEach((_, bone) => {\n finalFrame.bonePositions.set(bone, new THREE.Vector3(0, 0, 0));\n });\n }\n\n // Build enhanced animation\n return {\n ...animation,\n duration: finalTime,\n keyframes: [...animation.keyframes, intermediateFrame, finalFrame],\n };\n}\n\n/**\n * Create technique animation with recovery phase\n *\n * **Korean**: 복귀 단계를 포함한 기술 애니메이션 생성\n *\n * Convenience function that wraps animation creation with automatic recovery phase.\n * Use this when creating new technique animations from scratch.\n *\n * @param baseAnimation - Base animation without recovery\n * @param config - Recovery configuration\n * @returns Complete animation with recovery phase\n *\n * @example\n * ```typescript\n * // Create front kick with recovery\n * const frontKick = createTechniqueWithRecovery(\n * baseFrontKickAnimation,\n * { duration: 0.22 }\n * );\n * ```\n *\n * @korean 복귀단계기술생성\n */\nexport function createTechniqueWithRecovery(\n baseAnimation: SkeletalAnimation,\n config: RecoveryPhaseConfig = {}\n): SkeletalAnimation {\n return addRecoveryPhase(baseAnimation, config);\n}\n\n/**\n * Validate recovery phase quality\n *\n * **Korean**: 복귀 단계 품질 검증\n *\n * Checks if an animation has proper recovery phase characteristics:\n * - Has at least 2 recovery keyframes\n * - Recovery duration between 150-250ms\n * - Uses ease-out interpolation\n * - Returns to neutral position\n *\n * @param animation - Animation to validate\n * @returns Validation result with details\n *\n * @korean 복귀품질검증\n */\nexport interface RecoveryValidationResult {\n /** Whether animation has valid recovery phase */\n readonly isValid: boolean;\n /** Validation issues found */\n readonly issues: string[];\n /** Recovery duration in milliseconds */\n readonly recoveryDuration: number;\n /** Number of recovery keyframes */\n readonly recoveryKeyframes: number;\n}\n\n/**\n * Validate recovery phase in animation\n *\n * @param animation - Animation to validate\n * @returns Validation result\n *\n * @korean 복귀검증\n */\nexport function validateRecoveryPhase(\n animation: SkeletalAnimation\n): RecoveryValidationResult {\n const issues: string[] = [];\n\n if (animation.keyframes.length < 3) {\n issues.push(\n \"Animation has fewer than 3 keyframes (needs at least 3 for recovery)\"\n );\n return {\n isValid: false,\n issues,\n recoveryDuration: 0,\n recoveryKeyframes: 0,\n };\n }\n\n // Recovery phase is from the third-to-last keyframe (peak) to last keyframe (final recovery)\n // This is because addRecoveryPhase adds TWO keyframes: intermediate and final\n const lastKeyframe = animation.keyframes[animation.keyframes.length - 1];\n const thirdLastKeyframe = animation.keyframes[animation.keyframes.length - 3];\n\n const recoveryDuration = (lastKeyframe.time - thirdLastKeyframe.time) * 1000; // ms\n\n // Validate duration\n if (recoveryDuration < 150) {\n issues.push(\n `Recovery duration too short: ${recoveryDuration.toFixed(\n 0\n )}ms (minimum: 150ms)`\n );\n }\n if (recoveryDuration > 250) {\n issues.push(\n `Recovery duration too long: ${recoveryDuration.toFixed(\n 0\n )}ms (maximum: 250ms)`\n );\n }\n\n // Validate easing - both ease-out and ease-in are acceptable for recovery\n // ease-out is preferred but ease-in can also work for final deceleration\n const acceptableEasings = [\"ease-out\", \"ease-in\"];\n if (!acceptableEasings.includes(lastKeyframe.easing ?? \"\")) {\n issues.push(\n `Last keyframe should use ease-out or ease-in interpolation, found: ${lastKeyframe.easing}`\n );\n }\n\n // Validate return to neutral\n let hasNonZeroRotation = false;\n lastKeyframe.boneRotations.forEach((rotation) => {\n if (\n Math.abs(rotation.x) > 0.01 ||\n Math.abs(rotation.y) > 0.01 ||\n Math.abs(rotation.z) > 0.01\n ) {\n hasNonZeroRotation = true;\n }\n });\n\n if (hasNonZeroRotation) {\n issues.push(\"Final keyframe should return to neutral position (0, 0, 0)\");\n }\n\n return {\n isValid: issues.length === 0,\n issues,\n recoveryDuration,\n recoveryKeyframes: 2,\n };\n}\n\n/**\n * Calculate muscle tension at specific time in animation\n *\n * **Korean**: 애니메이션 시간별 근육 긴장도 계산\n *\n * Interpolates muscle tension based on animation progress and recovery phase.\n * Tension peaks during technique execution and gradually releases during recovery.\n *\n * @param animation - Animation with recovery phase\n * @param currentTime - Current time in animation (seconds)\n * @param config - Recovery configuration used\n * @returns Muscle tension value (0.0 to 1.0)\n *\n * @korean 근육긴장도계산\n */\nexport function calculateMuscleTension(\n animation: SkeletalAnimation,\n currentTime: number,\n config: RecoveryPhaseConfig = {}\n): number {\n const finalConfig = { ...DEFAULT_RECOVERY_CONFIG, ...config };\n\n if (animation.keyframes.length < 2) {\n return finalConfig.finalMuscleTension;\n }\n\n // Recovery phase starts at the third-to-last keyframe (after peak)\n const lastKeyframe = animation.keyframes[animation.keyframes.length - 1];\n const recoveryStartTime =\n animation.keyframes.length >= 3\n ? animation.keyframes[animation.keyframes.length - 3].time\n : animation.keyframes[animation.keyframes.length - 2].time;\n\n // Before recovery: peak tension\n if (currentTime < recoveryStartTime) {\n return finalConfig.peakMuscleTension;\n }\n\n // During recovery: interpolate from peak to relaxed\n const recoveryProgress =\n (currentTime - recoveryStartTime) / (lastKeyframe.time - recoveryStartTime);\n const clampedProgress = Math.max(0, Math.min(1, recoveryProgress));\n\n // Use ease-out curve for natural muscle release\n const easedProgress = 1 - Math.pow(1 - clampedProgress, 2);\n\n // Interpolate tension\n if (easedProgress < 0.6) {\n // First 60%: peak -> intermediate\n const t = easedProgress / 0.6;\n return (\n finalConfig.peakMuscleTension +\n (finalConfig.intermediateMuscleTension - finalConfig.peakMuscleTension) *\n t\n );\n } else {\n // Last 40%: intermediate -> final\n const t = (easedProgress - 0.6) / 0.4;\n return (\n finalConfig.intermediateMuscleTension +\n (finalConfig.finalMuscleTension - finalConfig.intermediateMuscleTension) *\n t\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA0EA,IAAM,0BAAyD;CAC7D,UAAU;CACV,2BAA2B;CAC3B,mBAAmB;CACnB,2BAA2B;CAC3B,oBAAoB;CACpB,YAAY;CACb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCD,SAAgB,iBACd,WACA,SAA8B,EAAE,EACb;CAEnB,MAAM,cAA6C;EACjD,GAAG;EACH,GAAG;EACJ;CAGD,IAAI,UAAU,UAAU,SAAS,GAAG;EAKlC,IAAA,QAAA,IAAA,aAA6B,QAC3B,QAAQ,KACN,cAAc,UAAU,KAAK,yDAC9B;EAEH,OAAO;;CAGT,MAAM,eAAe,UAAU,UAAU,UAAU,UAAU,SAAS;CACtE,MAAM,eAAe,UAAU,UAAU,UAAU,UAAU,SAAS;CAGtE,MAAM,oBAAoB,aAAa;CACvC,MAAM,mBAAmB,oBAAoB,YAAY,WAAW;CACpE,MAAM,YAAY,oBAAoB,YAAY;CAGlD,MAAM,oBAAuC;EAC3C,MAAM;EACN,QAAQ,YAAY,aAAa,aAAa;EAC9C,+BAAe,IAAI,KAAK;EACxB,+BAAe,IAAI,KAAK;EACzB;CAGD,aAAa,cAAc,SAAS,UAAU,SAAS;EACrD,MAAM,eAAe,IAAI,MAAM,MAC7B,SAAS,KAAK,IAAI,YAAY,4BAC9B,SAAS,KAAK,IAAI,YAAY,4BAC9B,SAAS,KAAK,IAAI,YAAY,4BAC9B,SAAS,MACV;EACD,kBAAkB,cAAc,IAAI,MAAM,aAAa;GACvD;CAGF,IAAI,aAAa,eACf,aAAa,cAAc,SAAS,UAAU,SAAS;EAIrD,MAAM,gBAAgB,YAAY;EAClC,MAAM,eAAe,IAAI,MAAM,QAC7B,SAAS,KAAK,IAAI,gBAClB,SAAS,KAAK,IAAI,gBAClB,SAAS,KAAK,IAAI,eACnB;EACD,kBAAkB,cAAc,IAAI,MAAM,aAAa;GACvD;CAIJ,MAAM,aAAgC;EACpC,MAAM;EACN,QAAQ,YAAY,aAAa,aAAa;EAC9C,+BAAe,IAAI,KAAK;EACxB,+BAAe,IAAI,KAAK;EACzB;CAGD,aAAa,cAAc,SAAS,UAAU,SAAS;EACrD,WAAW,cAAc,IACvB,MACA,IAAI,MAAM,MAAM,GAAG,GAAG,GAAG,SAAS,MAAM,CACzC;GACD;CAGF,IAAI,aAAa,eACf,aAAa,cAAc,SAAS,GAAG,SAAS;EAC9C,WAAW,cAAc,IAAI,MAAM,IAAI,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC;GAC9D;CAIJ,OAAO;EACL,GAAG;EACH,UAAU;EACV,WAAW;GAAC,GAAG,UAAU;GAAW;GAAmB;GAAW;EACnE"}
1
+ {"version":3,"file":"RecoveryPhaseEnhancer.js","names":[],"sources":["../../../../src/systems/animation/core/RecoveryPhaseEnhancer.ts"],"sourcesContent":["/**\n * Recovery Phase Enhancement for Black Trigram Animations\n *\n * Implements realistic recovery animations following Korean martial arts principles:\n * - 균형회복 (Gyunhyeong Hoebog) - Balance restoration\n * - 자세복귀 (Jase Bokgwi) - Stance return\n * - 호흡조절 (Hoheup Jojoel) - Breath control during recovery\n * - 근육이완 (Geunryuk Ihwan) - Muscle relaxation after tension\n *\n * @module systems/animation/RecoveryPhaseEnhancer\n * @category Animation System\n * @korean 복귀애니메이션강화\n */\n\nimport * as THREE from \"three\";\nimport type {\n AnimationKeyframe,\n SkeletalAnimation,\n} from \"@/types/skeletal\";\n\n/**\n * Recovery phase configuration options\n *\n * **Korean**: 복귀 설정\n *\n * @category Animation\n * @korean 복귀설정\n */\nexport interface RecoveryPhaseConfig {\n /**\n * Duration of recovery phase in seconds (default: 0.2s = 200ms)\n * Recommended range: 0.15 - 0.25 seconds\n * **Korean**: 복귀 시간\n */\n readonly duration?: number;\n\n /**\n * Percentage of return in intermediate keyframe (default: 0.8 = 80%)\n * **Korean**: 중간 복귀 비율\n */\n readonly intermediateReturnPercent?: number;\n\n /**\n * Initial muscle tension level at peak technique (default: 1.0 = 100%)\n * **Korean**: 최대 근육 긴장도\n */\n readonly peakMuscleTension?: number;\n\n /**\n * Muscle tension at intermediate recovery (default: 0.4 = 40%)\n * **Korean**: 중간 근육 긴장도\n */\n readonly intermediateMuscleTension?: number;\n\n /**\n * Final muscle tension in relaxed state (default: 0.1 = 10%)\n * **Korean**: 최종 근육 긴장도\n */\n readonly finalMuscleTension?: number;\n\n /**\n * Whether to use ease-out interpolation (default: true)\n * **Korean**: 부드러운 감속 사용\n */\n readonly useEaseOut?: boolean;\n}\n\n/**\n * Default recovery phase configuration\n * Based on Korean martial arts recovery principles\n *\n * **Korean**: 기본 복귀 설정\n */\nconst DEFAULT_RECOVERY_CONFIG: Required<RecoveryPhaseConfig> = {\n duration: 0.22, // 220ms - optimal for realistic recovery\n intermediateReturnPercent: 0.8, // 80% back to neutral\n peakMuscleTension: 1.0, // 100% tension at technique peak\n intermediateMuscleTension: 0.4, // 40% tension during recovery\n finalMuscleTension: 0.1, // 10% relaxed state\n useEaseOut: true,\n};\n\n/**\n * Add realistic recovery phase to technique animation\n *\n * **Korean**: 기술 애니메이션에 복귀 단계 추가\n *\n * Enhances technique animations with proper recovery phases following\n * Korean martial arts principles of 복귀 (Bokgwi - recovery/return).\n *\n * The recovery phase consists of two keyframes:\n * 1. **Intermediate recovery** (60% of recovery duration):\n * - Returns 80% toward neutral position\n * - Reduces muscle tension to 40%\n * - Uses ease-out for gradual deceleration\n *\n * 2. **Final recovery** (100% of recovery duration):\n * - Fully returns to neutral stance\n * - Relaxes muscle tension to 10%\n * - Completes breath cycle\n *\n * @param animation - Base technique animation\n * @param config - Recovery phase configuration options\n * @returns Enhanced animation with recovery phase\n *\n * @example\n * ```typescript\n * // Add default 220ms recovery to front kick\n * const kickWithRecovery = addRecoveryPhase(FRONT_KICK_ANIMATION);\n *\n * // Add custom 180ms recovery with faster muscle release\n * const quickRecovery = addRecoveryPhase(JAB_ANIMATION, {\n * duration: 0.18,\n * intermediateMuscleTension: 0.3,\n * finalMuscleTension: 0.05,\n * });\n * ```\n *\n * @korean 복귀단계추가\n */\nexport function addRecoveryPhase(\n animation: SkeletalAnimation,\n config: RecoveryPhaseConfig = {}\n): SkeletalAnimation {\n // Merge with defaults\n const finalConfig: Required<RecoveryPhaseConfig> = {\n ...DEFAULT_RECOVERY_CONFIG,\n ...config,\n };\n\n // Validate animation has at least 2 keyframes\n if (animation.keyframes.length < 2) {\n // In production, this would use proper logging system\n // For now, using console.warn is acceptable for development\n // Suppress console output during tests to avoid cluttering test output\n // Note: In test environments, proper assertions should validate this condition\n if (process.env.NODE_ENV !== \"test\") {\n console.warn(\n `Animation \"${animation.name}\" has fewer than 2 keyframes. Recovery phase not added.`\n );\n }\n return animation;\n }\n\n const lastKeyframe = animation.keyframes[animation.keyframes.length - 1];\n const peakKeyframe = animation.keyframes[animation.keyframes.length - 2];\n\n // Calculate recovery timing\n const recoveryStartTime = lastKeyframe.time;\n const intermediateTime = recoveryStartTime + finalConfig.duration * 0.6;\n const finalTime = recoveryStartTime + finalConfig.duration;\n\n // Create intermediate recovery keyframe (80% back to neutral)\n const intermediateFrame: AnimationKeyframe = {\n time: intermediateTime,\n easing: finalConfig.useEaseOut ? \"ease-out\" : \"linear\",\n boneRotations: new Map(),\n bonePositions: new Map(),\n };\n\n // Interpolate bone rotations 80% toward neutral\n peakKeyframe.boneRotations.forEach((rotation, bone) => {\n const intermediate = new THREE.Euler(\n rotation.x * (1 - finalConfig.intermediateReturnPercent),\n rotation.y * (1 - finalConfig.intermediateReturnPercent),\n rotation.z * (1 - finalConfig.intermediateReturnPercent),\n rotation.order\n );\n intermediateFrame.boneRotations.set(bone, intermediate);\n });\n\n // Interpolate bone positions 80% toward rest\n if (peakKeyframe.bonePositions) {\n peakKeyframe.bonePositions.forEach((position, bone) => {\n // Manual interpolation instead of Vector3.lerp() because bonePositions map\n // may contain objects that aren't true THREE.Vector3 instances with prototype methods.\n // This approach ensures compatibility with any object having x, y, z properties.\n const returnPercent = finalConfig.intermediateReturnPercent;\n const intermediate = new THREE.Vector3(\n position.x * (1 - returnPercent),\n position.y * (1 - returnPercent),\n position.z * (1 - returnPercent)\n );\n intermediateFrame.bonePositions.set(bone, intermediate);\n });\n }\n\n // Create final recovery frame (100% neutral)\n const finalFrame: AnimationKeyframe = {\n time: finalTime,\n easing: finalConfig.useEaseOut ? \"ease-out\" : \"linear\",\n boneRotations: new Map(),\n bonePositions: new Map(),\n };\n\n // All bones return to neutral (0 rotation)\n peakKeyframe.boneRotations.forEach((rotation, bone) => {\n finalFrame.boneRotations.set(\n bone,\n new THREE.Euler(0, 0, 0, rotation.order)\n );\n });\n\n // All positions return to rest\n if (peakKeyframe.bonePositions) {\n peakKeyframe.bonePositions.forEach((_, bone) => {\n finalFrame.bonePositions.set(bone, new THREE.Vector3(0, 0, 0));\n });\n }\n\n // Build enhanced animation\n return {\n ...animation,\n duration: finalTime,\n keyframes: [...animation.keyframes, intermediateFrame, finalFrame],\n };\n}\n\n/**\n * Create technique animation with recovery phase\n *\n * **Korean**: 복귀 단계를 포함한 기술 애니메이션 생성\n *\n * Convenience function that wraps animation creation with automatic recovery phase.\n * Use this when creating new technique animations from scratch.\n *\n * @param baseAnimation - Base animation without recovery\n * @param config - Recovery configuration\n * @returns Complete animation with recovery phase\n *\n * @example\n * ```typescript\n * // Create front kick with recovery\n * const frontKick = createTechniqueWithRecovery(\n * baseFrontKickAnimation,\n * { duration: 0.22 }\n * );\n * ```\n *\n * @korean 복귀단계기술생성\n */\nexport function createTechniqueWithRecovery(\n baseAnimation: SkeletalAnimation,\n config: RecoveryPhaseConfig = {}\n): SkeletalAnimation {\n return addRecoveryPhase(baseAnimation, config);\n}\n\n/**\n * Validate recovery phase quality\n *\n * **Korean**: 복귀 단계 품질 검증\n *\n * Checks if an animation has proper recovery phase characteristics:\n * - Has at least 2 recovery keyframes\n * - Recovery duration between 150-250ms\n * - Uses ease-out interpolation\n * - Returns to neutral position\n *\n * @param animation - Animation to validate\n * @returns Validation result with details\n *\n * @korean 복귀품질검증\n */\nexport interface RecoveryValidationResult {\n /** Whether animation has valid recovery phase */\n readonly isValid: boolean;\n /** Validation issues found */\n readonly issues: string[];\n /** Recovery duration in milliseconds */\n readonly recoveryDuration: number;\n /** Number of recovery keyframes */\n readonly recoveryKeyframes: number;\n}\n\n/**\n * Validate recovery phase in animation\n *\n * @param animation - Animation to validate\n * @returns Validation result\n *\n * @korean 복귀검증\n */\nexport function validateRecoveryPhase(\n animation: SkeletalAnimation\n): RecoveryValidationResult {\n const issues: string[] = [];\n\n if (animation.keyframes.length < 3) {\n issues.push(\n \"Animation has fewer than 3 keyframes (needs at least 3 for recovery)\"\n );\n return {\n isValid: false,\n issues,\n recoveryDuration: 0,\n recoveryKeyframes: 0,\n };\n }\n\n // Recovery phase is from the third-to-last keyframe (peak) to last keyframe (final recovery)\n // This is because addRecoveryPhase adds TWO keyframes: intermediate and final\n const lastKeyframe = animation.keyframes[animation.keyframes.length - 1];\n const thirdLastKeyframe = animation.keyframes[animation.keyframes.length - 3];\n\n const recoveryDuration = (lastKeyframe.time - thirdLastKeyframe.time) * 1000; // ms\n\n // Validate duration\n if (recoveryDuration < 150) {\n issues.push(\n `Recovery duration too short: ${recoveryDuration.toFixed(\n 0\n )}ms (minimum: 150ms)`\n );\n }\n if (recoveryDuration > 250) {\n issues.push(\n `Recovery duration too long: ${recoveryDuration.toFixed(\n 0\n )}ms (maximum: 250ms)`\n );\n }\n\n // Validate easing - both ease-out and ease-in are acceptable for recovery\n // ease-out is preferred but ease-in can also work for final deceleration\n const acceptableEasings = [\"ease-out\", \"ease-in\"];\n if (!acceptableEasings.includes(lastKeyframe.easing ?? \"\")) {\n issues.push(\n `Last keyframe should use ease-out or ease-in interpolation, found: ${lastKeyframe.easing}`\n );\n }\n\n // Validate return to neutral\n let hasNonZeroRotation = false;\n lastKeyframe.boneRotations.forEach((rotation) => {\n if (\n Math.abs(rotation.x) > 0.01 ||\n Math.abs(rotation.y) > 0.01 ||\n Math.abs(rotation.z) > 0.01\n ) {\n hasNonZeroRotation = true;\n }\n });\n\n if (hasNonZeroRotation) {\n issues.push(\"Final keyframe should return to neutral position (0, 0, 0)\");\n }\n\n return {\n isValid: issues.length === 0,\n issues,\n recoveryDuration,\n recoveryKeyframes: 2,\n };\n}\n\n/**\n * Calculate muscle tension at specific time in animation\n *\n * **Korean**: 애니메이션 시간별 근육 긴장도 계산\n *\n * Interpolates muscle tension based on animation progress and recovery phase.\n * Tension peaks during technique execution and gradually releases during recovery.\n *\n * @param animation - Animation with recovery phase\n * @param currentTime - Current time in animation (seconds)\n * @param config - Recovery configuration used\n * @returns Muscle tension value (0.0 to 1.0)\n *\n * @korean 근육긴장도계산\n */\nexport function calculateMuscleTension(\n animation: SkeletalAnimation,\n currentTime: number,\n config: RecoveryPhaseConfig = {}\n): number {\n const finalConfig = { ...DEFAULT_RECOVERY_CONFIG, ...config };\n\n if (animation.keyframes.length < 2) {\n return finalConfig.finalMuscleTension;\n }\n\n // Recovery phase starts at the third-to-last keyframe (after peak)\n const lastKeyframe = animation.keyframes[animation.keyframes.length - 1];\n const recoveryStartTime =\n animation.keyframes.length >= 3\n ? animation.keyframes[animation.keyframes.length - 3].time\n : animation.keyframes[animation.keyframes.length - 2].time;\n\n // Before recovery: peak tension\n if (currentTime < recoveryStartTime) {\n return finalConfig.peakMuscleTension;\n }\n\n // During recovery: interpolate from peak to relaxed\n const recoveryProgress =\n (currentTime - recoveryStartTime) / (lastKeyframe.time - recoveryStartTime);\n const clampedProgress = Math.max(0, Math.min(1, recoveryProgress));\n\n // Use ease-out curve for natural muscle release\n const easedProgress = 1 - Math.pow(1 - clampedProgress, 2);\n\n // Interpolate tension\n if (easedProgress < 0.6) {\n // First 60%: peak -> intermediate\n const t = easedProgress / 0.6;\n return (\n finalConfig.peakMuscleTension +\n (finalConfig.intermediateMuscleTension - finalConfig.peakMuscleTension) *\n t\n );\n } else {\n // Last 40%: intermediate -> final\n const t = (easedProgress - 0.6) / 0.4;\n return (\n finalConfig.intermediateMuscleTension +\n (finalConfig.finalMuscleTension - finalConfig.intermediateMuscleTension) *\n t\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAyEA,IAAM,0BAAyD;CAC7D,UAAU;CACV,2BAA2B;CAC3B,mBAAmB;CACnB,2BAA2B;CAC3B,oBAAoB;CACpB,YAAY;CACb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCD,SAAgB,iBACd,WACA,SAA8B,EAAE,EACb;CAEnB,MAAM,cAA6C;EACjD,GAAG;EACH,GAAG;EACJ;CAGD,IAAI,UAAU,UAAU,SAAS,GAAG;EAKlC,IAAA,QAAA,IAAA,aAA6B,QAC3B,QAAQ,KACN,cAAc,UAAU,KAAK,yDAC9B;EAEH,OAAO;;CAGT,MAAM,eAAe,UAAU,UAAU,UAAU,UAAU,SAAS;CACtE,MAAM,eAAe,UAAU,UAAU,UAAU,UAAU,SAAS;CAGtE,MAAM,oBAAoB,aAAa;CACvC,MAAM,mBAAmB,oBAAoB,YAAY,WAAW;CACpE,MAAM,YAAY,oBAAoB,YAAY;CAGlD,MAAM,oBAAuC;EAC3C,MAAM;EACN,QAAQ,YAAY,aAAa,aAAa;EAC9C,+BAAe,IAAI,KAAK;EACxB,+BAAe,IAAI,KAAK;EACzB;CAGD,aAAa,cAAc,SAAS,UAAU,SAAS;EACrD,MAAM,eAAe,IAAI,MAAM,MAC7B,SAAS,KAAK,IAAI,YAAY,4BAC9B,SAAS,KAAK,IAAI,YAAY,4BAC9B,SAAS,KAAK,IAAI,YAAY,4BAC9B,SAAS,MACV;EACD,kBAAkB,cAAc,IAAI,MAAM,aAAa;GACvD;CAGF,IAAI,aAAa,eACf,aAAa,cAAc,SAAS,UAAU,SAAS;EAIrD,MAAM,gBAAgB,YAAY;EAClC,MAAM,eAAe,IAAI,MAAM,QAC7B,SAAS,KAAK,IAAI,gBAClB,SAAS,KAAK,IAAI,gBAClB,SAAS,KAAK,IAAI,eACnB;EACD,kBAAkB,cAAc,IAAI,MAAM,aAAa;GACvD;CAIJ,MAAM,aAAgC;EACpC,MAAM;EACN,QAAQ,YAAY,aAAa,aAAa;EAC9C,+BAAe,IAAI,KAAK;EACxB,+BAAe,IAAI,KAAK;EACzB;CAGD,aAAa,cAAc,SAAS,UAAU,SAAS;EACrD,WAAW,cAAc,IACvB,MACA,IAAI,MAAM,MAAM,GAAG,GAAG,GAAG,SAAS,MAAM,CACzC;GACD;CAGF,IAAI,aAAa,eACf,aAAa,cAAc,SAAS,GAAG,SAAS;EAC9C,WAAW,cAAc,IAAI,MAAM,IAAI,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC;GAC9D;CAIJ,OAAO;EACL,GAAG;EACH,UAAU;EACV,WAAW;GAAC,GAAG,UAAU;GAAW;GAAmB;GAAW;EACnE"}
@@ -15,7 +15,6 @@ import { AttackAnimationType } from "../../../types/skeletal";
15
15
  * @param animationType - Attack animation type enum
16
16
  * @returns Name of skeletal animation from ATTACK_ANIMATIONS map
17
17
  *
18
- * @public
19
18
  * @korean 애니메이션타입에서이름가져오기
20
19
  */
21
20
  export declare function getAnimationNameForType(animationType: AttackAnimationType): string;
@@ -25,7 +24,6 @@ export declare function getAnimationNameForType(animationType: AttackAnimationTy
25
24
  * @param animationType - Attack animation type enum
26
25
  * @returns True if animation exists in ATTACK_ANIMATIONS map
27
26
  *
28
- * @public
29
27
  * @korean 애니메이션존재확인
30
28
  */
31
29
  export declare function hasAnimationForType(animationType: AttackAnimationType): boolean;
@@ -40,7 +38,6 @@ export declare function hasAnimationForType(animationType: AttackAnimationType):
40
38
  * @param damageType - Type of damage dealt
41
39
  * @returns Best-matching attack animation type
42
40
  *
43
- * @public
44
41
  * @korean 기술에서애니메이션타입결정
45
42
  */
46
43
  export declare function determineAnimationTypeForTechnique(techniqueName: string, techniqueId: string, damageType?: string): AttackAnimationType;
@@ -55,7 +52,6 @@ export declare function determineAnimationTypeForTechnique(techniqueName: string
55
52
  * @param damage - Base damage of the technique
56
53
  * @returns Speed modifier (0.8 - 1.2)
57
54
  *
58
- * @public
59
55
  * @korean 기술위력에서속도배율계산
60
56
  */
61
57
  export declare function calculateSpeedModifierForDamage(damage: number): number;
@@ -66,7 +62,6 @@ export declare function calculateSpeedModifierForDamage(damage: number): number;
66
62
  * @param speedModifier - Speed multiplier (0.8 - 1.2)
67
63
  * @returns Adjusted duration in milliseconds
68
64
  *
69
- * @public
70
65
  * @korean 조정된애니메이션지속시간
71
66
  */
72
67
  export declare function getAdjustedAnimationDuration(baseAnimationName: string, speedModifier: number): number;
@@ -80,7 +75,6 @@ import { MappingValidationResult, TechniqueAnimation, TechniqueAnimationKey } fr
80
75
  * with intelligent fallback system and build-time validation.
81
76
  *
82
77
  * @class
83
- * @public
84
78
  */
85
79
  export declare class TechniqueAnimationMapper {
86
80
  /** Primary animation mapping table */
@@ -103,7 +97,6 @@ export declare class TechniqueAnimationMapper {
103
97
  * @param key - Technique animation key
104
98
  * @returns Technique animation configuration
105
99
  *
106
- * @public
107
100
  * @korean 애니메이션가져오기
108
101
  */
109
102
  getAnimation(key: TechniqueAnimationKey): TechniqueAnimation;
@@ -273,7 +266,6 @@ export declare class TechniqueAnimationMapper {
273
266
  *
274
267
  * @returns Validation result with coverage and missing mappings
275
268
  *
276
- * @public
277
269
  * @korean 완전성검증
278
270
  */
279
271
  validateCompleteness(): MappingValidationResult;
@@ -284,7 +276,6 @@ export declare class TechniqueAnimationMapper {
284
276
  *
285
277
  * @returns Number of mapped combinations
286
278
  *
287
- * @public
288
279
  */
289
280
  getMappedCount(): number;
290
281
  }
@@ -296,7 +287,6 @@ export declare class TechniqueAnimationMapper {
296
287
  * Use this instance throughout the application for consistent
297
288
  * technique animation mapping.
298
289
  *
299
- * @public
300
290
  * @korean 싱글톤인스턴스
301
291
  */
302
292
  export declare const techniqueAnimationMapper: TechniqueAnimationMapper;
@@ -1 +1 @@
1
- {"version":3,"file":"TechniqueAnimationMapper.d.ts","sourceRoot":"","sources":["../../../../src/systems/animation/core/TechniqueAnimationMapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAmCvD;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,mBAAmB,GACjC,MAAM,CAER;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,aAAa,EAAE,mBAAmB,GACjC,OAAO,CAGT;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kCAAkC,CAChD,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,MAAM,GAClB,mBAAmB,CAuHrB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAOtE;AAED;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAC1C,iBAAiB,EAAE,MAAM,EACzB,aAAa,EAAE,MAAM,GACpB,MAAM,CAUR;AAsCD,OAAO,EAGL,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,EAGtB,MAAM,SAAS,CAAC;AAgMjB;;;;;;;;;;GAUG;AACH,qBAAa,wBAAwB;IACnC,sCAAsC;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;IAE/D,4CAA4C;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6C;IAEzE,oDAAoD;IACpD,OAAO,CAAC,oBAAoB,CAAC,CAAmC;;IAQhE;;;;;;;;;;;;;;;OAeG;IACI,YAAY,CAAC,GAAG,EAAE,qBAAqB,GAAG,kBAAkB;IAsBnE;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,eAAe;IAIvB;;;;;;OAMG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,yBAAyB;IA8DjC;;;;;;OAMG;IACH,OAAO,CAAC,YAAY;IA+BpB;;;;;;OAMG;IACH,OAAO,CAAC,uBAAuB;IAc/B;;;;;;OAMG;IACH,OAAO,CAAC,0BAA0B;IAalC;;;;;;OAMG;IACH,OAAO,CAAC,6BAA6B;IAarC;;;;;;;;OAQG;IACH,OAAO,CAAC,kCAAkC;IA8B1C;;;;;;;;OAQG;IACH,OAAO,CAAC,kCAAkC;IA2C1C;;;;;;;;OAQG;IACH,OAAO,CAAC,sBAAsB;IAgB9B;;;;;;;;;OASG;IACH,OAAO,CAAC,kBAAkB;IAc1B;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB;IAgB3B;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAa1B;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;IAe1B;;;;OAIG;IACH,OAAO,CAAC,iCAAiC;IAezC;;;;;;OAMG;IACH,OAAO,CAAC,oBAAoB;IAe5B;;;;;;OAMG;IACH,OAAO,CAAC,uBAAuB;IAyC/B;;;;;;;;;;;;OAYG;IACI,oBAAoB,IAAI,uBAAuB;IAsBtD;;;;;;;;OAQG;IACI,cAAc,IAAI,MAAM;CAGhC;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,wBAAwB,0BAAiC,CAAC"}
1
+ {"version":3,"file":"TechniqueAnimationMapper.d.ts","sourceRoot":"","sources":["../../../../src/systems/animation/core/TechniqueAnimationMapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAmCvD;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,mBAAmB,GACjC,MAAM,CAER;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,aAAa,EAAE,mBAAmB,GACjC,OAAO,CAGT;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kCAAkC,CAChD,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,MAAM,GAClB,mBAAmB,CAuHrB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAOtE;AAED;;;;;;;;GAQG;AACH,wBAAgB,4BAA4B,CAC1C,iBAAiB,EAAE,MAAM,EACzB,aAAa,EAAE,MAAM,GACpB,MAAM,CAUR;AAsCD,OAAO,EAGL,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,EAGtB,MAAM,SAAS,CAAC;AAgMjB;;;;;;;;;GASG;AACH,qBAAa,wBAAwB;IACnC,sCAAsC;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;IAE/D,4CAA4C;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6C;IAEzE,oDAAoD;IACpD,OAAO,CAAC,oBAAoB,CAAC,CAAmC;;IAQhE;;;;;;;;;;;;;;OAcG;IACI,YAAY,CAAC,GAAG,EAAE,qBAAqB,GAAG,kBAAkB;IAsBnE;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,eAAe;IAIvB;;;;;;OAMG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,yBAAyB;IA8DjC;;;;;;OAMG;IACH,OAAO,CAAC,YAAY;IA+BpB;;;;;;OAMG;IACH,OAAO,CAAC,uBAAuB;IAc/B;;;;;;OAMG;IACH,OAAO,CAAC,0BAA0B;IAalC;;;;;;OAMG;IACH,OAAO,CAAC,6BAA6B;IAarC;;;;;;;;OAQG;IACH,OAAO,CAAC,kCAAkC;IA8B1C;;;;;;;;OAQG;IACH,OAAO,CAAC,kCAAkC;IA2C1C;;;;;;;;OAQG;IACH,OAAO,CAAC,sBAAsB;IAgB9B;;;;;;;;;OASG;IACH,OAAO,CAAC,kBAAkB;IAc1B;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB;IAgB3B;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAa1B;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;IAe1B;;;;OAIG;IACH,OAAO,CAAC,iCAAiC;IAezC;;;;;;OAMG;IACH,OAAO,CAAC,oBAAoB;IAe5B;;;;;;OAMG;IACH,OAAO,CAAC,uBAAuB;IAyC/B;;;;;;;;;;;OAWG;IACI,oBAAoB,IAAI,uBAAuB;IAsBtD;;;;;;;OAOG;IACI,cAAc,IAAI,MAAM;CAGhC;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,wBAAwB,0BAAiC,CAAC"}
@@ -75,7 +75,6 @@ var ANIMATION_TYPE_TO_NAME_MAP = {
75
75
  * @param animationType - Attack animation type enum
76
76
  * @returns Name of skeletal animation from ATTACK_ANIMATIONS map
77
77
  *
78
- * @public
79
78
  * @korean 애니메이션타입에서이름가져오기
80
79
  */
81
80
  function getAnimationNameForType(animationType) {
@@ -92,7 +91,6 @@ function getAnimationNameForType(animationType) {
92
91
  * @param damageType - Type of damage dealt
93
92
  * @returns Best-matching attack animation type
94
93
  *
95
- * @public
96
94
  * @korean 기술에서애니메이션타입결정
97
95
  */
98
96
  function determineAnimationTypeForTechnique(techniqueName, techniqueId, damageType) {
@@ -132,7 +130,6 @@ function determineAnimationTypeForTechnique(techniqueName, techniqueId, damageTy
132
130
  * @param damage - Base damage of the technique
133
131
  * @returns Speed modifier (0.8 - 1.2)
134
132
  *
135
- * @public
136
133
  * @korean 기술위력에서속도배율계산
137
134
  */
138
135
  function calculateSpeedModifierForDamage(damage) {
@@ -147,7 +144,6 @@ function calculateSpeedModifierForDamage(damage) {
147
144
  * @param speedModifier - Speed multiplier (0.8 - 1.2)
148
145
  * @returns Adjusted duration in milliseconds
149
146
  *
150
- * @public
151
147
  * @korean 조정된애니메이션지속시간
152
148
  */
153
149
  function getAdjustedAnimationDuration(baseAnimationName, speedModifier) {
@@ -317,7 +313,6 @@ var STANCE_ANIMATION_CONFIG = {
317
313
  * with intelligent fallback system and build-time validation.
318
314
  *
319
315
  * @class
320
- * @public
321
316
  */
322
317
  var TechniqueAnimationMapper = class {
323
318
  /** Primary animation mapping table */
@@ -344,7 +339,6 @@ var TechniqueAnimationMapper = class {
344
339
  * @param key - Technique animation key
345
340
  * @returns Technique animation configuration
346
341
  *
347
- * @public
348
342
  * @korean 애니메이션가져오기
349
343
  */
350
344
  getAnimation(key) {
@@ -731,7 +725,6 @@ var TechniqueAnimationMapper = class {
731
725
  *
732
726
  * @returns Validation result with coverage and missing mappings
733
727
  *
734
- * @public
735
728
  * @korean 완전성검증
736
729
  */
737
730
  validateCompleteness() {
@@ -756,7 +749,6 @@ var TechniqueAnimationMapper = class {
756
749
  *
757
750
  * @returns Number of mapped combinations
758
751
  *
759
- * @public
760
752
  */
761
753
  getMappedCount() {
762
754
  return this.animationMap.size;
@@ -1 +1 @@
1
- {"version":3,"file":"TechniqueAnimationMapper.js","names":[],"sources":["../../../../src/systems/animation/core/TechniqueAnimationMapper.ts"],"sourcesContent":["/**\n * Technique Animation Mapper\n *\n * Maps 70 Korean techniques to appropriate attack animation types.\n * Implements the technique-to-animation link system for authentic martial arts animations.\n *\n * @module systems/animation/TechniqueAnimationMapper\n * @category Animation System\n * @korean 기술애니메이션매퍼\n */\n\nimport { AttackAnimationType } from \"@/types/skeletal\";\nimport { ATTACK_ANIMATIONS } from \"../catalogs/AttackAnimations\";\n\n/**\n * Maps AttackAnimationType to existing skeletal animation names\n *\n * Links the new enum-based system to existing animation implementation.\n * New animations will be added to AttackAnimations.ts as needed.\n *\n * @korean 애니메이션타입맵\n */\nconst ANIMATION_TYPE_TO_NAME_MAP: Record<AttackAnimationType, string> = {\n // Punch category (주먹 타격) - use existing animations\n [AttackAnimationType.PUNCH_HIGH]: \"jab\", // High punch to head\n [AttackAnimationType.PUNCH_MID]: \"cross\", // Mid-level cross punch\n [AttackAnimationType.PUNCH_LOW]: \"jab\", // Low punch to body (reuse jab for now)\n\n // Kick category (발차기) - use dedicated animations\n [AttackAnimationType.KICK_FRONT]: \"front_kick\", // Front kick (앞차기)\n [AttackAnimationType.KICK_SIDE]: \"side_kick\", // Side kick (옆차기) - NEW dedicated animation\n [AttackAnimationType.KICK_ROUNDHOUSE]: \"roundhouse_kick\", // Roundhouse kick (돌려차기)\n\n // Elbow category (팔꿈치 타격) - use dedicated elbow animations\n [AttackAnimationType.ELBOW_STRIKE]: \"elbow_strike\",\n [AttackAnimationType.ELBOW_UPPERCUT]: \"elbow_uppercut\", // NEW dedicated uppercut animation\n\n // Knee category (무릎 타격) - use dedicated knee animation\n [AttackAnimationType.KNEE_STRIKE]: \"knee_strike\",\n [AttackAnimationType.KNEE_CLINCH]: \"knee_strike\", // Reuse knee strike in clinch position\n\n // Pressure point category (급소 타격) - use precise jab motion\n [AttackAnimationType.PRESSURE_POINT]: \"jab\",\n [AttackAnimationType.PRESSURE_POINT_RAPID]: \"jab\",\n};\n\n/**\n * Get skeletal animation name for an attack animation type\n *\n * @param animationType - Attack animation type enum\n * @returns Name of skeletal animation from ATTACK_ANIMATIONS map\n *\n * @public\n * @korean 애니메이션타입에서이름가져오기\n */\nexport function getAnimationNameForType(\n animationType: AttackAnimationType,\n): string {\n return ANIMATION_TYPE_TO_NAME_MAP[animationType];\n}\n\n/**\n * Check if an animation type has a defined animation\n *\n * @param animationType - Attack animation type enum\n * @returns True if animation exists in ATTACK_ANIMATIONS map\n *\n * @public\n * @korean 애니메이션존재확인\n */\nexport function hasAnimationForType(\n animationType: AttackAnimationType,\n): boolean {\n const animationName = ANIMATION_TYPE_TO_NAME_MAP[animationType];\n return ATTACK_ANIMATIONS.has(animationName);\n}\n\n/**\n * Determines appropriate animation type from technique characteristics\n *\n * Uses technique name, damage type, and keywords to automatically\n * select the best-matching attack animation type.\n *\n * @param techniqueName - English or Korean technique name\n * @param techniqueId - Technique ID\n * @param damageType - Type of damage dealt\n * @returns Best-matching attack animation type\n *\n * @public\n * @korean 기술에서애니메이션타입결정\n */\nexport function determineAnimationTypeForTechnique(\n techniqueName: string,\n techniqueId: string,\n damageType?: string,\n): AttackAnimationType {\n const searchText = `${techniqueName} ${techniqueId}`.toLowerCase();\n\n // Pressure point / precise strikes (급소)\n if (\n searchText.includes(\"pressure\") ||\n searchText.includes(\"precise\") ||\n searchText.includes(\"nerve\") ||\n searchText.includes(\"vital\") ||\n searchText.includes(\"급소\") ||\n searchText.includes(\"신경\") ||\n damageType === \"nerve\" ||\n damageType === \"pressure\"\n ) {\n // Check for rapid/multi-hit variants\n if (\n searchText.includes(\"rapid\") ||\n searchText.includes(\"multiple\") ||\n searchText.includes(\"연속\")\n ) {\n return AttackAnimationType.PRESSURE_POINT_RAPID;\n }\n return AttackAnimationType.PRESSURE_POINT;\n }\n\n // Kicks (차기)\n if (\n searchText.includes(\"kick\") ||\n searchText.includes(\"차기\") ||\n searchText.includes(\"발\")\n ) {\n if (\n searchText.includes(\"roundhouse\") ||\n searchText.includes(\"round\") ||\n searchText.includes(\"돌려\") ||\n searchText.includes(\"회전\")\n ) {\n return AttackAnimationType.KICK_ROUNDHOUSE;\n }\n if (\n searchText.includes(\"side\") ||\n searchText.includes(\"옆\") ||\n searchText.includes(\"측면\")\n ) {\n return AttackAnimationType.KICK_SIDE;\n }\n // Default to front kick\n return AttackAnimationType.KICK_FRONT;\n }\n\n // Elbow strikes (팔꿈치)\n if (\n searchText.includes(\"elbow\") ||\n searchText.includes(\"팔꿈치\") ||\n searchText.includes(\"팔굽\")\n ) {\n if (\n searchText.includes(\"uppercut\") ||\n searchText.includes(\"올려\") ||\n searchText.includes(\"치켜\")\n ) {\n return AttackAnimationType.ELBOW_UPPERCUT;\n }\n return AttackAnimationType.ELBOW_STRIKE;\n }\n\n // Knee strikes (무릎)\n if (\n searchText.includes(\"knee\") ||\n searchText.includes(\"무릎\") ||\n searchText.includes(\"슬\")\n ) {\n if (\n searchText.includes(\"clinch\") ||\n searchText.includes(\"grab\") ||\n searchText.includes(\"잡고\")\n ) {\n return AttackAnimationType.KNEE_CLINCH;\n }\n return AttackAnimationType.KNEE_STRIKE;\n }\n\n // Punches (주먹) - check target height\n if (\n searchText.includes(\"punch\") ||\n searchText.includes(\"strike\") ||\n searchText.includes(\"주먹\") ||\n searchText.includes(\"권\") ||\n searchText.includes(\"격\")\n ) {\n // High attacks (head level)\n if (\n searchText.includes(\"head\") ||\n searchText.includes(\"high\") ||\n searchText.includes(\"temple\") ||\n searchText.includes(\"jaw\") ||\n searchText.includes(\"머리\") ||\n searchText.includes(\"관자\") ||\n searchText.includes(\"턱\")\n ) {\n return AttackAnimationType.PUNCH_HIGH;\n }\n // Low attacks (body level)\n if (\n searchText.includes(\"low\") ||\n searchText.includes(\"body\") ||\n searchText.includes(\"ribs\") ||\n searchText.includes(\"아래\") ||\n searchText.includes(\"복부\") ||\n searchText.includes(\"늑골\")\n ) {\n return AttackAnimationType.PUNCH_LOW;\n }\n // Default to mid-level punch\n return AttackAnimationType.PUNCH_MID;\n }\n\n // Default: mid-level punch for any unmatched technique\n return AttackAnimationType.PUNCH_MID;\n}\n\n/**\n * Calculates animation speed modifier based on technique power level\n *\n * Implements the rule:\n * - Light techniques (damage <20): 1.2x speed\n * - Normal techniques (damage 20-35): 1.0x speed\n * - Heavy techniques (damage >35): 0.8x speed\n *\n * @param damage - Base damage of the technique\n * @returns Speed modifier (0.8 - 1.2)\n *\n * @public\n * @korean 기술위력에서속도배율계산\n */\nexport function calculateSpeedModifierForDamage(damage: number): number {\n if (damage < 20) {\n return 1.2; // Light, fast techniques\n } else if (damage > 35) {\n return 0.8; // Heavy, powerful techniques\n }\n return 1.0; // Normal speed\n}\n\n/**\n * Get animation duration adjusted by speed modifier\n *\n * @param baseAnimationName - Name of base animation\n * @param speedModifier - Speed multiplier (0.8 - 1.2)\n * @returns Adjusted duration in milliseconds\n *\n * @public\n * @korean 조정된애니메이션지속시간\n */\nexport function getAdjustedAnimationDuration(\n baseAnimationName: string,\n speedModifier: number,\n): number {\n const animation = ATTACK_ANIMATIONS.get(baseAnimationName);\n if (!animation) {\n console.warn(\"Animation not found:\", baseAnimationName);\n return 200; // Default 200ms for missing animations\n }\n\n // Convert seconds to milliseconds and apply speed modifier\n const baseDurationMs = animation.duration * 1000;\n return Math.round(baseDurationMs / speedModifier);\n}\n\n/**\n * Comprehensive Technique Animation Mapping System\n *\n * **Korean**: 포괄적 기술 애니메이션 매핑 시스템\n *\n * Maps all 1024 technique configuration combinations\n * (8 stances × 4 technique types × 8 body parts × 4 intensities)\n * to appropriate animations with O(1) lookup performance.\n *\n * ## Architecture\n *\n * - **Primary Map**: Exact stance-type-part-intensity combinations\n * - **Fallback System**: 3-tier graceful degradation\n * 1. Exact match\n * 2. Intensity-agnostic match (same stance/type/part, medium intensity)\n * 3. Technique type generic (fallback to base technique animation)\n *\n * ## Korean Martial Arts Integration\n *\n * Each trigram stance influences animation selection:\n * - **☰ 건 (Geon)**: Direct, forceful animations\n * - **☱ 태 (Tae)**: Fluid, flowing animations\n * - **☲ 리 (Li)**: Precise, rapid animations\n * - **☳ 진 (Jin)**: Explosive, shocking animations\n * - **☴ 손 (Son)**: Continuous, pressuring animations\n * - **☵ 감 (Gam)**: Adaptive, countering animations\n * - **☶ 간 (Gan)**: Defensive, immovable animations\n * - **☷ 곤 (Gon)**: Grounding, takedown animations\n *\n * @module systems/animation/TechniqueAnimationMapper\n * @category Animation System\n * @korean 기술애니메이션매퍼\n */\n\nimport { TrigramStance } from \"@/types\";\nimport { BodyPart } from \"../../bodypart/types\";\nimport {\n AnimationPriority,\n AnimationState,\n MappingValidationResult,\n TechniqueAnimation,\n TechniqueAnimationKey,\n TechniqueIntensity,\n TechniqueTypeCategory,\n} from \"./types\";\n\n/**\n * Body part Korean terminology for animation names\n *\n * **Korean**: 신체 부위 한글 용어\n */\nconst BODY_PART_KOREAN: Record<string, string> = {\n [BodyPart.HEAD]: \"두부\",\n [BodyPart.NECK]: \"경부\",\n [BodyPart.TORSO_UPPER]: \"상체\",\n [BodyPart.TORSO_LOWER]: \"하체\",\n [BodyPart.ARM_LEFT]: \"좌팔\",\n [BodyPart.ARM_RIGHT]: \"우팔\",\n [BodyPart.LEG_LEFT]: \"좌각\",\n [BodyPart.LEG_RIGHT]: \"우각\",\n};\n\n/**\n * Body part English terminology for animation names\n */\nconst BODY_PART_ENGLISH: Record<string, string> = {\n [BodyPart.HEAD]: \"Head\",\n [BodyPart.NECK]: \"Neck\",\n [BodyPart.TORSO_UPPER]: \"Upper Torso\",\n [BodyPart.TORSO_LOWER]: \"Lower Torso\",\n [BodyPart.ARM_LEFT]: \"Left Arm\",\n [BodyPart.ARM_RIGHT]: \"Right Arm\",\n [BodyPart.LEG_LEFT]: \"Left Leg\",\n [BodyPart.LEG_RIGHT]: \"Right Leg\",\n};\n\n/**\n * Technique type Korean terminology\n *\n * **Korean**: 기술 유형 한글 용어\n */\nconst TECHNIQUE_TYPE_KOREAN: Record<TechniqueTypeCategory, string> = {\n strike: \"타격\",\n joint: \"관절\",\n throw: \"던지기\",\n pressure_point: \"급소\",\n};\n\n/**\n * Technique type English terminology\n */\nconst TECHNIQUE_TYPE_ENGLISH: Record<TechniqueTypeCategory, string> = {\n strike: \"Strike\",\n joint: \"Joint Lock\",\n throw: \"Throw\",\n pressure_point: \"Pressure Point\",\n};\n\n/**\n * Stance Korean names\n */\nconst STANCE_KOREAN: Record<string, string> = {\n [TrigramStance.GEON]: \"건괘\",\n [TrigramStance.TAE]: \"태괘\",\n [TrigramStance.LI]: \"리괘\",\n [TrigramStance.JIN]: \"진괘\",\n [TrigramStance.SON]: \"손괘\",\n [TrigramStance.GAM]: \"감괘\",\n [TrigramStance.GAN]: \"간괘\",\n [TrigramStance.GON]: \"곤괘\",\n};\n\n/**\n * Stance English names\n */\nconst STANCE_ENGLISH: Record<string, string> = {\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};\n\n/**\n * Stance Animation Characteristics Configuration\n *\n * **Korean**: 자세 애니메이션 특성 설정\n *\n * Data-driven configuration for each stance's animation modifiers,\n * eliminating code duplication across stance mapping methods.\n *\n * @internal\n */\ninterface StanceAnimationConfig {\n /** Base duration multiplier (1.0 = normal) */\n readonly durationMultiplier: number;\n /** Impact frame offset from base */\n readonly impactFrameOffset: number;\n /** Recovery frames offset from base */\n readonly recoveryFrameOffset: number;\n /** Technique-specific overrides (optional) */\n readonly techniqueOverrides?: Partial<\n Record<\n TechniqueTypeCategory,\n {\n durationMultiplier?: number;\n impactFrameOffset?: number;\n recoveryFrameOffset?: number;\n }\n >\n >;\n}\n\n/**\n * Stance animation characteristics by trigram\n *\n * **Korean**: 팔괘 자세별 애니메이션 특성\n *\n * Each stance has unique timing characteristics reflecting its philosophy:\n * - ☰ 건 (Geon/Heaven): Direct, powerful - standard timing with technique variations\n * - ☱ 태 (Tae/Lake): Fluid, flowing - faster recovery\n * - ☲ 리 (Li/Fire): Precise, rapid - fastest overall\n * - ☳ 진 (Jin/Thunder): Explosive - fast attack, longer recovery\n * - ☴ 손 (Son/Wind): Continuous - slightly fast, mobile\n * - ☵ 감 (Gam/Water): Adaptive - slightly slower, standard recovery\n * - ☶ 간 (Gan/Mountain): Defensive - slowest, longest recovery\n * - ☷ 곤 (Gon/Earth): Grounding - standard with throw specialization\n */\nconst STANCE_ANIMATION_CONFIG: Record<TrigramStance, StanceAnimationConfig> = {\n [TrigramStance.GEON]: {\n durationMultiplier: 1.0,\n impactFrameOffset: 0,\n recoveryFrameOffset: 0,\n techniqueOverrides: {\n joint: { durationMultiplier: 1.2 },\n throw: {\n durationMultiplier: 1.5,\n impactFrameOffset: 4,\n recoveryFrameOffset: 5,\n },\n pressure_point: {\n durationMultiplier: 0.8,\n impactFrameOffset: -2,\n },\n },\n },\n [TrigramStance.TAE]: {\n durationMultiplier: 1.0,\n impactFrameOffset: 0,\n recoveryFrameOffset: -2,\n techniqueOverrides: {\n joint: { durationMultiplier: 1.3 },\n },\n },\n [TrigramStance.LI]: {\n durationMultiplier: 0.85,\n impactFrameOffset: -1,\n recoveryFrameOffset: -3,\n },\n [TrigramStance.JIN]: {\n durationMultiplier: 0.9,\n impactFrameOffset: 0,\n recoveryFrameOffset: 2,\n },\n [TrigramStance.SON]: {\n durationMultiplier: 0.95,\n impactFrameOffset: 0,\n recoveryFrameOffset: -1,\n },\n [TrigramStance.GAM]: {\n durationMultiplier: 1.1,\n impactFrameOffset: 1,\n recoveryFrameOffset: 0,\n },\n [TrigramStance.GAN]: {\n durationMultiplier: 1.2,\n impactFrameOffset: 2,\n recoveryFrameOffset: 3,\n },\n [TrigramStance.GON]: {\n durationMultiplier: 1.0,\n impactFrameOffset: 0,\n recoveryFrameOffset: 0,\n techniqueOverrides: {\n throw: {\n durationMultiplier: 1.6,\n impactFrameOffset: 3,\n recoveryFrameOffset: 4,\n },\n },\n },\n};\n\n/**\n * Comprehensive Technique Animation Mapper Class\n *\n * **Korean**: 기술 애니메이션 매퍼 클래스\n *\n * Provides O(1) lookup for all 1024 technique-stance combinations\n * with intelligent fallback system and build-time validation.\n *\n * @class\n * @public\n */\nexport class TechniqueAnimationMapper {\n /** Primary animation mapping table */\n private readonly animationMap: Map<string, TechniqueAnimation>;\n\n /** Fallback animations by technique type */\n private readonly fallbackMap: Map<TechniqueTypeCategory, AnimationState>;\n\n /** Cache for generated combinations (validation) */\n private allCombinationsCache?: readonly TechniqueAnimationKey[];\n\n constructor() {\n this.animationMap = new Map();\n this.fallbackMap = this.initializeFallbacks();\n this.initializeCompleteMapping();\n }\n\n /**\n * Get animation for specific technique\n *\n * **Korean**: 특정 기술의 애니메이션 가져오기\n *\n * Uses 3-tier lookup strategy:\n * 1. Exact match (stance + type + part + intensity)\n * 2. Intensity-agnostic (stance + type + part + medium intensity)\n * 3. Technique type fallback (generic animation for technique type)\n *\n * @param key - Technique animation key\n * @returns Technique animation configuration\n *\n * @public\n * @korean 애니메이션가져오기\n */\n public getAnimation(key: TechniqueAnimationKey): TechniqueAnimation {\n // Try exact match first\n const lookupKey = this.createLookupKey(key);\n const exactMatch = this.animationMap.get(lookupKey);\n if (exactMatch) {\n return exactMatch;\n }\n\n // Fallback: Try without intensity (use medium)\n const genericKey = this.createLookupKey({\n ...key,\n intensity: \"medium\",\n });\n const genericMatch = this.animationMap.get(genericKey);\n if (genericMatch) {\n return this.adjustForIntensity(genericMatch, key.intensity);\n }\n\n // Final fallback: Use technique type generic animation\n return this.getFallbackAnimation(key);\n }\n\n /**\n * Create composite lookup key from technique animation key\n *\n * **Korean**: 복합 조회 키 생성\n *\n * Format: \"stance-type-part-intensity\"\n * Example: \"geon-strike-head-heavy\"\n *\n * @param key - Technique animation key\n * @returns Composite lookup string\n *\n * @private\n */\n private createLookupKey(key: TechniqueAnimationKey): string {\n return `${key.stance}-${key.techniqueType}-${key.bodyPart}-${key.intensity}`;\n }\n\n /**\n * Initialize fallback animations by technique type\n *\n * **Korean**: 기술 유형별 대체 애니메이션 초기화\n *\n * @private\n */\n private initializeFallbacks(): Map<TechniqueTypeCategory, AnimationState> {\n return new Map([\n [\"strike\", AnimationState.ATTACK],\n [\"joint\", AnimationState.ATTACK],\n [\"throw\", AnimationState.ATTACK],\n [\"pressure_point\", AnimationState.ATTACK],\n ]);\n }\n\n /**\n * Initialize complete mapping table\n *\n * **Korean**: 전체 매핑 테이블 초기화\n *\n * Maps all 1024 combinations organized by:\n * - 8 stances\n * - 4 technique types\n * - 8 body parts\n * - 4 intensity levels\n *\n * Uses data-driven STANCE_ANIMATION_CONFIG to eliminate code duplication.\n *\n * @private\n */\n private initializeCompleteMapping(): void {\n const bodyParts = Object.values(BodyPart);\n const intensities: TechniqueIntensity[] = [\n \"light\",\n \"medium\",\n \"heavy\",\n \"critical\",\n ];\n const techniqueTypes: TechniqueTypeCategory[] = [\n \"strike\",\n \"joint\",\n \"throw\",\n \"pressure_point\",\n ];\n\n // Map all 8 trigram stances using configuration\n Object.values(TrigramStance).forEach((stance) => {\n const config = STANCE_ANIMATION_CONFIG[stance];\n\n bodyParts.forEach((bodyPart) => {\n intensities.forEach((intensity) => {\n techniqueTypes.forEach((techniqueType) => {\n // Get base values with technique-specific overrides\n const override = config.techniqueOverrides?.[techniqueType];\n const durationMult =\n override?.durationMultiplier ?? config.durationMultiplier;\n const impactOffset =\n override?.impactFrameOffset ?? config.impactFrameOffset;\n const recoveryOffset =\n override?.recoveryFrameOffset ?? config.recoveryFrameOffset;\n\n this.mapTechnique(\n { stance, techniqueType, bodyPart, intensity },\n {\n animationState: AnimationState.ATTACK,\n duration:\n this.getDurationForIntensity(intensity) * durationMult,\n impactFrame:\n this.getImpactFrameForIntensity(intensity) + impactOffset,\n recoveryFrames:\n this.getRecoveryFramesForIntensity(intensity) +\n recoveryOffset,\n priority: AnimationPriority.ATTACK,\n koreanName: this.generateKoreanName(\n stance,\n techniqueType,\n bodyPart,\n intensity,\n ),\n englishName: this.generateEnglishName(\n stance,\n techniqueType,\n bodyPart,\n intensity,\n ),\n },\n );\n });\n });\n });\n });\n }\n /**\n * Add single technique mapping to the map with automatic rotation calculation\n *\n * **Korean**: 단일 기술 매핑 추가\n *\n * @private\n */\n private mapTechnique(\n key: TechniqueAnimationKey,\n animation: TechniqueAnimation,\n ): void {\n // Calculate rotation properties if not provided\n const torsoRotation =\n animation.torsoRotation ??\n this.getTorsoRotationForStanceTechnique(key.stance, key.techniqueType);\n const hipEngagement =\n animation.hipEngagement ??\n this.getHipEngagementForStanceTechnique(\n key.stance,\n key.techniqueType,\n key.intensity,\n );\n const powerModifier =\n animation.powerModifier ??\n this.calculatePowerModifier(hipEngagement, key.techniqueType);\n\n // Create complete animation with rotation properties\n const completeAnimation: TechniqueAnimation = {\n ...animation,\n torsoRotation,\n hipEngagement,\n powerModifier,\n };\n\n const lookupKey = this.createLookupKey(key);\n this.animationMap.set(lookupKey, completeAnimation);\n }\n\n /**\n * Get duration based on intensity level\n *\n * **Korean**: 강도 레벨에 따른 지속시간 가져오기\n *\n * @private\n */\n private getDurationForIntensity(intensity: TechniqueIntensity): number {\n const baseDuration = 0.6; // 600ms base\n switch (intensity) {\n case \"light\":\n return baseDuration * 0.7; // 420ms\n case \"medium\":\n return baseDuration; // 600ms\n case \"heavy\":\n return baseDuration * 1.3; // 780ms\n case \"critical\":\n return baseDuration * 1.6; // 960ms\n }\n }\n\n /**\n * Get impact frame based on intensity level\n *\n * **Korean**: 강도 레벨에 따른 충격 프레임 가져오기\n *\n * @private\n */\n private getImpactFrameForIntensity(intensity: TechniqueIntensity): number {\n switch (intensity) {\n case \"light\":\n return 8; // Frame 8 at 60fps\n case \"medium\":\n return 10; // Frame 10\n case \"heavy\":\n return 14; // Frame 14\n case \"critical\":\n return 18; // Frame 18\n }\n }\n\n /**\n * Get recovery frames based on intensity level\n *\n * **Korean**: 강도 레벨에 따른 회복 프레임 가져오기\n *\n * @private\n */\n private getRecoveryFramesForIntensity(intensity: TechniqueIntensity): number {\n switch (intensity) {\n case \"light\":\n return 8; // 8 frames recovery\n case \"medium\":\n return 12; // 12 frames recovery\n case \"heavy\":\n return 18; // 18 frames recovery\n case \"critical\":\n return 24; // 24 frames recovery\n }\n }\n\n /**\n * Calculate torso rotation for stance-technique combination\n *\n * **Korean**: 자세-기술 조합의 허리 회전 계산\n *\n * Returns rotation in radians (-π/2 to π/2)\n *\n * @private\n */\n private getTorsoRotationForStanceTechnique(\n stance: string,\n techniqueType: TechniqueTypeCategory,\n ): number {\n // Stance-specific base rotations (in radians)\n const stanceRotations: Record<string, number> = {\n [TrigramStance.GEON]: Math.PI / 6, // 30° - Direct, moderate rotation\n [TrigramStance.TAE]: Math.PI / 18, // 10° - Minimal rotation, fluid\n [TrigramStance.LI]: Math.PI / 9, // 20° - Quick snap rotation\n [TrigramStance.JIN]: Math.PI / 4, // 45° - Wide explosive rotation\n [TrigramStance.SON]: Math.PI / 12, // 15° - Continuous adaptive flow\n [TrigramStance.GAM]: Math.PI / 8, // 22.5° - Circular wave motion\n [TrigramStance.GAN]: Math.PI / 36, // 5° - Stable, minimal rotation\n [TrigramStance.GON]: Math.PI / 3, // 60° - Deep grounded rotation\n };\n\n const baseRotation = stanceRotations[stance] ?? 0;\n\n // Technique type modifiers\n const techniqueMultipliers: Record<TechniqueTypeCategory, number> = {\n strike: 1.2, // 20% more rotation for strikes\n joint: 0.7, // 30% less for joint locks\n throw: 1.5, // 50% more for throws\n pressure_point: 0.8, // 20% less for precision strikes\n };\n\n const multiplier = techniqueMultipliers[techniqueType] ?? 1.0;\n return Math.min(Math.PI / 2, baseRotation * multiplier); // Clamp to ±90°\n }\n\n /**\n * Calculate hip engagement for stance-technique combination\n *\n * **Korean**: 자세-기술 조합의 골반 참여도 계산\n *\n * Returns engagement factor (0-1)\n *\n * @private\n */\n private getHipEngagementForStanceTechnique(\n stance: string,\n techniqueType: TechniqueTypeCategory,\n intensity: TechniqueIntensity,\n ): number {\n // Stance-specific base hip engagement\n const stanceEngagement: Record<string, number> = {\n [TrigramStance.GEON]: 0.9, // High engagement - direct force\n [TrigramStance.TAE]: 0.5, // Moderate - fluid movement\n [TrigramStance.LI]: 0.7, // Good - rapid techniques\n [TrigramStance.JIN]: 1.0, // Maximum - explosive power\n [TrigramStance.SON]: 0.6, // Moderate - continuous pressure\n [TrigramStance.GAM]: 0.7, // Good - adaptive flow\n [TrigramStance.GAN]: 0.3, // Low - stable defensive\n [TrigramStance.GON]: 0.95, // Very high - grounding techniques\n };\n\n const baseEngagement = stanceEngagement[stance] ?? 0.6;\n\n // Technique type modifiers\n const techniqueMultipliers: Record<TechniqueTypeCategory, number> = {\n strike: 1.0, // Full engagement for strikes\n joint: 0.6, // Lower for joint manipulation\n throw: 1.1, // Highest for throws\n pressure_point: 0.7, // Moderate for precision\n };\n\n // Intensity modifiers\n const intensityMultipliers: Record<TechniqueIntensity, number> = {\n light: 0.7,\n medium: 0.9,\n heavy: 1.0,\n critical: 1.1,\n };\n\n const engagement =\n baseEngagement *\n techniqueMultipliers[techniqueType] *\n intensityMultipliers[intensity];\n\n return Math.min(1.0, Math.max(0.0, engagement)); // Clamp to 0-1\n }\n\n /**\n * Calculate power modifier from hip engagement\n *\n * **Korean**: 골반 참여도로부터 파워 배율 계산\n *\n * Based on PR #1132 calculateHipRotationPowerModifier system\n *\n * @private\n */\n private calculatePowerModifier(\n hipEngagement: number,\n techniqueType: TechniqueTypeCategory,\n ): number {\n // Base power curve: 1.0 + (engagement * maxBonus)\n const maxBonusByType: Record<TechniqueTypeCategory, number> = {\n strike: 0.3, // 30% max bonus for strikes\n joint: 0.1, // 10% for joint locks\n throw: 0.2, // 20% for throws\n pressure_point: 0.25, // 25% for pressure points\n };\n\n const maxBonus = maxBonusByType[techniqueType] ?? 0.2;\n return 1.0 + hipEngagement * maxBonus;\n }\n\n /**\n * Generate Korean technique name\n *\n * **Korean**: 한글 기술 이름 생성\n *\n * Format: \"스탠스 신체부위 강도 기술유형\"\n * Example: \"건괘 두부 강 타격\"\n *\n * @private\n */\n private generateKoreanName(\n stance: string,\n techniqueType: TechniqueTypeCategory,\n bodyPart: string,\n intensity: TechniqueIntensity,\n ): string {\n const stanceName = STANCE_KOREAN[stance] ?? stance;\n const bodyPartName = BODY_PART_KOREAN[bodyPart] ?? bodyPart;\n const techniqueName = TECHNIQUE_TYPE_KOREAN[techniqueType] ?? techniqueType;\n const intensityName = this.getIntensityKorean(intensity);\n\n return `${stanceName} ${bodyPartName} ${intensityName} ${techniqueName}`;\n }\n\n /**\n * Generate English technique name\n *\n * Format: \"Stance BodyPart Intensity TechniqueType\"\n * Example: \"Heaven Head Heavy Strike\"\n *\n * @private\n */\n private generateEnglishName(\n stance: string,\n techniqueType: TechniqueTypeCategory,\n bodyPart: string,\n intensity: TechniqueIntensity,\n ): string {\n const stanceName = STANCE_ENGLISH[stance] ?? stance;\n const bodyPartName = BODY_PART_ENGLISH[bodyPart] ?? bodyPart;\n const techniqueName =\n TECHNIQUE_TYPE_ENGLISH[techniqueType] ?? techniqueType;\n const intensityName =\n intensity.charAt(0).toUpperCase() + intensity.slice(1);\n\n return `${stanceName} ${bodyPartName} ${intensityName} ${techniqueName}`;\n }\n\n /**\n * Get Korean intensity name\n *\n * @private\n */\n private getIntensityKorean(intensity: TechniqueIntensity): string {\n switch (intensity) {\n case \"light\":\n return \"경\";\n case \"medium\":\n return \"중\";\n case \"heavy\":\n return \"강\";\n case \"critical\":\n return \"극\";\n }\n }\n\n /**\n * Adjust animation for different intensity\n *\n * **Korean**: 강도에 따른 애니메이션 조정\n *\n * @private\n */\n private adjustForIntensity(\n animation: TechniqueAnimation,\n intensity: TechniqueIntensity,\n ): TechniqueAnimation {\n const durationMultiplier =\n this.getDurationMultiplierForIntensity(intensity);\n\n return {\n ...animation,\n duration: animation.duration * durationMultiplier,\n impactFrame: Math.round(animation.impactFrame * durationMultiplier),\n recoveryFrames: Math.round(animation.recoveryFrames * durationMultiplier),\n };\n }\n\n /**\n * Get duration multiplier for intensity\n *\n * @private\n */\n private getDurationMultiplierForIntensity(\n intensity: TechniqueIntensity,\n ): number {\n switch (intensity) {\n case \"light\":\n return 0.7;\n case \"medium\":\n return 1.0;\n case \"heavy\":\n return 1.3;\n case \"critical\":\n return 1.6;\n }\n }\n\n /**\n * Get fallback animation when no exact match\n *\n * **Korean**: 일치하는 항목이 없을 때 대체 애니메이션 가져오기\n *\n * @private\n */\n private getFallbackAnimation(key: TechniqueAnimationKey): TechniqueAnimation {\n const fallbackState =\n this.fallbackMap.get(key.techniqueType) ?? AnimationState.ATTACK;\n\n return {\n animationState: fallbackState,\n duration: this.getDurationForIntensity(key.intensity),\n impactFrame: this.getImpactFrameForIntensity(key.intensity),\n recoveryFrames: this.getRecoveryFramesForIntensity(key.intensity),\n priority: AnimationPriority.ATTACK,\n koreanName: \"일반 기술\",\n englishName: \"Generic Technique\",\n };\n }\n\n /**\n * Generate all possible technique combinations\n *\n * **Korean**: 모든 가능한 기술 조합 생성\n *\n * @private\n */\n private generateAllCombinations(): readonly TechniqueAnimationKey[] {\n if (this.allCombinationsCache) {\n return this.allCombinationsCache;\n }\n\n const stances = Object.values(TrigramStance);\n const techniqueTypes: TechniqueTypeCategory[] = [\n \"strike\",\n \"joint\",\n \"throw\",\n \"pressure_point\",\n ];\n const bodyParts = Object.values(BodyPart);\n const intensities: TechniqueIntensity[] = [\n \"light\",\n \"medium\",\n \"heavy\",\n \"critical\",\n ];\n\n const combinations: TechniqueAnimationKey[] = [];\n\n stances.forEach((stance) => {\n techniqueTypes.forEach((techniqueType) => {\n bodyParts.forEach((bodyPart) => {\n intensities.forEach((intensity) => {\n combinations.push({\n stance,\n techniqueType,\n bodyPart,\n intensity,\n });\n });\n });\n });\n });\n\n this.allCombinationsCache = combinations;\n return combinations;\n }\n\n /**\n * Validate mapping completeness at build time\n *\n * **Korean**: 빌드 시간에 매핑 완전성 검증\n *\n * Reports coverage percentage and lists missing mappings.\n * Expected: 8 stances × 4 technique types × 8 body parts × 4 intensities = 1024 combinations\n *\n * @returns Validation result with coverage and missing mappings\n *\n * @public\n * @korean 완전성검증\n */\n public validateCompleteness(): MappingValidationResult {\n const allCombinations = this.generateAllCombinations();\n const missing: TechniqueAnimationKey[] = [];\n\n allCombinations.forEach((combo) => {\n const key = this.createLookupKey(combo);\n if (!this.animationMap.has(key)) {\n missing.push(combo);\n }\n });\n\n const mapped = allCombinations.length - missing.length;\n const coverage = (mapped / allCombinations.length) * 100;\n\n return {\n coverage,\n total: allCombinations.length,\n mapped,\n missing,\n };\n }\n\n /**\n * Get total number of mapped combinations\n *\n * **Korean**: 매핑된 조합의 총 개수 가져오기\n *\n * @returns Number of mapped combinations\n *\n * @public\n */\n public getMappedCount(): number {\n return this.animationMap.size;\n }\n}\n\n/**\n * Singleton instance of TechniqueAnimationMapper\n *\n * **Korean**: 기술 애니메이션 매퍼 싱글톤 인스턴스\n *\n * Use this instance throughout the application for consistent\n * technique animation mapping.\n *\n * @public\n * @korean 싱글톤인스턴스\n */\nexport const techniqueAnimationMapper = new TechniqueAnimationMapper();\n"],"mappings":"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"}
1
+ {"version":3,"file":"TechniqueAnimationMapper.js","names":[],"sources":["../../../../src/systems/animation/core/TechniqueAnimationMapper.ts"],"sourcesContent":["/**\n * Technique Animation Mapper\n *\n * Maps 70 Korean techniques to appropriate attack animation types.\n * Implements the technique-to-animation link system for authentic martial arts animations.\n *\n * @module systems/animation/TechniqueAnimationMapper\n * @category Animation System\n * @korean 기술애니메이션매퍼\n */\n\nimport { AttackAnimationType } from \"@/types/skeletal\";\nimport { ATTACK_ANIMATIONS } from \"../catalogs/AttackAnimations\";\n\n/**\n * Maps AttackAnimationType to existing skeletal animation names\n *\n * Links the new enum-based system to existing animation implementation.\n * New animations will be added to AttackAnimations.ts as needed.\n *\n * @korean 애니메이션타입맵\n */\nconst ANIMATION_TYPE_TO_NAME_MAP: Record<AttackAnimationType, string> = {\n // Punch category (주먹 타격) - use existing animations\n [AttackAnimationType.PUNCH_HIGH]: \"jab\", // High punch to head\n [AttackAnimationType.PUNCH_MID]: \"cross\", // Mid-level cross punch\n [AttackAnimationType.PUNCH_LOW]: \"jab\", // Low punch to body (reuse jab for now)\n\n // Kick category (발차기) - use dedicated animations\n [AttackAnimationType.KICK_FRONT]: \"front_kick\", // Front kick (앞차기)\n [AttackAnimationType.KICK_SIDE]: \"side_kick\", // Side kick (옆차기) - NEW dedicated animation\n [AttackAnimationType.KICK_ROUNDHOUSE]: \"roundhouse_kick\", // Roundhouse kick (돌려차기)\n\n // Elbow category (팔꿈치 타격) - use dedicated elbow animations\n [AttackAnimationType.ELBOW_STRIKE]: \"elbow_strike\",\n [AttackAnimationType.ELBOW_UPPERCUT]: \"elbow_uppercut\", // NEW dedicated uppercut animation\n\n // Knee category (무릎 타격) - use dedicated knee animation\n [AttackAnimationType.KNEE_STRIKE]: \"knee_strike\",\n [AttackAnimationType.KNEE_CLINCH]: \"knee_strike\", // Reuse knee strike in clinch position\n\n // Pressure point category (급소 타격) - use precise jab motion\n [AttackAnimationType.PRESSURE_POINT]: \"jab\",\n [AttackAnimationType.PRESSURE_POINT_RAPID]: \"jab\",\n};\n\n/**\n * Get skeletal animation name for an attack animation type\n *\n * @param animationType - Attack animation type enum\n * @returns Name of skeletal animation from ATTACK_ANIMATIONS map\n *\n * @korean 애니메이션타입에서이름가져오기\n */\nexport function getAnimationNameForType(\n animationType: AttackAnimationType,\n): string {\n return ANIMATION_TYPE_TO_NAME_MAP[animationType];\n}\n\n/**\n * Check if an animation type has a defined animation\n *\n * @param animationType - Attack animation type enum\n * @returns True if animation exists in ATTACK_ANIMATIONS map\n *\n * @korean 애니메이션존재확인\n */\nexport function hasAnimationForType(\n animationType: AttackAnimationType,\n): boolean {\n const animationName = ANIMATION_TYPE_TO_NAME_MAP[animationType];\n return ATTACK_ANIMATIONS.has(animationName);\n}\n\n/**\n * Determines appropriate animation type from technique characteristics\n *\n * Uses technique name, damage type, and keywords to automatically\n * select the best-matching attack animation type.\n *\n * @param techniqueName - English or Korean technique name\n * @param techniqueId - Technique ID\n * @param damageType - Type of damage dealt\n * @returns Best-matching attack animation type\n *\n * @korean 기술에서애니메이션타입결정\n */\nexport function determineAnimationTypeForTechnique(\n techniqueName: string,\n techniqueId: string,\n damageType?: string,\n): AttackAnimationType {\n const searchText = `${techniqueName} ${techniqueId}`.toLowerCase();\n\n // Pressure point / precise strikes (급소)\n if (\n searchText.includes(\"pressure\") ||\n searchText.includes(\"precise\") ||\n searchText.includes(\"nerve\") ||\n searchText.includes(\"vital\") ||\n searchText.includes(\"급소\") ||\n searchText.includes(\"신경\") ||\n damageType === \"nerve\" ||\n damageType === \"pressure\"\n ) {\n // Check for rapid/multi-hit variants\n if (\n searchText.includes(\"rapid\") ||\n searchText.includes(\"multiple\") ||\n searchText.includes(\"연속\")\n ) {\n return AttackAnimationType.PRESSURE_POINT_RAPID;\n }\n return AttackAnimationType.PRESSURE_POINT;\n }\n\n // Kicks (차기)\n if (\n searchText.includes(\"kick\") ||\n searchText.includes(\"차기\") ||\n searchText.includes(\"발\")\n ) {\n if (\n searchText.includes(\"roundhouse\") ||\n searchText.includes(\"round\") ||\n searchText.includes(\"돌려\") ||\n searchText.includes(\"회전\")\n ) {\n return AttackAnimationType.KICK_ROUNDHOUSE;\n }\n if (\n searchText.includes(\"side\") ||\n searchText.includes(\"옆\") ||\n searchText.includes(\"측면\")\n ) {\n return AttackAnimationType.KICK_SIDE;\n }\n // Default to front kick\n return AttackAnimationType.KICK_FRONT;\n }\n\n // Elbow strikes (팔꿈치)\n if (\n searchText.includes(\"elbow\") ||\n searchText.includes(\"팔꿈치\") ||\n searchText.includes(\"팔굽\")\n ) {\n if (\n searchText.includes(\"uppercut\") ||\n searchText.includes(\"올려\") ||\n searchText.includes(\"치켜\")\n ) {\n return AttackAnimationType.ELBOW_UPPERCUT;\n }\n return AttackAnimationType.ELBOW_STRIKE;\n }\n\n // Knee strikes (무릎)\n if (\n searchText.includes(\"knee\") ||\n searchText.includes(\"무릎\") ||\n searchText.includes(\"슬\")\n ) {\n if (\n searchText.includes(\"clinch\") ||\n searchText.includes(\"grab\") ||\n searchText.includes(\"잡고\")\n ) {\n return AttackAnimationType.KNEE_CLINCH;\n }\n return AttackAnimationType.KNEE_STRIKE;\n }\n\n // Punches (주먹) - check target height\n if (\n searchText.includes(\"punch\") ||\n searchText.includes(\"strike\") ||\n searchText.includes(\"주먹\") ||\n searchText.includes(\"권\") ||\n searchText.includes(\"격\")\n ) {\n // High attacks (head level)\n if (\n searchText.includes(\"head\") ||\n searchText.includes(\"high\") ||\n searchText.includes(\"temple\") ||\n searchText.includes(\"jaw\") ||\n searchText.includes(\"머리\") ||\n searchText.includes(\"관자\") ||\n searchText.includes(\"턱\")\n ) {\n return AttackAnimationType.PUNCH_HIGH;\n }\n // Low attacks (body level)\n if (\n searchText.includes(\"low\") ||\n searchText.includes(\"body\") ||\n searchText.includes(\"ribs\") ||\n searchText.includes(\"아래\") ||\n searchText.includes(\"복부\") ||\n searchText.includes(\"늑골\")\n ) {\n return AttackAnimationType.PUNCH_LOW;\n }\n // Default to mid-level punch\n return AttackAnimationType.PUNCH_MID;\n }\n\n // Default: mid-level punch for any unmatched technique\n return AttackAnimationType.PUNCH_MID;\n}\n\n/**\n * Calculates animation speed modifier based on technique power level\n *\n * Implements the rule:\n * - Light techniques (damage <20): 1.2x speed\n * - Normal techniques (damage 20-35): 1.0x speed\n * - Heavy techniques (damage >35): 0.8x speed\n *\n * @param damage - Base damage of the technique\n * @returns Speed modifier (0.8 - 1.2)\n *\n * @korean 기술위력에서속도배율계산\n */\nexport function calculateSpeedModifierForDamage(damage: number): number {\n if (damage < 20) {\n return 1.2; // Light, fast techniques\n } else if (damage > 35) {\n return 0.8; // Heavy, powerful techniques\n }\n return 1.0; // Normal speed\n}\n\n/**\n * Get animation duration adjusted by speed modifier\n *\n * @param baseAnimationName - Name of base animation\n * @param speedModifier - Speed multiplier (0.8 - 1.2)\n * @returns Adjusted duration in milliseconds\n *\n * @korean 조정된애니메이션지속시간\n */\nexport function getAdjustedAnimationDuration(\n baseAnimationName: string,\n speedModifier: number,\n): number {\n const animation = ATTACK_ANIMATIONS.get(baseAnimationName);\n if (!animation) {\n console.warn(\"Animation not found:\", baseAnimationName);\n return 200; // Default 200ms for missing animations\n }\n\n // Convert seconds to milliseconds and apply speed modifier\n const baseDurationMs = animation.duration * 1000;\n return Math.round(baseDurationMs / speedModifier);\n}\n\n/**\n * Comprehensive Technique Animation Mapping System\n *\n * **Korean**: 포괄적 기술 애니메이션 매핑 시스템\n *\n * Maps all 1024 technique configuration combinations\n * (8 stances × 4 technique types × 8 body parts × 4 intensities)\n * to appropriate animations with O(1) lookup performance.\n *\n * ## Architecture\n *\n * - **Primary Map**: Exact stance-type-part-intensity combinations\n * - **Fallback System**: 3-tier graceful degradation\n * 1. Exact match\n * 2. Intensity-agnostic match (same stance/type/part, medium intensity)\n * 3. Technique type generic (fallback to base technique animation)\n *\n * ## Korean Martial Arts Integration\n *\n * Each trigram stance influences animation selection:\n * - **☰ 건 (Geon)**: Direct, forceful animations\n * - **☱ 태 (Tae)**: Fluid, flowing animations\n * - **☲ 리 (Li)**: Precise, rapid animations\n * - **☳ 진 (Jin)**: Explosive, shocking animations\n * - **☴ 손 (Son)**: Continuous, pressuring animations\n * - **☵ 감 (Gam)**: Adaptive, countering animations\n * - **☶ 간 (Gan)**: Defensive, immovable animations\n * - **☷ 곤 (Gon)**: Grounding, takedown animations\n *\n * @module systems/animation/TechniqueAnimationMapper\n * @category Animation System\n * @korean 기술애니메이션매퍼\n */\n\nimport { TrigramStance } from \"@/types\";\nimport { BodyPart } from \"../../bodypart/types\";\nimport {\n AnimationPriority,\n AnimationState,\n MappingValidationResult,\n TechniqueAnimation,\n TechniqueAnimationKey,\n TechniqueIntensity,\n TechniqueTypeCategory,\n} from \"./types\";\n\n/**\n * Body part Korean terminology for animation names\n *\n * **Korean**: 신체 부위 한글 용어\n */\nconst BODY_PART_KOREAN: Record<string, string> = {\n [BodyPart.HEAD]: \"두부\",\n [BodyPart.NECK]: \"경부\",\n [BodyPart.TORSO_UPPER]: \"상체\",\n [BodyPart.TORSO_LOWER]: \"하체\",\n [BodyPart.ARM_LEFT]: \"좌팔\",\n [BodyPart.ARM_RIGHT]: \"우팔\",\n [BodyPart.LEG_LEFT]: \"좌각\",\n [BodyPart.LEG_RIGHT]: \"우각\",\n};\n\n/**\n * Body part English terminology for animation names\n */\nconst BODY_PART_ENGLISH: Record<string, string> = {\n [BodyPart.HEAD]: \"Head\",\n [BodyPart.NECK]: \"Neck\",\n [BodyPart.TORSO_UPPER]: \"Upper Torso\",\n [BodyPart.TORSO_LOWER]: \"Lower Torso\",\n [BodyPart.ARM_LEFT]: \"Left Arm\",\n [BodyPart.ARM_RIGHT]: \"Right Arm\",\n [BodyPart.LEG_LEFT]: \"Left Leg\",\n [BodyPart.LEG_RIGHT]: \"Right Leg\",\n};\n\n/**\n * Technique type Korean terminology\n *\n * **Korean**: 기술 유형 한글 용어\n */\nconst TECHNIQUE_TYPE_KOREAN: Record<TechniqueTypeCategory, string> = {\n strike: \"타격\",\n joint: \"관절\",\n throw: \"던지기\",\n pressure_point: \"급소\",\n};\n\n/**\n * Technique type English terminology\n */\nconst TECHNIQUE_TYPE_ENGLISH: Record<TechniqueTypeCategory, string> = {\n strike: \"Strike\",\n joint: \"Joint Lock\",\n throw: \"Throw\",\n pressure_point: \"Pressure Point\",\n};\n\n/**\n * Stance Korean names\n */\nconst STANCE_KOREAN: Record<string, string> = {\n [TrigramStance.GEON]: \"건괘\",\n [TrigramStance.TAE]: \"태괘\",\n [TrigramStance.LI]: \"리괘\",\n [TrigramStance.JIN]: \"진괘\",\n [TrigramStance.SON]: \"손괘\",\n [TrigramStance.GAM]: \"감괘\",\n [TrigramStance.GAN]: \"간괘\",\n [TrigramStance.GON]: \"곤괘\",\n};\n\n/**\n * Stance English names\n */\nconst STANCE_ENGLISH: Record<string, string> = {\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};\n\n/**\n * Stance Animation Characteristics Configuration\n *\n * **Korean**: 자세 애니메이션 특성 설정\n *\n * Data-driven configuration for each stance's animation modifiers,\n * eliminating code duplication across stance mapping methods.\n *\n * @internal\n */\ninterface StanceAnimationConfig {\n /** Base duration multiplier (1.0 = normal) */\n readonly durationMultiplier: number;\n /** Impact frame offset from base */\n readonly impactFrameOffset: number;\n /** Recovery frames offset from base */\n readonly recoveryFrameOffset: number;\n /** Technique-specific overrides (optional) */\n readonly techniqueOverrides?: Partial<\n Record<\n TechniqueTypeCategory,\n {\n durationMultiplier?: number;\n impactFrameOffset?: number;\n recoveryFrameOffset?: number;\n }\n >\n >;\n}\n\n/**\n * Stance animation characteristics by trigram\n *\n * **Korean**: 팔괘 자세별 애니메이션 특성\n *\n * Each stance has unique timing characteristics reflecting its philosophy:\n * - ☰ 건 (Geon/Heaven): Direct, powerful - standard timing with technique variations\n * - ☱ 태 (Tae/Lake): Fluid, flowing - faster recovery\n * - ☲ 리 (Li/Fire): Precise, rapid - fastest overall\n * - ☳ 진 (Jin/Thunder): Explosive - fast attack, longer recovery\n * - ☴ 손 (Son/Wind): Continuous - slightly fast, mobile\n * - ☵ 감 (Gam/Water): Adaptive - slightly slower, standard recovery\n * - ☶ 간 (Gan/Mountain): Defensive - slowest, longest recovery\n * - ☷ 곤 (Gon/Earth): Grounding - standard with throw specialization\n */\nconst STANCE_ANIMATION_CONFIG: Record<TrigramStance, StanceAnimationConfig> = {\n [TrigramStance.GEON]: {\n durationMultiplier: 1.0,\n impactFrameOffset: 0,\n recoveryFrameOffset: 0,\n techniqueOverrides: {\n joint: { durationMultiplier: 1.2 },\n throw: {\n durationMultiplier: 1.5,\n impactFrameOffset: 4,\n recoveryFrameOffset: 5,\n },\n pressure_point: {\n durationMultiplier: 0.8,\n impactFrameOffset: -2,\n },\n },\n },\n [TrigramStance.TAE]: {\n durationMultiplier: 1.0,\n impactFrameOffset: 0,\n recoveryFrameOffset: -2,\n techniqueOverrides: {\n joint: { durationMultiplier: 1.3 },\n },\n },\n [TrigramStance.LI]: {\n durationMultiplier: 0.85,\n impactFrameOffset: -1,\n recoveryFrameOffset: -3,\n },\n [TrigramStance.JIN]: {\n durationMultiplier: 0.9,\n impactFrameOffset: 0,\n recoveryFrameOffset: 2,\n },\n [TrigramStance.SON]: {\n durationMultiplier: 0.95,\n impactFrameOffset: 0,\n recoveryFrameOffset: -1,\n },\n [TrigramStance.GAM]: {\n durationMultiplier: 1.1,\n impactFrameOffset: 1,\n recoveryFrameOffset: 0,\n },\n [TrigramStance.GAN]: {\n durationMultiplier: 1.2,\n impactFrameOffset: 2,\n recoveryFrameOffset: 3,\n },\n [TrigramStance.GON]: {\n durationMultiplier: 1.0,\n impactFrameOffset: 0,\n recoveryFrameOffset: 0,\n techniqueOverrides: {\n throw: {\n durationMultiplier: 1.6,\n impactFrameOffset: 3,\n recoveryFrameOffset: 4,\n },\n },\n },\n};\n\n/**\n * Comprehensive Technique Animation Mapper Class\n *\n * **Korean**: 기술 애니메이션 매퍼 클래스\n *\n * Provides O(1) lookup for all 1024 technique-stance combinations\n * with intelligent fallback system and build-time validation.\n *\n * @class\n */\nexport class TechniqueAnimationMapper {\n /** Primary animation mapping table */\n private readonly animationMap: Map<string, TechniqueAnimation>;\n\n /** Fallback animations by technique type */\n private readonly fallbackMap: Map<TechniqueTypeCategory, AnimationState>;\n\n /** Cache for generated combinations (validation) */\n private allCombinationsCache?: readonly TechniqueAnimationKey[];\n\n constructor() {\n this.animationMap = new Map();\n this.fallbackMap = this.initializeFallbacks();\n this.initializeCompleteMapping();\n }\n\n /**\n * Get animation for specific technique\n *\n * **Korean**: 특정 기술의 애니메이션 가져오기\n *\n * Uses 3-tier lookup strategy:\n * 1. Exact match (stance + type + part + intensity)\n * 2. Intensity-agnostic (stance + type + part + medium intensity)\n * 3. Technique type fallback (generic animation for technique type)\n *\n * @param key - Technique animation key\n * @returns Technique animation configuration\n *\n * @korean 애니메이션가져오기\n */\n public getAnimation(key: TechniqueAnimationKey): TechniqueAnimation {\n // Try exact match first\n const lookupKey = this.createLookupKey(key);\n const exactMatch = this.animationMap.get(lookupKey);\n if (exactMatch) {\n return exactMatch;\n }\n\n // Fallback: Try without intensity (use medium)\n const genericKey = this.createLookupKey({\n ...key,\n intensity: \"medium\",\n });\n const genericMatch = this.animationMap.get(genericKey);\n if (genericMatch) {\n return this.adjustForIntensity(genericMatch, key.intensity);\n }\n\n // Final fallback: Use technique type generic animation\n return this.getFallbackAnimation(key);\n }\n\n /**\n * Create composite lookup key from technique animation key\n *\n * **Korean**: 복합 조회 키 생성\n *\n * Format: \"stance-type-part-intensity\"\n * Example: \"geon-strike-head-heavy\"\n *\n * @param key - Technique animation key\n * @returns Composite lookup string\n *\n * @private\n */\n private createLookupKey(key: TechniqueAnimationKey): string {\n return `${key.stance}-${key.techniqueType}-${key.bodyPart}-${key.intensity}`;\n }\n\n /**\n * Initialize fallback animations by technique type\n *\n * **Korean**: 기술 유형별 대체 애니메이션 초기화\n *\n * @private\n */\n private initializeFallbacks(): Map<TechniqueTypeCategory, AnimationState> {\n return new Map([\n [\"strike\", AnimationState.ATTACK],\n [\"joint\", AnimationState.ATTACK],\n [\"throw\", AnimationState.ATTACK],\n [\"pressure_point\", AnimationState.ATTACK],\n ]);\n }\n\n /**\n * Initialize complete mapping table\n *\n * **Korean**: 전체 매핑 테이블 초기화\n *\n * Maps all 1024 combinations organized by:\n * - 8 stances\n * - 4 technique types\n * - 8 body parts\n * - 4 intensity levels\n *\n * Uses data-driven STANCE_ANIMATION_CONFIG to eliminate code duplication.\n *\n * @private\n */\n private initializeCompleteMapping(): void {\n const bodyParts = Object.values(BodyPart);\n const intensities: TechniqueIntensity[] = [\n \"light\",\n \"medium\",\n \"heavy\",\n \"critical\",\n ];\n const techniqueTypes: TechniqueTypeCategory[] = [\n \"strike\",\n \"joint\",\n \"throw\",\n \"pressure_point\",\n ];\n\n // Map all 8 trigram stances using configuration\n Object.values(TrigramStance).forEach((stance) => {\n const config = STANCE_ANIMATION_CONFIG[stance];\n\n bodyParts.forEach((bodyPart) => {\n intensities.forEach((intensity) => {\n techniqueTypes.forEach((techniqueType) => {\n // Get base values with technique-specific overrides\n const override = config.techniqueOverrides?.[techniqueType];\n const durationMult =\n override?.durationMultiplier ?? config.durationMultiplier;\n const impactOffset =\n override?.impactFrameOffset ?? config.impactFrameOffset;\n const recoveryOffset =\n override?.recoveryFrameOffset ?? config.recoveryFrameOffset;\n\n this.mapTechnique(\n { stance, techniqueType, bodyPart, intensity },\n {\n animationState: AnimationState.ATTACK,\n duration:\n this.getDurationForIntensity(intensity) * durationMult,\n impactFrame:\n this.getImpactFrameForIntensity(intensity) + impactOffset,\n recoveryFrames:\n this.getRecoveryFramesForIntensity(intensity) +\n recoveryOffset,\n priority: AnimationPriority.ATTACK,\n koreanName: this.generateKoreanName(\n stance,\n techniqueType,\n bodyPart,\n intensity,\n ),\n englishName: this.generateEnglishName(\n stance,\n techniqueType,\n bodyPart,\n intensity,\n ),\n },\n );\n });\n });\n });\n });\n }\n /**\n * Add single technique mapping to the map with automatic rotation calculation\n *\n * **Korean**: 단일 기술 매핑 추가\n *\n * @private\n */\n private mapTechnique(\n key: TechniqueAnimationKey,\n animation: TechniqueAnimation,\n ): void {\n // Calculate rotation properties if not provided\n const torsoRotation =\n animation.torsoRotation ??\n this.getTorsoRotationForStanceTechnique(key.stance, key.techniqueType);\n const hipEngagement =\n animation.hipEngagement ??\n this.getHipEngagementForStanceTechnique(\n key.stance,\n key.techniqueType,\n key.intensity,\n );\n const powerModifier =\n animation.powerModifier ??\n this.calculatePowerModifier(hipEngagement, key.techniqueType);\n\n // Create complete animation with rotation properties\n const completeAnimation: TechniqueAnimation = {\n ...animation,\n torsoRotation,\n hipEngagement,\n powerModifier,\n };\n\n const lookupKey = this.createLookupKey(key);\n this.animationMap.set(lookupKey, completeAnimation);\n }\n\n /**\n * Get duration based on intensity level\n *\n * **Korean**: 강도 레벨에 따른 지속시간 가져오기\n *\n * @private\n */\n private getDurationForIntensity(intensity: TechniqueIntensity): number {\n const baseDuration = 0.6; // 600ms base\n switch (intensity) {\n case \"light\":\n return baseDuration * 0.7; // 420ms\n case \"medium\":\n return baseDuration; // 600ms\n case \"heavy\":\n return baseDuration * 1.3; // 780ms\n case \"critical\":\n return baseDuration * 1.6; // 960ms\n }\n }\n\n /**\n * Get impact frame based on intensity level\n *\n * **Korean**: 강도 레벨에 따른 충격 프레임 가져오기\n *\n * @private\n */\n private getImpactFrameForIntensity(intensity: TechniqueIntensity): number {\n switch (intensity) {\n case \"light\":\n return 8; // Frame 8 at 60fps\n case \"medium\":\n return 10; // Frame 10\n case \"heavy\":\n return 14; // Frame 14\n case \"critical\":\n return 18; // Frame 18\n }\n }\n\n /**\n * Get recovery frames based on intensity level\n *\n * **Korean**: 강도 레벨에 따른 회복 프레임 가져오기\n *\n * @private\n */\n private getRecoveryFramesForIntensity(intensity: TechniqueIntensity): number {\n switch (intensity) {\n case \"light\":\n return 8; // 8 frames recovery\n case \"medium\":\n return 12; // 12 frames recovery\n case \"heavy\":\n return 18; // 18 frames recovery\n case \"critical\":\n return 24; // 24 frames recovery\n }\n }\n\n /**\n * Calculate torso rotation for stance-technique combination\n *\n * **Korean**: 자세-기술 조합의 허리 회전 계산\n *\n * Returns rotation in radians (-π/2 to π/2)\n *\n * @private\n */\n private getTorsoRotationForStanceTechnique(\n stance: string,\n techniqueType: TechniqueTypeCategory,\n ): number {\n // Stance-specific base rotations (in radians)\n const stanceRotations: Record<string, number> = {\n [TrigramStance.GEON]: Math.PI / 6, // 30° - Direct, moderate rotation\n [TrigramStance.TAE]: Math.PI / 18, // 10° - Minimal rotation, fluid\n [TrigramStance.LI]: Math.PI / 9, // 20° - Quick snap rotation\n [TrigramStance.JIN]: Math.PI / 4, // 45° - Wide explosive rotation\n [TrigramStance.SON]: Math.PI / 12, // 15° - Continuous adaptive flow\n [TrigramStance.GAM]: Math.PI / 8, // 22.5° - Circular wave motion\n [TrigramStance.GAN]: Math.PI / 36, // 5° - Stable, minimal rotation\n [TrigramStance.GON]: Math.PI / 3, // 60° - Deep grounded rotation\n };\n\n const baseRotation = stanceRotations[stance] ?? 0;\n\n // Technique type modifiers\n const techniqueMultipliers: Record<TechniqueTypeCategory, number> = {\n strike: 1.2, // 20% more rotation for strikes\n joint: 0.7, // 30% less for joint locks\n throw: 1.5, // 50% more for throws\n pressure_point: 0.8, // 20% less for precision strikes\n };\n\n const multiplier = techniqueMultipliers[techniqueType] ?? 1.0;\n return Math.min(Math.PI / 2, baseRotation * multiplier); // Clamp to ±90°\n }\n\n /**\n * Calculate hip engagement for stance-technique combination\n *\n * **Korean**: 자세-기술 조합의 골반 참여도 계산\n *\n * Returns engagement factor (0-1)\n *\n * @private\n */\n private getHipEngagementForStanceTechnique(\n stance: string,\n techniqueType: TechniqueTypeCategory,\n intensity: TechniqueIntensity,\n ): number {\n // Stance-specific base hip engagement\n const stanceEngagement: Record<string, number> = {\n [TrigramStance.GEON]: 0.9, // High engagement - direct force\n [TrigramStance.TAE]: 0.5, // Moderate - fluid movement\n [TrigramStance.LI]: 0.7, // Good - rapid techniques\n [TrigramStance.JIN]: 1.0, // Maximum - explosive power\n [TrigramStance.SON]: 0.6, // Moderate - continuous pressure\n [TrigramStance.GAM]: 0.7, // Good - adaptive flow\n [TrigramStance.GAN]: 0.3, // Low - stable defensive\n [TrigramStance.GON]: 0.95, // Very high - grounding techniques\n };\n\n const baseEngagement = stanceEngagement[stance] ?? 0.6;\n\n // Technique type modifiers\n const techniqueMultipliers: Record<TechniqueTypeCategory, number> = {\n strike: 1.0, // Full engagement for strikes\n joint: 0.6, // Lower for joint manipulation\n throw: 1.1, // Highest for throws\n pressure_point: 0.7, // Moderate for precision\n };\n\n // Intensity modifiers\n const intensityMultipliers: Record<TechniqueIntensity, number> = {\n light: 0.7,\n medium: 0.9,\n heavy: 1.0,\n critical: 1.1,\n };\n\n const engagement =\n baseEngagement *\n techniqueMultipliers[techniqueType] *\n intensityMultipliers[intensity];\n\n return Math.min(1.0, Math.max(0.0, engagement)); // Clamp to 0-1\n }\n\n /**\n * Calculate power modifier from hip engagement\n *\n * **Korean**: 골반 참여도로부터 파워 배율 계산\n *\n * Based on PR #1132 calculateHipRotationPowerModifier system\n *\n * @private\n */\n private calculatePowerModifier(\n hipEngagement: number,\n techniqueType: TechniqueTypeCategory,\n ): number {\n // Base power curve: 1.0 + (engagement * maxBonus)\n const maxBonusByType: Record<TechniqueTypeCategory, number> = {\n strike: 0.3, // 30% max bonus for strikes\n joint: 0.1, // 10% for joint locks\n throw: 0.2, // 20% for throws\n pressure_point: 0.25, // 25% for pressure points\n };\n\n const maxBonus = maxBonusByType[techniqueType] ?? 0.2;\n return 1.0 + hipEngagement * maxBonus;\n }\n\n /**\n * Generate Korean technique name\n *\n * **Korean**: 한글 기술 이름 생성\n *\n * Format: \"스탠스 신체부위 강도 기술유형\"\n * Example: \"건괘 두부 강 타격\"\n *\n * @private\n */\n private generateKoreanName(\n stance: string,\n techniqueType: TechniqueTypeCategory,\n bodyPart: string,\n intensity: TechniqueIntensity,\n ): string {\n const stanceName = STANCE_KOREAN[stance] ?? stance;\n const bodyPartName = BODY_PART_KOREAN[bodyPart] ?? bodyPart;\n const techniqueName = TECHNIQUE_TYPE_KOREAN[techniqueType] ?? techniqueType;\n const intensityName = this.getIntensityKorean(intensity);\n\n return `${stanceName} ${bodyPartName} ${intensityName} ${techniqueName}`;\n }\n\n /**\n * Generate English technique name\n *\n * Format: \"Stance BodyPart Intensity TechniqueType\"\n * Example: \"Heaven Head Heavy Strike\"\n *\n * @private\n */\n private generateEnglishName(\n stance: string,\n techniqueType: TechniqueTypeCategory,\n bodyPart: string,\n intensity: TechniqueIntensity,\n ): string {\n const stanceName = STANCE_ENGLISH[stance] ?? stance;\n const bodyPartName = BODY_PART_ENGLISH[bodyPart] ?? bodyPart;\n const techniqueName =\n TECHNIQUE_TYPE_ENGLISH[techniqueType] ?? techniqueType;\n const intensityName =\n intensity.charAt(0).toUpperCase() + intensity.slice(1);\n\n return `${stanceName} ${bodyPartName} ${intensityName} ${techniqueName}`;\n }\n\n /**\n * Get Korean intensity name\n *\n * @private\n */\n private getIntensityKorean(intensity: TechniqueIntensity): string {\n switch (intensity) {\n case \"light\":\n return \"경\";\n case \"medium\":\n return \"중\";\n case \"heavy\":\n return \"강\";\n case \"critical\":\n return \"극\";\n }\n }\n\n /**\n * Adjust animation for different intensity\n *\n * **Korean**: 강도에 따른 애니메이션 조정\n *\n * @private\n */\n private adjustForIntensity(\n animation: TechniqueAnimation,\n intensity: TechniqueIntensity,\n ): TechniqueAnimation {\n const durationMultiplier =\n this.getDurationMultiplierForIntensity(intensity);\n\n return {\n ...animation,\n duration: animation.duration * durationMultiplier,\n impactFrame: Math.round(animation.impactFrame * durationMultiplier),\n recoveryFrames: Math.round(animation.recoveryFrames * durationMultiplier),\n };\n }\n\n /**\n * Get duration multiplier for intensity\n *\n * @private\n */\n private getDurationMultiplierForIntensity(\n intensity: TechniqueIntensity,\n ): number {\n switch (intensity) {\n case \"light\":\n return 0.7;\n case \"medium\":\n return 1.0;\n case \"heavy\":\n return 1.3;\n case \"critical\":\n return 1.6;\n }\n }\n\n /**\n * Get fallback animation when no exact match\n *\n * **Korean**: 일치하는 항목이 없을 때 대체 애니메이션 가져오기\n *\n * @private\n */\n private getFallbackAnimation(key: TechniqueAnimationKey): TechniqueAnimation {\n const fallbackState =\n this.fallbackMap.get(key.techniqueType) ?? AnimationState.ATTACK;\n\n return {\n animationState: fallbackState,\n duration: this.getDurationForIntensity(key.intensity),\n impactFrame: this.getImpactFrameForIntensity(key.intensity),\n recoveryFrames: this.getRecoveryFramesForIntensity(key.intensity),\n priority: AnimationPriority.ATTACK,\n koreanName: \"일반 기술\",\n englishName: \"Generic Technique\",\n };\n }\n\n /**\n * Generate all possible technique combinations\n *\n * **Korean**: 모든 가능한 기술 조합 생성\n *\n * @private\n */\n private generateAllCombinations(): readonly TechniqueAnimationKey[] {\n if (this.allCombinationsCache) {\n return this.allCombinationsCache;\n }\n\n const stances = Object.values(TrigramStance);\n const techniqueTypes: TechniqueTypeCategory[] = [\n \"strike\",\n \"joint\",\n \"throw\",\n \"pressure_point\",\n ];\n const bodyParts = Object.values(BodyPart);\n const intensities: TechniqueIntensity[] = [\n \"light\",\n \"medium\",\n \"heavy\",\n \"critical\",\n ];\n\n const combinations: TechniqueAnimationKey[] = [];\n\n stances.forEach((stance) => {\n techniqueTypes.forEach((techniqueType) => {\n bodyParts.forEach((bodyPart) => {\n intensities.forEach((intensity) => {\n combinations.push({\n stance,\n techniqueType,\n bodyPart,\n intensity,\n });\n });\n });\n });\n });\n\n this.allCombinationsCache = combinations;\n return combinations;\n }\n\n /**\n * Validate mapping completeness at build time\n *\n * **Korean**: 빌드 시간에 매핑 완전성 검증\n *\n * Reports coverage percentage and lists missing mappings.\n * Expected: 8 stances × 4 technique types × 8 body parts × 4 intensities = 1024 combinations\n *\n * @returns Validation result with coverage and missing mappings\n *\n * @korean 완전성검증\n */\n public validateCompleteness(): MappingValidationResult {\n const allCombinations = this.generateAllCombinations();\n const missing: TechniqueAnimationKey[] = [];\n\n allCombinations.forEach((combo) => {\n const key = this.createLookupKey(combo);\n if (!this.animationMap.has(key)) {\n missing.push(combo);\n }\n });\n\n const mapped = allCombinations.length - missing.length;\n const coverage = (mapped / allCombinations.length) * 100;\n\n return {\n coverage,\n total: allCombinations.length,\n mapped,\n missing,\n };\n }\n\n /**\n * Get total number of mapped combinations\n *\n * **Korean**: 매핑된 조합의 총 개수 가져오기\n *\n * @returns Number of mapped combinations\n *\n */\n public getMappedCount(): number {\n return this.animationMap.size;\n }\n}\n\n/**\n * Singleton instance of TechniqueAnimationMapper\n *\n * **Korean**: 기술 애니메이션 매퍼 싱글톤 인스턴스\n *\n * Use this instance throughout the application for consistent\n * technique animation mapping.\n *\n * @korean 싱글톤인스턴스\n */\nexport const techniqueAnimationMapper = new TechniqueAnimationMapper();\n"],"mappings":"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"}
@@ -37,7 +37,6 @@ import type { StanceLaterality, StanceWithSide } from "../../trigram/types";
37
37
  *
38
38
  * Contains all animation types for a specific stance with laterality.
39
39
  *
40
- * @public
41
40
  * @category Animation Mapping
42
41
  * @korean 자세애니메이션모음
43
42
  */
@@ -88,7 +87,6 @@ export interface StanceAnimationCollection {
88
87
  * // tae.attacks are left-handed versions
89
88
  * ```
90
89
  *
91
- * @public
92
90
  * @category Animation Mapping
93
91
  * @korean 자세애니메이션가져오기
94
92
  */
@@ -112,7 +110,6 @@ export declare function getAnimationsForStance(stanceOrSide: TrigramStance | Sta
112
110
  * const gan = getGuardPoseForStanceWithSide("gan"); // Defaults to right
113
111
  * ```
114
112
  *
115
- * @public
116
113
  * @category Animation Mapping
117
114
  * @korean 자세방어포즈가져오기
118
115
  */
@@ -138,7 +135,6 @@ export declare function getGuardPoseForStanceWithSide(stanceOrSide: TrigramStanc
138
135
  * console.log(allPoses.size); // 16 (8 stances × 2 laterality)
139
136
  * ```
140
137
  *
141
- * @public
142
138
  * @category Animation Mapping
143
139
  * @korean 모든방어포즈가져오기
144
140
  */
@@ -164,7 +160,6 @@ export declare function getAllGuardPoses(): Map<string, StanceGuardPose>;
164
160
  * // Returns 3 right-handed Lake stance attacks (default)
165
161
  * ```
166
162
  *
167
- * @public
168
163
  * @category Animation Mapping
169
164
  * @korean 공격애니메이션가져오기
170
165
  */
@@ -187,7 +182,6 @@ export declare function getAttackAnimations(stanceOrSide: TrigramStance | Stance
187
182
  * // Returns 2 left-handed Water stance defensive moves
188
183
  * ```
189
184
  *
190
- * @public
191
185
  * @category Animation Mapping
192
186
  * @korean 방어애니메이션가져오기
193
187
  */
@@ -210,7 +204,6 @@ export declare function getDefensiveAnimations(stanceOrSide: TrigramStance | Sta
210
204
  * const taeWalk = getWalkAnimation("tae"); // Defaults to right
211
205
  * ```
212
206
  *
213
- * @public
214
207
  * @category Animation Mapping
215
208
  * @korean 걷기애니메이션가져오기
216
209
  */
@@ -233,7 +226,6 @@ export declare function getWalkAnimation(stanceOrSide: TrigramStance | StanceWit
233
226
  * const ganRun = getRunAnimation("gan"); // Defaults to right
234
227
  * ```
235
228
  *
236
- * @public
237
229
  * @category Animation Mapping
238
230
  * @korean 달리기애니메이션가져오기
239
231
  */
@@ -243,7 +235,6 @@ export declare function getRunAnimation(stanceOrSide: TrigramStance | StanceWith
243
235
  *
244
236
  * **Korean**: 매핑 통계
245
237
  *
246
- * @public
247
238
  * @category Animation Mapping
248
239
  * @korean 매핑통계
249
240
  */
@@ -278,7 +269,6 @@ export interface AnimationMappingStats {
278
269
  * console.log(`Total attacks: ${stats.totalAttacks}`); // 8 × 5 × 2 = 80
279
270
  * ```
280
271
  *
281
- * @public
282
272
  * @category Animation Mapping
283
273
  * @korean 매핑통계가져오기
284
274
  */
@@ -1 +1 @@
1
- {"version":3,"file":"TrigramAnimationMapping.d.ts","sourceRoot":"","sources":["../../../../src/systems/animation/core/TrigramAnimationMapping.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAiB5E;;;;;;;;;;GAUG;AACH,MAAM,WAAW,yBAAyB;IACxC,iCAAiC;IACjC,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;IACpC,uCAAuC;IACvC,QAAQ,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC/C,0CAA0C;IAC1C,QAAQ,CAAC,SAAS,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACjD,qBAAqB;IACrB,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,oBAAoB;IACpB,QAAQ,CAAC,GAAG,EAAE,iBAAiB,CAAC;CACjC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,aAAa,GAAG,cAAc,EAC5C,iBAAiB,GAAE,gBAA0B,GAC5C,yBAAyB,GAAG,SAAS,CAwDvC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,6BAA6B,CAC3C,YAAY,EAAE,aAAa,GAAG,cAAc,EAC5C,iBAAiB,GAAE,gBAA0B,GAC5C,eAAe,GAAG,SAAS,CAW7B;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,gBAAgB,IAAI,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAE/D;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,aAAa,GAAG,cAAc,EAC5C,iBAAiB,GAAE,gBAA0B,GAC5C,SAAS,iBAAiB,EAAE,CAmB9B;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,aAAa,GAAG,cAAc,EAC5C,iBAAiB,GAAE,gBAA0B,GAC5C,SAAS,iBAAiB,EAAE,CAmB9B;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,aAAa,GAAG,cAAc,EAC5C,iBAAiB,GAAE,gBAA0B,GAC5C,iBAAiB,GAAG,SAAS,CAqB/B;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,eAAe,CAC7B,YAAY,EAAE,aAAa,GAAG,cAAc,EAC5C,iBAAiB,GAAE,gBAA0B,GAC5C,iBAAiB,GAAG,SAAS,CAqB/B;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,qBAAqB;IACpC,2EAA2E;IAC3E,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,qCAAqC;IACrC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,mCAAmC;IACnC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,sCAAsC;IACtC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,mFAAmF;IACnF,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,wFAAwF;IACxF,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,wBAAwB,IAAI,qBAAqB,CAahE"}
1
+ {"version":3,"file":"TrigramAnimationMapping.d.ts","sourceRoot":"","sources":["../../../../src/systems/animation/core/TrigramAnimationMapping.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAiB5E;;;;;;;;;GASG;AACH,MAAM,WAAW,yBAAyB;IACxC,iCAAiC;IACjC,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;IACpC,uCAAuC;IACvC,QAAQ,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC/C,0CAA0C;IAC1C,QAAQ,CAAC,SAAS,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACjD,qBAAqB;IACrB,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,oBAAoB;IACpB,QAAQ,CAAC,GAAG,EAAE,iBAAiB,CAAC;CACjC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,aAAa,GAAG,cAAc,EAC5C,iBAAiB,GAAE,gBAA0B,GAC5C,yBAAyB,GAAG,SAAS,CAwDvC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,6BAA6B,CAC3C,YAAY,EAAE,aAAa,GAAG,cAAc,EAC5C,iBAAiB,GAAE,gBAA0B,GAC5C,eAAe,GAAG,SAAS,CAW7B;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,gBAAgB,IAAI,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAE/D;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,aAAa,GAAG,cAAc,EAC5C,iBAAiB,GAAE,gBAA0B,GAC5C,SAAS,iBAAiB,EAAE,CAmB9B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,aAAa,GAAG,cAAc,EAC5C,iBAAiB,GAAE,gBAA0B,GAC5C,SAAS,iBAAiB,EAAE,CAmB9B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,aAAa,GAAG,cAAc,EAC5C,iBAAiB,GAAE,gBAA0B,GAC5C,iBAAiB,GAAG,SAAS,CAqB/B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,eAAe,CAC7B,YAAY,EAAE,aAAa,GAAG,cAAc,EAC5C,iBAAiB,GAAE,gBAA0B,GAC5C,iBAAiB,GAAG,SAAS,CAqB/B;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,qBAAqB;IACpC,2EAA2E;IAC3E,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,qCAAqC;IACrC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,mCAAmC;IACnC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,sCAAsC;IACtC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,mFAAmF;IACnF,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,wFAAwF;IACxF,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,wBAAwB,IAAI,qBAAqB,CAahE"}
@@ -52,7 +52,6 @@ export declare const TRIGRAM_STANCES_ORDER: readonly TrigramStance[];
52
52
  * calculateTransitionDuration(TrigramStance.GEON, TrigramStance.GEON); // 0.3 (laterality change)
53
53
  * ```
54
54
  *
55
- * @public
56
55
  * @category Trigram System
57
56
  * @korean 전환시간계산
58
57
  */
@@ -98,7 +97,6 @@ export declare function calculateTransitionDuration(from: TrigramStance, to: Tri
98
97
  * );
99
98
  * ```
100
99
  *
101
- * @public
102
100
  * @category Trigram System
103
101
  * @korean 팔괘자세전환
104
102
  */
@@ -1 +1 @@
1
- {"version":3,"file":"TrigramStanceTransitions.d.ts","sourceRoot":"","sources":["../../../../src/systems/animation/core/TrigramStanceTransitions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAG1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAI5D;;;;;;;;;GASG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,aAAa,EAShD,CAAC;AAEX;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,aAAa,EACnB,EAAE,EAAE,aAAa,GAChB,MAAM,CA2BR;AAsCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,aAAa,EACnB,EAAE,EAAE,aAAa,EACjB,UAAU,EAAE,gBAAgB,GAC3B,iBAAiB,CA8QnB;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAa,CAAC;AAE5E;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,2BAA2B,IAAI,IAAI,CAWlD;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,aAAa,EACnB,EAAE,EAAE,aAAa,EACjB,UAAU,EAAE,gBAAgB,GAC3B,iBAAiB,GAAG,SAAS,CAG/B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,kCAAkC,IAAI,IAAI,CAIzD"}
1
+ {"version":3,"file":"TrigramStanceTransitions.d.ts","sourceRoot":"","sources":["../../../../src/systems/animation/core/TrigramStanceTransitions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAG1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAI5D;;;;;;;;;GASG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,aAAa,EAShD,CAAC;AAEX;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,aAAa,EACnB,EAAE,EAAE,aAAa,GAChB,MAAM,CA2BR;AAsCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,aAAa,EACnB,EAAE,EAAE,aAAa,EACjB,UAAU,EAAE,gBAAgB,GAC3B,iBAAiB,CA8QnB;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAa,CAAC;AAE5E;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,2BAA2B,IAAI,IAAI,CAWlD;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,aAAa,EACnB,EAAE,EAAE,aAAa,EACjB,UAAU,EAAE,gBAAgB,GAC3B,iBAAiB,GAAG,SAAS,CAG/B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,kCAAkC,IAAI,IAAI,CAIzD"}