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":"CollisionDetection.js","names":[],"sources":["../../../src/systems/physics/CollisionDetection.ts"],"sourcesContent":["/**\n * Collision Detection System for Black Trigram combat physics.\n *\n * **Korean**: 충돌 감지 시스템\n *\n * Implements precise collision detection for the 70 vital points combat system using:\n * - Broad-phase AABB (Axis-Aligned Bounding Box) checks for performance\n * - Narrow-phase raycasting for precise vital point detection\n * - Attack reach validation based on technique and stance\n * - Bounding boxes for 5 anatomical regions\n *\n * ## Architecture\n *\n * The system uses a two-phase collision detection approach:\n *\n * 1. **Broad-phase**: Fast AABB checks to eliminate impossible collisions\n * 2. **Narrow-phase**: Precise raycasting to identify specific vital points\n *\n * This ensures 60fps performance even with complex collision queries.\n *\n * ## Performance\n *\n * - Broad-phase: O(1) per check (simple distance comparison)\n * - Narrow-phase: O(n) where n = vital points in region (typically 8-20)\n * - Target: <100 collision checks per frame for 60fps\n *\n * @example\n * ```typescript\n * const collision = new CollisionDetection();\n *\n * const result = collision.checkAttackHit(\n * { x: 0, y: 0, z: 5 }, // Attacker position\n * { x: 0, y: 0, z: 6.5 }, // Defender position\n * { id: \"kick\", type: \"kick\" }, // Technique\n * TrigramStance.LI, // Attacker stance\n * \"torso\" // Target region\n * );\n *\n * if (result.hit) {\n * console.log(`Hit ${result.vitalPoint?.names.english}!`);\n * console.log(`Accuracy: ${(result.accuracy * 100).toFixed(1)}%`);\n * }\n * ```\n *\n * @module systems/physics/CollisionDetection\n * @category Combat Systems\n * @korean 충돌감지시스템\n */\n\nimport * as THREE from \"three\";\nimport { TrigramStance } from \"../../types/common\";\nimport type {\n AnatomicalRegionPhysics,\n BoundingBox,\n CollisionResult,\n Position3D,\n RaycastQuery,\n TechniqueType,\n} from \"../../types/physics\";\nimport {\n ANATOMICAL_DIMENSIONS,\n BASE_REACH,\n STANCE_REACH_MODIFIERS,\n} from \"../../types/physics\";\nimport type { VitalPoint } from \"../vitalpoint/types\";\nimport { VITAL_POINTS_DATA } from \"../vitalpoint/VitalPointsData\";\nimport { CoordinateMapper } from \"./CoordinateMapper\";\nimport { ThreeObjectPools } from \"../../utils/threeObjectPool\";\n\n/**\n * Collision Detection Engine for combat physics.\n *\n * **Korean**: 충돌 감지 엔진\n *\n * Provides efficient collision detection for combat using bounding boxes and raycasting.\n * Optimized for 60fps performance with multiple simultaneous collision checks.\n *\n * @public\n * @category Combat Systems\n * @korean 충돌감지엔진\n */\nexport class CollisionDetection {\n private readonly boundingBoxes: Map<AnatomicalRegionPhysics, BoundingBox> =\n new Map();\n private readonly raycaster: THREE.Raycaster = new THREE.Raycaster();\n private vitalPointsByRegion: Map<AnatomicalRegionPhysics, VitalPoint[]> =\n new Map();\n\n // Geometry cache for object pooling to avoid repeated allocations during combat\n private readonly geometryCache: Map<string, THREE.BufferGeometry> = new Map();\n\n // Coordinate mapper for 2D→3D conversion\n private readonly coordinateMapper: CoordinateMapper;\n\n /**\n * Creates a new CollisionDetection instance.\n *\n * Initializes bounding boxes for all anatomical regions and organizes\n * vital points by region for efficient lookup.\n */\n constructor() {\n this.coordinateMapper = new CoordinateMapper();\n this.initializeBoundingBoxes();\n this.organizeVitalPointsByRegion();\n this.initializeGeometryCache();\n }\n\n /**\n * Cleans up Three.js resources.\n *\n * **Korean**: 자원 정리\n *\n * Disposes of cached geometries and releases memory to prevent leaks.\n * Should be called when the CollisionDetection instance is no longer needed.\n *\n * @public\n * @korean 자원정리\n */\n public dispose(): void {\n // Dispose all cached geometries\n for (const geometry of this.geometryCache.values()) {\n geometry.dispose();\n }\n this.geometryCache.clear();\n }\n\n /**\n * Checks if an attack hits the defender.\n *\n * **Korean**: 공격 타격 확인\n *\n * Performs two-phase collision detection:\n * 1. Calculate effective attack reach based on technique and stance\n * 2. Broad-phase: Check if defender is within reach\n * 3. Broad-phase: Check if target region's AABB is within reach\n * 4. Narrow-phase: Raycast to find precise vital point hit\n *\n * @param attackerPosition - 3D position of the attacker\n * @param defenderPosition - 3D position of the defender\n * @param technique - Technique being used with type information\n * @param attackerStance - Attacker's current trigram stance\n * @param targetRegion - Anatomical region being targeted\n * @returns Collision result with hit status, vital point, distance, and accuracy\n *\n * @example\n * ```typescript\n * const result = collision.checkAttackHit(\n * { x: 0, y: 0, z: 5 },\n * { x: 0, y: 0, z: 6 },\n * { type: \"punch\" },\n * TrigramStance.GEON,\n * \"head\"\n * );\n * ```\n *\n * @public\n * @korean 공격타격확인\n */\n checkAttackHit(\n attackerPosition: Position3D,\n defenderPosition: Position3D,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Technique object has dynamic properties from combat system\n technique: { type?: string; [key: string]: any },\n attackerStance: TrigramStance,\n targetRegion: AnatomicalRegionPhysics,\n ): CollisionResult {\n // Calculate effective attack reach\n const techniqueType = this.parseTechniqueType(technique.type);\n const attackReach = this.calculateAttackReach(\n techniqueType,\n attackerStance,\n );\n\n // Calculate distance between attacker and defender\n const distance = this.calculateDistance3D(\n attackerPosition,\n defenderPosition,\n );\n\n // Broad-phase: Check if defender is within reach\n if (distance > attackReach.effectiveReach) {\n return {\n hit: false,\n distance,\n accuracy: 0,\n };\n }\n\n // Get target region bounding box\n const targetBox = this.boundingBoxes.get(targetRegion);\n if (!targetBox) {\n return {\n hit: false,\n distance,\n accuracy: 0,\n };\n }\n\n // Narrow-phase: Raycast from attacker to target region\n const attackDirection = this.normalizeVector3D(\n this.subtractVectors3D(defenderPosition, attackerPosition),\n );\n\n const raycastQuery: RaycastQuery = {\n origin: attackerPosition,\n direction: attackDirection,\n maxDistance: attackReach.effectiveReach,\n targetRegion,\n };\n\n // Check intersection with target bounding box\n const intersection = this.raycastBoundingBox(\n raycastQuery,\n targetBox,\n defenderPosition,\n );\n\n if (!intersection) {\n return {\n hit: false,\n distance,\n accuracy: 0,\n };\n }\n\n // Determine specific vital point within region\n const vitalPoint = this.identifyVitalPoint(\n targetRegion,\n intersection.point,\n defenderPosition,\n );\n\n if (!vitalPoint) {\n return {\n hit: false,\n distance,\n accuracy: 0,\n };\n }\n\n // Calculate accuracy (how close to vital point center)\n const accuracy = this.calculateHitAccuracy(\n intersection.point,\n vitalPoint,\n defenderPosition,\n );\n\n return {\n hit: true,\n region: targetRegion,\n vitalPoint,\n distance,\n accuracy,\n hitPoint: intersection.point,\n };\n }\n\n /**\n * Calculates effective attack reach for a technique.\n *\n * **Korean**: 공격 범위 계산\n *\n * Applies stance modifiers to base technique reach.\n *\n * @param techniqueType - Type of technique\n * @param stance - Current trigram stance\n * @returns Attack reach with all modifiers applied\n *\n * @private\n * @korean 공격범위계산\n */\n private calculateAttackReach(\n techniqueType: TechniqueType,\n stance: TrigramStance,\n ): {\n technique: TechniqueType;\n baseReach: number;\n stance: TrigramStance;\n stanceModifier: number;\n effectiveReach: number;\n } {\n // Use BASE_REACH constant from physics types\n const baseReach = BASE_REACH[techniqueType];\n\n // Use STANCE_REACH_MODIFIERS constant from physics types\n const stanceModifier = STANCE_REACH_MODIFIERS[stance];\n const effectiveReach = baseReach * stanceModifier;\n\n return {\n technique: techniqueType,\n baseReach,\n stance,\n stanceModifier,\n effectiveReach,\n };\n }\n\n /**\n * Performs raycasting against a bounding box.\n *\n * **Korean**: 경계 상자 광선 투사\n *\n * Uses cached geometries from object pool to avoid repeated allocations\n * during combat. Creates a Three.js mesh for the bounding box and performs\n * raycasting to detect intersection points.\n *\n * Uses object pooling for Vector3 allocations to reduce GC pressure.\n *\n * @param query - Raycast query parameters\n * @param box - Bounding box to test\n * @param defenderPosition - Position of the defender\n * @returns Intersection point or null if no hit\n *\n * @private\n * @korean 경계상자광선투사\n */\n private raycastBoundingBox(\n query: RaycastQuery,\n box: BoundingBox,\n defenderPosition: Position3D,\n ): { point: Position3D } | null {\n // Get cached geometry from pool to avoid repeated allocations\n const cacheKey = `${box.type}-${box.region}`;\n let geometry = this.geometryCache.get(cacheKey);\n\n // If not cached (shouldn't happen after initialization), create it\n if (!geometry) {\n geometry = this.createGeometryForBox(box);\n this.geometryCache.set(cacheKey, geometry);\n }\n\n // Create temporary mesh for raycasting (mesh is lightweight, geometry is cached)\n const mesh = new THREE.Mesh(geometry);\n mesh.position.set(\n defenderPosition.x + box.center.x,\n defenderPosition.y + box.center.y,\n defenderPosition.z + box.center.z,\n );\n\n // Setup raycaster using pooled Vector3 objects to reduce GC pressure\n // Wrap in try-finally to ensure pooled objects are always released\n const origin = ThreeObjectPools.vector3.acquire();\n const direction = ThreeObjectPools.vector3.acquire();\n\n try {\n origin.set(query.origin.x, query.origin.y, query.origin.z);\n direction.set(query.direction.x, query.direction.y, query.direction.z);\n\n this.raycaster.set(origin, direction);\n this.raycaster.far = query.maxDistance;\n\n // Perform raycast\n const intersections = this.raycaster.intersectObject(mesh);\n\n // Clean up temporary mesh (geometry remains cached)\n // Note: mesh.material is undefined, no need to dispose\n\n if (intersections.length > 0) {\n const point = intersections[0].point;\n return {\n point: { x: point.x, y: point.y, z: point.z },\n };\n }\n\n return null;\n } finally {\n // Release pooled objects back to pool (guaranteed even if exception occurs)\n ThreeObjectPools.vector3.release(origin);\n ThreeObjectPools.vector3.release(direction);\n }\n }\n\n /**\n * Creates Three.js geometry for a bounding box.\n *\n * Helper method for geometry cache initialization.\n *\n * @param box - Bounding box specification\n * @returns Three.js geometry\n *\n * @private\n * @korean 경계상자지오메트리생성\n */\n private createGeometryForBox(box: BoundingBox): THREE.BufferGeometry {\n switch (box.type) {\n case \"sphere\":\n return new THREE.SphereGeometry(box.dimensions.x, 8, 8);\n case \"box\":\n return new THREE.BoxGeometry(\n box.dimensions.x,\n box.dimensions.y,\n box.dimensions.z,\n );\n case \"capsule\":\n return new THREE.CapsuleGeometry(\n box.dimensions.x,\n box.dimensions.y,\n 4,\n 8,\n );\n }\n }\n\n /**\n * Identifies the specific vital point hit within a region.\n *\n * **Korean**: 급소 식별\n *\n * Finds the closest vital point to the hit location within the targeted region.\n *\n * @param region - Anatomical region hit\n * @param hitPoint - 3D point where attack intersected\n * @param defenderPosition - Position of the defender\n * @returns Closest vital point or null if none found\n *\n * @private\n * @korean 급소식별\n */\n private identifyVitalPoint(\n region: AnatomicalRegionPhysics,\n hitPoint: Position3D,\n _defenderPosition: Position3D, // Prefixed with _ to indicate intentionally unused\n ): VitalPoint | null {\n // Get all vital points for this region\n const vitalPoints = this.vitalPointsByRegion.get(region);\n if (!vitalPoints || vitalPoints.length === 0) {\n return null;\n }\n\n // Use CoordinateMapper to find the closest vital point in 3D space\n const result = this.coordinateMapper.findClosestVitalPoint(\n hitPoint,\n vitalPoints,\n region,\n );\n\n // For collision detection, we accept any vital point in the region\n // even if it's not very close, as long as the region was hit\n // This provides more forgiving collision detection while still\n // using accurate 3D positioning for scoring/accuracy\n return result\n ? result.vitalPoint\n : vitalPoints.length > 0\n ? vitalPoints[0]\n : null;\n }\n\n /**\n * Calculates hit accuracy based on distance to vital point center.\n *\n * **Korean**: 타격 정확도 계산\n *\n * Accuracy decreases linearly with distance from vital point center.\n * Perfect accuracy (1.0) at center, decreasing to 0 at 5cm radius.\n *\n * @param hitPoint - Point where attack landed\n * @param vitalPoint - Target vital point\n * @param defenderPosition - Position of the defender\n * @returns Accuracy value from 0 to 1\n *\n * @private\n * @korean 타격정확도계산\n */\n private calculateHitAccuracy(\n hitPoint: Position3D,\n vitalPoint: VitalPoint,\n _defenderPosition: Position3D, // Prefixed with _ to indicate intentionally unused\n ): number {\n // Use CoordinateMapper to convert vital point to 3D and calculate distance\n const distance = this.coordinateMapper.distanceToVitalPoint(\n hitPoint,\n vitalPoint,\n );\n\n // Accuracy calculation: Perfect (1.0) at center, decreasing to 0 at 5cm radius\n const maxDistance = 0.05; // 5cm radius for vital points\n const accuracy = Math.max(0, 1 - distance / maxDistance);\n\n return accuracy;\n }\n\n /**\n * Calculates Euclidean distance between two 3D points.\n *\n * @param pos1 - First position\n * @param pos2 - Second position\n * @returns Distance in meters\n *\n * @private\n * @korean 3D거리계산\n */\n private calculateDistance3D(pos1: Position3D, pos2: Position3D): number {\n const dx = pos1.x - pos2.x;\n const dy = pos1.y - pos2.y;\n const dz = pos1.z - pos2.z;\n return Math.sqrt(dx * dx + dy * dy + dz * dz);\n }\n\n /**\n * Subtracts one 3D vector from another.\n *\n * @param v1 - First vector\n * @param v2 - Second vector\n * @returns Resulting vector\n *\n * @private\n * @korean 벡터빼기\n */\n private subtractVectors3D(v1: Position3D, v2: Position3D): Position3D {\n return {\n x: v1.x - v2.x,\n y: v1.y - v2.y,\n z: v1.z - v2.z,\n };\n }\n\n /**\n * Normalizes a 3D vector to unit length.\n *\n * @param vec - Vector to normalize\n * @returns Normalized vector\n *\n * @private\n * @korean 벡터정규화\n */\n private normalizeVector3D(vec: Position3D): Position3D {\n const length = Math.sqrt(vec.x * vec.x + vec.y * vec.y + vec.z * vec.z);\n if (length === 0) {\n return { x: 0, y: 0, z: 1 }; // Default forward direction\n }\n return {\n x: vec.x / length,\n y: vec.y / length,\n z: vec.z / length,\n };\n }\n\n /**\n * Parses technique type from string.\n *\n * @param techniqueTypeStr - Technique type as string\n * @returns Parsed technique type\n *\n * @private\n * @korean 기술유형파싱\n */\n private parseTechniqueType(techniqueTypeStr?: string): TechniqueType {\n const typeMap: Record<string, TechniqueType> = {\n punch: \"punch\",\n kick: \"kick\",\n elbow: \"elbow\",\n knee: \"knee\",\n pressure_point: \"pressure_point\",\n strike: \"punch\", // Default strike to punch\n };\n\n return typeMap[techniqueTypeStr ?? \"punch\"] ?? \"punch\";\n }\n\n /**\n * Initializes bounding boxes for all anatomical regions.\n *\n * Creates collision volumes for the 5 anatomical regions using the\n * ANATOMICAL_DIMENSIONS constants from the physics types module.\n *\n * @private\n * @korean 경계상자초기화\n */\n private initializeBoundingBoxes(): void {\n // Head: Sphere (from ANATOMICAL_DIMENSIONS)\n this.boundingBoxes.set(\"head\", {\n type: ANATOMICAL_DIMENSIONS.head.type,\n center: ANATOMICAL_DIMENSIONS.head.center,\n dimensions: {\n x: ANATOMICAL_DIMENSIONS.head.radius,\n y: 0,\n z: 0,\n }, // radius only\n region: \"head\",\n });\n\n // Neck: Capsule (from ANATOMICAL_DIMENSIONS)\n this.boundingBoxes.set(\"neck\", {\n type: ANATOMICAL_DIMENSIONS.neck.type,\n center: ANATOMICAL_DIMENSIONS.neck.center,\n dimensions: {\n x: ANATOMICAL_DIMENSIONS.neck.radius,\n y: ANATOMICAL_DIMENSIONS.neck.height,\n z: 0,\n }, // radius and height\n region: \"neck\",\n });\n\n // Torso: Box (from ANATOMICAL_DIMENSIONS)\n this.boundingBoxes.set(\"torso\", {\n type: ANATOMICAL_DIMENSIONS.torso.type,\n center: ANATOMICAL_DIMENSIONS.torso.center,\n dimensions: {\n x: ANATOMICAL_DIMENSIONS.torso.width,\n y: ANATOMICAL_DIMENSIONS.torso.height,\n z: ANATOMICAL_DIMENSIONS.torso.depth,\n }, // width, height, depth\n region: \"torso\",\n });\n\n // Arms: Capsules (from ANATOMICAL_DIMENSIONS)\n this.boundingBoxes.set(\"arms\", {\n type: ANATOMICAL_DIMENSIONS.arms.type,\n center: ANATOMICAL_DIMENSIONS.arms.center,\n dimensions: {\n x: ANATOMICAL_DIMENSIONS.arms.radius,\n y: ANATOMICAL_DIMENSIONS.arms.height,\n z: 0,\n }, // radius and length\n region: \"arms\",\n });\n\n // Legs: Capsules (from ANATOMICAL_DIMENSIONS)\n this.boundingBoxes.set(\"legs\", {\n type: ANATOMICAL_DIMENSIONS.legs.type,\n center: ANATOMICAL_DIMENSIONS.legs.center,\n dimensions: {\n x: ANATOMICAL_DIMENSIONS.legs.radius,\n y: ANATOMICAL_DIMENSIONS.legs.height,\n z: 0,\n }, // radius and length\n region: \"legs\",\n });\n }\n\n /**\n * Initializes geometry cache for object pooling.\n *\n * Pre-creates all geometries needed for raycasting to avoid repeated\n * allocations during combat. Critical for maintaining 60fps with up to\n * 100 collision checks per frame.\n *\n * @private\n * @korean 지오메트리캐시초기화\n */\n private initializeGeometryCache(): void {\n // Pre-create and cache geometries for all bounding boxes\n for (const box of this.boundingBoxes.values()) {\n const cacheKey = `${box.type}-${box.region}`;\n const geometry = this.createGeometryForBox(box);\n this.geometryCache.set(cacheKey, geometry);\n }\n }\n\n /**\n * Organizes vital points by anatomical region for efficient lookup.\n *\n * NOTE: This categorization currently uses y-coordinate thresholds that assume\n * positions are in meters. However, VITAL_POINTS_DATA uses pixel coordinates\n * (e.g., y: 50), which will cause incorrect categorization. Most vital points\n * will end up in the \"legs\" region since pixel y-coordinates are typically less\n * than 0.8.\n *\n * TODO: After implementing 2D→3D coordinate mapping, update this method to use\n * the converted 3D positions, or use the anatomical region data that may already\n * exist in the vital points data structure.\n *\n * Categorizes the 70 vital points into their respective regions:\n * - Head: 10 vital points\n * - Neck: 8 vital points\n * - Torso: 20 vital points\n * - Arms: 16 vital points\n * - Legs: 16 vital points\n *\n * @private\n * @korean 급소영역별정리\n */\n private organizeVitalPointsByRegion(): void {\n const regionMap: Map<AnatomicalRegionPhysics, VitalPoint[]> = new Map([\n [\"head\", []],\n [\"neck\", []],\n [\"torso\", []],\n [\"arms\", []],\n [\"legs\", []],\n ]);\n\n // Use existing VitalPointsData categorization by ID prefix\n // This is more reliable than coordinate-based heuristics\n for (const vp of VITAL_POINTS_DATA) {\n let region: AnatomicalRegionPhysics;\n\n // Categorize by ID prefix (existing VitalPointsData convention)\n // Check neck-related patterns first (more specific) before head (broader)\n if (\n vp.id.includes(\"_neck\") ||\n vp.id.includes(\"_throat\") ||\n vp.id === \"head_side_neck\" ||\n vp.id === \"head_throat\"\n ) {\n region = \"neck\";\n } else if (vp.id.startsWith(\"head_\")) {\n region = \"head\";\n } else if (vp.id.startsWith(\"torso_\")) {\n region = \"torso\";\n } else if (\n vp.id.startsWith(\"arm_left_\") ||\n vp.id.startsWith(\"arm_right_\")\n ) {\n region = \"arms\";\n } else if (\n vp.id.startsWith(\"leg_left_\") ||\n vp.id.startsWith(\"leg_right_\")\n ) {\n region = \"legs\";\n } else {\n // Default to torso for uncategorized points (core region)\n region = \"torso\";\n }\n\n const list = regionMap.get(region);\n if (list) {\n list.push(vp);\n }\n }\n\n this.vitalPointsByRegion = regionMap;\n }\n\n /**\n * Gets the bounding box for an anatomical region.\n *\n * @param region - Anatomical region\n * @returns Bounding box or undefined if not found\n *\n * @public\n * @korean 경계상자조회\n */\n getBoundingBox(region: AnatomicalRegionPhysics): BoundingBox | undefined {\n return this.boundingBoxes.get(region);\n }\n\n /**\n * Gets all bounding boxes.\n *\n * @returns Map of all bounding boxes by region\n *\n * @public\n * @korean 모든경계상자조회\n */\n getAllBoundingBoxes(): ReadonlyMap<AnatomicalRegionPhysics, BoundingBox> {\n return this.boundingBoxes;\n }\n\n /**\n * Gets vital points for a specific region.\n *\n * @param region - Anatomical region\n * @returns Array of vital points in that region\n *\n * @public\n * @korean 영역별급소조회\n */\n getVitalPointsInRegion(\n region: AnatomicalRegionPhysics,\n ): readonly VitalPoint[] {\n return this.vitalPointsByRegion.get(region) ?? [];\n }\n}\n\nexport default CollisionDetection;\n"],"mappings":"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"}
1
+ {"version":3,"file":"CollisionDetection.js","names":[],"sources":["../../../src/systems/physics/CollisionDetection.ts"],"sourcesContent":["/**\n * Collision Detection System for Black Trigram combat physics.\n *\n * **Korean**: 충돌 감지 시스템\n *\n * Implements precise collision detection for the 70 vital points combat system using:\n * - Broad-phase AABB (Axis-Aligned Bounding Box) checks for performance\n * - Narrow-phase raycasting for precise vital point detection\n * - Attack reach validation based on technique and stance\n * - Bounding boxes for 5 anatomical regions\n *\n * ## Architecture\n *\n * The system uses a two-phase collision detection approach:\n *\n * 1. **Broad-phase**: Fast AABB checks to eliminate impossible collisions\n * 2. **Narrow-phase**: Precise raycasting to identify specific vital points\n *\n * This ensures 60fps performance even with complex collision queries.\n *\n * ## Performance\n *\n * - Broad-phase: O(1) per check (simple distance comparison)\n * - Narrow-phase: O(n) where n = vital points in region (typically 8-20)\n * - Target: <100 collision checks per frame for 60fps\n *\n * @example\n * ```typescript\n * const collision = new CollisionDetection();\n *\n * const result = collision.checkAttackHit(\n * { x: 0, y: 0, z: 5 }, // Attacker position\n * { x: 0, y: 0, z: 6.5 }, // Defender position\n * { id: \"kick\", type: \"kick\" }, // Technique\n * TrigramStance.LI, // Attacker stance\n * \"torso\" // Target region\n * );\n *\n * if (result.hit) {\n * console.log(`Hit ${result.vitalPoint?.names.english}!`);\n * console.log(`Accuracy: ${(result.accuracy * 100).toFixed(1)}%`);\n * }\n * ```\n *\n * @module systems/physics/CollisionDetection\n * @category Combat Systems\n * @korean 충돌감지시스템\n */\n\nimport * as THREE from \"three\";\nimport { TrigramStance } from \"../../types/common\";\nimport type {\n AnatomicalRegionPhysics,\n BoundingBox,\n CollisionResult,\n Position3D,\n RaycastQuery,\n TechniqueType,\n} from \"../../types/physics\";\nimport {\n ANATOMICAL_DIMENSIONS,\n BASE_REACH,\n STANCE_REACH_MODIFIERS,\n} from \"../../types/physics\";\nimport type { VitalPoint } from \"../vitalpoint/types\";\nimport { VITAL_POINTS_DATA } from \"../vitalpoint/VitalPointsData\";\nimport { CoordinateMapper } from \"./CoordinateMapper\";\nimport { ThreeObjectPools } from \"../../utils/threeObjectPool\";\n\n/**\n * Collision Detection Engine for combat physics.\n *\n * **Korean**: 충돌 감지 엔진\n *\n * Provides efficient collision detection for combat using bounding boxes and raycasting.\n * Optimized for 60fps performance with multiple simultaneous collision checks.\n *\n * @category Combat Systems\n * @korean 충돌감지엔진\n */\nexport class CollisionDetection {\n private readonly boundingBoxes: Map<AnatomicalRegionPhysics, BoundingBox> =\n new Map();\n private readonly raycaster: THREE.Raycaster = new THREE.Raycaster();\n private vitalPointsByRegion: Map<AnatomicalRegionPhysics, VitalPoint[]> =\n new Map();\n\n // Geometry cache for object pooling to avoid repeated allocations during combat\n private readonly geometryCache: Map<string, THREE.BufferGeometry> = new Map();\n\n // Coordinate mapper for 2D→3D conversion\n private readonly coordinateMapper: CoordinateMapper;\n\n /**\n * Creates a new CollisionDetection instance.\n *\n * Initializes bounding boxes for all anatomical regions and organizes\n * vital points by region for efficient lookup.\n */\n constructor() {\n this.coordinateMapper = new CoordinateMapper();\n this.initializeBoundingBoxes();\n this.organizeVitalPointsByRegion();\n this.initializeGeometryCache();\n }\n\n /**\n * Cleans up Three.js resources.\n *\n * **Korean**: 자원 정리\n *\n * Disposes of cached geometries and releases memory to prevent leaks.\n * Should be called when the CollisionDetection instance is no longer needed.\n *\n * @korean 자원정리\n */\n public dispose(): void {\n // Dispose all cached geometries\n for (const geometry of this.geometryCache.values()) {\n geometry.dispose();\n }\n this.geometryCache.clear();\n }\n\n /**\n * Checks if an attack hits the defender.\n *\n * **Korean**: 공격 타격 확인\n *\n * Performs two-phase collision detection:\n * 1. Calculate effective attack reach based on technique and stance\n * 2. Broad-phase: Check if defender is within reach\n * 3. Broad-phase: Check if target region's AABB is within reach\n * 4. Narrow-phase: Raycast to find precise vital point hit\n *\n * @param attackerPosition - 3D position of the attacker\n * @param defenderPosition - 3D position of the defender\n * @param technique - Technique being used with type information\n * @param attackerStance - Attacker's current trigram stance\n * @param targetRegion - Anatomical region being targeted\n * @returns Collision result with hit status, vital point, distance, and accuracy\n *\n * @example\n * ```typescript\n * const result = collision.checkAttackHit(\n * { x: 0, y: 0, z: 5 },\n * { x: 0, y: 0, z: 6 },\n * { type: \"punch\" },\n * TrigramStance.GEON,\n * \"head\"\n * );\n * ```\n *\n * @korean 공격타격확인\n */\n checkAttackHit(\n attackerPosition: Position3D,\n defenderPosition: Position3D,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Technique object has dynamic properties from combat system\n technique: { type?: string; [key: string]: any },\n attackerStance: TrigramStance,\n targetRegion: AnatomicalRegionPhysics,\n ): CollisionResult {\n // Calculate effective attack reach\n const techniqueType = this.parseTechniqueType(technique.type);\n const attackReach = this.calculateAttackReach(\n techniqueType,\n attackerStance,\n );\n\n // Calculate distance between attacker and defender\n const distance = this.calculateDistance3D(\n attackerPosition,\n defenderPosition,\n );\n\n // Broad-phase: Check if defender is within reach\n if (distance > attackReach.effectiveReach) {\n return {\n hit: false,\n distance,\n accuracy: 0,\n };\n }\n\n // Get target region bounding box\n const targetBox = this.boundingBoxes.get(targetRegion);\n if (!targetBox) {\n return {\n hit: false,\n distance,\n accuracy: 0,\n };\n }\n\n // Narrow-phase: Raycast from attacker to target region\n const attackDirection = this.normalizeVector3D(\n this.subtractVectors3D(defenderPosition, attackerPosition),\n );\n\n const raycastQuery: RaycastQuery = {\n origin: attackerPosition,\n direction: attackDirection,\n maxDistance: attackReach.effectiveReach,\n targetRegion,\n };\n\n // Check intersection with target bounding box\n const intersection = this.raycastBoundingBox(\n raycastQuery,\n targetBox,\n defenderPosition,\n );\n\n if (!intersection) {\n return {\n hit: false,\n distance,\n accuracy: 0,\n };\n }\n\n // Determine specific vital point within region\n const vitalPoint = this.identifyVitalPoint(\n targetRegion,\n intersection.point,\n defenderPosition,\n );\n\n if (!vitalPoint) {\n return {\n hit: false,\n distance,\n accuracy: 0,\n };\n }\n\n // Calculate accuracy (how close to vital point center)\n const accuracy = this.calculateHitAccuracy(\n intersection.point,\n vitalPoint,\n defenderPosition,\n );\n\n return {\n hit: true,\n region: targetRegion,\n vitalPoint,\n distance,\n accuracy,\n hitPoint: intersection.point,\n };\n }\n\n /**\n * Calculates effective attack reach for a technique.\n *\n * **Korean**: 공격 범위 계산\n *\n * Applies stance modifiers to base technique reach.\n *\n * @param techniqueType - Type of technique\n * @param stance - Current trigram stance\n * @returns Attack reach with all modifiers applied\n *\n * @private\n * @korean 공격범위계산\n */\n private calculateAttackReach(\n techniqueType: TechniqueType,\n stance: TrigramStance,\n ): {\n technique: TechniqueType;\n baseReach: number;\n stance: TrigramStance;\n stanceModifier: number;\n effectiveReach: number;\n } {\n // Use BASE_REACH constant from physics types\n const baseReach = BASE_REACH[techniqueType];\n\n // Use STANCE_REACH_MODIFIERS constant from physics types\n const stanceModifier = STANCE_REACH_MODIFIERS[stance];\n const effectiveReach = baseReach * stanceModifier;\n\n return {\n technique: techniqueType,\n baseReach,\n stance,\n stanceModifier,\n effectiveReach,\n };\n }\n\n /**\n * Performs raycasting against a bounding box.\n *\n * **Korean**: 경계 상자 광선 투사\n *\n * Uses cached geometries from object pool to avoid repeated allocations\n * during combat. Creates a Three.js mesh for the bounding box and performs\n * raycasting to detect intersection points.\n *\n * Uses object pooling for Vector3 allocations to reduce GC pressure.\n *\n * @param query - Raycast query parameters\n * @param box - Bounding box to test\n * @param defenderPosition - Position of the defender\n * @returns Intersection point or null if no hit\n *\n * @private\n * @korean 경계상자광선투사\n */\n private raycastBoundingBox(\n query: RaycastQuery,\n box: BoundingBox,\n defenderPosition: Position3D,\n ): { point: Position3D } | null {\n // Get cached geometry from pool to avoid repeated allocations\n const cacheKey = `${box.type}-${box.region}`;\n let geometry = this.geometryCache.get(cacheKey);\n\n // If not cached (shouldn't happen after initialization), create it\n if (!geometry) {\n geometry = this.createGeometryForBox(box);\n this.geometryCache.set(cacheKey, geometry);\n }\n\n // Create temporary mesh for raycasting (mesh is lightweight, geometry is cached)\n const mesh = new THREE.Mesh(geometry);\n mesh.position.set(\n defenderPosition.x + box.center.x,\n defenderPosition.y + box.center.y,\n defenderPosition.z + box.center.z,\n );\n\n // Setup raycaster using pooled Vector3 objects to reduce GC pressure\n // Wrap in try-finally to ensure pooled objects are always released\n const origin = ThreeObjectPools.vector3.acquire();\n const direction = ThreeObjectPools.vector3.acquire();\n\n try {\n origin.set(query.origin.x, query.origin.y, query.origin.z);\n direction.set(query.direction.x, query.direction.y, query.direction.z);\n\n this.raycaster.set(origin, direction);\n this.raycaster.far = query.maxDistance;\n\n // Perform raycast\n const intersections = this.raycaster.intersectObject(mesh);\n\n // Clean up temporary mesh (geometry remains cached)\n // Note: mesh.material is undefined, no need to dispose\n\n if (intersections.length > 0) {\n const point = intersections[0].point;\n return {\n point: { x: point.x, y: point.y, z: point.z },\n };\n }\n\n return null;\n } finally {\n // Release pooled objects back to pool (guaranteed even if exception occurs)\n ThreeObjectPools.vector3.release(origin);\n ThreeObjectPools.vector3.release(direction);\n }\n }\n\n /**\n * Creates Three.js geometry for a bounding box.\n *\n * Helper method for geometry cache initialization.\n *\n * @param box - Bounding box specification\n * @returns Three.js geometry\n *\n * @private\n * @korean 경계상자지오메트리생성\n */\n private createGeometryForBox(box: BoundingBox): THREE.BufferGeometry {\n switch (box.type) {\n case \"sphere\":\n return new THREE.SphereGeometry(box.dimensions.x, 8, 8);\n case \"box\":\n return new THREE.BoxGeometry(\n box.dimensions.x,\n box.dimensions.y,\n box.dimensions.z,\n );\n case \"capsule\":\n return new THREE.CapsuleGeometry(\n box.dimensions.x,\n box.dimensions.y,\n 4,\n 8,\n );\n }\n }\n\n /**\n * Identifies the specific vital point hit within a region.\n *\n * **Korean**: 급소 식별\n *\n * Finds the closest vital point to the hit location within the targeted region.\n *\n * @param region - Anatomical region hit\n * @param hitPoint - 3D point where attack intersected\n * @param defenderPosition - Position of the defender\n * @returns Closest vital point or null if none found\n *\n * @private\n * @korean 급소식별\n */\n private identifyVitalPoint(\n region: AnatomicalRegionPhysics,\n hitPoint: Position3D,\n _defenderPosition: Position3D, // Prefixed with _ to indicate intentionally unused\n ): VitalPoint | null {\n // Get all vital points for this region\n const vitalPoints = this.vitalPointsByRegion.get(region);\n if (!vitalPoints || vitalPoints.length === 0) {\n return null;\n }\n\n // Use CoordinateMapper to find the closest vital point in 3D space\n const result = this.coordinateMapper.findClosestVitalPoint(\n hitPoint,\n vitalPoints,\n region,\n );\n\n // For collision detection, we accept any vital point in the region\n // even if it's not very close, as long as the region was hit\n // This provides more forgiving collision detection while still\n // using accurate 3D positioning for scoring/accuracy\n return result\n ? result.vitalPoint\n : vitalPoints.length > 0\n ? vitalPoints[0]\n : null;\n }\n\n /**\n * Calculates hit accuracy based on distance to vital point center.\n *\n * **Korean**: 타격 정확도 계산\n *\n * Accuracy decreases linearly with distance from vital point center.\n * Perfect accuracy (1.0) at center, decreasing to 0 at 5cm radius.\n *\n * @param hitPoint - Point where attack landed\n * @param vitalPoint - Target vital point\n * @param defenderPosition - Position of the defender\n * @returns Accuracy value from 0 to 1\n *\n * @private\n * @korean 타격정확도계산\n */\n private calculateHitAccuracy(\n hitPoint: Position3D,\n vitalPoint: VitalPoint,\n _defenderPosition: Position3D, // Prefixed with _ to indicate intentionally unused\n ): number {\n // Use CoordinateMapper to convert vital point to 3D and calculate distance\n const distance = this.coordinateMapper.distanceToVitalPoint(\n hitPoint,\n vitalPoint,\n );\n\n // Accuracy calculation: Perfect (1.0) at center, decreasing to 0 at 5cm radius\n const maxDistance = 0.05; // 5cm radius for vital points\n const accuracy = Math.max(0, 1 - distance / maxDistance);\n\n return accuracy;\n }\n\n /**\n * Calculates Euclidean distance between two 3D points.\n *\n * @param pos1 - First position\n * @param pos2 - Second position\n * @returns Distance in meters\n *\n * @private\n * @korean 3D거리계산\n */\n private calculateDistance3D(pos1: Position3D, pos2: Position3D): number {\n const dx = pos1.x - pos2.x;\n const dy = pos1.y - pos2.y;\n const dz = pos1.z - pos2.z;\n return Math.sqrt(dx * dx + dy * dy + dz * dz);\n }\n\n /**\n * Subtracts one 3D vector from another.\n *\n * @param v1 - First vector\n * @param v2 - Second vector\n * @returns Resulting vector\n *\n * @private\n * @korean 벡터빼기\n */\n private subtractVectors3D(v1: Position3D, v2: Position3D): Position3D {\n return {\n x: v1.x - v2.x,\n y: v1.y - v2.y,\n z: v1.z - v2.z,\n };\n }\n\n /**\n * Normalizes a 3D vector to unit length.\n *\n * @param vec - Vector to normalize\n * @returns Normalized vector\n *\n * @private\n * @korean 벡터정규화\n */\n private normalizeVector3D(vec: Position3D): Position3D {\n const length = Math.sqrt(vec.x * vec.x + vec.y * vec.y + vec.z * vec.z);\n if (length === 0) {\n return { x: 0, y: 0, z: 1 }; // Default forward direction\n }\n return {\n x: vec.x / length,\n y: vec.y / length,\n z: vec.z / length,\n };\n }\n\n /**\n * Parses technique type from string.\n *\n * @param techniqueTypeStr - Technique type as string\n * @returns Parsed technique type\n *\n * @private\n * @korean 기술유형파싱\n */\n private parseTechniqueType(techniqueTypeStr?: string): TechniqueType {\n const typeMap: Record<string, TechniqueType> = {\n punch: \"punch\",\n kick: \"kick\",\n elbow: \"elbow\",\n knee: \"knee\",\n pressure_point: \"pressure_point\",\n strike: \"punch\", // Default strike to punch\n };\n\n return typeMap[techniqueTypeStr ?? \"punch\"] ?? \"punch\";\n }\n\n /**\n * Initializes bounding boxes for all anatomical regions.\n *\n * Creates collision volumes for the 5 anatomical regions using the\n * ANATOMICAL_DIMENSIONS constants from the physics types module.\n *\n * @private\n * @korean 경계상자초기화\n */\n private initializeBoundingBoxes(): void {\n // Head: Sphere (from ANATOMICAL_DIMENSIONS)\n this.boundingBoxes.set(\"head\", {\n type: ANATOMICAL_DIMENSIONS.head.type,\n center: ANATOMICAL_DIMENSIONS.head.center,\n dimensions: {\n x: ANATOMICAL_DIMENSIONS.head.radius,\n y: 0,\n z: 0,\n }, // radius only\n region: \"head\",\n });\n\n // Neck: Capsule (from ANATOMICAL_DIMENSIONS)\n this.boundingBoxes.set(\"neck\", {\n type: ANATOMICAL_DIMENSIONS.neck.type,\n center: ANATOMICAL_DIMENSIONS.neck.center,\n dimensions: {\n x: ANATOMICAL_DIMENSIONS.neck.radius,\n y: ANATOMICAL_DIMENSIONS.neck.height,\n z: 0,\n }, // radius and height\n region: \"neck\",\n });\n\n // Torso: Box (from ANATOMICAL_DIMENSIONS)\n this.boundingBoxes.set(\"torso\", {\n type: ANATOMICAL_DIMENSIONS.torso.type,\n center: ANATOMICAL_DIMENSIONS.torso.center,\n dimensions: {\n x: ANATOMICAL_DIMENSIONS.torso.width,\n y: ANATOMICAL_DIMENSIONS.torso.height,\n z: ANATOMICAL_DIMENSIONS.torso.depth,\n }, // width, height, depth\n region: \"torso\",\n });\n\n // Arms: Capsules (from ANATOMICAL_DIMENSIONS)\n this.boundingBoxes.set(\"arms\", {\n type: ANATOMICAL_DIMENSIONS.arms.type,\n center: ANATOMICAL_DIMENSIONS.arms.center,\n dimensions: {\n x: ANATOMICAL_DIMENSIONS.arms.radius,\n y: ANATOMICAL_DIMENSIONS.arms.height,\n z: 0,\n }, // radius and length\n region: \"arms\",\n });\n\n // Legs: Capsules (from ANATOMICAL_DIMENSIONS)\n this.boundingBoxes.set(\"legs\", {\n type: ANATOMICAL_DIMENSIONS.legs.type,\n center: ANATOMICAL_DIMENSIONS.legs.center,\n dimensions: {\n x: ANATOMICAL_DIMENSIONS.legs.radius,\n y: ANATOMICAL_DIMENSIONS.legs.height,\n z: 0,\n }, // radius and length\n region: \"legs\",\n });\n }\n\n /**\n * Initializes geometry cache for object pooling.\n *\n * Pre-creates all geometries needed for raycasting to avoid repeated\n * allocations during combat. Critical for maintaining 60fps with up to\n * 100 collision checks per frame.\n *\n * @private\n * @korean 지오메트리캐시초기화\n */\n private initializeGeometryCache(): void {\n // Pre-create and cache geometries for all bounding boxes\n for (const box of this.boundingBoxes.values()) {\n const cacheKey = `${box.type}-${box.region}`;\n const geometry = this.createGeometryForBox(box);\n this.geometryCache.set(cacheKey, geometry);\n }\n }\n\n /**\n * Organizes vital points by anatomical region for efficient lookup.\n *\n * NOTE: This categorization currently uses y-coordinate thresholds that assume\n * positions are in meters. However, VITAL_POINTS_DATA uses pixel coordinates\n * (e.g., y: 50), which will cause incorrect categorization. Most vital points\n * will end up in the \"legs\" region since pixel y-coordinates are typically less\n * than 0.8.\n *\n * TODO: After implementing 2D→3D coordinate mapping, update this method to use\n * the converted 3D positions, or use the anatomical region data that may already\n * exist in the vital points data structure.\n *\n * Categorizes the 70 vital points into their respective regions:\n * - Head: 10 vital points\n * - Neck: 8 vital points\n * - Torso: 20 vital points\n * - Arms: 16 vital points\n * - Legs: 16 vital points\n *\n * @private\n * @korean 급소영역별정리\n */\n private organizeVitalPointsByRegion(): void {\n const regionMap: Map<AnatomicalRegionPhysics, VitalPoint[]> = new Map([\n [\"head\", []],\n [\"neck\", []],\n [\"torso\", []],\n [\"arms\", []],\n [\"legs\", []],\n ]);\n\n // Use existing VitalPointsData categorization by ID prefix\n // This is more reliable than coordinate-based heuristics\n for (const vp of VITAL_POINTS_DATA) {\n let region: AnatomicalRegionPhysics;\n\n // Categorize by ID prefix (existing VitalPointsData convention)\n // Check neck-related patterns first (more specific) before head (broader)\n if (\n vp.id.includes(\"_neck\") ||\n vp.id.includes(\"_throat\") ||\n vp.id === \"head_side_neck\" ||\n vp.id === \"head_throat\"\n ) {\n region = \"neck\";\n } else if (vp.id.startsWith(\"head_\")) {\n region = \"head\";\n } else if (vp.id.startsWith(\"torso_\")) {\n region = \"torso\";\n } else if (\n vp.id.startsWith(\"arm_left_\") ||\n vp.id.startsWith(\"arm_right_\")\n ) {\n region = \"arms\";\n } else if (\n vp.id.startsWith(\"leg_left_\") ||\n vp.id.startsWith(\"leg_right_\")\n ) {\n region = \"legs\";\n } else {\n // Default to torso for uncategorized points (core region)\n region = \"torso\";\n }\n\n const list = regionMap.get(region);\n if (list) {\n list.push(vp);\n }\n }\n\n this.vitalPointsByRegion = regionMap;\n }\n\n /**\n * Gets the bounding box for an anatomical region.\n *\n * @param region - Anatomical region\n * @returns Bounding box or undefined if not found\n *\n * @korean 경계상자조회\n */\n getBoundingBox(region: AnatomicalRegionPhysics): BoundingBox | undefined {\n return this.boundingBoxes.get(region);\n }\n\n /**\n * Gets all bounding boxes.\n *\n * @returns Map of all bounding boxes by region\n *\n * @korean 모든경계상자조회\n */\n getAllBoundingBoxes(): ReadonlyMap<AnatomicalRegionPhysics, BoundingBox> {\n return this.boundingBoxes;\n }\n\n /**\n * Gets vital points for a specific region.\n *\n * @param region - Anatomical region\n * @returns Array of vital points in that region\n *\n * @korean 영역별급소조회\n */\n getVitalPointsInRegion(\n region: AnatomicalRegionPhysics,\n ): readonly VitalPoint[] {\n return this.vitalPointsByRegion.get(region) ?? [];\n }\n}\n\nexport default CollisionDetection;\n"],"mappings":"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"}
@@ -56,7 +56,6 @@ export interface CharacterModelConfig {
56
56
  * Provides bidirectional mapping between the 2D UI overlay coordinate system
57
57
  * and the 3D physics world coordinate system.
58
58
  *
59
- * @public
60
59
  * @category Physics System
61
60
  * @korean 좌표변환기
62
61
  */
@@ -1 +1 @@
1
- {"version":3,"file":"CoordinateMapper.d.ts","sourceRoot":"","sources":["../../../src/systems/physics/CoordinateMapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,kDAAkD;IAClD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,yDAAyD;IACzD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB,gEAAgE;IAChE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB,kDAAkD;IAClD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAE9B,mDAAmD;IACnD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAqFD;;;;;;;;;;;GAWG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAE9C;;;;OAIG;gBACS,MAAM,GAAE,OAAO,CAAC,oBAAoB,CAAM;IAItD;;;;;;;;;;;;;;;;;;;OAmBG;IACH,gBAAgB,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,uBAAuB,GAAG,UAAU;IAuBhF;;;;;;;;;;;;;;;;;;OAkBG;IACH,gBAAgB,CAAC,OAAO,EAAE,UAAU,GAAG,QAAQ;IAc/C;;;;;;;;;;;;;;;;OAgBG;IACH,mBAAmB,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU;IAMvD;;;;;;;;;OASG;IACH,OAAO,CAAC,iBAAiB;IAWzB;;;;;;;;;;;;;;;;OAgBG;IACH,oBAAoB,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,GAAG,MAAM;IAUzE;;;;;;;;;;;;;;;;;;;OAmBG;IACH,qBAAqB,CACnB,OAAO,EAAE,UAAU,EACnB,WAAW,EAAE,SAAS,UAAU,EAAE,EAClC,MAAM,CAAC,EAAE,uBAAuB,GAC/B;QAAE,UAAU,EAAE,UAAU,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IA6BtD;;;;OAIG;IACH,SAAS,IAAI,oBAAoB;CAGlC;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,uBAAuB,kBAAyB,CAAC"}
1
+ {"version":3,"file":"CoordinateMapper.d.ts","sourceRoot":"","sources":["../../../src/systems/physics/CoordinateMapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,kDAAkD;IAClD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,yDAAyD;IACzD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB,gEAAgE;IAChE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB,kDAAkD;IAClD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAE9B,mDAAmD;IACnD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAqFD;;;;;;;;;;GAUG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAE9C;;;;OAIG;gBACS,MAAM,GAAE,OAAO,CAAC,oBAAoB,CAAM;IAItD;;;;;;;;;;;;;;;;;;;OAmBG;IACH,gBAAgB,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,uBAAuB,GAAG,UAAU;IAuBhF;;;;;;;;;;;;;;;;;;OAkBG;IACH,gBAAgB,CAAC,OAAO,EAAE,UAAU,GAAG,QAAQ;IAc/C;;;;;;;;;;;;;;;;OAgBG;IACH,mBAAmB,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU;IAMvD;;;;;;;;;OASG;IACH,OAAO,CAAC,iBAAiB;IAWzB;;;;;;;;;;;;;;;;OAgBG;IACH,oBAAoB,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,GAAG,MAAM;IAUzE;;;;;;;;;;;;;;;;;;;OAmBG;IACH,qBAAqB,CACnB,OAAO,EAAE,UAAU,EACnB,WAAW,EAAE,SAAS,UAAU,EAAE,EAClC,MAAM,CAAC,EAAE,uBAAuB,GAC/B;QAAE,UAAU,EAAE,UAAU,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IA6BtD;;;;OAIG;IACH,SAAS,IAAI,oBAAoB;CAGlC;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,uBAAuB,kBAAyB,CAAC"}
@@ -51,7 +51,6 @@ var REGION_DEPTH_OFFSETS = {
51
51
  * Provides bidirectional mapping between the 2D UI overlay coordinate system
52
52
  * and the 3D physics world coordinate system.
53
53
  *
54
- * @public
55
54
  * @category Physics System
56
55
  * @korean 좌표변환기
57
56
  */
@@ -1 +1 @@
1
- {"version":3,"file":"CoordinateMapper.js","names":[],"sources":["../../../src/systems/physics/CoordinateMapper.ts"],"sourcesContent":["/**\n * Coordinate Mapper for 2D→3D conversion in Black Trigram.\n * \n * **Korean**: 좌표 변환기 (2D → 3D)\n * \n * Maps 2D pixel coordinates from the vital points data (UI overlay) to 3D world\n * coordinates for physics-based collision detection. This allows the UI-based\n * vital point system to work seamlessly with Three.js 3D collision detection.\n * \n * ## Coordinate Systems\n * \n * - **2D Pixel Space**: Origin (0,0) at top-left, used by vital points UI overlay\n * - **3D World Space**: Origin (0,0,0) at character center, used by collision detection\n * \n * ## Character Model Assumptions\n * \n * - Character height: 1.75m (average adult)\n * - Character width: 0.5m (shoulder width)\n * - Character depth: 0.3m (chest to back)\n * - Standing position: feet at y=0, head at y=1.75\n * \n * ## Mapping Strategy\n * \n * The mapper uses anatomical regions to determine the Z-depth (front-to-back position)\n * of vital points, ensuring physically accurate 3D positions for collision detection.\n * \n * @module systems/physics/CoordinateMapper\n * @category Physics System\n * @korean 좌표변환\n */\n\nimport type { Position } from \"@/types/common\";\nimport type { Position3D, AnatomicalRegionPhysics } from \"@/types/physics\";\nimport type { VitalPoint } from \"../vitalpoint/types\";\n\n/**\n * Configuration for the character model coordinate mapping.\n * \n * **Korean**: 캐릭터 모델 설정\n */\nexport interface CharacterModelConfig {\n /** Character height in meters (default: 1.75m) */\n readonly height: number;\n \n /** Character shoulder width in meters (default: 0.5m) */\n readonly width: number;\n \n /** Character depth (chest to back) in meters (default: 0.3m) */\n readonly depth: number;\n \n /** UI overlay width in pixels (default: 200px) */\n readonly overlayWidth: number;\n \n /** UI overlay height in pixels (default: 300px) */\n readonly overlayHeight: number;\n}\n\n/**\n * Average adult standing height used for physics mapping (meters).\n * \n * This value is based on common anthropometric data and provides a\n * reasonable default for a neutral, unarmed character in Black Trigram.\n */\nconst AVERAGE_ADULT_HEIGHT_M = 1.75; // 175cm average adult height\n\n/**\n * Average shoulder width used for frontal collision and UI mapping (meters).\n * \n * This approximates the biacromial (shoulder-to-shoulder) breadth for an\n * adult, which is sufficient for our hitbox and overlay alignment needs.\n */\nconst AVERAGE_SHOULDER_WIDTH_M = 0.5; // 50cm shoulder width\n\n/**\n * Average torso depth (chest to back) used for front/back hit placement (meters).\n */\nconst AVERAGE_TORSO_DEPTH_M = 0.3; // 30cm chest depth\n\n/**\n * Default UI overlay width in pixels.\n * \n * This matches the designed vital-point sprite asset width, ensuring that\n * pixel coordinates from the overlay map consistently to the 3D character.\n */\nconst DEFAULT_OVERLAY_WIDTH_PX = 200; // Standard UI overlay width\n\n/**\n * Default UI overlay height in pixels.\n * \n * This matches the designed vital-point sprite asset height, keeping the\n * 2D→3D mapping resolution-independent but asset-consistent.\n */\nconst DEFAULT_OVERLAY_HEIGHT_PX = 300; // Standard UI overlay height\n\n/**\n * Default character model configuration based on average adult proportions.\n */\nconst DEFAULT_CHARACTER_CONFIG: CharacterModelConfig = {\n height: AVERAGE_ADULT_HEIGHT_M,\n width: AVERAGE_SHOULDER_WIDTH_M,\n depth: AVERAGE_TORSO_DEPTH_M,\n overlayWidth: DEFAULT_OVERLAY_WIDTH_PX,\n overlayHeight: DEFAULT_OVERLAY_HEIGHT_PX,\n};\n\n/**\n * Z-depth (front-to-back) offsets for different anatomical regions.\n * \n * Units are **meters in model space**, measured along the character's local Z axis,\n * and are applied relative to the character's center plane (Z = 0) and the\n * configured {@link CharacterModelConfig.depth}. With the default depth of\n * `0.3m`, an offset of `0.05` corresponds to ≈5 cm of forward displacement.\n *\n * These values were chosen as simple, stable approximations based on average\n * adult proportions and validated visually against the default rig:\n *\n * - `head: 0.05` → head center sits slightly in front of the torso plane\n * (≈1/6 of torso depth) to match typical forward head posture.\n * - `neck: 0.02` → neck base is close to the torso plane but not perfectly\n * centered, acknowledging slight anterior offset of the trachea/sternum.\n * - `torso: 0.0` → torso vital points lie on the reference center plane that\n * approximates the mid‑chest / spine midpoint.\n * - `arms: 0.05` → relaxed arms hang slightly in front of the torso plane,\n * using the same forward offset as the head for consistency.\n * - `legs: 0.0` → leg targets (front of thighs/shins) are modeled on the\n * center plane; depth variation is instead captured by vertical placement.\n *\n * If you change {@link CharacterModelConfig.depth}, you may keep these absolute\n * meter values (for physical fidelity) or re‑express them as fractions of the\n * new depth, but they should continue to represent small (≈0–5 cm) anatomical\n * offsets from the torso midline.\n */\nconst REGION_DEPTH_OFFSETS: Record<AnatomicalRegionPhysics, number> = {\n head: 0.05, // ≈5 cm forward from torso mid-plane to match cranial alignment\n neck: 0.02, // ≈2 cm forward; neck base is near, but not exactly on, center\n torso: 0.0, // Torso reference plane (mid‑chest / spine midpoint)\n arms: 0.05, // ≈5 cm forward; relaxed arms rest slightly in front of torso\n legs: 0.0, // Legs aligned to torso center plane; front/back handled elsewhere\n};\n\n/**\n * Coordinate Mapper for converting 2D pixel coordinates to 3D world coordinates.\n * \n * **Korean**: 좌표 변환기\n * \n * Provides bidirectional mapping between the 2D UI overlay coordinate system\n * and the 3D physics world coordinate system.\n * \n * @public\n * @category Physics System\n * @korean 좌표변환기\n */\nexport class CoordinateMapper {\n private readonly config: CharacterModelConfig;\n \n /**\n * Creates a new CoordinateMapper with optional custom configuration.\n * \n * @param config - Optional character model configuration\n */\n constructor(config: Partial<CharacterModelConfig> = {}) {\n this.config = { ...DEFAULT_CHARACTER_CONFIG, ...config };\n }\n \n /**\n * Converts a 2D pixel position to a 3D world position.\n * \n * **Korean**: 2D → 3D 변환\n * \n * Maps UI overlay pixel coordinates to 3D world space coordinates suitable\n * for physics collision detection.\n * \n * @param pixel2D - 2D pixel position (origin top-left)\n * @param region - Anatomical region for Z-depth calculation\n * @returns 3D world position in meters (origin at character center)\n * \n * @example\n * ```typescript\n * const mapper = new CoordinateMapper();\n * const vitalPoint = { position: { x: 100, y: 50 } };\n * const worldPos = mapper.pixel2DToWorld3D(vitalPoint.position, \"head\");\n * // worldPos: { x: 0, y: 1.45, z: 0.05 }\n * ```\n */\n pixel2DToWorld3D(pixel2D: Position, region: AnatomicalRegionPhysics): Position3D {\n // Normalize pixel coordinates to 0-1 range\n const normalizedX = pixel2D.x / this.config.overlayWidth;\n const normalizedY = pixel2D.y / this.config.overlayHeight;\n \n // Convert to world coordinates\n // X: Map from pixel space (0 = left, overlayWidth = right) to world space (-width/2 to +width/2)\n const worldX = (normalizedX - 0.5) * this.config.width;\n \n // Y: Map from pixel space (0 = top, overlayHeight = bottom) to world space (height to 0)\n // Invert Y-axis: pixel 0 = top = character head, pixel overlayHeight = bottom = character feet\n const worldY = (1 - normalizedY) * this.config.height;\n \n // Z: Use anatomical region to determine depth offset\n const worldZ = REGION_DEPTH_OFFSETS[region];\n \n return {\n x: worldX,\n y: worldY,\n z: worldZ,\n };\n }\n \n /**\n * Converts a 3D world position to a 2D pixel position.\n * \n * **Korean**: 3D → 2D 변환\n * \n * Maps 3D world space coordinates back to UI overlay pixel coordinates.\n * Useful for debugging and visual feedback.\n * \n * @param world3D - 3D world position in meters\n * @returns 2D pixel position (origin top-left)\n * \n * @example\n * ```typescript\n * const mapper = new CoordinateMapper();\n * const worldPos = { x: 0, y: 1.45, z: 0.05 };\n * const pixelPos = mapper.world3DToPixel2D(worldPos);\n * // pixelPos: { x: 100, y: 50 }\n * ```\n */\n world3DToPixel2D(world3D: Position3D): Position {\n // Convert world X to normalized 0-1 range\n const normalizedX = (world3D.x / this.config.width) + 0.5;\n \n // Convert world Y to normalized 0-1 range (inverted)\n const normalizedY = 1 - (world3D.y / this.config.height);\n \n // Convert to pixel coordinates\n return {\n x: Math.round(normalizedX * this.config.overlayWidth),\n y: Math.round(normalizedY * this.config.overlayHeight),\n };\n }\n \n /**\n * Converts a vital point's 2D position to 3D world position.\n * \n * **Korean**: 급소 위치 변환\n * \n * Convenience method that extracts position and region from a VitalPoint object.\n * \n * @param vitalPoint - Vital point with 2D position\n * @returns 3D world position\n * \n * @example\n * ```typescript\n * const mapper = new CoordinateMapper();\n * const temple = VITAL_POINTS_DATA.find(vp => vp.id === \"head_temple\");\n * const worldPos = mapper.vitalPointToWorld3D(temple);\n * ```\n */\n vitalPointToWorld3D(vitalPoint: VitalPoint): Position3D {\n // Infer region from vital point ID prefix\n const region = this.inferRegionFromId(vitalPoint.id);\n return this.pixel2DToWorld3D(vitalPoint.position, region);\n }\n \n /**\n * Infers the anatomical region from a vital point ID.\n * \n * **Korean**: 급소 ID에서 영역 추론\n * \n * @param vitalPointId - Vital point ID (e.g., \"head_temple\", \"torso_solar_plexus\")\n * @returns Anatomical region\n * \n * @private\n */\n private inferRegionFromId(vitalPointId: string): AnatomicalRegionPhysics {\n if (vitalPointId.startsWith(\"head_\")) return \"head\";\n if (vitalPointId.startsWith(\"neck_\")) return \"neck\";\n if (vitalPointId.startsWith(\"torso_\")) return \"torso\";\n if (vitalPointId.startsWith(\"arm_\")) return \"arms\";\n if (vitalPointId.startsWith(\"leg_\")) return \"legs\";\n \n // Default to torso if no clear region prefix\n return \"torso\";\n }\n \n /**\n * Calculates the distance between a 3D point and a vital point's 3D position.\n * \n * **Korean**: 거리 계산\n * \n * @param point3D - Point in 3D world space\n * @param vitalPoint - Vital point to measure distance to\n * @returns Distance in meters\n * \n * @example\n * ```typescript\n * const mapper = new CoordinateMapper();\n * const attackPoint = { x: 0, y: 1.5, z: 0.1 };\n * const temple = VITAL_POINTS_DATA.find(vp => vp.id === \"head_temple\");\n * const distance = mapper.distanceToVitalPoint(attackPoint, temple);\n * ```\n */\n distanceToVitalPoint(point3D: Position3D, vitalPoint: VitalPoint): number {\n const vitalPoint3D = this.vitalPointToWorld3D(vitalPoint);\n \n const dx = point3D.x - vitalPoint3D.x;\n const dy = point3D.y - vitalPoint3D.y;\n const dz = point3D.z - vitalPoint3D.z;\n \n return Math.sqrt(dx * dx + dy * dy + dz * dz);\n }\n \n /**\n * Finds the closest vital point to a 3D position within a given region.\n * \n * **Korean**: 가장 가까운 급소 찾기\n * \n * @param point3D - Point in 3D world space\n * @param vitalPoints - Array of vital points to search\n * @param region - Optional region filter\n * @returns Closest vital point and distance, or null if none found\n * \n * @example\n * ```typescript\n * const mapper = new CoordinateMapper();\n * const hitPoint = { x: 0, y: 1.7, z: 0.05 };\n * const result = mapper.findClosestVitalPoint(hitPoint, VITAL_POINTS_DATA, \"head\");\n * if (result) {\n * console.log(`Hit ${result.vitalPoint.names.english} at ${result.distance}m`);\n * }\n * ```\n */\n findClosestVitalPoint(\n point3D: Position3D,\n vitalPoints: readonly VitalPoint[],\n region?: AnatomicalRegionPhysics\n ): { vitalPoint: VitalPoint; distance: number } | null {\n let closestVitalPoint: VitalPoint | null = null;\n let closestDistance = Infinity;\n \n for (const vitalPoint of vitalPoints) {\n // Filter by region if specified\n if (region) {\n const vpRegion = this.inferRegionFromId(vitalPoint.id);\n if (vpRegion !== region) continue;\n }\n \n const distance = this.distanceToVitalPoint(point3D, vitalPoint);\n \n if (distance < closestDistance) {\n closestDistance = distance;\n closestVitalPoint = vitalPoint;\n }\n }\n \n if (closestVitalPoint === null) {\n return null;\n }\n \n return {\n vitalPoint: closestVitalPoint,\n distance: closestDistance,\n };\n }\n \n /**\n * Gets the current character model configuration.\n * \n * @returns Current configuration\n */\n getConfig(): CharacterModelConfig {\n return { ...this.config };\n }\n}\n\n/**\n * Default singleton instance for convenient access.\n * \n * **Korean**: 기본 인스턴스\n * \n * @example\n * ```typescript\n * import { defaultCoordinateMapper } from './CoordinateMapper';\n * \n * const worldPos = defaultCoordinateMapper.pixel2DToWorld3D({ x: 100, y: 50 }, \"head\");\n * ```\n */\nexport const defaultCoordinateMapper = new CoordinateMapper();\n"],"mappings":";;;;AAiGA,IAAM,2BAAiD;CACrD,QAAQ;CACR,OAAO;CACP,OAAO;CACP,cAAc;CACd,eAAe;CAChB;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BD,IAAM,uBAAgE;CACpE,MAAM;CACN,MAAM;CACN,OAAO;CACP,MAAM;CACN,MAAM;CACP;;;;;;;;;;;;;AAcD,IAAa,mBAAb,MAA8B;CAC5B;;;;;;CAOA,YAAY,SAAwC,EAAE,EAAE;EACtD,KAAK,SAAS;GAAE,GAAG;GAA0B,GAAG;GAAQ;;;;;;;;;;;;;;;;;;;;;;CAuB1D,iBAAiB,SAAmB,QAA6C;EAE/E,MAAM,cAAc,QAAQ,IAAI,KAAK,OAAO;EAC5C,MAAM,cAAc,QAAQ,IAAI,KAAK,OAAO;EAa5C,OAAO;GACL,IAVc,cAAc,MAAO,KAAK,OAAO;GAW/C,IAPc,IAAI,eAAe,KAAK,OAAO;GAQ7C,GALa,qBAAqB;GAMnC;;;;;;;;;;;;;;;;;;;;;CAsBH,iBAAiB,SAA+B;EAE9C,MAAM,cAAe,QAAQ,IAAI,KAAK,OAAO,QAAS;EAGtD,MAAM,cAAc,IAAK,QAAQ,IAAI,KAAK,OAAO;EAGjD,OAAO;GACL,GAAG,KAAK,MAAM,cAAc,KAAK,OAAO,aAAa;GACrD,GAAG,KAAK,MAAM,cAAc,KAAK,OAAO,cAAc;GACvD;;;;;;;;;;;;;;;;;;;CAoBH,oBAAoB,YAAoC;EAEtD,MAAM,SAAS,KAAK,kBAAkB,WAAW,GAAG;EACpD,OAAO,KAAK,iBAAiB,WAAW,UAAU,OAAO;;;;;;;;;;;;CAa3D,kBAA0B,cAA+C;EACvE,IAAI,aAAa,WAAW,QAAQ,EAAE,OAAO;EAC7C,IAAI,aAAa,WAAW,QAAQ,EAAE,OAAO;EAC7C,IAAI,aAAa,WAAW,SAAS,EAAE,OAAO;EAC9C,IAAI,aAAa,WAAW,OAAO,EAAE,OAAO;EAC5C,IAAI,aAAa,WAAW,OAAO,EAAE,OAAO;EAG5C,OAAO;;;;;;;;;;;;;;;;;;;CAoBT,qBAAqB,SAAqB,YAAgC;EACxE,MAAM,eAAe,KAAK,oBAAoB,WAAW;EAEzD,MAAM,KAAK,QAAQ,IAAI,aAAa;EACpC,MAAM,KAAK,QAAQ,IAAI,aAAa;EACpC,MAAM,KAAK,QAAQ,IAAI,aAAa;EAEpC,OAAO,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;CAuB/C,sBACE,SACA,aACA,QACqD;EACrD,IAAI,oBAAuC;EAC3C,IAAI,kBAAkB;EAEtB,KAAK,MAAM,cAAc,aAAa;GAEpC,IAAI;QACe,KAAK,kBAAkB,WAAW,GAC/C,KAAa,QAAQ;;GAG3B,MAAM,WAAW,KAAK,qBAAqB,SAAS,WAAW;GAE/D,IAAI,WAAW,iBAAiB;IAC9B,kBAAkB;IAClB,oBAAoB;;;EAIxB,IAAI,sBAAsB,MACxB,OAAO;EAGT,OAAO;GACL,YAAY;GACZ,UAAU;GACX;;;;;;;CAQH,YAAkC;EAChC,OAAO,EAAE,GAAG,KAAK,QAAQ;;;AAgBU,IAAI,kBAAkB"}
1
+ {"version":3,"file":"CoordinateMapper.js","names":[],"sources":["../../../src/systems/physics/CoordinateMapper.ts"],"sourcesContent":["/**\n * Coordinate Mapper for 2D→3D conversion in Black Trigram.\n * \n * **Korean**: 좌표 변환기 (2D → 3D)\n * \n * Maps 2D pixel coordinates from the vital points data (UI overlay) to 3D world\n * coordinates for physics-based collision detection. This allows the UI-based\n * vital point system to work seamlessly with Three.js 3D collision detection.\n * \n * ## Coordinate Systems\n * \n * - **2D Pixel Space**: Origin (0,0) at top-left, used by vital points UI overlay\n * - **3D World Space**: Origin (0,0,0) at character center, used by collision detection\n * \n * ## Character Model Assumptions\n * \n * - Character height: 1.75m (average adult)\n * - Character width: 0.5m (shoulder width)\n * - Character depth: 0.3m (chest to back)\n * - Standing position: feet at y=0, head at y=1.75\n * \n * ## Mapping Strategy\n * \n * The mapper uses anatomical regions to determine the Z-depth (front-to-back position)\n * of vital points, ensuring physically accurate 3D positions for collision detection.\n * \n * @module systems/physics/CoordinateMapper\n * @category Physics System\n * @korean 좌표변환\n */\n\nimport type { Position } from \"@/types/common\";\nimport type { Position3D, AnatomicalRegionPhysics } from \"@/types/physics\";\nimport type { VitalPoint } from \"../vitalpoint/types\";\n\n/**\n * Configuration for the character model coordinate mapping.\n * \n * **Korean**: 캐릭터 모델 설정\n */\nexport interface CharacterModelConfig {\n /** Character height in meters (default: 1.75m) */\n readonly height: number;\n \n /** Character shoulder width in meters (default: 0.5m) */\n readonly width: number;\n \n /** Character depth (chest to back) in meters (default: 0.3m) */\n readonly depth: number;\n \n /** UI overlay width in pixels (default: 200px) */\n readonly overlayWidth: number;\n \n /** UI overlay height in pixels (default: 300px) */\n readonly overlayHeight: number;\n}\n\n/**\n * Average adult standing height used for physics mapping (meters).\n * \n * This value is based on common anthropometric data and provides a\n * reasonable default for a neutral, unarmed character in Black Trigram.\n */\nconst AVERAGE_ADULT_HEIGHT_M = 1.75; // 175cm average adult height\n\n/**\n * Average shoulder width used for frontal collision and UI mapping (meters).\n * \n * This approximates the biacromial (shoulder-to-shoulder) breadth for an\n * adult, which is sufficient for our hitbox and overlay alignment needs.\n */\nconst AVERAGE_SHOULDER_WIDTH_M = 0.5; // 50cm shoulder width\n\n/**\n * Average torso depth (chest to back) used for front/back hit placement (meters).\n */\nconst AVERAGE_TORSO_DEPTH_M = 0.3; // 30cm chest depth\n\n/**\n * Default UI overlay width in pixels.\n * \n * This matches the designed vital-point sprite asset width, ensuring that\n * pixel coordinates from the overlay map consistently to the 3D character.\n */\nconst DEFAULT_OVERLAY_WIDTH_PX = 200; // Standard UI overlay width\n\n/**\n * Default UI overlay height in pixels.\n * \n * This matches the designed vital-point sprite asset height, keeping the\n * 2D→3D mapping resolution-independent but asset-consistent.\n */\nconst DEFAULT_OVERLAY_HEIGHT_PX = 300; // Standard UI overlay height\n\n/**\n * Default character model configuration based on average adult proportions.\n */\nconst DEFAULT_CHARACTER_CONFIG: CharacterModelConfig = {\n height: AVERAGE_ADULT_HEIGHT_M,\n width: AVERAGE_SHOULDER_WIDTH_M,\n depth: AVERAGE_TORSO_DEPTH_M,\n overlayWidth: DEFAULT_OVERLAY_WIDTH_PX,\n overlayHeight: DEFAULT_OVERLAY_HEIGHT_PX,\n};\n\n/**\n * Z-depth (front-to-back) offsets for different anatomical regions.\n * \n * Units are **meters in model space**, measured along the character's local Z axis,\n * and are applied relative to the character's center plane (Z = 0) and the\n * configured {@link CharacterModelConfig.depth}. With the default depth of\n * `0.3m`, an offset of `0.05` corresponds to ≈5 cm of forward displacement.\n *\n * These values were chosen as simple, stable approximations based on average\n * adult proportions and validated visually against the default rig:\n *\n * - `head: 0.05` → head center sits slightly in front of the torso plane\n * (≈1/6 of torso depth) to match typical forward head posture.\n * - `neck: 0.02` → neck base is close to the torso plane but not perfectly\n * centered, acknowledging slight anterior offset of the trachea/sternum.\n * - `torso: 0.0` → torso vital points lie on the reference center plane that\n * approximates the mid‑chest / spine midpoint.\n * - `arms: 0.05` → relaxed arms hang slightly in front of the torso plane,\n * using the same forward offset as the head for consistency.\n * - `legs: 0.0` → leg targets (front of thighs/shins) are modeled on the\n * center plane; depth variation is instead captured by vertical placement.\n *\n * If you change {@link CharacterModelConfig.depth}, you may keep these absolute\n * meter values (for physical fidelity) or re‑express them as fractions of the\n * new depth, but they should continue to represent small (≈0–5 cm) anatomical\n * offsets from the torso midline.\n */\nconst REGION_DEPTH_OFFSETS: Record<AnatomicalRegionPhysics, number> = {\n head: 0.05, // ≈5 cm forward from torso mid-plane to match cranial alignment\n neck: 0.02, // ≈2 cm forward; neck base is near, but not exactly on, center\n torso: 0.0, // Torso reference plane (mid‑chest / spine midpoint)\n arms: 0.05, // ≈5 cm forward; relaxed arms rest slightly in front of torso\n legs: 0.0, // Legs aligned to torso center plane; front/back handled elsewhere\n};\n\n/**\n * Coordinate Mapper for converting 2D pixel coordinates to 3D world coordinates.\n * \n * **Korean**: 좌표 변환기\n * \n * Provides bidirectional mapping between the 2D UI overlay coordinate system\n * and the 3D physics world coordinate system.\n * \n * @category Physics System\n * @korean 좌표변환기\n */\nexport class CoordinateMapper {\n private readonly config: CharacterModelConfig;\n \n /**\n * Creates a new CoordinateMapper with optional custom configuration.\n * \n * @param config - Optional character model configuration\n */\n constructor(config: Partial<CharacterModelConfig> = {}) {\n this.config = { ...DEFAULT_CHARACTER_CONFIG, ...config };\n }\n \n /**\n * Converts a 2D pixel position to a 3D world position.\n * \n * **Korean**: 2D → 3D 변환\n * \n * Maps UI overlay pixel coordinates to 3D world space coordinates suitable\n * for physics collision detection.\n * \n * @param pixel2D - 2D pixel position (origin top-left)\n * @param region - Anatomical region for Z-depth calculation\n * @returns 3D world position in meters (origin at character center)\n * \n * @example\n * ```typescript\n * const mapper = new CoordinateMapper();\n * const vitalPoint = { position: { x: 100, y: 50 } };\n * const worldPos = mapper.pixel2DToWorld3D(vitalPoint.position, \"head\");\n * // worldPos: { x: 0, y: 1.45, z: 0.05 }\n * ```\n */\n pixel2DToWorld3D(pixel2D: Position, region: AnatomicalRegionPhysics): Position3D {\n // Normalize pixel coordinates to 0-1 range\n const normalizedX = pixel2D.x / this.config.overlayWidth;\n const normalizedY = pixel2D.y / this.config.overlayHeight;\n \n // Convert to world coordinates\n // X: Map from pixel space (0 = left, overlayWidth = right) to world space (-width/2 to +width/2)\n const worldX = (normalizedX - 0.5) * this.config.width;\n \n // Y: Map from pixel space (0 = top, overlayHeight = bottom) to world space (height to 0)\n // Invert Y-axis: pixel 0 = top = character head, pixel overlayHeight = bottom = character feet\n const worldY = (1 - normalizedY) * this.config.height;\n \n // Z: Use anatomical region to determine depth offset\n const worldZ = REGION_DEPTH_OFFSETS[region];\n \n return {\n x: worldX,\n y: worldY,\n z: worldZ,\n };\n }\n \n /**\n * Converts a 3D world position to a 2D pixel position.\n * \n * **Korean**: 3D → 2D 변환\n * \n * Maps 3D world space coordinates back to UI overlay pixel coordinates.\n * Useful for debugging and visual feedback.\n * \n * @param world3D - 3D world position in meters\n * @returns 2D pixel position (origin top-left)\n * \n * @example\n * ```typescript\n * const mapper = new CoordinateMapper();\n * const worldPos = { x: 0, y: 1.45, z: 0.05 };\n * const pixelPos = mapper.world3DToPixel2D(worldPos);\n * // pixelPos: { x: 100, y: 50 }\n * ```\n */\n world3DToPixel2D(world3D: Position3D): Position {\n // Convert world X to normalized 0-1 range\n const normalizedX = (world3D.x / this.config.width) + 0.5;\n \n // Convert world Y to normalized 0-1 range (inverted)\n const normalizedY = 1 - (world3D.y / this.config.height);\n \n // Convert to pixel coordinates\n return {\n x: Math.round(normalizedX * this.config.overlayWidth),\n y: Math.round(normalizedY * this.config.overlayHeight),\n };\n }\n \n /**\n * Converts a vital point's 2D position to 3D world position.\n * \n * **Korean**: 급소 위치 변환\n * \n * Convenience method that extracts position and region from a VitalPoint object.\n * \n * @param vitalPoint - Vital point with 2D position\n * @returns 3D world position\n * \n * @example\n * ```typescript\n * const mapper = new CoordinateMapper();\n * const temple = VITAL_POINTS_DATA.find(vp => vp.id === \"head_temple\");\n * const worldPos = mapper.vitalPointToWorld3D(temple);\n * ```\n */\n vitalPointToWorld3D(vitalPoint: VitalPoint): Position3D {\n // Infer region from vital point ID prefix\n const region = this.inferRegionFromId(vitalPoint.id);\n return this.pixel2DToWorld3D(vitalPoint.position, region);\n }\n \n /**\n * Infers the anatomical region from a vital point ID.\n * \n * **Korean**: 급소 ID에서 영역 추론\n * \n * @param vitalPointId - Vital point ID (e.g., \"head_temple\", \"torso_solar_plexus\")\n * @returns Anatomical region\n * \n * @private\n */\n private inferRegionFromId(vitalPointId: string): AnatomicalRegionPhysics {\n if (vitalPointId.startsWith(\"head_\")) return \"head\";\n if (vitalPointId.startsWith(\"neck_\")) return \"neck\";\n if (vitalPointId.startsWith(\"torso_\")) return \"torso\";\n if (vitalPointId.startsWith(\"arm_\")) return \"arms\";\n if (vitalPointId.startsWith(\"leg_\")) return \"legs\";\n \n // Default to torso if no clear region prefix\n return \"torso\";\n }\n \n /**\n * Calculates the distance between a 3D point and a vital point's 3D position.\n * \n * **Korean**: 거리 계산\n * \n * @param point3D - Point in 3D world space\n * @param vitalPoint - Vital point to measure distance to\n * @returns Distance in meters\n * \n * @example\n * ```typescript\n * const mapper = new CoordinateMapper();\n * const attackPoint = { x: 0, y: 1.5, z: 0.1 };\n * const temple = VITAL_POINTS_DATA.find(vp => vp.id === \"head_temple\");\n * const distance = mapper.distanceToVitalPoint(attackPoint, temple);\n * ```\n */\n distanceToVitalPoint(point3D: Position3D, vitalPoint: VitalPoint): number {\n const vitalPoint3D = this.vitalPointToWorld3D(vitalPoint);\n \n const dx = point3D.x - vitalPoint3D.x;\n const dy = point3D.y - vitalPoint3D.y;\n const dz = point3D.z - vitalPoint3D.z;\n \n return Math.sqrt(dx * dx + dy * dy + dz * dz);\n }\n \n /**\n * Finds the closest vital point to a 3D position within a given region.\n * \n * **Korean**: 가장 가까운 급소 찾기\n * \n * @param point3D - Point in 3D world space\n * @param vitalPoints - Array of vital points to search\n * @param region - Optional region filter\n * @returns Closest vital point and distance, or null if none found\n * \n * @example\n * ```typescript\n * const mapper = new CoordinateMapper();\n * const hitPoint = { x: 0, y: 1.7, z: 0.05 };\n * const result = mapper.findClosestVitalPoint(hitPoint, VITAL_POINTS_DATA, \"head\");\n * if (result) {\n * console.log(`Hit ${result.vitalPoint.names.english} at ${result.distance}m`);\n * }\n * ```\n */\n findClosestVitalPoint(\n point3D: Position3D,\n vitalPoints: readonly VitalPoint[],\n region?: AnatomicalRegionPhysics\n ): { vitalPoint: VitalPoint; distance: number } | null {\n let closestVitalPoint: VitalPoint | null = null;\n let closestDistance = Infinity;\n \n for (const vitalPoint of vitalPoints) {\n // Filter by region if specified\n if (region) {\n const vpRegion = this.inferRegionFromId(vitalPoint.id);\n if (vpRegion !== region) continue;\n }\n \n const distance = this.distanceToVitalPoint(point3D, vitalPoint);\n \n if (distance < closestDistance) {\n closestDistance = distance;\n closestVitalPoint = vitalPoint;\n }\n }\n \n if (closestVitalPoint === null) {\n return null;\n }\n \n return {\n vitalPoint: closestVitalPoint,\n distance: closestDistance,\n };\n }\n \n /**\n * Gets the current character model configuration.\n * \n * @returns Current configuration\n */\n getConfig(): CharacterModelConfig {\n return { ...this.config };\n }\n}\n\n/**\n * Default singleton instance for convenient access.\n * \n * **Korean**: 기본 인스턴스\n * \n * @example\n * ```typescript\n * import { defaultCoordinateMapper } from './CoordinateMapper';\n * \n * const worldPos = defaultCoordinateMapper.pixel2DToWorld3D({ x: 100, y: 50 }, \"head\");\n * ```\n */\nexport const defaultCoordinateMapper = new CoordinateMapper();\n"],"mappings":";;;;AAiGA,IAAM,2BAAiD;CACrD,QAAQ;CACR,OAAO;CACP,OAAO;CACP,cAAc;CACd,eAAe;CAChB;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BD,IAAM,uBAAgE;CACpE,MAAM;CACN,MAAM;CACN,OAAO;CACP,MAAM;CACN,MAAM;CACP;;;;;;;;;;;;AAaD,IAAa,mBAAb,MAA8B;CAC5B;;;;;;CAOA,YAAY,SAAwC,EAAE,EAAE;EACtD,KAAK,SAAS;GAAE,GAAG;GAA0B,GAAG;GAAQ;;;;;;;;;;;;;;;;;;;;;;CAuB1D,iBAAiB,SAAmB,QAA6C;EAE/E,MAAM,cAAc,QAAQ,IAAI,KAAK,OAAO;EAC5C,MAAM,cAAc,QAAQ,IAAI,KAAK,OAAO;EAa5C,OAAO;GACL,IAVc,cAAc,MAAO,KAAK,OAAO;GAW/C,IAPc,IAAI,eAAe,KAAK,OAAO;GAQ7C,GALa,qBAAqB;GAMnC;;;;;;;;;;;;;;;;;;;;;CAsBH,iBAAiB,SAA+B;EAE9C,MAAM,cAAe,QAAQ,IAAI,KAAK,OAAO,QAAS;EAGtD,MAAM,cAAc,IAAK,QAAQ,IAAI,KAAK,OAAO;EAGjD,OAAO;GACL,GAAG,KAAK,MAAM,cAAc,KAAK,OAAO,aAAa;GACrD,GAAG,KAAK,MAAM,cAAc,KAAK,OAAO,cAAc;GACvD;;;;;;;;;;;;;;;;;;;CAoBH,oBAAoB,YAAoC;EAEtD,MAAM,SAAS,KAAK,kBAAkB,WAAW,GAAG;EACpD,OAAO,KAAK,iBAAiB,WAAW,UAAU,OAAO;;;;;;;;;;;;CAa3D,kBAA0B,cAA+C;EACvE,IAAI,aAAa,WAAW,QAAQ,EAAE,OAAO;EAC7C,IAAI,aAAa,WAAW,QAAQ,EAAE,OAAO;EAC7C,IAAI,aAAa,WAAW,SAAS,EAAE,OAAO;EAC9C,IAAI,aAAa,WAAW,OAAO,EAAE,OAAO;EAC5C,IAAI,aAAa,WAAW,OAAO,EAAE,OAAO;EAG5C,OAAO;;;;;;;;;;;;;;;;;;;CAoBT,qBAAqB,SAAqB,YAAgC;EACxE,MAAM,eAAe,KAAK,oBAAoB,WAAW;EAEzD,MAAM,KAAK,QAAQ,IAAI,aAAa;EACpC,MAAM,KAAK,QAAQ,IAAI,aAAa;EACpC,MAAM,KAAK,QAAQ,IAAI,aAAa;EAEpC,OAAO,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;CAuB/C,sBACE,SACA,aACA,QACqD;EACrD,IAAI,oBAAuC;EAC3C,IAAI,kBAAkB;EAEtB,KAAK,MAAM,cAAc,aAAa;GAEpC,IAAI;QACe,KAAK,kBAAkB,WAAW,GAC/C,KAAa,QAAQ;;GAG3B,MAAM,WAAW,KAAK,qBAAqB,SAAS,WAAW;GAE/D,IAAI,WAAW,iBAAiB;IAC9B,kBAAkB;IAClB,oBAAoB;;;EAIxB,IAAI,sBAAsB,MACxB,OAAO;EAGT,OAAO;GACL,YAAY;GACZ,UAAU;GACX;;;;;;;CAQH,YAAkC;EAChC,OAAO,EAAE,GAAG,KAAK,QAAQ;;;AAgBU,IAAI,kBAAkB"}
@@ -38,7 +38,6 @@ import { TrigramStance } from '../../types/common';
38
38
  *
39
39
  * **Korean**: 균형 상태 (Balance State)
40
40
  *
41
- * @public
42
41
  * @korean 균형상태
43
42
  */
44
43
  export interface BalanceState {
@@ -52,7 +51,6 @@ export interface BalanceState {
52
51
  *
53
52
  * **Korean**: 밀침 설정 (Knockback Configuration)
54
53
  *
55
- * @public
56
54
  * @korean 밀침설정
57
55
  */
58
56
  export interface KnockbackConfig {
@@ -74,7 +72,6 @@ export interface KnockbackConfig {
74
72
  *
75
73
  * Contains displacement vector, animation timing, and fall determination.
76
74
  *
77
- * @public
78
75
  * @korean 밀침결과
79
76
  */
80
77
  export interface KnockbackResult {
@@ -115,7 +112,6 @@ export interface KnockbackResult {
115
112
  * // recoveryWindow: 1.05s (0.7s * 1.5 for low balance)
116
113
  * ```
117
114
  *
118
- * @public
119
115
  * @korean 밀침물리
120
116
  */
121
117
  export declare class KnockbackPhysics {
@@ -157,7 +153,6 @@ export declare class KnockbackPhysics {
157
153
  * // Result: ~9.6m knockback, shouldFall: true, 3.0s recovery
158
154
  * ```
159
155
  *
160
- * @public
161
156
  * @korean 밀침계산
162
157
  */
163
158
  calculateKnockback(config: KnockbackConfig, attackDamage: number): KnockbackResult;
@@ -289,7 +284,6 @@ export declare class KnockbackPhysics {
289
284
  * // Progress 1.0: At final position
290
285
  * ```
291
286
  *
292
- * @public
293
287
  * @korean 밀침힘적용
294
288
  */
295
289
  applyKnockbackForce(playerPosition: THREE.Vector3, result: KnockbackResult, _deltaTime: number, progress: number): THREE.Vector3;
@@ -302,7 +296,6 @@ export declare class KnockbackPhysics {
302
296
  * @param duration - Total knockback duration
303
297
  * @returns True if still in knockback animation
304
298
  *
305
- * @public
306
299
  * @korean 밀침상태확인
307
300
  */
308
301
  isInKnockback(elapsedTime: number, duration: number): boolean;
@@ -315,7 +308,6 @@ export declare class KnockbackPhysics {
315
308
  * @param recoveryWindow - Total recovery window duration
316
309
  * @returns True if in vulnerable recovery state
317
310
  *
318
- * @public
319
311
  * @korean 회복대기확인
320
312
  */
321
313
  isInRecoveryWindow(elapsedTime: number, recoveryWindow: number): boolean;
@@ -327,7 +319,6 @@ export declare class KnockbackPhysics {
327
319
  * @param shouldFall - Whether knockback causes fall
328
320
  * @returns Korean and English state names
329
321
  *
330
- * @public
331
322
  * @korean 밀침상태이름
332
323
  */
333
324
  static getKnockbackStateName(shouldFall: boolean): {
@@ -341,7 +332,6 @@ export declare class KnockbackPhysics {
341
332
  *
342
333
  * @returns Korean and English state names
343
334
  *
344
- * @public
345
335
  * @korean 회복상태이름
346
336
  */
347
337
  getRecoveryStateName(): {
@@ -355,7 +345,6 @@ export declare class KnockbackPhysics {
355
345
  *
356
346
  * @returns Korean and English state names
357
347
  *
358
- * @public
359
348
  * @korean 휘청거림상태이름
360
349
  */
361
350
  getStumblingStateName(): {
@@ -1 +1 @@
1
- {"version":3,"file":"KnockbackPhysics.d.ts","sourceRoot":"","sources":["../../../src/systems/physics/KnockbackPhysics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,oCAAoC;IACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,4CAA4C;IAC5C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,eAAe;IAC9B,iCAAiC;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,+DAA+D;IAC/D,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC;IAClC,8CAA8C;IAC9C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,4BAA4B;IAC5B,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,6BAA6B;IAC7B,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;CACvC;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC;IACrC,iDAAiD;IACjD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,gEAAgE;IAChE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,4CAA4C;IAC5C,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,qBAAa,gBAAgB;IAC3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAwCG;IACH,kBAAkB,CAAC,MAAM,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,GAAG,eAAe;IAgClF;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,wBAAwB;IAOhC;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,OAAO,CAAC,2BAA2B;IAcnC;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,kBAAkB;IAS1B;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,0BAA0B;IAKlC;;;;;;;;;;;;;;;;;;;OAmBG;IACH,OAAO,CAAC,uBAAuB;IAW/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAiCG;IACH,mBAAmB,CACjB,cAAc,EAAE,KAAK,CAAC,OAAO,EAC7B,MAAM,EAAE,eAAe,EACvB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,KAAK,CAAC,OAAO;IAchB;;;;;;;;;;;OAWG;IACH,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI7D;;;;;;;;;;;OAWG;IACH,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO;IAIxE;;;;;;;;;;OAUG;IACH,MAAM,CAAC,qBAAqB,CAAC,UAAU,EAAE,OAAO,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IActF;;;;;;;;;OASG;IACH,oBAAoB,IAAI;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAO3D;;;;;;;;;OASG;IACH,qBAAqB,IAAI;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;CAM7D;AAED,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"KnockbackPhysics.d.ts","sourceRoot":"","sources":["../../../src/systems/physics/KnockbackPhysics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,oCAAoC;IACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,4CAA4C;IAC5C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,iCAAiC;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,+DAA+D;IAC/D,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC;IAClC,8CAA8C;IAC9C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,4BAA4B;IAC5B,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,6BAA6B;IAC7B,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;CACvC;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC;IACrC,iDAAiD;IACjD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,gEAAgE;IAChE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,4CAA4C;IAC5C,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,gBAAgB;IAC3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAuCG;IACH,kBAAkB,CAAC,MAAM,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,GAAG,eAAe;IAgClF;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,wBAAwB;IAOhC;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,OAAO,CAAC,2BAA2B;IAcnC;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,kBAAkB;IAS1B;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,0BAA0B;IAKlC;;;;;;;;;;;;;;;;;;;OAmBG;IACH,OAAO,CAAC,uBAAuB;IAW/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgCG;IACH,mBAAmB,CACjB,cAAc,EAAE,KAAK,CAAC,OAAO,EAC7B,MAAM,EAAE,eAAe,EACvB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,KAAK,CAAC,OAAO;IAchB;;;;;;;;;;OAUG;IACH,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI7D;;;;;;;;;;OAUG;IACH,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO;IAIxE;;;;;;;;;OASG;IACH,MAAM,CAAC,qBAAqB,CAAC,UAAU,EAAE,OAAO,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IActF;;;;;;;;OAQG;IACH,oBAAoB,IAAI;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAO3D;;;;;;;;OAQG;IACH,qBAAqB,IAAI;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;CAM7D;AAED,eAAe,gBAAgB,CAAC"}
@@ -28,7 +28,6 @@ import { TrigramStance } from "../../types/common.js";
28
28
  * // recoveryWindow: 1.05s (0.7s * 1.5 for low balance)
29
29
  * ```
30
30
  *
31
- * @public
32
31
  * @korean 밀침물리
33
32
  */
34
33
  var KnockbackPhysics = class {
@@ -70,7 +69,6 @@ var KnockbackPhysics = class {
70
69
  * // Result: ~9.6m knockback, shouldFall: true, 3.0s recovery
71
70
  * ```
72
71
  *
73
- * @public
74
72
  * @korean 밀침계산
75
73
  */
76
74
  calculateKnockback(config, attackDamage) {
@@ -240,7 +238,6 @@ var KnockbackPhysics = class {
240
238
  * // Progress 1.0: At final position
241
239
  * ```
242
240
  *
243
- * @public
244
241
  * @korean 밀침힘적용
245
242
  */
246
243
  applyKnockbackForce(playerPosition, result, _deltaTime, progress) {
@@ -257,7 +254,6 @@ var KnockbackPhysics = class {
257
254
  * @param duration - Total knockback duration
258
255
  * @returns True if still in knockback animation
259
256
  *
260
- * @public
261
257
  * @korean 밀침상태확인
262
258
  */
263
259
  isInKnockback(elapsedTime, duration) {
@@ -272,7 +268,6 @@ var KnockbackPhysics = class {
272
268
  * @param recoveryWindow - Total recovery window duration
273
269
  * @returns True if in vulnerable recovery state
274
270
  *
275
- * @public
276
271
  * @korean 회복대기확인
277
272
  */
278
273
  isInRecoveryWindow(elapsedTime, recoveryWindow) {
@@ -286,7 +281,6 @@ var KnockbackPhysics = class {
286
281
  * @param shouldFall - Whether knockback causes fall
287
282
  * @returns Korean and English state names
288
283
  *
289
- * @public
290
284
  * @korean 밀침상태이름
291
285
  */
292
286
  static getKnockbackStateName(shouldFall) {
@@ -306,7 +300,6 @@ var KnockbackPhysics = class {
306
300
  *
307
301
  * @returns Korean and English state names
308
302
  *
309
- * @public
310
303
  * @korean 회복상태이름
311
304
  */
312
305
  getRecoveryStateName() {
@@ -322,7 +315,6 @@ var KnockbackPhysics = class {
322
315
  *
323
316
  * @returns Korean and English state names
324
317
  *
325
- * @public
326
318
  * @korean 휘청거림상태이름
327
319
  */
328
320
  getStumblingStateName() {
@@ -1 +1 @@
1
- {"version":3,"file":"KnockbackPhysics.js","names":[],"sources":["../../../src/systems/physics/KnockbackPhysics.ts"],"sourcesContent":["/**\n * Knockback Physics System for realistic force-based displacement.\n * \n * **Korean**: 밀침 물리 시스템 (Knockback Physics System)\n * \n * Implements realistic combat knockback mechanics that calculate force-based\n * displacement when players are hit. The system integrates with BalanceSystem\n * for authentic stumbling/falling reactions.\n * \n * ## Knockback Mechanics\n * \n * Knockback force is determined by:\n * - Attack damage and technique type\n * - Impact angle and direction\n * - Current balance state\n * - Stance resistance modifiers (8 trigram stances)\n * \n * ## Balance Integration\n * \n * - High balance (>70%): Reduced knockback by 30%\n * - Medium balance (40-70%): Normal knockback\n * - Low balance (<40%): Increased knockback by 50%, stumbling\n * - Critical balance (<20%): Guaranteed fall, 2s recovery\n * \n * ## Performance\n * \n * Optimized for 60fps with efficient vector calculations and smooth\n * easing curves for realistic knockback feel.\n * \n * @module systems/physics/KnockbackPhysics\n * @category Physics System\n * @korean 밀침물리\n */\n\nimport * as THREE from 'three';\nimport { TrigramStance } from '@/types/common';\n\n/**\n * Balance state information for knockback calculations.\n * \n * **Korean**: 균형 상태 (Balance State)\n * \n * @public\n * @korean 균형상태\n */\nexport interface BalanceState {\n /** Current balance value (0-100) */\n readonly current: number;\n /** Maximum balance value (typically 100) */\n readonly max: number;\n}\n\n/**\n * Configuration for knockback force calculation.\n * \n * **Korean**: 밀침 설정 (Knockback Configuration)\n * \n * @public\n * @korean 밀침설정\n */\nexport interface KnockbackConfig {\n /** Force magnitude in Newtons */\n readonly force: number;\n /** Normalized attack direction vector (attacker → defender) */\n readonly direction: THREE.Vector3;\n /** Duration of knockback effect in seconds */\n readonly duration: number;\n /** Current balance state */\n readonly balanceState: BalanceState;\n /** Current trigram stance */\n readonly currentStance: TrigramStance;\n}\n\n/**\n * Result of knockback calculation.\n * \n * **Korean**: 밀침 결과 (Knockback Result)\n * \n * Contains displacement vector, animation timing, and fall determination.\n * \n * @public\n * @korean 밀침결과\n */\nexport interface KnockbackResult {\n /** Total knockback displacement vector in world space */\n readonly displacement: THREE.Vector3;\n /** Duration of knockback animation in seconds */\n readonly duration: number;\n /** Vulnerable state duration after knockback ends in seconds */\n readonly recoveryWindow: number;\n /** Whether fall animation should trigger */\n readonly shouldFall: boolean;\n}\n\n/**\n * Knockback Physics Engine.\n * \n * **Korean**: 밀침 물리 엔진\n * \n * Calculates realistic knockback displacement based on attack force,\n * stance resistance, and balance state. Integrates with BalanceSystem\n * for stumbling and falling mechanics.\n * \n * @example\n * ```typescript\n * const physics = new KnockbackPhysics();\n * \n * // Calculate knockback from heavy strike\n * const config: KnockbackConfig = {\n * force: 800, // 80 damage\n * direction: new THREE.Vector3(1, 0, 0).normalize(),\n * duration: 0.8,\n * balanceState: { current: 35, max: 100 }, // Low balance\n * currentStance: TrigramStance.LI, // Fire stance (low resistance)\n * };\n * \n * const result = physics.calculateKnockback(config, 80);\n * // Result: 2.5m base * 1.3 (Fire penalty) * 1.5 (low balance) = ~4.9m\n * // shouldFall: false (balance > 20%)\n * // recoveryWindow: 1.05s (0.7s * 1.5 for low balance)\n * ```\n * \n * @public\n * @korean 밀침물리\n */\nexport class KnockbackPhysics {\n /**\n * Calculates knockback displacement and effects.\n * \n * **Korean**: 밀침 계산 (Calculate Knockback)\n * \n * Determines knockback distance, duration, and fall state based on:\n * 1. Base knockback from damage amount\n * 2. Stance resistance modifier (8 trigram effects)\n * 3. Balance state modifier (stumbling/falling)\n * 4. Recovery window (vulnerable state after)\n * \n * @param config - Knockback configuration with force and state\n * @param attackDamage - Damage dealt by attack (0-100+)\n * @returns Knockback result with displacement and timing\n * \n * @example\n * ```typescript\n * // Light strike on stable player\n * const light = physics.calculateKnockback({\n * force: 300,\n * direction: attackVector,\n * duration: 0.3,\n * balanceState: { current: 85, max: 100 },\n * currentStance: TrigramStance.GEON,\n * }, 30);\n * // Result: ~0.3m knockback (0.5m * 0.9 Geon * 0.7 high balance)\n * \n * // Critical strike on low-balance player\n * const critical = physics.calculateKnockback({\n * force: 1200,\n * direction: attackVector,\n * duration: 1.2,\n * balanceState: { current: 15, max: 100 },\n * currentStance: TrigramStance.SON,\n * }, 110);\n * // Result: ~9.6m knockback, shouldFall: true, 3.0s recovery\n * ```\n * \n * @public\n * @korean 밀침계산\n */\n calculateKnockback(config: KnockbackConfig, attackDamage: number): KnockbackResult {\n // 1. Base knockback distance from damage\n let baseDistance = this.getBaseKnockbackDistance(attackDamage);\n \n // 2. Apply stance resistance modifier\n const stanceResistance = this.getStanceResistanceModifier(config.currentStance);\n baseDistance *= (1 - stanceResistance);\n \n // 3. Apply balance modifier (stumbling/falling)\n const balanceModifier = this.getBalanceModifier(config.balanceState);\n const finalDistance = baseDistance * balanceModifier;\n \n // 4. Calculate displacement vector\n const displacement = config.direction.clone().multiplyScalar(finalDistance);\n \n // 5. Determine duration based on distance\n const duration = this.calculateKnockbackDuration(finalDistance);\n \n // 6. Calculate recovery window (vulnerable state)\n const recoveryWindow = this.calculateRecoveryWindow(attackDamage, config.balanceState);\n \n // 7. Check if balance is critical (should fall)\n const shouldFall = config.balanceState.current < 20;\n \n return {\n displacement,\n duration,\n recoveryWindow,\n shouldFall,\n };\n }\n\n /**\n * Gets base knockback distance from damage amount.\n * \n * **Korean**: 기본 밀침 거리 (Base Knockback Distance)\n * \n * Damage thresholds:\n * - Light (20-40): 0.5m knockback, 0.3s duration\n * - Medium (40-70): 1.2m knockback, 0.5s duration\n * - Heavy (70-100): 2.5m knockback, 0.8s duration\n * - Critical (100+): 4.0m knockback, 1.2s duration + fall\n * \n * @param damage - Attack damage amount\n * @returns Base knockback distance in meters\n * \n * @private\n * @korean 기본밀침거리\n */\n private getBaseKnockbackDistance(damage: number): number {\n if (damage < 40) return 0.5; // Light strike\n if (damage < 70) return 1.2; // Medium strike\n if (damage < 100) return 2.5; // Heavy strike\n return 4.0; // Critical strike\n }\n\n /**\n * Gets stance resistance modifier for knockback.\n * \n * **Korean**: 자세 저항 배율 (Stance Resistance Modifier)\n * \n * Trigram stance resistance modifiers:\n * - ☶ 간 (Gan/Mountain): +40% resistance (defensive mastery)\n * - ☷ 곤 (Gon/Earth): +30% resistance (grounded techniques)\n * - ☰ 건 (Geon/Heaven): +10% resistance (balanced force)\n * - ☵ 감 (Gam/Water): 0% (neutral, adaptive)\n * - ☱ 태 (Tae/Lake): 0% (neutral, fluid)\n * - ☳ 진 (Jin/Thunder): -10% resistance (explosive power)\n * - ☴ 손 (Son/Wind): -20% resistance (fluid, mobile)\n * - ☲ 리 (Li/Fire): -30% resistance (aggressive, exposed)\n * \n * @param stance - Current trigram stance\n * @returns Resistance modifier (-0.3 to +0.4)\n * \n * @private\n * @korean 자세저항배율\n */\n private getStanceResistanceModifier(stance: TrigramStance): number {\n const resistances: Record<TrigramStance, number> = {\n [TrigramStance.GAN]: 0.40, // Mountain: +40% resistance\n [TrigramStance.GON]: 0.30, // Earth: +30% resistance\n [TrigramStance.GEON]: 0.10, // Heaven: +10% resistance\n [TrigramStance.GAM]: 0.00, // Water: neutral\n [TrigramStance.TAE]: 0.00, // Lake: neutral\n [TrigramStance.JIN]: -0.10, // Thunder: -10% resistance\n [TrigramStance.SON]: -0.20, // Wind: -20% resistance (fluid)\n [TrigramStance.LI]: -0.30, // Fire: -30% resistance (aggressive)\n };\n return resistances[stance];\n }\n\n /**\n * Gets balance modifier for knockback distance.\n * \n * **Korean**: 균형 배율 (Balance Modifier)\n * \n * Balance thresholds:\n * - High balance (>70%): 0.70x (30% reduction)\n * - Medium balance (40-70%): 1.00x (normal)\n * - Low balance (20-40%): 1.50x (50% increase, stumbling)\n * - Critical balance (<20%): 2.00x (100% increase, falling)\n * \n * @param balanceState - Current balance state\n * @returns Balance multiplier (0.7 to 2.0)\n * \n * @private\n * @korean 균형배율\n */\n private getBalanceModifier(balanceState: BalanceState): number {\n const balancePercent = (balanceState.current / balanceState.max) * 100;\n \n if (balancePercent > 70) return 0.70; // High balance: -30% knockback\n if (balancePercent > 40) return 1.00; // Normal knockback\n if (balancePercent > 20) return 1.50; // Low balance: +50% knockback\n return 2.00; // Critical balance: +100% knockback\n }\n\n /**\n * Calculates knockback animation duration.\n * \n * **Korean**: 밀침 지속시간 계산 (Calculate Knockback Duration)\n * \n * Linear relationship between distance and duration:\n * - 0.5m = 0.3s (light)\n * - 1.2m = 0.48s\n * - 2.5m = 0.86s\n * - 4.0m = 1.2s (critical)\n * \n * @param distance - Knockback distance in meters\n * @returns Duration in seconds\n * \n * @private\n * @korean 밀침지속시간계산\n */\n private calculateKnockbackDuration(distance: number): number {\n // Linear relationship: 0.5m = 0.3s, 4.0m = 1.2s\n return 0.3 + (distance / 4.0) * 0.9;\n }\n\n /**\n * Calculates recovery window (vulnerability duration).\n * \n * **Korean**: 회복 대기시간 계산 (Calculate Recovery Window)\n * \n * Recovery windows by damage:\n * - Light (<40): 0.2s vulnerability\n * - Medium (40-70): 0.4s vulnerability\n * - Heavy (70-100): 0.7s vulnerability\n * - Critical (100+): 1.5s vulnerability + grounded\n * \n * Low balance increases vulnerability by 50%.\n * \n * @param damage - Attack damage amount\n * @param balanceState - Current balance state\n * @returns Vulnerability duration in seconds\n * \n * @private\n * @korean 회복대기시간계산\n */\n private calculateRecoveryWindow(damage: number, balanceState: BalanceState): number {\n // Base recovery time from damage\n const baseRecoveryTime = damage < 40 ? 0.2 : damage < 70 ? 0.4 : damage < 100 ? 0.7 : 1.5;\n \n // Increase recovery time if balance is low (more vulnerable)\n const balancePercent = (balanceState.current / balanceState.max) * 100;\n const balanceModifier = balancePercent < 40 ? 1.5 : 1.0;\n \n return baseRecoveryTime * balanceModifier;\n }\n\n /**\n * Applies knockback force to player position over time.\n * \n * **Korean**: 밀침 힘 적용 (Apply Knockback Force)\n * \n * Uses smooth ease-out cubic curve for realistic knockback feel:\n * - Fast initial displacement (impact)\n * - Gradual deceleration (friction/resistance)\n * - Smooth stop at final position\n * \n * @param playerPosition - Current player position\n * @param result - Knockback result with displacement\n * @param deltaTime - Time elapsed since knockback started\n * @param progress - Knockback progress (0 to 1)\n * @returns New player position\n * \n * @example\n * ```typescript\n * // In game loop (60fps)\n * const newPosition = physics.applyKnockbackForce(\n * playerPosition,\n * knockbackResult,\n * deltaTime,\n * elapsedTime / knockbackResult.duration\n * );\n * \n * // Progress 0.0: At original position\n * // Progress 0.5: ~88% of total displacement (ease-out)\n * // Progress 1.0: At final position\n * ```\n * \n * @public\n * @korean 밀침힘적용\n */\n applyKnockbackForce(\n playerPosition: THREE.Vector3,\n result: KnockbackResult,\n _deltaTime: number,\n progress: number\n ): THREE.Vector3 {\n // Clamp progress to [0, 1]\n const clampedProgress = Math.max(0, Math.min(1, progress));\n \n // Smooth knockback curve (ease-out cubic)\n // Fast initial impact, gradual deceleration\n const easedProgress = 1 - Math.pow(1 - clampedProgress, 3);\n \n // Calculate position along knockback path\n const currentDisplacement = result.displacement.clone().multiplyScalar(easedProgress);\n \n return playerPosition.clone().add(currentDisplacement);\n }\n\n /**\n * Checks if player is currently in knockback state.\n * \n * **Korean**: 밀침 상태 확인 (Check Knockback State)\n * \n * @param elapsedTime - Time elapsed since knockback started\n * @param duration - Total knockback duration\n * @returns True if still in knockback animation\n * \n * @public\n * @korean 밀침상태확인\n */\n isInKnockback(elapsedTime: number, duration: number): boolean {\n return elapsedTime < duration;\n }\n\n /**\n * Checks if player is in recovery window (vulnerable state).\n * \n * **Korean**: 회복 대기 확인 (Check Recovery Window)\n * \n * @param elapsedTime - Time elapsed since knockback ended\n * @param recoveryWindow - Total recovery window duration\n * @returns True if in vulnerable recovery state\n * \n * @public\n * @korean 회복대기확인\n */\n isInRecoveryWindow(elapsedTime: number, recoveryWindow: number): boolean {\n return elapsedTime < recoveryWindow;\n }\n\n /**\n * Gets bilingual Korean-English name for knockback state.\n * \n * **Korean**: 밀침 상태 이름 (Knockback State Name)\n * \n * @param shouldFall - Whether knockback causes fall\n * @returns Korean and English state names\n * \n * @public\n * @korean 밀침상태이름\n */\n static getKnockbackStateName(shouldFall: boolean): { korean: string; english: string } {\n if (shouldFall) {\n return {\n korean: \"넘어짐\",\n english: \"Falling\",\n };\n }\n \n return {\n korean: \"밀침\",\n english: \"Knockback\",\n };\n }\n\n /**\n * Gets bilingual Korean-English name for recovery state.\n * \n * **Korean**: 회복 상태 이름 (Recovery State Name)\n * \n * @returns Korean and English state names\n * \n * @public\n * @korean 회복상태이름\n */\n getRecoveryStateName(): { korean: string; english: string } {\n return {\n korean: \"회복\",\n english: \"Recovery\",\n };\n }\n\n /**\n * Gets bilingual Korean-English name for stumbling state.\n * \n * **Korean**: 휘청거림 상태 이름 (Stumbling State Name)\n * \n * @returns Korean and English state names\n * \n * @public\n * @korean 휘청거림상태이름\n */\n getStumblingStateName(): { korean: string; english: string } {\n return {\n korean: \"휘청거림\",\n english: \"Stumbling\",\n };\n }\n}\n\nexport default KnockbackPhysics;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6HA,IAAa,mBAAb,MAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0C5B,mBAAmB,QAAyB,cAAuC;EAEjF,IAAI,eAAe,KAAK,yBAAyB,aAAa;EAG9D,MAAM,mBAAmB,KAAK,4BAA4B,OAAO,cAAc;EAC/E,gBAAiB,IAAI;EAGrB,MAAM,kBAAkB,KAAK,mBAAmB,OAAO,aAAa;EACpE,MAAM,gBAAgB,eAAe;EAcrC,OAAO;GACL,cAZmB,OAAO,UAAU,OAAO,CAAC,eAAe,cAY3D;GACA,UAVe,KAAK,2BAA2B,cAU/C;GACA,gBARqB,KAAK,wBAAwB,cAAc,OAAO,aAQvE;GACA,YANiB,OAAO,aAAa,UAAU;GAOhD;;;;;;;;;;;;;;;;;;;CAoBH,yBAAiC,QAAwB;EACvD,IAAI,SAAS,IAAI,OAAO;EACxB,IAAI,SAAS,IAAI,OAAO;EACxB,IAAI,SAAS,KAAK,OAAO;EACzB,OAAO;;;;;;;;;;;;;;;;;;;;;;;CAwBT,4BAAoC,QAA+B;EAWjE,OAAO;IATJ,cAAc,MAAM;IACpB,cAAc,MAAM;IACpB,cAAc,OAAO;IACrB,cAAc,MAAM;IACpB,cAAc,MAAM;IACpB,cAAc,MAAM;IACpB,cAAc,MAAM;IACpB,cAAc,KAAK;GAEf,CAAY;;;;;;;;;;;;;;;;;;;CAoBrB,mBAA2B,cAAoC;EAC7D,MAAM,iBAAkB,aAAa,UAAU,aAAa,MAAO;EAEnE,IAAI,iBAAiB,IAAI,OAAO;EAChC,IAAI,iBAAiB,IAAI,OAAO;EAChC,IAAI,iBAAiB,IAAI,OAAO;EAChC,OAAO;;;;;;;;;;;;;;;;;;;CAoBT,2BAAmC,UAA0B;EAE3D,OAAO,KAAO,WAAW,IAAO;;;;;;;;;;;;;;;;;;;;;;CAuBlC,wBAAgC,QAAgB,cAAoC;EAQlF,QANyB,SAAS,KAAK,KAAM,SAAS,KAAK,KAAM,SAAS,MAAM,KAAM,QAG9D,aAAa,UAAU,aAAa,MAAO,MAC1B,KAAK,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCtD,oBACE,gBACA,QACA,YACA,UACe;EAMf,MAAM,gBAAgB,IAAI,KAAK,IAAI,IAJX,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,SAAS,CAIlB,EAAiB,EAAE;EAG1D,MAAM,sBAAsB,OAAO,aAAa,OAAO,CAAC,eAAe,cAAc;EAErF,OAAO,eAAe,OAAO,CAAC,IAAI,oBAAoB;;;;;;;;;;;;;;CAexD,cAAc,aAAqB,UAA2B;EAC5D,OAAO,cAAc;;;;;;;;;;;;;;CAevB,mBAAmB,aAAqB,gBAAiC;EACvE,OAAO,cAAc;;;;;;;;;;;;;CAcvB,OAAO,sBAAsB,YAA0D;EACrF,IAAI,YACF,OAAO;GACL,QAAQ;GACR,SAAS;GACV;EAGH,OAAO;GACL,QAAQ;GACR,SAAS;GACV;;;;;;;;;;;;CAaH,uBAA4D;EAC1D,OAAO;GACL,QAAQ;GACR,SAAS;GACV;;;;;;;;;;;;CAaH,wBAA6D;EAC3D,OAAO;GACL,QAAQ;GACR,SAAS;GACV"}
1
+ {"version":3,"file":"KnockbackPhysics.js","names":[],"sources":["../../../src/systems/physics/KnockbackPhysics.ts"],"sourcesContent":["/**\n * Knockback Physics System for realistic force-based displacement.\n * \n * **Korean**: 밀침 물리 시스템 (Knockback Physics System)\n * \n * Implements realistic combat knockback mechanics that calculate force-based\n * displacement when players are hit. The system integrates with BalanceSystem\n * for authentic stumbling/falling reactions.\n * \n * ## Knockback Mechanics\n * \n * Knockback force is determined by:\n * - Attack damage and technique type\n * - Impact angle and direction\n * - Current balance state\n * - Stance resistance modifiers (8 trigram stances)\n * \n * ## Balance Integration\n * \n * - High balance (>70%): Reduced knockback by 30%\n * - Medium balance (40-70%): Normal knockback\n * - Low balance (<40%): Increased knockback by 50%, stumbling\n * - Critical balance (<20%): Guaranteed fall, 2s recovery\n * \n * ## Performance\n * \n * Optimized for 60fps with efficient vector calculations and smooth\n * easing curves for realistic knockback feel.\n * \n * @module systems/physics/KnockbackPhysics\n * @category Physics System\n * @korean 밀침물리\n */\n\nimport * as THREE from 'three';\nimport { TrigramStance } from '@/types/common';\n\n/**\n * Balance state information for knockback calculations.\n * \n * **Korean**: 균형 상태 (Balance State)\n * \n * @korean 균형상태\n */\nexport interface BalanceState {\n /** Current balance value (0-100) */\n readonly current: number;\n /** Maximum balance value (typically 100) */\n readonly max: number;\n}\n\n/**\n * Configuration for knockback force calculation.\n * \n * **Korean**: 밀침 설정 (Knockback Configuration)\n * \n * @korean 밀침설정\n */\nexport interface KnockbackConfig {\n /** Force magnitude in Newtons */\n readonly force: number;\n /** Normalized attack direction vector (attacker → defender) */\n readonly direction: THREE.Vector3;\n /** Duration of knockback effect in seconds */\n readonly duration: number;\n /** Current balance state */\n readonly balanceState: BalanceState;\n /** Current trigram stance */\n readonly currentStance: TrigramStance;\n}\n\n/**\n * Result of knockback calculation.\n * \n * **Korean**: 밀침 결과 (Knockback Result)\n * \n * Contains displacement vector, animation timing, and fall determination.\n * \n * @korean 밀침결과\n */\nexport interface KnockbackResult {\n /** Total knockback displacement vector in world space */\n readonly displacement: THREE.Vector3;\n /** Duration of knockback animation in seconds */\n readonly duration: number;\n /** Vulnerable state duration after knockback ends in seconds */\n readonly recoveryWindow: number;\n /** Whether fall animation should trigger */\n readonly shouldFall: boolean;\n}\n\n/**\n * Knockback Physics Engine.\n * \n * **Korean**: 밀침 물리 엔진\n * \n * Calculates realistic knockback displacement based on attack force,\n * stance resistance, and balance state. Integrates with BalanceSystem\n * for stumbling and falling mechanics.\n * \n * @example\n * ```typescript\n * const physics = new KnockbackPhysics();\n * \n * // Calculate knockback from heavy strike\n * const config: KnockbackConfig = {\n * force: 800, // 80 damage\n * direction: new THREE.Vector3(1, 0, 0).normalize(),\n * duration: 0.8,\n * balanceState: { current: 35, max: 100 }, // Low balance\n * currentStance: TrigramStance.LI, // Fire stance (low resistance)\n * };\n * \n * const result = physics.calculateKnockback(config, 80);\n * // Result: 2.5m base * 1.3 (Fire penalty) * 1.5 (low balance) = ~4.9m\n * // shouldFall: false (balance > 20%)\n * // recoveryWindow: 1.05s (0.7s * 1.5 for low balance)\n * ```\n * \n * @korean 밀침물리\n */\nexport class KnockbackPhysics {\n /**\n * Calculates knockback displacement and effects.\n * \n * **Korean**: 밀침 계산 (Calculate Knockback)\n * \n * Determines knockback distance, duration, and fall state based on:\n * 1. Base knockback from damage amount\n * 2. Stance resistance modifier (8 trigram effects)\n * 3. Balance state modifier (stumbling/falling)\n * 4. Recovery window (vulnerable state after)\n * \n * @param config - Knockback configuration with force and state\n * @param attackDamage - Damage dealt by attack (0-100+)\n * @returns Knockback result with displacement and timing\n * \n * @example\n * ```typescript\n * // Light strike on stable player\n * const light = physics.calculateKnockback({\n * force: 300,\n * direction: attackVector,\n * duration: 0.3,\n * balanceState: { current: 85, max: 100 },\n * currentStance: TrigramStance.GEON,\n * }, 30);\n * // Result: ~0.3m knockback (0.5m * 0.9 Geon * 0.7 high balance)\n * \n * // Critical strike on low-balance player\n * const critical = physics.calculateKnockback({\n * force: 1200,\n * direction: attackVector,\n * duration: 1.2,\n * balanceState: { current: 15, max: 100 },\n * currentStance: TrigramStance.SON,\n * }, 110);\n * // Result: ~9.6m knockback, shouldFall: true, 3.0s recovery\n * ```\n * \n * @korean 밀침계산\n */\n calculateKnockback(config: KnockbackConfig, attackDamage: number): KnockbackResult {\n // 1. Base knockback distance from damage\n let baseDistance = this.getBaseKnockbackDistance(attackDamage);\n \n // 2. Apply stance resistance modifier\n const stanceResistance = this.getStanceResistanceModifier(config.currentStance);\n baseDistance *= (1 - stanceResistance);\n \n // 3. Apply balance modifier (stumbling/falling)\n const balanceModifier = this.getBalanceModifier(config.balanceState);\n const finalDistance = baseDistance * balanceModifier;\n \n // 4. Calculate displacement vector\n const displacement = config.direction.clone().multiplyScalar(finalDistance);\n \n // 5. Determine duration based on distance\n const duration = this.calculateKnockbackDuration(finalDistance);\n \n // 6. Calculate recovery window (vulnerable state)\n const recoveryWindow = this.calculateRecoveryWindow(attackDamage, config.balanceState);\n \n // 7. Check if balance is critical (should fall)\n const shouldFall = config.balanceState.current < 20;\n \n return {\n displacement,\n duration,\n recoveryWindow,\n shouldFall,\n };\n }\n\n /**\n * Gets base knockback distance from damage amount.\n * \n * **Korean**: 기본 밀침 거리 (Base Knockback Distance)\n * \n * Damage thresholds:\n * - Light (20-40): 0.5m knockback, 0.3s duration\n * - Medium (40-70): 1.2m knockback, 0.5s duration\n * - Heavy (70-100): 2.5m knockback, 0.8s duration\n * - Critical (100+): 4.0m knockback, 1.2s duration + fall\n * \n * @param damage - Attack damage amount\n * @returns Base knockback distance in meters\n * \n * @private\n * @korean 기본밀침거리\n */\n private getBaseKnockbackDistance(damage: number): number {\n if (damage < 40) return 0.5; // Light strike\n if (damage < 70) return 1.2; // Medium strike\n if (damage < 100) return 2.5; // Heavy strike\n return 4.0; // Critical strike\n }\n\n /**\n * Gets stance resistance modifier for knockback.\n * \n * **Korean**: 자세 저항 배율 (Stance Resistance Modifier)\n * \n * Trigram stance resistance modifiers:\n * - ☶ 간 (Gan/Mountain): +40% resistance (defensive mastery)\n * - ☷ 곤 (Gon/Earth): +30% resistance (grounded techniques)\n * - ☰ 건 (Geon/Heaven): +10% resistance (balanced force)\n * - ☵ 감 (Gam/Water): 0% (neutral, adaptive)\n * - ☱ 태 (Tae/Lake): 0% (neutral, fluid)\n * - ☳ 진 (Jin/Thunder): -10% resistance (explosive power)\n * - ☴ 손 (Son/Wind): -20% resistance (fluid, mobile)\n * - ☲ 리 (Li/Fire): -30% resistance (aggressive, exposed)\n * \n * @param stance - Current trigram stance\n * @returns Resistance modifier (-0.3 to +0.4)\n * \n * @private\n * @korean 자세저항배율\n */\n private getStanceResistanceModifier(stance: TrigramStance): number {\n const resistances: Record<TrigramStance, number> = {\n [TrigramStance.GAN]: 0.40, // Mountain: +40% resistance\n [TrigramStance.GON]: 0.30, // Earth: +30% resistance\n [TrigramStance.GEON]: 0.10, // Heaven: +10% resistance\n [TrigramStance.GAM]: 0.00, // Water: neutral\n [TrigramStance.TAE]: 0.00, // Lake: neutral\n [TrigramStance.JIN]: -0.10, // Thunder: -10% resistance\n [TrigramStance.SON]: -0.20, // Wind: -20% resistance (fluid)\n [TrigramStance.LI]: -0.30, // Fire: -30% resistance (aggressive)\n };\n return resistances[stance];\n }\n\n /**\n * Gets balance modifier for knockback distance.\n * \n * **Korean**: 균형 배율 (Balance Modifier)\n * \n * Balance thresholds:\n * - High balance (>70%): 0.70x (30% reduction)\n * - Medium balance (40-70%): 1.00x (normal)\n * - Low balance (20-40%): 1.50x (50% increase, stumbling)\n * - Critical balance (<20%): 2.00x (100% increase, falling)\n * \n * @param balanceState - Current balance state\n * @returns Balance multiplier (0.7 to 2.0)\n * \n * @private\n * @korean 균형배율\n */\n private getBalanceModifier(balanceState: BalanceState): number {\n const balancePercent = (balanceState.current / balanceState.max) * 100;\n \n if (balancePercent > 70) return 0.70; // High balance: -30% knockback\n if (balancePercent > 40) return 1.00; // Normal knockback\n if (balancePercent > 20) return 1.50; // Low balance: +50% knockback\n return 2.00; // Critical balance: +100% knockback\n }\n\n /**\n * Calculates knockback animation duration.\n * \n * **Korean**: 밀침 지속시간 계산 (Calculate Knockback Duration)\n * \n * Linear relationship between distance and duration:\n * - 0.5m = 0.3s (light)\n * - 1.2m = 0.48s\n * - 2.5m = 0.86s\n * - 4.0m = 1.2s (critical)\n * \n * @param distance - Knockback distance in meters\n * @returns Duration in seconds\n * \n * @private\n * @korean 밀침지속시간계산\n */\n private calculateKnockbackDuration(distance: number): number {\n // Linear relationship: 0.5m = 0.3s, 4.0m = 1.2s\n return 0.3 + (distance / 4.0) * 0.9;\n }\n\n /**\n * Calculates recovery window (vulnerability duration).\n * \n * **Korean**: 회복 대기시간 계산 (Calculate Recovery Window)\n * \n * Recovery windows by damage:\n * - Light (<40): 0.2s vulnerability\n * - Medium (40-70): 0.4s vulnerability\n * - Heavy (70-100): 0.7s vulnerability\n * - Critical (100+): 1.5s vulnerability + grounded\n * \n * Low balance increases vulnerability by 50%.\n * \n * @param damage - Attack damage amount\n * @param balanceState - Current balance state\n * @returns Vulnerability duration in seconds\n * \n * @private\n * @korean 회복대기시간계산\n */\n private calculateRecoveryWindow(damage: number, balanceState: BalanceState): number {\n // Base recovery time from damage\n const baseRecoveryTime = damage < 40 ? 0.2 : damage < 70 ? 0.4 : damage < 100 ? 0.7 : 1.5;\n \n // Increase recovery time if balance is low (more vulnerable)\n const balancePercent = (balanceState.current / balanceState.max) * 100;\n const balanceModifier = balancePercent < 40 ? 1.5 : 1.0;\n \n return baseRecoveryTime * balanceModifier;\n }\n\n /**\n * Applies knockback force to player position over time.\n * \n * **Korean**: 밀침 힘 적용 (Apply Knockback Force)\n * \n * Uses smooth ease-out cubic curve for realistic knockback feel:\n * - Fast initial displacement (impact)\n * - Gradual deceleration (friction/resistance)\n * - Smooth stop at final position\n * \n * @param playerPosition - Current player position\n * @param result - Knockback result with displacement\n * @param deltaTime - Time elapsed since knockback started\n * @param progress - Knockback progress (0 to 1)\n * @returns New player position\n * \n * @example\n * ```typescript\n * // In game loop (60fps)\n * const newPosition = physics.applyKnockbackForce(\n * playerPosition,\n * knockbackResult,\n * deltaTime,\n * elapsedTime / knockbackResult.duration\n * );\n * \n * // Progress 0.0: At original position\n * // Progress 0.5: ~88% of total displacement (ease-out)\n * // Progress 1.0: At final position\n * ```\n * \n * @korean 밀침힘적용\n */\n applyKnockbackForce(\n playerPosition: THREE.Vector3,\n result: KnockbackResult,\n _deltaTime: number,\n progress: number\n ): THREE.Vector3 {\n // Clamp progress to [0, 1]\n const clampedProgress = Math.max(0, Math.min(1, progress));\n \n // Smooth knockback curve (ease-out cubic)\n // Fast initial impact, gradual deceleration\n const easedProgress = 1 - Math.pow(1 - clampedProgress, 3);\n \n // Calculate position along knockback path\n const currentDisplacement = result.displacement.clone().multiplyScalar(easedProgress);\n \n return playerPosition.clone().add(currentDisplacement);\n }\n\n /**\n * Checks if player is currently in knockback state.\n * \n * **Korean**: 밀침 상태 확인 (Check Knockback State)\n * \n * @param elapsedTime - Time elapsed since knockback started\n * @param duration - Total knockback duration\n * @returns True if still in knockback animation\n * \n * @korean 밀침상태확인\n */\n isInKnockback(elapsedTime: number, duration: number): boolean {\n return elapsedTime < duration;\n }\n\n /**\n * Checks if player is in recovery window (vulnerable state).\n * \n * **Korean**: 회복 대기 확인 (Check Recovery Window)\n * \n * @param elapsedTime - Time elapsed since knockback ended\n * @param recoveryWindow - Total recovery window duration\n * @returns True if in vulnerable recovery state\n * \n * @korean 회복대기확인\n */\n isInRecoveryWindow(elapsedTime: number, recoveryWindow: number): boolean {\n return elapsedTime < recoveryWindow;\n }\n\n /**\n * Gets bilingual Korean-English name for knockback state.\n * \n * **Korean**: 밀침 상태 이름 (Knockback State Name)\n * \n * @param shouldFall - Whether knockback causes fall\n * @returns Korean and English state names\n * \n * @korean 밀침상태이름\n */\n static getKnockbackStateName(shouldFall: boolean): { korean: string; english: string } {\n if (shouldFall) {\n return {\n korean: \"넘어짐\",\n english: \"Falling\",\n };\n }\n \n return {\n korean: \"밀침\",\n english: \"Knockback\",\n };\n }\n\n /**\n * Gets bilingual Korean-English name for recovery state.\n * \n * **Korean**: 회복 상태 이름 (Recovery State Name)\n * \n * @returns Korean and English state names\n * \n * @korean 회복상태이름\n */\n getRecoveryStateName(): { korean: string; english: string } {\n return {\n korean: \"회복\",\n english: \"Recovery\",\n };\n }\n\n /**\n * Gets bilingual Korean-English name for stumbling state.\n * \n * **Korean**: 휘청거림 상태 이름 (Stumbling State Name)\n * \n * @returns Korean and English state names\n * \n * @korean 휘청거림상태이름\n */\n getStumblingStateName(): { korean: string; english: string } {\n return {\n korean: \"휘청거림\",\n english: \"Stumbling\",\n };\n }\n}\n\nexport default KnockbackPhysics;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyHA,IAAa,mBAAb,MAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyC5B,mBAAmB,QAAyB,cAAuC;EAEjF,IAAI,eAAe,KAAK,yBAAyB,aAAa;EAG9D,MAAM,mBAAmB,KAAK,4BAA4B,OAAO,cAAc;EAC/E,gBAAiB,IAAI;EAGrB,MAAM,kBAAkB,KAAK,mBAAmB,OAAO,aAAa;EACpE,MAAM,gBAAgB,eAAe;EAcrC,OAAO;GACL,cAZmB,OAAO,UAAU,OAAO,CAAC,eAAe,cAY3D;GACA,UAVe,KAAK,2BAA2B,cAU/C;GACA,gBARqB,KAAK,wBAAwB,cAAc,OAAO,aAQvE;GACA,YANiB,OAAO,aAAa,UAAU;GAOhD;;;;;;;;;;;;;;;;;;;CAoBH,yBAAiC,QAAwB;EACvD,IAAI,SAAS,IAAI,OAAO;EACxB,IAAI,SAAS,IAAI,OAAO;EACxB,IAAI,SAAS,KAAK,OAAO;EACzB,OAAO;;;;;;;;;;;;;;;;;;;;;;;CAwBT,4BAAoC,QAA+B;EAWjE,OAAO;IATJ,cAAc,MAAM;IACpB,cAAc,MAAM;IACpB,cAAc,OAAO;IACrB,cAAc,MAAM;IACpB,cAAc,MAAM;IACpB,cAAc,MAAM;IACpB,cAAc,MAAM;IACpB,cAAc,KAAK;GAEf,CAAY;;;;;;;;;;;;;;;;;;;CAoBrB,mBAA2B,cAAoC;EAC7D,MAAM,iBAAkB,aAAa,UAAU,aAAa,MAAO;EAEnE,IAAI,iBAAiB,IAAI,OAAO;EAChC,IAAI,iBAAiB,IAAI,OAAO;EAChC,IAAI,iBAAiB,IAAI,OAAO;EAChC,OAAO;;;;;;;;;;;;;;;;;;;CAoBT,2BAAmC,UAA0B;EAE3D,OAAO,KAAO,WAAW,IAAO;;;;;;;;;;;;;;;;;;;;;;CAuBlC,wBAAgC,QAAgB,cAAoC;EAQlF,QANyB,SAAS,KAAK,KAAM,SAAS,KAAK,KAAM,SAAS,MAAM,KAAM,QAG9D,aAAa,UAAU,aAAa,MAAO,MAC1B,KAAK,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsCtD,oBACE,gBACA,QACA,YACA,UACe;EAMf,MAAM,gBAAgB,IAAI,KAAK,IAAI,IAJX,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,SAAS,CAIlB,EAAiB,EAAE;EAG1D,MAAM,sBAAsB,OAAO,aAAa,OAAO,CAAC,eAAe,cAAc;EAErF,OAAO,eAAe,OAAO,CAAC,IAAI,oBAAoB;;;;;;;;;;;;;CAcxD,cAAc,aAAqB,UAA2B;EAC5D,OAAO,cAAc;;;;;;;;;;;;;CAcvB,mBAAmB,aAAqB,gBAAiC;EACvE,OAAO,cAAc;;;;;;;;;;;;CAavB,OAAO,sBAAsB,YAA0D;EACrF,IAAI,YACF,OAAO;GACL,QAAQ;GACR,SAAS;GACV;EAGH,OAAO;GACL,QAAQ;GACR,SAAS;GACV;;;;;;;;;;;CAYH,uBAA4D;EAC1D,OAAO;GACL,QAAQ;GACR,SAAS;GACV;;;;;;;;;;;CAYH,wBAA6D;EAC3D,OAAO;GACL,QAAQ;GACR,SAAS;GACV"}
@@ -27,7 +27,6 @@ import * as THREE from "three";
27
27
  *
28
28
  * **Korean**: 이동 입력 (Movement Input)
29
29
  *
30
- * @public
31
30
  * @category Physics System
32
31
  * @korean 이동입력
33
32
  */
@@ -51,7 +50,6 @@ export interface MovementInput {
51
50
  * Contains position, velocity, and current movement parameters.
52
51
  * All vectors are mutable for performance (updated in-place during physics loop).
53
52
  *
54
- * @public
55
53
  * @category Physics System
56
54
  * @korean 이동상태
57
55
  */
@@ -138,7 +136,6 @@ export declare const STANCE_SPEED_MODIFIERS: Record<TrigramStance, number>;
138
136
  * physics.updateMovement(state, input, deltaTime);
139
137
  * ```
140
138
  *
141
- * @public
142
139
  * @category Physics System
143
140
  * @korean 이동물리엔진
144
141
  */
@@ -236,7 +233,6 @@ export declare class MovementPhysics {
236
233
  * const largePhysics = new MovementPhysics(14.0);
237
234
  * ```
238
235
  *
239
- * @public
240
236
  */
241
237
  constructor(arenaWidthMeters?: number);
242
238
  /**
@@ -359,7 +355,6 @@ export declare class MovementPhysics {
359
355
  *
360
356
  * @param speed - Maximum speed in m/s
361
357
  *
362
- * @public
363
358
  */
364
359
  setMaxSpeed(speed: number): void;
365
360
  /**
@@ -373,7 +368,6 @@ export declare class MovementPhysics {
373
368
  *
374
369
  * @param acceleration - Acceleration in m/s²
375
370
  *
376
- * @public
377
371
  */
378
372
  setAcceleration(acceleration: number): void;
379
373
  /**
@@ -384,7 +378,6 @@ export declare class MovementPhysics {
384
378
  * Resets movement to use default calculations without external
385
379
  * override values.
386
380
  *
387
- * @public
388
381
  */
389
382
  clearOverrides(): void;
390
383
  /**
@@ -399,7 +392,6 @@ export declare class MovementPhysics {
399
392
  * @param widthMeters - Arena width in meters (must be positive)
400
393
  * @throws {Error} If widthMeters is not a positive number
401
394
  *
402
- * @public
403
395
  */
404
396
  setArenaWidth(widthMeters: number): void;
405
397
  /**
@@ -409,7 +401,6 @@ export declare class MovementPhysics {
409
401
  *
410
402
  * @returns Arena width in meters
411
403
  *
412
- * @public
413
404
  */
414
405
  getArenaWidth(): number;
415
406
  /**
@@ -421,7 +412,6 @@ export declare class MovementPhysics {
421
412
  *
422
413
  * @returns Arena-based speed multiplier (0.7 to 1.3)
423
414
  *
424
- * @public
425
415
  */
426
416
  getArenaSpeedScale(): number;
427
417
  }
@@ -1 +1 @@
1
- {"version":3,"file":"MovementPhysics.d.ts","sourceRoot":"","sources":["../../../src/systems/physics/MovementPhysics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B;;;;;;;;GAQG;AACH,MAAM,WAAW,aAAa;IAC5B,2DAA2D;IAC3D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,2DAA2D;IAC3D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,qCAAqC;IACrC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,2CAA2C;IAC3C,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,oDAAoD;IACpD,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;CACpC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;;;;OAQG;IACH,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC;IACjC;;;;;;;OAOG;IACH,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC;IACjC,4CAA4C;IAC5C,YAAY,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,4DAA4D;IAC5D,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAShE,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,qBAAa,eAAe;IAC1B;;;;;;;;OAQG;IACH,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA8B;IAEhE;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAQ;IAE1C;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAO;IAEjC;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAO;IAEvC;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IAEvC;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAQ;IAE7C;;;;OAIG;IACH,OAAO,CAAC,iBAAiB,CAAgB;IAKzC;;;;OAIG;IACH,OAAO,CAAC,iBAAiB,CAAuB;IAEhD;;;;OAIG;IACH,OAAO,CAAC,qBAAqB,CAAuB;IAEpD;;;;OAIG;IACH,OAAO,CAAC,sBAAsB,CAAe;IAG7C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAuB;IAC1D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuB;IACpD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAuB;IACrD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAuB;IAE3D;;;;;;;;;;;;;;;;;;;;;OAqBG;gBACS,gBAAgB,GAAE,MAAa;IAU3C;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,OAAO,CAAC,wBAAwB;IAMhC;;;;;;;;;;;;;;;OAeG;IACI,cAAc,CACnB,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,aAAa,EACpB,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,mBAAmB,GAC3B,IAAI;IAuJP;;;;;;;;;OASG;IACI,sBAAsB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM;IAI5D;;;;;;;;;;;OAWG;IACI,sBAAsB,CAAC,mBAAmB,EAAE,MAAM,GAAG,MAAM;IAOlE;;;;;;;;;;;OAWG;IACI,WAAW,CAChB,SAAS,EAAE,OAAO,EAClB,MAAM,EAAE,aAAa,EACrB,eAAe,EAAE,MAAM,GACtB,MAAM;IAQT;;;;;;;;;;OAUG;IACI,mBAAmB,CACxB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,MAAM;IAKT;;;;;;;;;OASG;IACI,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAKxD;;;;;;;;OAQG;IACI,WAAW,IAAI,MAAM;IAI5B;;;;;;;;;;;;OAYG;IACI,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIvC;;;;;;;;;;;;OAYG;IACI,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAIlD;;;;;;;;;OASG;IACI,cAAc,IAAI,IAAI;IAK7B;;;;;;;;;;;;;OAaG;IACI,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAU/C;;;;;;;;OAQG;IACI,aAAa,IAAI,MAAM;IAI9B;;;;;;;;;;OAUG;IACI,kBAAkB,IAAI,MAAM;CAGpC"}
1
+ {"version":3,"file":"MovementPhysics.d.ts","sourceRoot":"","sources":["../../../src/systems/physics/MovementPhysics.ts"],"names":[],"mappings":"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"}