blacktrigram 0.7.44 → 0.7.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (746) hide show
  1. package/lib/audio/AudioManager.d.ts +26 -0
  2. package/lib/audio/AudioManager.d.ts.map +1 -1
  3. package/lib/audio/AudioManager.js +26 -0
  4. package/lib/audio/AudioManager.js.map +1 -1
  5. package/lib/audio/index.d.ts.map +1 -1
  6. package/lib/audio/index.js.map +1 -1
  7. package/lib/audio/types.d.ts +18 -2
  8. package/lib/audio/types.d.ts.map +1 -1
  9. package/lib/audio/types.js +1 -0
  10. package/lib/audio/types.js.map +1 -1
  11. package/lib/components/effects/WindParticles3D.d.ts.map +1 -1
  12. package/lib/components/index.d.ts.map +1 -1
  13. package/lib/components/index.js.map +1 -1
  14. package/lib/components/screens/combat/CombatScreen3D.d.ts.map +1 -1
  15. package/lib/components/screens/combat/CombatScreen3D.js.map +1 -1
  16. package/lib/components/screens/combat/components/controls/KeyboardHints.d.ts +0 -1
  17. package/lib/components/screens/combat/components/controls/KeyboardHints.d.ts.map +1 -1
  18. package/lib/components/screens/combat/components/controls/KeyboardHints.js +0 -1
  19. package/lib/components/screens/combat/components/controls/KeyboardHints.js.map +1 -1
  20. package/lib/components/screens/combat/components/controls/PauseMenu.d.ts.map +1 -1
  21. package/lib/components/screens/combat/components/controls/PauseMenu.js.map +1 -1
  22. package/lib/components/screens/combat/components/effects/ArterialSpray3D.d.ts.map +1 -1
  23. package/lib/components/screens/combat/components/effects/BloodDecals3D.d.ts.map +1 -1
  24. package/lib/components/screens/combat/components/effects/BloodDecals3D.js.map +1 -1
  25. package/lib/components/screens/combat/components/effects/BloodLossOverlayHtml.d.ts.map +1 -1
  26. package/lib/components/screens/combat/components/effects/BloodLossOverlayHtml.js.map +1 -1
  27. package/lib/components/screens/combat/components/effects/BloodParticles3D.d.ts.map +1 -1
  28. package/lib/components/screens/combat/components/effects/BloodParticles3D.js.map +1 -1
  29. package/lib/components/screens/combat/components/effects/BloodViscosity3D.d.ts.map +1 -1
  30. package/lib/components/screens/combat/components/effects/BloodViscosity3D.js.map +1 -1
  31. package/lib/components/screens/combat/components/effects/BoneCrackParticles3D.d.ts.map +1 -1
  32. package/lib/components/screens/combat/components/effects/CombatParticleEffects3D.d.ts.map +1 -1
  33. package/lib/components/screens/combat/components/effects/CombatParticleEffects3D.js.map +1 -1
  34. package/lib/components/screens/combat/components/effects/ConsciousnessBlur.d.ts.map +1 -1
  35. package/lib/components/screens/combat/components/effects/ConsciousnessBlur.js.map +1 -1
  36. package/lib/components/screens/combat/components/effects/DustClouds3D.d.ts.map +1 -1
  37. package/lib/components/screens/combat/components/effects/EarthCrackEffect3D.d.ts.map +1 -1
  38. package/lib/components/screens/combat/components/effects/EarthHealingEffect3D.d.ts.map +1 -1
  39. package/lib/components/screens/combat/components/effects/ImpactSparks3D.d.ts.map +1 -1
  40. package/lib/components/screens/combat/components/effects/InternalDamage3D.d.ts.map +1 -1
  41. package/lib/components/screens/combat/components/effects/InternalDamage3D.js.map +1 -1
  42. package/lib/components/screens/combat/components/effects/LiPrecisionTargetingOverlay.d.ts.map +1 -1
  43. package/lib/components/screens/combat/components/effects/NerveStrikeParticles3D.d.ts.map +1 -1
  44. package/lib/components/screens/combat/components/effects/PainVignette.d.ts.map +1 -1
  45. package/lib/components/screens/combat/components/effects/PainVignette.js.map +1 -1
  46. package/lib/components/screens/combat/components/effects/ParticleAudio3D.d.ts.map +1 -1
  47. package/lib/components/screens/combat/components/effects/ParticleAudio3D.js.map +1 -1
  48. package/lib/components/screens/combat/components/effects/TraumaOverlay3D.d.ts.map +1 -1
  49. package/lib/components/screens/combat/components/effects/TraumaOverlay3D.js.map +1 -1
  50. package/lib/components/screens/combat/components/effects/WaterRipple3D.d.ts.map +1 -1
  51. package/lib/components/screens/combat/components/effects/WaterWave3D.d.ts.map +1 -1
  52. package/lib/components/screens/combat/components/effects/index.d.ts.map +1 -1
  53. package/lib/components/screens/combat/components/feedback/MatchCountdown.d.ts.map +1 -1
  54. package/lib/components/screens/combat/components/feedback/MatchCountdown.js.map +1 -1
  55. package/lib/components/screens/combat/components/feedback/RoundAnnouncementOverlayHtml.d.ts.map +1 -1
  56. package/lib/components/screens/combat/components/feedback/RoundAnnouncementOverlayHtml.js.map +1 -1
  57. package/lib/components/screens/combat/components/feedback/RoundStartAnnouncementOverlayHtml.d.ts.map +1 -1
  58. package/lib/components/screens/combat/components/feedback/RoundStartAnnouncementOverlayHtml.js.map +1 -1
  59. package/lib/components/screens/combat/components/hud/CombatBottomHUD.d.ts.map +1 -1
  60. package/lib/components/screens/combat/components/hud/CombatBottomHUD.js.map +1 -1
  61. package/lib/components/screens/combat/components/hud/CombatLeftHUD.d.ts.map +1 -1
  62. package/lib/components/screens/combat/components/hud/CombatLeftHUD.js.map +1 -1
  63. package/lib/components/screens/combat/components/hud/CombatPortraitStatusStrip.d.ts.map +1 -1
  64. package/lib/components/screens/combat/components/hud/CombatPortraitStatusStrip.js.map +1 -1
  65. package/lib/components/screens/combat/components/hud/CombatRightHUD.d.ts.map +1 -1
  66. package/lib/components/screens/combat/components/hud/CombatRightHUD.js.map +1 -1
  67. package/lib/components/screens/combat/components/hud/CombatTopHUD.d.ts.map +1 -1
  68. package/lib/components/screens/combat/components/hud/CombatTopHUD.js.map +1 -1
  69. package/lib/components/screens/combat/components/hud/DifficultyIndicator.d.ts.map +1 -1
  70. package/lib/components/screens/combat/components/hud/DifficultyIndicator.js.map +1 -1
  71. package/lib/components/screens/combat/components/hud/FPSMonitor.d.ts.map +1 -1
  72. package/lib/components/screens/combat/components/hud/FPSMonitor.js.map +1 -1
  73. package/lib/components/screens/combat/components/hud/PlayerStateOverlayHtml.d.ts.map +1 -1
  74. package/lib/components/screens/combat/components/hud/PlayerStateOverlayHtml.js.map +1 -1
  75. package/lib/components/screens/combat/components/indicators/BalanceIndicator.d.ts.map +1 -1
  76. package/lib/components/screens/combat/components/indicators/BalanceIndicator.js.map +1 -1
  77. package/lib/components/screens/combat/components/indicators/InputBufferDisplay.d.ts +0 -1
  78. package/lib/components/screens/combat/components/indicators/InputBufferDisplay.d.ts.map +1 -1
  79. package/lib/components/screens/combat/components/indicators/InputBufferDisplay.js +0 -1
  80. package/lib/components/screens/combat/components/indicators/InputBufferDisplay.js.map +1 -1
  81. package/lib/components/screens/combat/components/indicators/StaminaWarning.d.ts.map +1 -1
  82. package/lib/components/screens/combat/components/indicators/StaminaWarning.js.map +1 -1
  83. package/lib/components/screens/combat/components/indicators/TechniqueNameDisplay.d.ts +0 -2
  84. package/lib/components/screens/combat/components/indicators/TechniqueNameDisplay.d.ts.map +1 -1
  85. package/lib/components/screens/combat/components/indicators/TechniqueNameDisplay.js +0 -1
  86. package/lib/components/screens/combat/components/indicators/TechniqueNameDisplay.js.map +1 -1
  87. package/lib/components/screens/combat/helpers/AnimationUpdater.d.ts.map +1 -1
  88. package/lib/components/screens/combat/helpers/AnimationUpdater.js.map +1 -1
  89. package/lib/components/screens/combat/helpers/combatHelpers.d.ts.map +1 -1
  90. package/lib/components/screens/combat/helpers/combatHelpers.js.map +1 -1
  91. package/lib/components/screens/combat/hooks/useAICombat.d.ts.map +1 -1
  92. package/lib/components/screens/combat/hooks/useAICombat.js.map +1 -1
  93. package/lib/components/screens/combat/hooks/useCombatActions.d.ts.map +1 -1
  94. package/lib/components/screens/combat/hooks/useCombatActions.js.map +1 -1
  95. package/lib/components/screens/combat/hooks/useCombatAttackMovement.d.ts.map +1 -1
  96. package/lib/components/screens/combat/hooks/useCombatAttackMovement.js.map +1 -1
  97. package/lib/components/screens/combat/hooks/useCombatAudio.d.ts.map +1 -1
  98. package/lib/components/screens/combat/hooks/useCombatAudio.js.map +1 -1
  99. package/lib/components/screens/combat/hooks/useCombatLayout.d.ts.map +1 -1
  100. package/lib/components/screens/combat/hooks/useCombatLayout.js.map +1 -1
  101. package/lib/components/screens/combat/hooks/useCombatState.d.ts.map +1 -1
  102. package/lib/components/screens/combat/hooks/useCombatState.js.map +1 -1
  103. package/lib/components/screens/combat/hooks/useGrapplingAudio.d.ts.map +1 -1
  104. package/lib/components/screens/combat/hooks/usePreloadCombatAudio.d.ts.map +1 -1
  105. package/lib/components/screens/controls/ControlsScreen3D.d.ts.map +1 -1
  106. package/lib/components/screens/controls/ControlsScreen3D.js.map +1 -1
  107. package/lib/components/screens/controls/components/ControlBindingsOverlayHtml.d.ts.map +1 -1
  108. package/lib/components/screens/controls/components/ControlBindingsOverlayHtml.js.map +1 -1
  109. package/lib/components/screens/controls/components/GamepadVisualization3D.d.ts.map +1 -1
  110. package/lib/components/screens/controls/components/GamepadVisualization3D.js.map +1 -1
  111. package/lib/components/screens/controls/components/InteractiveControlDemoOverlayHtml.d.ts.map +1 -1
  112. package/lib/components/screens/controls/components/InteractiveControlDemoOverlayHtml.js.map +1 -1
  113. package/lib/components/screens/controls/components/Key3D.d.ts.map +1 -1
  114. package/lib/components/screens/controls/components/Key3D.js.map +1 -1
  115. package/lib/components/screens/controls/components/VisualKeyboard3D.d.ts.map +1 -1
  116. package/lib/components/screens/controls/components/VisualKeyboard3D.js.map +1 -1
  117. package/lib/components/screens/controls/constants/ControlsConstants.d.ts.map +1 -1
  118. package/lib/components/screens/controls/constants/ControlsConstants.js.map +1 -1
  119. package/lib/components/screens/controls/hooks/useControlsState.d.ts.map +1 -1
  120. package/lib/components/screens/controls/hooks/useControlsState.js.map +1 -1
  121. package/lib/components/screens/endscreen/EndScreen3D.d.ts.map +1 -1
  122. package/lib/components/screens/endscreen/EndScreen3D.js.map +1 -1
  123. package/lib/components/screens/endscreen/components/DefeatAnimation3D.d.ts.map +1 -1
  124. package/lib/components/screens/endscreen/components/DefeatAnimation3D.js.map +1 -1
  125. package/lib/components/screens/endscreen/components/NavigationButtonsOverlayHtml.d.ts.map +1 -1
  126. package/lib/components/screens/endscreen/components/NavigationButtonsOverlayHtml.js.map +1 -1
  127. package/lib/components/screens/endscreen/components/PerformanceBreakdownOverlayHtml.d.ts.map +1 -1
  128. package/lib/components/screens/endscreen/components/PerformanceBreakdownOverlayHtml.js.map +1 -1
  129. package/lib/components/screens/endscreen/components/PerformanceRatingOverlayHtml.d.ts.map +1 -1
  130. package/lib/components/screens/endscreen/components/PerformanceRatingOverlayHtml.js.map +1 -1
  131. package/lib/components/screens/endscreen/components/VictoryAnimation3D.d.ts.map +1 -1
  132. package/lib/components/screens/endscreen/components/VictoryAnimation3D.js.map +1 -1
  133. package/lib/components/screens/endscreen/components/WinnerDisplayOverlayHtml.d.ts.map +1 -1
  134. package/lib/components/screens/endscreen/components/WinnerDisplayOverlayHtml.js.map +1 -1
  135. package/lib/components/screens/endscreen/components/index.d.ts.map +1 -1
  136. package/lib/components/screens/endscreen/index.d.ts.map +1 -1
  137. package/lib/components/screens/intro/IntroScreen3D.d.ts.map +1 -1
  138. package/lib/components/screens/intro/IntroScreen3D.js +1 -1
  139. package/lib/components/screens/intro/IntroScreen3D.js.map +1 -1
  140. package/lib/components/screens/intro/components/AbilityListOverlayHtml.d.ts.map +1 -1
  141. package/lib/components/screens/intro/components/AbilityListOverlayHtml.js.map +1 -1
  142. package/lib/components/screens/intro/components/ArchetypeCardGridOverlayHtml.d.ts.map +1 -1
  143. package/lib/components/screens/intro/components/ArchetypeCardGridOverlayHtml.js.map +1 -1
  144. package/lib/components/screens/intro/components/ArchetypeCardOverlayHtml.d.ts.map +1 -1
  145. package/lib/components/screens/intro/components/ArchetypeCardOverlayHtml.js.map +1 -1
  146. package/lib/components/screens/intro/components/ArchetypeDisplayOverlayHtml.d.ts.map +1 -1
  147. package/lib/components/screens/intro/components/ArchetypeDisplayOverlayHtml.js.map +1 -1
  148. package/lib/components/screens/intro/components/EnhancedArchetypeDisplayOverlayHtml.d.ts.map +1 -1
  149. package/lib/components/screens/intro/components/EnhancedArchetypeDisplayOverlayHtml.js.map +1 -1
  150. package/lib/components/screens/intro/components/MenuButtonsOverlayHtml.d.ts.map +1 -1
  151. package/lib/components/screens/intro/components/MenuButtonsOverlayHtml.js.map +1 -1
  152. package/lib/components/screens/intro/components/MenuSectionOverlayHtml.d.ts.map +1 -1
  153. package/lib/components/screens/intro/components/MenuSectionOverlayHtml.js.map +1 -1
  154. package/lib/components/screens/intro/components/StatBarOverlayHtml.d.ts.map +1 -1
  155. package/lib/components/screens/intro/components/StatBarOverlayHtml.js.map +1 -1
  156. package/lib/components/screens/philosophy/PhilosophyScreen3D.d.ts.map +1 -1
  157. package/lib/components/screens/philosophy/PhilosophyScreen3D.js.map +1 -1
  158. package/lib/components/screens/philosophy/components/InteractiveTrigramGridOverlayHtml.d.ts +0 -1
  159. package/lib/components/screens/philosophy/components/InteractiveTrigramGridOverlayHtml.d.ts.map +1 -1
  160. package/lib/components/screens/philosophy/components/PhilosophyNavigationOverlayHtml.d.ts +0 -1
  161. package/lib/components/screens/philosophy/components/PhilosophyNavigationOverlayHtml.d.ts.map +1 -1
  162. package/lib/components/screens/philosophy/components/PhilosophySectionOverlayHtml.d.ts +0 -1
  163. package/lib/components/screens/philosophy/components/PhilosophySectionOverlayHtml.d.ts.map +1 -1
  164. package/lib/components/screens/philosophy/components/PhilosophyTextOverlayHtml.d.ts +0 -1
  165. package/lib/components/screens/philosophy/components/PhilosophyTextOverlayHtml.d.ts.map +1 -1
  166. package/lib/components/screens/philosophy/components/TrigramSymbol3D.d.ts +0 -1
  167. package/lib/components/screens/philosophy/components/TrigramSymbol3D.d.ts.map +1 -1
  168. package/lib/components/screens/philosophy/components/TrigramVisualization3D.d.ts +0 -1
  169. package/lib/components/screens/philosophy/components/TrigramVisualization3D.d.ts.map +1 -1
  170. package/lib/components/screens/philosophy/hooks/usePhilosophyState.d.ts +0 -1
  171. package/lib/components/screens/philosophy/hooks/usePhilosophyState.d.ts.map +1 -1
  172. package/lib/components/screens/training/TrainingScreen3D.d.ts.map +1 -1
  173. package/lib/components/screens/training/TrainingScreen3D.js.map +1 -1
  174. package/lib/components/screens/training/components/AnatomyControlsOverlayHtml.d.ts.map +1 -1
  175. package/lib/components/screens/training/components/AnatomyControlsOverlayHtml.js.map +1 -1
  176. package/lib/components/screens/training/components/AnatomyOverlay3D.d.ts.map +1 -1
  177. package/lib/components/screens/training/components/AnatomyOverlay3D.js.map +1 -1
  178. package/lib/components/screens/training/components/DamageNumber3D.d.ts.map +1 -1
  179. package/lib/components/screens/training/components/FootPlacementMarkers3D.d.ts.map +1 -1
  180. package/lib/components/screens/training/components/FootPlacementMarkers3D.js.map +1 -1
  181. package/lib/components/screens/training/components/FootworkDrillsOverlayHtml.d.ts.map +1 -1
  182. package/lib/components/screens/training/components/FootworkDrillsOverlayHtml.js.map +1 -1
  183. package/lib/components/screens/training/components/HitFeedbackEffect3D.d.ts.map +1 -1
  184. package/lib/components/screens/training/components/HitFeedbackEffect3D.js.map +1 -1
  185. package/lib/components/screens/training/components/TrainingAICharacter3D.d.ts.map +1 -1
  186. package/lib/components/screens/training/components/TrainingArena3D.d.ts.map +1 -1
  187. package/lib/components/screens/training/components/TrainingControlsOverlayHtml.d.ts.map +1 -1
  188. package/lib/components/screens/training/components/TrainingControlsOverlayHtml.js.map +1 -1
  189. package/lib/components/screens/training/components/TrainingDummy3D.d.ts.map +1 -1
  190. package/lib/components/screens/training/components/TrainingDummy3D.js.map +1 -1
  191. package/lib/components/screens/training/components/TrainingFeedbackOverlayHtml.d.ts.map +1 -1
  192. package/lib/components/screens/training/components/TrainingFeedbackOverlayHtml.js.map +1 -1
  193. package/lib/components/screens/training/components/TrainingHitEffects3D.d.ts.map +1 -1
  194. package/lib/components/screens/training/components/TrainingModeSelectorOverlayHtml.d.ts.map +1 -1
  195. package/lib/components/screens/training/components/TrainingModeSelectorOverlayHtml.js.map +1 -1
  196. package/lib/components/screens/training/components/TrainingStatsOverlayHtml.d.ts.map +1 -1
  197. package/lib/components/screens/training/components/TrainingStatsOverlayHtml.js.map +1 -1
  198. package/lib/components/screens/training/components/VitalPointMarker3D.d.ts.map +1 -1
  199. package/lib/components/screens/training/components/VitalPointMarker3D.js.map +1 -1
  200. package/lib/components/screens/training/components/VitalPointTrainingOverlayHtml.d.ts.map +1 -1
  201. package/lib/components/screens/training/components/VitalPointTrainingOverlayHtml.js.map +1 -1
  202. package/lib/components/screens/training/components/hud/TrainingBottomHUD.d.ts.map +1 -1
  203. package/lib/components/screens/training/components/hud/TrainingBottomHUD.js.map +1 -1
  204. package/lib/components/screens/training/components/hud/TrainingLeftHUD.d.ts.map +1 -1
  205. package/lib/components/screens/training/components/hud/TrainingLeftHUD.js.map +1 -1
  206. package/lib/components/screens/training/components/hud/TrainingRightHUD.d.ts.map +1 -1
  207. package/lib/components/screens/training/components/hud/TrainingRightHUD.js.map +1 -1
  208. package/lib/components/screens/training/components/hud/TrainingTopHUD.d.ts.map +1 -1
  209. package/lib/components/screens/training/components/hud/TrainingTopHUD.js.map +1 -1
  210. package/lib/components/screens/training/components/index.d.ts.map +1 -1
  211. package/lib/components/screens/training/hooks/useAttackMovement.d.ts.map +1 -1
  212. package/lib/components/screens/training/hooks/useAttackMovement.js.map +1 -1
  213. package/lib/components/screens/training/hooks/useTrainingActions.d.ts.map +1 -1
  214. package/lib/components/screens/training/hooks/useTrainingActions.js.map +1 -1
  215. package/lib/components/screens/training/hooks/useTrainingLayout.d.ts.map +1 -1
  216. package/lib/components/screens/training/hooks/useTrainingLayout.js.map +1 -1
  217. package/lib/components/screens/training/hooks/useTrainingState.d.ts.map +1 -1
  218. package/lib/components/screens/training/hooks/useTrainingState.js.map +1 -1
  219. package/lib/components/shared/base/AccessibilityProvider.d.ts.map +1 -1
  220. package/lib/components/shared/base/BaseButton.d.ts.map +1 -1
  221. package/lib/components/shared/base/BaseButton.js.map +1 -1
  222. package/lib/components/shared/base/BaseButtonOverlayHtml.d.ts.map +1 -1
  223. package/lib/components/shared/base/BaseButtonOverlayHtml.js.map +1 -1
  224. package/lib/components/shared/base/BasePanel.d.ts.map +1 -1
  225. package/lib/components/shared/base/BasePanel.js.map +1 -1
  226. package/lib/components/shared/base/BaseText.d.ts.map +1 -1
  227. package/lib/components/shared/base/BaseText.js.map +1 -1
  228. package/lib/components/shared/base/ResponsiveContainer.d.ts.map +1 -1
  229. package/lib/components/shared/base/index.d.ts.map +1 -1
  230. package/lib/components/shared/base/useKoreanTheme.d.ts.map +1 -1
  231. package/lib/components/shared/base/useKoreanTheme.js.map +1 -1
  232. package/lib/components/shared/debug/PerformanceDebugOverlayHtml.d.ts.map +1 -1
  233. package/lib/components/shared/debug/PerformanceDebugOverlayHtml.js.map +1 -1
  234. package/lib/components/shared/effects/ScreenFlash.d.ts.map +1 -1
  235. package/lib/components/shared/mobile/ActionButtons.d.ts.map +1 -1
  236. package/lib/components/shared/mobile/ActionButtons.js +0 -1
  237. package/lib/components/shared/mobile/ActionButtons.js.map +1 -1
  238. package/lib/components/shared/mobile/GestureRecognizerPure.d.ts +0 -1
  239. package/lib/components/shared/mobile/GestureRecognizerPure.d.ts.map +1 -1
  240. package/lib/components/shared/mobile/GestureRecognizerPure.js +0 -1
  241. package/lib/components/shared/mobile/GestureRecognizerPure.js.map +1 -1
  242. package/lib/components/shared/mobile/HapticController.d.ts +0 -13
  243. package/lib/components/shared/mobile/HapticController.d.ts.map +1 -1
  244. package/lib/components/shared/mobile/HapticController.js +0 -10
  245. package/lib/components/shared/mobile/HapticController.js.map +1 -1
  246. package/lib/components/shared/mobile/MobileControlsPure.d.ts.map +1 -1
  247. package/lib/components/shared/mobile/MobileControlsPure.js.map +1 -1
  248. package/lib/components/shared/mobile/PerformanceMonitor.d.ts +0 -15
  249. package/lib/components/shared/mobile/PerformanceMonitor.d.ts.map +1 -1
  250. package/lib/components/shared/mobile/StanceWheelPure.d.ts +0 -1
  251. package/lib/components/shared/mobile/StanceWheelPure.d.ts.map +1 -1
  252. package/lib/components/shared/mobile/StanceWheelPure.js +0 -1
  253. package/lib/components/shared/mobile/StanceWheelPure.js.map +1 -1
  254. package/lib/components/shared/mobile/TouchOptimizer.d.ts +0 -4
  255. package/lib/components/shared/mobile/TouchOptimizer.d.ts.map +1 -1
  256. package/lib/components/shared/mobile/TouchOptimizer.js +0 -3
  257. package/lib/components/shared/mobile/TouchOptimizer.js.map +1 -1
  258. package/lib/components/shared/mobile/VirtualDPad.d.ts.map +1 -1
  259. package/lib/components/shared/mobile/VirtualDPad.js +0 -1
  260. package/lib/components/shared/mobile/VirtualDPad.js.map +1 -1
  261. package/lib/components/shared/mobile/index.d.ts.map +1 -1
  262. package/lib/components/shared/three/anatomy/BodySurface.d.ts.map +1 -1
  263. package/lib/components/shared/three/anatomy/BodySurface.js.map +1 -1
  264. package/lib/components/shared/three/anatomy/BoneAttachedMuscles.d.ts.map +1 -1
  265. package/lib/components/shared/three/anatomy/BoneAttachedMuscles.js.map +1 -1
  266. package/lib/components/shared/three/anatomy/BoneClothing.d.ts.map +1 -1
  267. package/lib/components/shared/three/anatomy/BoneClothing.js.map +1 -1
  268. package/lib/components/shared/three/anatomy/BoneRenderer.d.ts +0 -1
  269. package/lib/components/shared/three/anatomy/BoneRenderer.d.ts.map +1 -1
  270. package/lib/components/shared/three/anatomy/BoneRenderer.js.map +1 -1
  271. package/lib/components/shared/three/anatomy/Face3D.d.ts.map +1 -1
  272. package/lib/components/shared/three/anatomy/Face3D.js.map +1 -1
  273. package/lib/components/shared/three/anatomy/Foot3D.d.ts +0 -1
  274. package/lib/components/shared/three/anatomy/Foot3D.d.ts.map +1 -1
  275. package/lib/components/shared/three/anatomy/Foot3D.js.map +1 -1
  276. package/lib/components/shared/three/anatomy/Hand3D.d.ts +0 -1
  277. package/lib/components/shared/three/anatomy/Hand3D.d.ts.map +1 -1
  278. package/lib/components/shared/three/anatomy/Hand3D.js.map +1 -1
  279. package/lib/components/shared/three/effects/ActionFeedback.d.ts.map +1 -1
  280. package/lib/components/shared/three/effects/ActionFeedback.js.map +1 -1
  281. package/lib/components/shared/three/effects/DamageNumbers.d.ts.map +1 -1
  282. package/lib/components/shared/three/effects/DamageNumbers.js.map +1 -1
  283. package/lib/components/shared/three/effects/ExplosiveBurstEffect3D.d.ts.map +1 -1
  284. package/lib/components/shared/three/effects/GrapplingIndicator3D.d.ts.map +1 -1
  285. package/lib/components/shared/three/effects/HitEffects3D.d.ts.map +1 -1
  286. package/lib/components/shared/three/effects/HitEffects3D.js.map +1 -1
  287. package/lib/components/shared/three/effects/LimbExposureIndicator3D.d.ts.map +1 -1
  288. package/lib/components/shared/three/effects/NerveDisruptionEffect3D.d.ts.map +1 -1
  289. package/lib/components/shared/three/effects/PlayerStateIndicators.d.ts.map +1 -1
  290. package/lib/components/shared/three/effects/PlayerStateIndicators.js.map +1 -1
  291. package/lib/components/shared/three/effects/StanceSymbol3D.d.ts.map +1 -1
  292. package/lib/components/shared/three/effects/StanceSymbol3D.js.map +1 -1
  293. package/lib/components/shared/three/effects/StanceTransitionEffect.d.ts.map +1 -1
  294. package/lib/components/shared/three/effects/StanceTransitionEffect.js.map +1 -1
  295. package/lib/components/shared/three/effects/ThunderEffect3D.d.ts.map +1 -1
  296. package/lib/components/shared/three/effects/VitalPointMarkers3D.d.ts.map +1 -1
  297. package/lib/components/shared/three/effects/VitalPointMarkers3D.js.map +1 -1
  298. package/lib/components/shared/three/index.d.ts.map +1 -1
  299. package/lib/components/shared/three/indicators/ElementalColorSystem.d.ts +0 -6
  300. package/lib/components/shared/three/indicators/ElementalColorSystem.d.ts.map +1 -1
  301. package/lib/components/shared/three/indicators/ElementalColorSystem.js +0 -4
  302. package/lib/components/shared/three/indicators/ElementalColorSystem.js.map +1 -1
  303. package/lib/components/shared/three/indicators/GuardIndicator.d.ts +0 -1
  304. package/lib/components/shared/three/indicators/GuardIndicator.d.ts.map +1 -1
  305. package/lib/components/shared/three/indicators/GuardIndicator.js +0 -1
  306. package/lib/components/shared/three/indicators/GuardIndicator.js.map +1 -1
  307. package/lib/components/shared/three/indicators/HapticFeedback.d.ts +0 -7
  308. package/lib/components/shared/three/indicators/HapticFeedback.d.ts.map +1 -1
  309. package/lib/components/shared/three/indicators/HapticFeedback.js +0 -2
  310. package/lib/components/shared/three/indicators/HapticFeedback.js.map +1 -1
  311. package/lib/components/shared/three/indicators/StanceChangeIndicator.d.ts +0 -1
  312. package/lib/components/shared/three/indicators/StanceChangeIndicator.d.ts.map +1 -1
  313. package/lib/components/shared/three/indicators/StanceChangeIndicator.js +0 -1
  314. package/lib/components/shared/three/indicators/StanceChangeIndicator.js.map +1 -1
  315. package/lib/components/shared/three/indicators/TrigramSymbol3D.d.ts +0 -1
  316. package/lib/components/shared/three/indicators/TrigramSymbol3D.d.ts.map +1 -1
  317. package/lib/components/shared/three/models/Player3DWithTransitions.d.ts.map +1 -1
  318. package/lib/components/shared/three/models/Player3DWithTransitions.js.map +1 -1
  319. package/lib/components/shared/three/models/SkeletalPlayer3D.d.ts.map +1 -1
  320. package/lib/components/shared/three/models/SkeletalPlayer3D.js.map +1 -1
  321. package/lib/components/shared/three/optimization/AdaptiveQuality.d.ts.map +1 -1
  322. package/lib/components/shared/three/optimization/AdaptiveQuality.js.map +1 -1
  323. package/lib/components/shared/three/optimization/InstancedGeometry.d.ts.map +1 -1
  324. package/lib/components/shared/three/optimization/LODSystem.d.ts.map +1 -1
  325. package/lib/components/shared/three/scene/AtmosphericParticles3D.d.ts.map +1 -1
  326. package/lib/components/shared/three/scene/AtmosphericParticles3D.js.map +1 -1
  327. package/lib/components/shared/three/scene/BackgroundScene3D.d.ts.map +1 -1
  328. package/lib/components/shared/three/scene/BackgroundScene3D.js.map +1 -1
  329. package/lib/components/shared/three/scene/CombatArena3D.d.ts.map +1 -1
  330. package/lib/components/shared/three/scene/CombatArena3D.js.map +1 -1
  331. package/lib/components/shared/three/scene/DebugCollision.d.ts +0 -2
  332. package/lib/components/shared/three/scene/DebugCollision.d.ts.map +1 -1
  333. package/lib/components/shared/three/scene/KoreanSignage3D.d.ts.map +1 -1
  334. package/lib/components/shared/three/scene/KoreanSignage3D.js.map +1 -1
  335. package/lib/components/shared/three/ui/ArchetypeCard.d.ts.map +1 -1
  336. package/lib/components/shared/three/ui/ArchetypeCard.js.map +1 -1
  337. package/lib/components/shared/three/ui/BodyPartHealthDisplay.d.ts.map +1 -1
  338. package/lib/components/shared/three/ui/BodyPartHealthDisplay.js.map +1 -1
  339. package/lib/components/shared/three/ui/BreathingIndicator.d.ts.map +1 -1
  340. package/lib/components/shared/three/ui/BreathingIndicator2.js.map +1 -1
  341. package/lib/components/shared/three/ui/CombatReadinessBar.d.ts.map +1 -1
  342. package/lib/components/shared/three/ui/CombatReadinessBar.js.map +1 -1
  343. package/lib/components/shared/three/ui/ComboCounter.d.ts.map +1 -1
  344. package/lib/components/shared/three/ui/ComboCounter.js.map +1 -1
  345. package/lib/components/shared/three/ui/HealthBar.d.ts.map +1 -1
  346. package/lib/components/shared/three/ui/HealthBar.js.map +1 -1
  347. package/lib/components/shared/three/ui/KoreanButton.d.ts.map +1 -1
  348. package/lib/components/shared/three/ui/KoreanButton.js.map +1 -1
  349. package/lib/components/shared/three/ui/KoreanPanel.d.ts.map +1 -1
  350. package/lib/components/shared/three/ui/KoreanPanel.js.map +1 -1
  351. package/lib/components/shared/three/ui/KoreanText.d.ts.map +1 -1
  352. package/lib/components/shared/three/ui/KoreanText.js.map +1 -1
  353. package/lib/components/shared/three/ui/MenuList.d.ts.map +1 -1
  354. package/lib/components/shared/three/ui/MenuList.js.map +1 -1
  355. package/lib/components/shared/three/ui/PlayerHUD.d.ts.map +1 -1
  356. package/lib/components/shared/three/ui/PlayerHUD.js.map +1 -1
  357. package/lib/components/shared/three/ui/ProgressBar.d.ts.map +1 -1
  358. package/lib/components/shared/three/ui/ProgressBar.js.map +1 -1
  359. package/lib/components/shared/three/ui/SpeedIndicatorHUD.d.ts +0 -1
  360. package/lib/components/shared/three/ui/SpeedIndicatorHUD.d.ts.map +1 -1
  361. package/lib/components/shared/three/ui/SpeedIndicatorHUD.js +0 -1
  362. package/lib/components/shared/three/ui/SpeedIndicatorHUD.js.map +1 -1
  363. package/lib/components/shared/three/ui/StaminaBar.d.ts.map +1 -1
  364. package/lib/components/shared/three/ui/StaminaBar.js.map +1 -1
  365. package/lib/components/shared/three/ui/TechniqueBar.d.ts.map +1 -1
  366. package/lib/components/shared/three/ui/TechniqueBar.js.map +1 -1
  367. package/lib/components/shared/three/ui/TechniqueBarContainer.d.ts.map +1 -1
  368. package/lib/components/shared/three/ui/TechniqueCard.d.ts.map +1 -1
  369. package/lib/components/shared/three/ui/TechniqueCard.js.map +1 -1
  370. package/lib/components/shared/three/ui/VitalPointOverlayControlsHtml.d.ts.map +1 -1
  371. package/lib/components/shared/three/ui/VitalPointOverlayControlsHtml.js.map +1 -1
  372. package/lib/components/shared/three/ui/VulnerabilityWindowHUD.d.ts.map +1 -1
  373. package/lib/components/shared/ui/BaseHUDContainer.d.ts.map +1 -1
  374. package/lib/components/shared/ui/BaseHUDContainer.js.map +1 -1
  375. package/lib/components/shared/ui/CombatTimer.d.ts.map +1 -1
  376. package/lib/components/shared/ui/CombatTimer.js.map +1 -1
  377. package/lib/components/shared/ui/ErrorBoundary.d.ts.map +1 -1
  378. package/lib/components/shared/ui/ErrorModal.d.ts.map +1 -1
  379. package/lib/components/shared/ui/ErrorModal.js.map +1 -1
  380. package/lib/components/shared/ui/HUDSection.d.ts.map +1 -1
  381. package/lib/components/shared/ui/LoadingState.d.ts.map +1 -1
  382. package/lib/components/shared/ui/LoadingState.js.map +1 -1
  383. package/lib/components/shared/ui/MobileHUDLayout.d.ts +0 -1
  384. package/lib/components/shared/ui/MobileHUDLayout.d.ts.map +1 -1
  385. package/lib/components/shared/ui/ResponsiveContainer.d.ts +0 -1
  386. package/lib/components/shared/ui/ResponsiveContainer.d.ts.map +1 -1
  387. package/lib/components/shared/ui/SplashScreen.d.ts.map +1 -1
  388. package/lib/components/shared/ui/SplashScreen.js +2 -2
  389. package/lib/components/shared/ui/SplashScreen.js.map +1 -1
  390. package/lib/components/shared/ui/StyledHUDPanel.d.ts.map +1 -1
  391. package/lib/components/shared/ui/VitalPointOverlayControlsPure.d.ts.map +1 -1
  392. package/lib/components/shared/ui/VitalPointOverlayControlsPure.js.map +1 -1
  393. package/lib/components/shared/ui/VolumeControl.d.ts.map +1 -1
  394. package/lib/components/shared/ui/VolumeControl.js.map +1 -1
  395. package/lib/components/shared/ui/shared/ConfirmDialog.d.ts.map +1 -1
  396. package/lib/components/shared/ui/shared/ConfirmDialog.js.map +1 -1
  397. package/lib/components/test/Hello3D.d.ts.map +1 -1
  398. package/lib/components/ui/combat/BalanceIndicatorOverlayHtml.d.ts.map +1 -1
  399. package/lib/components/ui/combat/BalanceIndicatorOverlayHtml.js.map +1 -1
  400. package/lib/components/ui/combat/ComboCounter.d.ts.map +1 -1
  401. package/lib/components/ui/combat/PressureMeter.d.ts.map +1 -1
  402. package/lib/systems/CombatSystem.d.ts +0 -6
  403. package/lib/systems/CombatSystem.d.ts.map +1 -1
  404. package/lib/systems/CombatSystem.js +0 -6
  405. package/lib/systems/CombatSystem.js.map +1 -1
  406. package/lib/systems/EffectCalculator.d.ts +0 -7
  407. package/lib/systems/EffectCalculator.d.ts.map +1 -1
  408. package/lib/systems/EffectCalculator.js +0 -4
  409. package/lib/systems/EffectCalculator.js.map +1 -1
  410. package/lib/systems/LayoutSystem.d.ts +0 -1
  411. package/lib/systems/LayoutSystem.d.ts.map +1 -1
  412. package/lib/systems/LayoutSystem.js +0 -1
  413. package/lib/systems/LayoutSystem.js.map +1 -1
  414. package/lib/systems/PlayerEffectManager.d.ts +0 -10
  415. package/lib/systems/PlayerEffectManager.d.ts.map +1 -1
  416. package/lib/systems/PlayerEffectManager.js +0 -3
  417. package/lib/systems/PlayerEffectManager.js.map +1 -1
  418. package/lib/systems/ResponsiveScaling.d.ts +0 -12
  419. package/lib/systems/ResponsiveScaling.d.ts.map +1 -1
  420. package/lib/systems/ResponsiveScaling.js +0 -12
  421. package/lib/systems/ResponsiveScaling.js.map +1 -1
  422. package/lib/systems/TrigramSystem.d.ts +0 -13
  423. package/lib/systems/TrigramSystem.d.ts.map +1 -1
  424. package/lib/systems/TrigramSystem.js +0 -13
  425. package/lib/systems/TrigramSystem.js.map +1 -1
  426. package/lib/systems/VitalPointSystem.d.ts +0 -10
  427. package/lib/systems/VitalPointSystem.d.ts.map +1 -1
  428. package/lib/systems/VitalPointSystem.js +0 -10
  429. package/lib/systems/VitalPointSystem.js.map +1 -1
  430. package/lib/systems/animation/builders/KeyframeInterpolation.d.ts +0 -4
  431. package/lib/systems/animation/builders/KeyframeInterpolation.d.ts.map +1 -1
  432. package/lib/systems/animation/builders/KeyframeInterpolation.js +0 -1
  433. package/lib/systems/animation/builders/KeyframeInterpolation.js.map +1 -1
  434. package/lib/systems/animation/builders/SkeletonRig.d.ts +0 -4
  435. package/lib/systems/animation/builders/SkeletonRig.d.ts.map +1 -1
  436. package/lib/systems/animation/builders/SkeletonRig.js +0 -3
  437. package/lib/systems/animation/builders/SkeletonRig.js.map +1 -1
  438. package/lib/systems/animation/catalogs/RecoveryAnimations.d.ts +0 -5
  439. package/lib/systems/animation/catalogs/RecoveryAnimations.d.ts.map +1 -1
  440. package/lib/systems/animation/catalogs/RecoveryAnimations.js +0 -5
  441. package/lib/systems/animation/catalogs/RecoveryAnimations.js.map +1 -1
  442. package/lib/systems/animation/core/AnimationHitTiming.d.ts +0 -6
  443. package/lib/systems/animation/core/AnimationHitTiming.d.ts.map +1 -1
  444. package/lib/systems/animation/core/AnimationHitTiming.js +0 -4
  445. package/lib/systems/animation/core/AnimationHitTiming.js.map +1 -1
  446. package/lib/systems/animation/core/AnimationTransitions.d.ts +0 -3
  447. package/lib/systems/animation/core/AnimationTransitions.d.ts.map +1 -1
  448. package/lib/systems/animation/core/AnimationTransitions.js.map +1 -1
  449. package/lib/systems/animation/core/LateralityTransform.d.ts +0 -3
  450. package/lib/systems/animation/core/LateralityTransform.d.ts.map +1 -1
  451. package/lib/systems/animation/core/LateralityTransform.js +0 -1
  452. package/lib/systems/animation/core/LateralityTransform.js.map +1 -1
  453. package/lib/systems/animation/core/RecoveryPhaseEnhancer.d.ts +0 -1
  454. package/lib/systems/animation/core/RecoveryPhaseEnhancer.d.ts.map +1 -1
  455. package/lib/systems/animation/core/RecoveryPhaseEnhancer.js.map +1 -1
  456. package/lib/systems/animation/core/TechniqueAnimationMapper.d.ts +0 -10
  457. package/lib/systems/animation/core/TechniqueAnimationMapper.d.ts.map +1 -1
  458. package/lib/systems/animation/core/TechniqueAnimationMapper.js +0 -8
  459. package/lib/systems/animation/core/TechniqueAnimationMapper.js.map +1 -1
  460. package/lib/systems/animation/core/TrigramAnimationMapping.d.ts +0 -10
  461. package/lib/systems/animation/core/TrigramAnimationMapping.d.ts.map +1 -1
  462. package/lib/systems/animation/core/TrigramStanceTransitions.d.ts +0 -2
  463. package/lib/systems/animation/core/TrigramStanceTransitions.d.ts.map +1 -1
  464. package/lib/systems/animation/core/types.d.ts +0 -39
  465. package/lib/systems/animation/core/types.d.ts.map +1 -1
  466. package/lib/systems/animation/core/types.js +0 -9
  467. package/lib/systems/animation/core/types.js.map +1 -1
  468. package/lib/systems/animation/systems/AdvancedJointMovements.d.ts +0 -27
  469. package/lib/systems/animation/systems/AdvancedJointMovements.d.ts.map +1 -1
  470. package/lib/systems/animation/systems/AdvancedJointMovements.js +0 -1
  471. package/lib/systems/animation/systems/AdvancedJointMovements.js.map +1 -1
  472. package/lib/systems/animation/systems/BodyFacingSystem.d.ts +0 -19
  473. package/lib/systems/animation/systems/BodyFacingSystem.d.ts.map +1 -1
  474. package/lib/systems/animation/systems/BodyFacingSystem.js +0 -14
  475. package/lib/systems/animation/systems/BodyFacingSystem.js.map +1 -1
  476. package/lib/systems/animation/systems/FacialExpressions.d.ts +0 -10
  477. package/lib/systems/animation/systems/FacialExpressions.d.ts.map +1 -1
  478. package/lib/systems/animation/systems/FacialExpressions.js +0 -2
  479. package/lib/systems/animation/systems/FacialExpressions.js.map +1 -1
  480. package/lib/systems/animation/systems/FallAnimations.d.ts +0 -4
  481. package/lib/systems/animation/systems/FallAnimations.d.ts.map +1 -1
  482. package/lib/systems/animation/systems/FallAnimations.js +0 -2
  483. package/lib/systems/animation/systems/FallAnimations.js.map +1 -1
  484. package/lib/systems/animation/systems/HeadMovements.d.ts +0 -10
  485. package/lib/systems/animation/systems/HeadMovements.d.ts.map +1 -1
  486. package/lib/systems/bodypart/BodyPartDamageIntegration.d.ts +0 -7
  487. package/lib/systems/bodypart/BodyPartDamageIntegration.d.ts.map +1 -1
  488. package/lib/systems/bodypart/BodyPartDamageIntegration.js +0 -7
  489. package/lib/systems/bodypart/BodyPartDamageIntegration.js.map +1 -1
  490. package/lib/systems/bodypart/BodyPartHealthSystem.d.ts +0 -13
  491. package/lib/systems/bodypart/BodyPartHealthSystem.d.ts.map +1 -1
  492. package/lib/systems/bodypart/BodyPartHealthSystem.js +0 -13
  493. package/lib/systems/bodypart/BodyPartHealthSystem.js.map +1 -1
  494. package/lib/systems/bodypart/BodyPartPositionMapping.d.ts +0 -6
  495. package/lib/systems/bodypart/BodyPartPositionMapping.d.ts.map +1 -1
  496. package/lib/systems/bodypart/BodyPartPositionMapping.js +0 -6
  497. package/lib/systems/bodypart/BodyPartPositionMapping.js.map +1 -1
  498. package/lib/systems/bodypart/CombatInjuryIntegration.d.ts +0 -10
  499. package/lib/systems/bodypart/CombatInjuryIntegration.d.ts.map +1 -1
  500. package/lib/systems/bodypart/CombatInjuryIntegration.js +0 -8
  501. package/lib/systems/bodypart/CombatInjuryIntegration.js.map +1 -1
  502. package/lib/systems/bodypart/InjuryIntegration.d.ts +0 -2
  503. package/lib/systems/bodypart/InjuryIntegration.d.ts.map +1 -1
  504. package/lib/systems/bodypart/InjuryIntegration.js +0 -2
  505. package/lib/systems/bodypart/InjuryIntegration.js.map +1 -1
  506. package/lib/systems/bodypart/InjuryTracker.d.ts +0 -14
  507. package/lib/systems/bodypart/InjuryTracker.d.ts.map +1 -1
  508. package/lib/systems/bodypart/InjuryTracker.js +0 -12
  509. package/lib/systems/bodypart/InjuryTracker.js.map +1 -1
  510. package/lib/systems/bodypart/MovementPenaltySystem.d.ts +0 -8
  511. package/lib/systems/bodypart/MovementPenaltySystem.d.ts.map +1 -1
  512. package/lib/systems/bodypart/MovementPenaltySystem.js +0 -8
  513. package/lib/systems/bodypart/MovementPenaltySystem.js.map +1 -1
  514. package/lib/systems/bodypart/PlayerInjuryTrackingManager.d.ts +0 -8
  515. package/lib/systems/bodypart/PlayerInjuryTrackingManager.d.ts.map +1 -1
  516. package/lib/systems/bodypart/PlayerInjuryTrackingManager.js +0 -8
  517. package/lib/systems/bodypart/PlayerInjuryTrackingManager.js.map +1 -1
  518. package/lib/systems/bodypart/types.d.ts +0 -13
  519. package/lib/systems/bodypart/types.d.ts.map +1 -1
  520. package/lib/systems/bodypart/types.js +0 -5
  521. package/lib/systems/bodypart/types.js.map +1 -1
  522. package/lib/systems/breathing/BreathingDisruptionSystem.d.ts +0 -3
  523. package/lib/systems/breathing/BreathingDisruptionSystem.d.ts.map +1 -1
  524. package/lib/systems/breathing/BreathingDisruptionSystem.js +0 -2
  525. package/lib/systems/breathing/BreathingDisruptionSystem.js.map +1 -1
  526. package/lib/systems/combat/BalanceSystem.d.ts +0 -25
  527. package/lib/systems/combat/BalanceSystem.d.ts.map +1 -1
  528. package/lib/systems/combat/BalanceSystem.js +0 -25
  529. package/lib/systems/combat/BalanceSystem.js.map +1 -1
  530. package/lib/systems/combat/BreakingStatusEffects.d.ts +0 -4
  531. package/lib/systems/combat/BreakingStatusEffects.d.ts.map +1 -1
  532. package/lib/systems/combat/BreakingStatusEffects.js +0 -3
  533. package/lib/systems/combat/BreakingStatusEffects.js.map +1 -1
  534. package/lib/systems/combat/CombatStateSystem.d.ts +0 -9
  535. package/lib/systems/combat/CombatStateSystem.d.ts.map +1 -1
  536. package/lib/systems/combat/CombatStateSystem.js +0 -9
  537. package/lib/systems/combat/CombatStateSystem.js.map +1 -1
  538. package/lib/systems/combat/ConsciousnessSystem.d.ts +0 -16
  539. package/lib/systems/combat/ConsciousnessSystem.d.ts.map +1 -1
  540. package/lib/systems/combat/ConsciousnessSystem.js +0 -16
  541. package/lib/systems/combat/ConsciousnessSystem.js.map +1 -1
  542. package/lib/systems/combat/FallIntegration.d.ts +0 -3
  543. package/lib/systems/combat/FallIntegration.d.ts.map +1 -1
  544. package/lib/systems/combat/FallIntegration.js +0 -3
  545. package/lib/systems/combat/FallIntegration.js.map +1 -1
  546. package/lib/systems/combat/GrappleSystem.d.ts +0 -2
  547. package/lib/systems/combat/GrappleSystem.d.ts.map +1 -1
  548. package/lib/systems/combat/GrappleSystem.js +0 -2
  549. package/lib/systems/combat/GrappleSystem.js.map +1 -1
  550. package/lib/systems/combat/LimbExposureSystem.d.ts +0 -7
  551. package/lib/systems/combat/LimbExposureSystem.d.ts.map +1 -1
  552. package/lib/systems/combat/LimbExposureSystem.js +0 -7
  553. package/lib/systems/combat/LimbExposureSystem.js.map +1 -1
  554. package/lib/systems/combat/PainResponseSystem.d.ts +0 -11
  555. package/lib/systems/combat/PainResponseSystem.d.ts.map +1 -1
  556. package/lib/systems/combat/PainResponseSystem.js +0 -11
  557. package/lib/systems/combat/PainResponseSystem.js.map +1 -1
  558. package/lib/systems/combat/painConsciousnessUtils.d.ts +0 -7
  559. package/lib/systems/combat/painConsciousnessUtils.d.ts.map +1 -1
  560. package/lib/systems/combat/painConsciousnessUtils.js +0 -7
  561. package/lib/systems/combat/painConsciousnessUtils.js.map +1 -1
  562. package/lib/systems/effects.d.ts +11 -0
  563. package/lib/systems/effects.d.ts.map +1 -1
  564. package/lib/systems/effects.js +10 -0
  565. package/lib/systems/effects.js.map +1 -1
  566. package/lib/systems/game.d.ts +16 -0
  567. package/lib/systems/game.d.ts.map +1 -1
  568. package/lib/systems/game.js +1 -0
  569. package/lib/systems/game.js.map +1 -1
  570. package/lib/systems/index.d.ts +5 -1
  571. package/lib/systems/index.d.ts.map +1 -1
  572. package/lib/systems/index.js.map +1 -1
  573. package/lib/systems/movement/InjuryMovementModifier.d.ts +0 -10
  574. package/lib/systems/movement/InjuryMovementModifier.d.ts.map +1 -1
  575. package/lib/systems/movement/InjuryMovementModifier.js +0 -7
  576. package/lib/systems/movement/InjuryMovementModifier.js.map +1 -1
  577. package/lib/systems/movement/integration.d.ts +0 -3
  578. package/lib/systems/movement/integration.d.ts.map +1 -1
  579. package/lib/systems/movement/integration.js +0 -3
  580. package/lib/systems/movement/integration.js.map +1 -1
  581. package/lib/systems/physics/AttackMovementPhysics.d.ts +0 -9
  582. package/lib/systems/physics/AttackMovementPhysics.d.ts.map +1 -1
  583. package/lib/systems/physics/AttackMovementPhysics.js +0 -7
  584. package/lib/systems/physics/AttackMovementPhysics.js.map +1 -1
  585. package/lib/systems/physics/CollisionDetection.d.ts +0 -6
  586. package/lib/systems/physics/CollisionDetection.d.ts.map +1 -1
  587. package/lib/systems/physics/CollisionDetection.js +0 -6
  588. package/lib/systems/physics/CollisionDetection.js.map +1 -1
  589. package/lib/systems/physics/CoordinateMapper.d.ts +0 -1
  590. package/lib/systems/physics/CoordinateMapper.d.ts.map +1 -1
  591. package/lib/systems/physics/CoordinateMapper.js +0 -1
  592. package/lib/systems/physics/CoordinateMapper.js.map +1 -1
  593. package/lib/systems/physics/KnockbackPhysics.d.ts +0 -11
  594. package/lib/systems/physics/KnockbackPhysics.d.ts.map +1 -1
  595. package/lib/systems/physics/KnockbackPhysics.js +0 -8
  596. package/lib/systems/physics/KnockbackPhysics.js.map +1 -1
  597. package/lib/systems/physics/MovementPhysics.d.ts +0 -10
  598. package/lib/systems/physics/MovementPhysics.d.ts.map +1 -1
  599. package/lib/systems/physics/MovementPhysics.js +0 -8
  600. package/lib/systems/physics/MovementPhysics.js.map +1 -1
  601. package/lib/systems/physics/PhysicalReachCalculator.d.ts +0 -6
  602. package/lib/systems/physics/PhysicalReachCalculator.d.ts.map +1 -1
  603. package/lib/systems/physics/PhysicalReachCalculator.js +0 -5
  604. package/lib/systems/physics/PhysicalReachCalculator.js.map +1 -1
  605. package/lib/systems/physics/SpeedModifierSystem.d.ts +0 -5
  606. package/lib/systems/physics/SpeedModifierSystem.d.ts.map +1 -1
  607. package/lib/systems/physics/SpeedModifierSystem.js +0 -4
  608. package/lib/systems/physics/SpeedModifierSystem.js.map +1 -1
  609. package/lib/systems/player.d.ts +0 -5
  610. package/lib/systems/player.d.ts.map +1 -1
  611. package/lib/systems/trigram/TrigramCalculator.d.ts +0 -1
  612. package/lib/systems/trigram/TrigramCalculator.d.ts.map +1 -1
  613. package/lib/systems/trigram/TrigramCalculator.js +0 -1
  614. package/lib/systems/trigram/TrigramCalculator.js.map +1 -1
  615. package/lib/systems/trigram/types.d.ts +0 -4
  616. package/lib/systems/trigram/types.d.ts.map +1 -1
  617. package/lib/systems/trigram/types.js +0 -2
  618. package/lib/systems/trigram/types.js.map +1 -1
  619. package/lib/systems/types.d.ts +7 -2
  620. package/lib/systems/types.d.ts.map +1 -1
  621. package/lib/systems/types.js.map +1 -1
  622. package/lib/systems/vitalpoint/DamageCalculator.d.ts +0 -3
  623. package/lib/systems/vitalpoint/DamageCalculator.d.ts.map +1 -1
  624. package/lib/systems/vitalpoint/DamageCalculator.js +0 -3
  625. package/lib/systems/vitalpoint/DamageCalculator.js.map +1 -1
  626. package/lib/systems/vitalpoint/KoreanVitalPoints.d.ts +0 -8
  627. package/lib/systems/vitalpoint/KoreanVitalPoints.d.ts.map +1 -1
  628. package/lib/systems/vitalpoint/KoreanVitalPoints.js +0 -8
  629. package/lib/systems/vitalpoint/KoreanVitalPoints.js.map +1 -1
  630. package/lib/systems/vitalpoint/VitalPointsData.d.ts +0 -3
  631. package/lib/systems/vitalpoint/VitalPointsData.d.ts.map +1 -1
  632. package/lib/systems/vitalpoint/VitalPointsData.js +0 -1
  633. package/lib/systems/vitalpoint/VitalPointsData.js.map +1 -1
  634. package/lib/types/PhysicsTypes.d.ts +21 -78
  635. package/lib/types/PhysicsTypes.d.ts.map +1 -1
  636. package/lib/types/PhysicsTypes.js +17 -63
  637. package/lib/types/PhysicsTypes.js.map +1 -1
  638. package/lib/types/clothing.d.ts +0 -9
  639. package/lib/types/clothing.d.ts.map +1 -1
  640. package/lib/types/constants/animations.d.ts +35 -1
  641. package/lib/types/constants/animations.d.ts.map +1 -1
  642. package/lib/types/constants/animations.js +12 -1
  643. package/lib/types/constants/animations.js.map +1 -1
  644. package/lib/types/constants/colors.d.ts +28 -2
  645. package/lib/types/constants/colors.d.ts.map +1 -1
  646. package/lib/types/constants/colors.js +30 -4
  647. package/lib/types/constants/colors.js.map +1 -1
  648. package/lib/types/constants/index.d.ts +5 -1
  649. package/lib/types/constants/index.d.ts.map +1 -1
  650. package/lib/types/constants/index.js.map +1 -1
  651. package/lib/types/constants/performance.d.ts +0 -2
  652. package/lib/types/constants/performance.d.ts.map +1 -1
  653. package/lib/types/constants/performance.js +0 -2
  654. package/lib/types/constants/performance.js.map +1 -1
  655. package/lib/types/constants/typography.d.ts +40 -2
  656. package/lib/types/constants/typography.d.ts.map +1 -1
  657. package/lib/types/constants/typography.js +40 -2
  658. package/lib/types/constants/typography.js.map +1 -1
  659. package/lib/types/constants/ui.d.ts +89 -1
  660. package/lib/types/constants/ui.d.ts.map +1 -1
  661. package/lib/types/constants/ui.js +33 -1
  662. package/lib/types/constants/ui.js.map +1 -1
  663. package/lib/types/facial.d.ts +0 -15
  664. package/lib/types/facial.d.ts.map +1 -1
  665. package/lib/types/facial.js +0 -8
  666. package/lib/types/facial.js.map +1 -1
  667. package/lib/types/hand-animation.d.ts +34 -147
  668. package/lib/types/hand-animation.d.ts.map +1 -1
  669. package/lib/types/hand-animation.js +0 -2
  670. package/lib/types/hand-animation.js.map +1 -1
  671. package/lib/types/injury.d.ts +0 -2
  672. package/lib/types/injury.d.ts.map +1 -1
  673. package/lib/types/injury.js +0 -1
  674. package/lib/types/injury.js.map +1 -1
  675. package/lib/types/physics.d.ts +0 -21
  676. package/lib/types/physics.d.ts.map +1 -1
  677. package/lib/types/physics.js +0 -6
  678. package/lib/types/physics.js.map +1 -1
  679. package/lib/types/physicsConstants.d.ts +0 -12
  680. package/lib/types/physicsConstants.d.ts.map +1 -1
  681. package/lib/types/physicsConstants.js +0 -12
  682. package/lib/types/physicsConstants.js.map +1 -1
  683. package/lib/types/player-visual.d.ts +45 -189
  684. package/lib/types/player-visual.d.ts.map +1 -1
  685. package/lib/types/technique.d.ts +1 -5
  686. package/lib/types/technique.d.ts.map +1 -1
  687. package/lib/types/techniqueId.d.ts +0 -1
  688. package/lib/types/techniqueId.d.ts.map +1 -1
  689. package/lib/types/techniqueId.js +0 -1
  690. package/lib/types/techniqueId.js.map +1 -1
  691. package/lib/utils/arenaWorldDimensions.d.ts +0 -11
  692. package/lib/utils/arenaWorldDimensions.d.ts.map +1 -1
  693. package/lib/utils/arenaWorldDimensions.js +0 -6
  694. package/lib/utils/arenaWorldDimensions.js.map +1 -1
  695. package/lib/utils/controlMapping.d.ts +3 -4
  696. package/lib/utils/controlMapping.d.ts.map +1 -1
  697. package/lib/utils/controlMapping.js +1 -2
  698. package/lib/utils/controlMapping.js.map +1 -1
  699. package/lib/utils/deviceDetection.d.ts +0 -5
  700. package/lib/utils/deviceDetection.d.ts.map +1 -1
  701. package/lib/utils/deviceDetection.js +0 -5
  702. package/lib/utils/deviceDetection.js.map +1 -1
  703. package/lib/utils/hapticFeedback.d.ts +23 -95
  704. package/lib/utils/hapticFeedback.d.ts.map +1 -1
  705. package/lib/utils/hapticFeedback.js +9 -39
  706. package/lib/utils/hapticFeedback.js.map +1 -1
  707. package/lib/utils/haptics.d.ts +0 -3
  708. package/lib/utils/haptics.d.ts.map +1 -1
  709. package/lib/utils/haptics.js +0 -1
  710. package/lib/utils/haptics.js.map +1 -1
  711. package/lib/utils/math.d.ts +0 -3
  712. package/lib/utils/math.d.ts.map +1 -1
  713. package/lib/utils/math.js +0 -2
  714. package/lib/utils/math.js.map +1 -1
  715. package/lib/utils/mobileLayoutHelpers.d.ts +0 -3
  716. package/lib/utils/mobileLayoutHelpers.d.ts.map +1 -1
  717. package/lib/utils/mobileLayoutHelpers.js +0 -1
  718. package/lib/utils/mobileLayoutHelpers.js.map +1 -1
  719. package/lib/utils/mobileUIUtils.d.ts +5 -100
  720. package/lib/utils/mobileUIUtils.d.ts.map +1 -1
  721. package/lib/utils/mobileUIUtils.js +0 -9
  722. package/lib/utils/mobileUIUtils.js.map +1 -1
  723. package/lib/utils/physicalAttributeValidation.d.ts.map +1 -1
  724. package/lib/utils/player3DHelpers.d.ts.map +1 -1
  725. package/lib/utils/player3DHelpers.js.map +1 -1
  726. package/lib/utils/responsiveLayoutHelpers.d.ts +0 -65
  727. package/lib/utils/responsiveLayoutHelpers.d.ts.map +1 -1
  728. package/lib/utils/responsiveLayoutHelpers.js +0 -65
  729. package/lib/utils/responsiveLayoutHelpers.js.map +1 -1
  730. package/lib/utils/responsiveOrientationConstants.d.ts +0 -7
  731. package/lib/utils/responsiveOrientationConstants.d.ts.map +1 -1
  732. package/lib/utils/responsiveOrientationConstants.js +0 -7
  733. package/lib/utils/responsiveOrientationConstants.js.map +1 -1
  734. package/lib/utils/safeAreaUtils.d.ts +0 -6
  735. package/lib/utils/safeAreaUtils.d.ts.map +1 -1
  736. package/lib/utils/safeAreaUtils.js +0 -2
  737. package/lib/utils/safeAreaUtils.js.map +1 -1
  738. package/lib/utils/sharedPhysicsConfig.d.ts +0 -4
  739. package/lib/utils/sharedPhysicsConfig.d.ts.map +1 -1
  740. package/lib/utils/sharedPhysicsConfig.js +0 -2
  741. package/lib/utils/sharedPhysicsConfig.js.map +1 -1
  742. package/lib/utils/skeletonScaling.d.ts +0 -9
  743. package/lib/utils/skeletonScaling.d.ts.map +1 -1
  744. package/lib/utils/skeletonScaling.js +0 -1
  745. package/lib/utils/skeletonScaling.js.map +1 -1
  746. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"GrappleSystem.js","names":[],"sources":["../../../src/systems/combat/GrappleSystem.ts"],"sourcesContent":["/**\n * Grappling System for Korean Martial Arts Combat\n *\n * **Korean**: 잡기 시스템 (Grapple System)\n *\n * Implements realistic grappling and takedown mechanics based on:\n * - **Hapkido (합기도)**: Joint locks and control techniques\n * - **Ssireum (씨름)**: Traditional Korean wrestling\n * - **GON Stance (곤괘)**: Earth stance grounding and control\n *\n * ## Core Mechanics\n *\n * 1. **Grab Initiation**: Establish grip on opponent's limb/body\n * 2. **Control Duration**: Maintain control with stamina cost\n * 3. **Grip Strength**: Affects escape difficulty and follow-up options\n * 4. **Escape Mechanics**: Based on strength, technique, and stamina\n * 5. **Follow-up Techniques**: Throws, takedowns, joint locks from control\n *\n * ## Phase 2 Enhancement\n *\n * Enhanced with Gon (Earth) trigram metadata integration:\n * - Uses `controlDuration` from ExtendedGonTechnique\n * - Supports authentic Ssireum/Hapkido control durations\n * - Maintains backward compatibility with non-Gon techniques\n *\n * @module systems/combat/GrappleSystem\n * @category Combat System\n * @korean 잡기시스템\n */\n\nimport type { PlayerState } from \"@/systems/player\";\nimport {\n CombatState,\n GrappleControl,\n GrappleState,\n GrappleTarget,\n TrigramStance,\n} from \"@/types\";\nimport { asExtendedGonTechnique } from \"../trigram/types/GonTechniqueExtensions\";\nimport type { KoreanTechnique } from \"../vitalpoint/types\";\n\n/**\n * Configuration for grappling mechanics.\n *\n * **Korean**: 잡기 설정 (Grapple Configuration)\n */\nexport interface GrappleConfig {\n /** Base stamina cost per second to maintain control */\n readonly baseStaminaCostPerSecond: number;\n /** Minimum grip strength to maintain control */\n readonly minGripStrength: number;\n /** Maximum grip strength value */\n readonly maxGripStrength: number;\n /** Base escape difficulty multiplier */\n readonly baseEscapeDifficulty: number;\n /** Stamina cost to attempt escape */\n readonly escapeStaminaCost: number;\n /** Minimum duration before escape is possible (ms) */\n readonly minControlDuration: number;\n}\n\n/**\n * Default grappling configuration values.\n */\nexport const DEFAULT_GRAPPLE_CONFIG: GrappleConfig = {\n baseStaminaCostPerSecond: 5,\n minGripStrength: 20,\n maxGripStrength: 100,\n baseEscapeDifficulty: 1.5,\n escapeStaminaCost: 15,\n minControlDuration: 500, // 0.5 seconds\n};\n\n/**\n * Grapple attempt result.\n *\n * **Korean**: 잡기 시도 결과 (Grapple Attempt Result)\n */\nexport interface GrappleAttemptResult {\n /** Whether the grapple was successful */\n readonly success: boolean;\n /** New grapple control state if successful */\n readonly grappleControl?: GrappleControl;\n /** Reason for failure if unsuccessful */\n readonly reason?: string;\n /** Stamina cost for the attempt */\n readonly staminaCost: number;\n}\n\n/**\n * Escape attempt result.\n *\n * **Korean**: 탈출 시도 결과 (Escape Attempt Result)\n */\nexport interface EscapeAttemptResult {\n /** Whether the escape was successful */\n readonly success: boolean;\n /** Updated grapple control state */\n readonly grappleControl: GrappleControl | null;\n /** Reason for failure if unsuccessful */\n readonly reason?: string;\n /** Stamina cost for the attempt */\n readonly staminaCost: number;\n}\n\n/**\n * Grappling System for control and hold mechanics.\n *\n * **Korean**: 잡기 시스템 (Grapple System)\n *\n * Manages grappling state between combatants, including grip strength,\n * control duration, escape mechanics, and follow-up techniques.\n */\nexport class GrappleSystem {\n private readonly config: GrappleConfig;\n\n constructor(config: Partial<GrappleConfig> = {}) {\n this.config = { ...DEFAULT_GRAPPLE_CONFIG, ...config };\n }\n\n /**\n * Attempt to initiate a grapple on target.\n *\n * **Korean**: 잡기 시도 (Attempt Grapple)\n *\n * @param attacker - Player attempting the grapple\n * @param defender - Target player\n * @param target - Body part to grapple\n * @param currentTime - Current game time in milliseconds\n * @returns Result of the grapple attempt\n */\n attemptGrapple(\n attacker: PlayerState,\n defender: PlayerState,\n target: GrappleTarget,\n currentTime: number\n ): GrappleAttemptResult {\n // Check if attacker can grapple\n if (attacker.combatState === CombatState.STUNNED) {\n return {\n success: false,\n reason: \"Attacker is stunned\",\n staminaCost: 0,\n };\n }\n\n // Check if attacker is already grappling someone else\n if (attacker.combatState === CombatState.GRAPPLING) {\n return {\n success: false,\n reason: \"Attacker is already grappling another opponent\",\n staminaCost: 0,\n };\n }\n\n if (attacker.stamina < this.config.escapeStaminaCost) {\n return {\n success: false,\n reason: \"Insufficient stamina\",\n staminaCost: 0,\n };\n }\n\n // Check if defender is already being grappled\n if (defender.combatState === CombatState.GRAPPLED) {\n return {\n success: false,\n reason: \"Target is already being grappled\",\n staminaCost: 0,\n };\n }\n\n // Calculate grip strength based on attacker attributes and stance\n const gripStrength = this.calculateGripStrength(attacker, target);\n\n // Calculate success chance based on attributes\n const successChance = this.calculateGrappleSuccessChance(\n attacker,\n defender,\n target\n );\n\n const roll = Math.random();\n const success = roll < successChance;\n\n if (success) {\n // Create grapple control - start with GRABBING state during initiation\n const grappleControl: GrappleControl = {\n state: GrappleState.GRABBING,\n target,\n controllerId: attacker.id,\n targetId: defender.id,\n gripStrength,\n duration: 0,\n startTime: currentTime,\n canEscape: false, // Initially cannot escape\n staminaCostPerSecond: this.calculateStaminaCost(target, gripStrength),\n };\n\n return {\n success: true,\n grappleControl,\n staminaCost: this.config.escapeStaminaCost,\n };\n }\n\n return {\n success: false,\n reason: `Grapple attempt failed (${Math.round(successChance * 100)}% chance)`,\n staminaCost: this.config.escapeStaminaCost * 0.5, // Half cost on failure\n };\n }\n\n /**\n * Update grapple control state over time.\n *\n * **Korean**: 잡기 업데이트 (Update Grapple)\n *\n * @param grappleControl - Current grapple control state\n * @param controller - Player maintaining control\n * @param target - Player being controlled\n * @param deltaTime - Time elapsed since last update (seconds)\n * @param currentTime - Current game time in milliseconds\n * @returns Updated grapple control or null if broken\n */\n updateGrapple(\n grappleControl: GrappleControl,\n controller: PlayerState,\n _target: PlayerState,\n deltaTime: number,\n currentTime: number\n ): GrappleControl | null {\n // Check if controller can maintain control\n if (\n controller.stamina < grappleControl.staminaCostPerSecond * deltaTime ||\n controller.combatState === CombatState.STUNNED\n ) {\n // Control broken due to stamina or state\n return null;\n }\n\n // Update duration\n const newDuration = currentTime - grappleControl.startTime;\n\n // Transition from GRABBING to CONTROLLING after initial establishment\n let newState = grappleControl.state;\n if (grappleControl.state === GrappleState.GRABBING && newDuration > 0) {\n newState = GrappleState.CONTROLLING;\n }\n\n // Decay grip strength slightly over time\n const gripDecayRate = 2; // points per second\n const rawGripStrength = grappleControl.gripStrength - gripDecayRate * deltaTime;\n\n // Check if grip strength has dropped too low\n if (rawGripStrength < this.config.minGripStrength) {\n return null;\n }\n\n const newGripStrength = rawGripStrength;\n\n // Allow escape attempts after minimum duration\n const canEscape = newDuration >= this.config.minControlDuration;\n\n return {\n ...grappleControl,\n state: newState,\n gripStrength: newGripStrength,\n duration: newDuration,\n canEscape,\n };\n }\n\n /**\n * Attempt to escape from a grapple.\n *\n * **Korean**: 탈출 시도 (Attempt Escape)\n *\n * @param grappleControl - Current grapple control state\n * @param controller - Player maintaining control\n * @param target - Player attempting to escape\n * @returns Result of the escape attempt\n */\n attemptEscape(\n grappleControl: GrappleControl,\n controller: PlayerState,\n target: PlayerState\n ): EscapeAttemptResult {\n // Check if escape is possible\n if (!grappleControl.canEscape) {\n return {\n success: false,\n grappleControl,\n reason: \"Cannot escape yet\",\n staminaCost: 0,\n };\n }\n\n // Check stamina\n if (target.stamina < this.config.escapeStaminaCost) {\n return {\n success: false,\n grappleControl,\n reason: \"Insufficient stamina\",\n staminaCost: 0,\n };\n }\n\n // Calculate escape chance\n const escapeChance = this.calculateEscapeChance(\n grappleControl,\n controller,\n target\n );\n\n const roll = Math.random();\n const success = roll < escapeChance;\n\n if (success) {\n return {\n success: true,\n grappleControl: null, // Escape successful, control broken\n staminaCost: this.config.escapeStaminaCost,\n };\n }\n\n // Escape failed, weaken grip slightly\n const weakenedGripStrength = Math.max(\n this.config.minGripStrength,\n grappleControl.gripStrength - 10\n );\n\n return {\n success: false,\n grappleControl: {\n ...grappleControl,\n gripStrength: weakenedGripStrength,\n },\n reason: `Escape failed (${Math.round(escapeChance * 100)}% chance)`,\n staminaCost: this.config.escapeStaminaCost,\n };\n }\n\n /**\n * Calculate grip strength based on attacker attributes and target.\n *\n * **Korean**: 악력 계산 (Calculate Grip Strength)\n *\n * @private\n */\n private calculateGripStrength(\n attacker: PlayerState,\n target: GrappleTarget\n ): number {\n // Base strength from attack power\n let strength = attacker.attackPower * 3;\n\n // Stance modifiers\n if (attacker.currentStance === TrigramStance.GON) {\n strength *= 1.3; // GON stance excels at grappling\n } else if (attacker.currentStance === TrigramStance.GAN) {\n strength *= 1.15; // GAN stance is also good for control\n }\n\n // Target modifiers\n switch (target) {\n case GrappleTarget.HAND:\n strength *= 1.1; // Easier to control hand\n break;\n case GrappleTarget.ARM:\n strength *= 1.0; // Standard difficulty\n break;\n case GrappleTarget.LEG:\n strength *= 0.9; // Harder to control leg\n break;\n case GrappleTarget.TORSO:\n strength *= 0.85; // Harder to control torso\n break;\n case GrappleTarget.NECK:\n strength *= 1.2; // High control but risky\n break;\n case GrappleTarget.BOTH_ARMS:\n strength *= 0.7; // Very hard to control both arms\n break;\n }\n\n return Math.min(this.config.maxGripStrength, strength);\n }\n\n /**\n * Calculate grapple success chance.\n *\n * **Korean**: 잡기 성공률 계산 (Calculate Grapple Success Chance)\n *\n * @private\n */\n private calculateGrappleSuccessChance(\n attacker: PlayerState,\n defender: PlayerState,\n target: GrappleTarget\n ): number {\n // Base chance from technique vs defense\n const attributeDiff = attacker.technique - defender.defense;\n let baseChance = 0.5 + attributeDiff * 0.02; // ±2% per point difference\n\n // Speed advantage\n if (attacker.speed > defender.speed) {\n baseChance += (attacker.speed - defender.speed) * 0.01;\n }\n\n // Stance modifiers\n if (attacker.currentStance === TrigramStance.GON) {\n baseChance += 0.15; // GON stance excels at grappling\n }\n\n if (defender.combatState === CombatState.ATTACKING) {\n baseChance += 0.2; // Easier to grapple during attack\n } else if (defender.combatState === CombatState.DEFENDING) {\n baseChance -= 0.15; // Harder to grapple defensive opponent\n }\n\n // Target difficulty\n switch (target) {\n case GrappleTarget.HAND:\n baseChance += 0.1; // Easier to grab hand\n break;\n case GrappleTarget.BOTH_ARMS:\n baseChance -= 0.2; // Much harder to grab both arms\n break;\n case GrappleTarget.NECK:\n baseChance -= 0.1; // Risky target\n break;\n }\n\n // Clamp between 0.05 and 0.95\n return Math.max(0.05, Math.min(0.95, baseChance));\n }\n\n /**\n * Calculate escape chance from grapple.\n *\n * **Korean**: 탈출 성공률 계산 (Calculate Escape Chance)\n *\n * @private\n */\n private calculateEscapeChance(\n grappleControl: GrappleControl,\n controller: PlayerState,\n target: PlayerState\n ): number {\n // Base chance from strength vs grip\n const gripFactor = grappleControl.gripStrength / this.config.maxGripStrength;\n let baseChance = 0.5 - gripFactor * 0.3; // Stronger grip = harder escape\n\n // Attribute comparison\n const strengthDiff = target.attackPower - controller.attackPower;\n baseChance += strengthDiff * 0.02;\n\n // Speed advantage helps escape\n if (target.speed > controller.speed) {\n baseChance += (target.speed - controller.speed) * 0.015;\n }\n\n // Technique helps find weaknesses in grip\n baseChance += target.technique * 0.005;\n\n // Stance modifiers - certain stances are better at escaping grapples\n // **Korean**: 곤(坤) 자세는 탈출에 유리 (+30%), 간(艮) 자세는 방어적인 탈출 (+15%)\n if (target.currentStance === TrigramStance.GON) {\n baseChance += 0.3; // GON stance excels at grounding and escape\n } else if (target.currentStance === TrigramStance.GAN) {\n baseChance += 0.15; // GAN stance has defensive escape advantage\n }\n\n // Time factor - longer control makes escape harder\n const durationSeconds = grappleControl.duration / 1000;\n const timePenalty = Math.min(0.2, durationSeconds * 0.02);\n baseChance -= timePenalty;\n\n // Clamp between 0.05 and 0.85\n return Math.max(0.05, Math.min(0.85, baseChance));\n }\n\n /**\n * Calculate stamina cost to maintain control.\n *\n * **Korean**: 체력 소모 계산 (Calculate Stamina Cost)\n *\n * @private\n */\n private calculateStaminaCost(\n target: GrappleTarget,\n gripStrength: number\n ): number {\n let cost = this.config.baseStaminaCostPerSecond;\n\n // Target affects stamina cost\n switch (target) {\n case GrappleTarget.HAND:\n cost *= 0.8; // Easier to maintain\n break;\n case GrappleTarget.ARM:\n cost *= 1.0; // Standard\n break;\n case GrappleTarget.LEG:\n cost *= 1.2; // Harder to maintain\n break;\n case GrappleTarget.TORSO:\n cost *= 1.3; // Much harder to maintain\n break;\n case GrappleTarget.NECK:\n cost *= 1.5; // Very demanding\n break;\n case GrappleTarget.BOTH_ARMS:\n cost *= 1.8; // Extremely demanding\n break;\n }\n\n // Higher grip strength costs more stamina\n const gripFactor = gripStrength / this.config.maxGripStrength;\n cost *= 0.7 + gripFactor * 0.6; // 70-130% based on grip\n\n return cost;\n }\n\n /**\n * Check if a grapple can be transitioned to a throw.\n *\n * **Korean**: 던지기 전환 확인 (Check Throw Transition)\n *\n * @param grappleControl - Current grapple control state\n * @param controller - Player attempting throw\n * @returns Whether throw transition is possible\n */\n canTransitionToThrow(\n grappleControl: GrappleControl,\n controller: PlayerState\n ): boolean {\n // Need sufficient control duration\n if (grappleControl.duration < 1000) {\n return false; // Need at least 1 second of control\n }\n\n // Need sufficient grip strength\n if (grappleControl.gripStrength < 60) {\n return false;\n }\n\n // Need sufficient stamina for throw\n if (controller.stamina < 20) {\n return false;\n }\n\n // Certain targets are better for throws\n const goodThrowTargets = [\n GrappleTarget.ARM,\n GrappleTarget.TORSO,\n GrappleTarget.BOTH_ARMS,\n ];\n\n return goodThrowTargets.includes(grappleControl.target);\n }\n\n /**\n * Check if a grapple can be transitioned to a joint lock.\n *\n * **Korean**: 관절기 전환 확인 (Check Joint Lock Transition)\n *\n * @param grappleControl - Current grapple control state\n * @param controller - Player attempting lock\n * @returns Whether joint lock transition is possible\n */\n canTransitionToJointLock(\n grappleControl: GrappleControl,\n controller: PlayerState\n ): boolean {\n // Need sufficient control duration\n if (grappleControl.duration < 800) {\n return false;\n }\n\n // Need high technique for joint locks\n if (controller.technique < 10) {\n return false;\n }\n\n // Joint locks work on limbs\n const lockTargets = [\n GrappleTarget.HAND,\n GrappleTarget.ARM,\n GrappleTarget.LEG,\n ];\n\n return lockTargets.includes(grappleControl.target);\n }\n\n /**\n * Get technique-specific control duration from Gon metadata.\n *\n * **Korean**: 기술별 제어 시간 조회 (Get Technique Control Duration)\n *\n * Retrieves the post-throw positional advantage duration from\n * ExtendedGonTechnique metadata. Falls back to default duration\n * if technique doesn't have Gon-specific enhancements.\n *\n * **Control Duration Philosophy**:\n * - Traditional Ssireum techniques (800-2000ms) provide longer control\n * - Aggressive slam techniques (800-1200ms) provide brief control\n * - Sacrifice throws (1500-2000ms) provide extended ground control\n *\n * **Use Cases**:\n * - Determining follow-up attack windows after throws\n * - Calculating defender recovery time before counterattack\n * - Applying post-throw positional advantage in game state\n *\n * @param technique - Korean martial arts technique (checks for ExtendedGonTechnique)\n * @param defaultDuration - Fallback duration if technique has no metadata (default: 1000ms)\n * @returns Control duration in milliseconds\n *\n * @example\n * ```typescript\n * const controlTime = grappleSystem.getTechniqueControlDuration(\n * ssireumThrowTechnique, // controlDuration: 1800\n * 1000 // default fallback\n * );\n * // Result: 1800ms (uses technique metadata)\n * ```\n *\n * @public\n * @korean 기술별제어시간조회\n */\n getTechniqueControlDuration(\n technique: KoreanTechnique,\n defaultDuration: number = 1000,\n ): number {\n // Use helper function for safe type casting\n const gonTechnique = asExtendedGonTechnique(technique);\n if (!gonTechnique) {\n // Non-Gon technique: use default duration\n return defaultDuration;\n }\n\n // Extract control duration from validated Gon technique\n return gonTechnique.controlDuration;\n }\n\n /**\n * Apply post-throw control advantage window.\n *\n * **Korean**: 던지기 후 우세 적용 (Apply Post-Throw Advantage)\n *\n * Creates a control advantage state after a successful throw,\n * using the technique's `controlDuration` to determine how long\n * the attacker maintains positional dominance.\n *\n * **Advantage Effects**:\n * - Attacker gains priority for follow-up attacks\n * - Defender must wait for control duration to expire\n * - Applies to throw transitions from grapple control\n *\n * @param technique - Throw technique executed\n * @param attackerId - Player who executed throw\n * @param defenderId - Player who was thrown\n * @param currentTime - Current game time in milliseconds\n * @returns Control advantage state with duration from technique metadata\n *\n * @example\n * ```typescript\n * const advantage = grappleSystem.applyPostThrowAdvantage(\n * ssireumThrowTechnique,\n * \"player1\",\n * \"player2\",\n * Date.now()\n * );\n * // advantage.duration = 1800ms (from technique metadata)\n * ```\n *\n * @public\n * @korean 던지기후우세적용\n */\n applyPostThrowAdvantage(\n technique: KoreanTechnique,\n attackerId: string,\n defenderId: string,\n currentTime: number,\n ): {\n controllerId: string;\n targetId: string;\n duration: number;\n startTime: number;\n endTime: number;\n } {\n // Get technique-specific control duration with 1200ms fallback\n const controlDuration = this.getTechniqueControlDuration(technique, 1200);\n\n return {\n controllerId: attackerId,\n targetId: defenderId,\n duration: controlDuration,\n startTime: currentTime,\n endTime: currentTime + controlDuration,\n };\n }\n}\n\nexport default GrappleSystem;\n"],"mappings":"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"}
1
+ {"version":3,"file":"GrappleSystem.js","names":[],"sources":["../../../src/systems/combat/GrappleSystem.ts"],"sourcesContent":["/**\n * Grappling System for Korean Martial Arts Combat\n *\n * **Korean**: 잡기 시스템 (Grapple System)\n *\n * Implements realistic grappling and takedown mechanics based on:\n * - **Hapkido (합기도)**: Joint locks and control techniques\n * - **Ssireum (씨름)**: Traditional Korean wrestling\n * - **GON Stance (곤괘)**: Earth stance grounding and control\n *\n * ## Core Mechanics\n *\n * 1. **Grab Initiation**: Establish grip on opponent's limb/body\n * 2. **Control Duration**: Maintain control with stamina cost\n * 3. **Grip Strength**: Affects escape difficulty and follow-up options\n * 4. **Escape Mechanics**: Based on strength, technique, and stamina\n * 5. **Follow-up Techniques**: Throws, takedowns, joint locks from control\n *\n * ## Phase 2 Enhancement\n *\n * Enhanced with Gon (Earth) trigram metadata integration:\n * - Uses `controlDuration` from ExtendedGonTechnique\n * - Supports authentic Ssireum/Hapkido control durations\n * - Maintains backward compatibility with non-Gon techniques\n *\n * @module systems/combat/GrappleSystem\n * @category Combat System\n * @korean 잡기시스템\n */\n\nimport type { PlayerState } from \"@/systems/player\";\nimport {\n CombatState,\n GrappleControl,\n GrappleState,\n GrappleTarget,\n TrigramStance,\n} from \"@/types\";\nimport { asExtendedGonTechnique } from \"../trigram/types/GonTechniqueExtensions\";\nimport type { KoreanTechnique } from \"../vitalpoint/types\";\n\n/**\n * Configuration for grappling mechanics.\n *\n * **Korean**: 잡기 설정 (Grapple Configuration)\n */\nexport interface GrappleConfig {\n /** Base stamina cost per second to maintain control */\n readonly baseStaminaCostPerSecond: number;\n /** Minimum grip strength to maintain control */\n readonly minGripStrength: number;\n /** Maximum grip strength value */\n readonly maxGripStrength: number;\n /** Base escape difficulty multiplier */\n readonly baseEscapeDifficulty: number;\n /** Stamina cost to attempt escape */\n readonly escapeStaminaCost: number;\n /** Minimum duration before escape is possible (ms) */\n readonly minControlDuration: number;\n}\n\n/**\n * Default grappling configuration values.\n */\nexport const DEFAULT_GRAPPLE_CONFIG: GrappleConfig = {\n baseStaminaCostPerSecond: 5,\n minGripStrength: 20,\n maxGripStrength: 100,\n baseEscapeDifficulty: 1.5,\n escapeStaminaCost: 15,\n minControlDuration: 500, // 0.5 seconds\n};\n\n/**\n * Grapple attempt result.\n *\n * **Korean**: 잡기 시도 결과 (Grapple Attempt Result)\n */\nexport interface GrappleAttemptResult {\n /** Whether the grapple was successful */\n readonly success: boolean;\n /** New grapple control state if successful */\n readonly grappleControl?: GrappleControl;\n /** Reason for failure if unsuccessful */\n readonly reason?: string;\n /** Stamina cost for the attempt */\n readonly staminaCost: number;\n}\n\n/**\n * Escape attempt result.\n *\n * **Korean**: 탈출 시도 결과 (Escape Attempt Result)\n */\nexport interface EscapeAttemptResult {\n /** Whether the escape was successful */\n readonly success: boolean;\n /** Updated grapple control state */\n readonly grappleControl: GrappleControl | null;\n /** Reason for failure if unsuccessful */\n readonly reason?: string;\n /** Stamina cost for the attempt */\n readonly staminaCost: number;\n}\n\n/**\n * Grappling System for control and hold mechanics.\n *\n * **Korean**: 잡기 시스템 (Grapple System)\n *\n * Manages grappling state between combatants, including grip strength,\n * control duration, escape mechanics, and follow-up techniques.\n */\nexport class GrappleSystem {\n private readonly config: GrappleConfig;\n\n constructor(config: Partial<GrappleConfig> = {}) {\n this.config = { ...DEFAULT_GRAPPLE_CONFIG, ...config };\n }\n\n /**\n * Attempt to initiate a grapple on target.\n *\n * **Korean**: 잡기 시도 (Attempt Grapple)\n *\n * @param attacker - Player attempting the grapple\n * @param defender - Target player\n * @param target - Body part to grapple\n * @param currentTime - Current game time in milliseconds\n * @returns Result of the grapple attempt\n */\n attemptGrapple(\n attacker: PlayerState,\n defender: PlayerState,\n target: GrappleTarget,\n currentTime: number\n ): GrappleAttemptResult {\n // Check if attacker can grapple\n if (attacker.combatState === CombatState.STUNNED) {\n return {\n success: false,\n reason: \"Attacker is stunned\",\n staminaCost: 0,\n };\n }\n\n // Check if attacker is already grappling someone else\n if (attacker.combatState === CombatState.GRAPPLING) {\n return {\n success: false,\n reason: \"Attacker is already grappling another opponent\",\n staminaCost: 0,\n };\n }\n\n if (attacker.stamina < this.config.escapeStaminaCost) {\n return {\n success: false,\n reason: \"Insufficient stamina\",\n staminaCost: 0,\n };\n }\n\n // Check if defender is already being grappled\n if (defender.combatState === CombatState.GRAPPLED) {\n return {\n success: false,\n reason: \"Target is already being grappled\",\n staminaCost: 0,\n };\n }\n\n // Calculate grip strength based on attacker attributes and stance\n const gripStrength = this.calculateGripStrength(attacker, target);\n\n // Calculate success chance based on attributes\n const successChance = this.calculateGrappleSuccessChance(\n attacker,\n defender,\n target\n );\n\n const roll = Math.random();\n const success = roll < successChance;\n\n if (success) {\n // Create grapple control - start with GRABBING state during initiation\n const grappleControl: GrappleControl = {\n state: GrappleState.GRABBING,\n target,\n controllerId: attacker.id,\n targetId: defender.id,\n gripStrength,\n duration: 0,\n startTime: currentTime,\n canEscape: false, // Initially cannot escape\n staminaCostPerSecond: this.calculateStaminaCost(target, gripStrength),\n };\n\n return {\n success: true,\n grappleControl,\n staminaCost: this.config.escapeStaminaCost,\n };\n }\n\n return {\n success: false,\n reason: `Grapple attempt failed (${Math.round(successChance * 100)}% chance)`,\n staminaCost: this.config.escapeStaminaCost * 0.5, // Half cost on failure\n };\n }\n\n /**\n * Update grapple control state over time.\n *\n * **Korean**: 잡기 업데이트 (Update Grapple)\n *\n * @param grappleControl - Current grapple control state\n * @param controller - Player maintaining control\n * @param target - Player being controlled\n * @param deltaTime - Time elapsed since last update (seconds)\n * @param currentTime - Current game time in milliseconds\n * @returns Updated grapple control or null if broken\n */\n updateGrapple(\n grappleControl: GrappleControl,\n controller: PlayerState,\n _target: PlayerState,\n deltaTime: number,\n currentTime: number\n ): GrappleControl | null {\n // Check if controller can maintain control\n if (\n controller.stamina < grappleControl.staminaCostPerSecond * deltaTime ||\n controller.combatState === CombatState.STUNNED\n ) {\n // Control broken due to stamina or state\n return null;\n }\n\n // Update duration\n const newDuration = currentTime - grappleControl.startTime;\n\n // Transition from GRABBING to CONTROLLING after initial establishment\n let newState = grappleControl.state;\n if (grappleControl.state === GrappleState.GRABBING && newDuration > 0) {\n newState = GrappleState.CONTROLLING;\n }\n\n // Decay grip strength slightly over time\n const gripDecayRate = 2; // points per second\n const rawGripStrength = grappleControl.gripStrength - gripDecayRate * deltaTime;\n\n // Check if grip strength has dropped too low\n if (rawGripStrength < this.config.minGripStrength) {\n return null;\n }\n\n const newGripStrength = rawGripStrength;\n\n // Allow escape attempts after minimum duration\n const canEscape = newDuration >= this.config.minControlDuration;\n\n return {\n ...grappleControl,\n state: newState,\n gripStrength: newGripStrength,\n duration: newDuration,\n canEscape,\n };\n }\n\n /**\n * Attempt to escape from a grapple.\n *\n * **Korean**: 탈출 시도 (Attempt Escape)\n *\n * @param grappleControl - Current grapple control state\n * @param controller - Player maintaining control\n * @param target - Player attempting to escape\n * @returns Result of the escape attempt\n */\n attemptEscape(\n grappleControl: GrappleControl,\n controller: PlayerState,\n target: PlayerState\n ): EscapeAttemptResult {\n // Check if escape is possible\n if (!grappleControl.canEscape) {\n return {\n success: false,\n grappleControl,\n reason: \"Cannot escape yet\",\n staminaCost: 0,\n };\n }\n\n // Check stamina\n if (target.stamina < this.config.escapeStaminaCost) {\n return {\n success: false,\n grappleControl,\n reason: \"Insufficient stamina\",\n staminaCost: 0,\n };\n }\n\n // Calculate escape chance\n const escapeChance = this.calculateEscapeChance(\n grappleControl,\n controller,\n target\n );\n\n const roll = Math.random();\n const success = roll < escapeChance;\n\n if (success) {\n return {\n success: true,\n grappleControl: null, // Escape successful, control broken\n staminaCost: this.config.escapeStaminaCost,\n };\n }\n\n // Escape failed, weaken grip slightly\n const weakenedGripStrength = Math.max(\n this.config.minGripStrength,\n grappleControl.gripStrength - 10\n );\n\n return {\n success: false,\n grappleControl: {\n ...grappleControl,\n gripStrength: weakenedGripStrength,\n },\n reason: `Escape failed (${Math.round(escapeChance * 100)}% chance)`,\n staminaCost: this.config.escapeStaminaCost,\n };\n }\n\n /**\n * Calculate grip strength based on attacker attributes and target.\n *\n * **Korean**: 악력 계산 (Calculate Grip Strength)\n *\n * @private\n */\n private calculateGripStrength(\n attacker: PlayerState,\n target: GrappleTarget\n ): number {\n // Base strength from attack power\n let strength = attacker.attackPower * 3;\n\n // Stance modifiers\n if (attacker.currentStance === TrigramStance.GON) {\n strength *= 1.3; // GON stance excels at grappling\n } else if (attacker.currentStance === TrigramStance.GAN) {\n strength *= 1.15; // GAN stance is also good for control\n }\n\n // Target modifiers\n switch (target) {\n case GrappleTarget.HAND:\n strength *= 1.1; // Easier to control hand\n break;\n case GrappleTarget.ARM:\n strength *= 1.0; // Standard difficulty\n break;\n case GrappleTarget.LEG:\n strength *= 0.9; // Harder to control leg\n break;\n case GrappleTarget.TORSO:\n strength *= 0.85; // Harder to control torso\n break;\n case GrappleTarget.NECK:\n strength *= 1.2; // High control but risky\n break;\n case GrappleTarget.BOTH_ARMS:\n strength *= 0.7; // Very hard to control both arms\n break;\n }\n\n return Math.min(this.config.maxGripStrength, strength);\n }\n\n /**\n * Calculate grapple success chance.\n *\n * **Korean**: 잡기 성공률 계산 (Calculate Grapple Success Chance)\n *\n * @private\n */\n private calculateGrappleSuccessChance(\n attacker: PlayerState,\n defender: PlayerState,\n target: GrappleTarget\n ): number {\n // Base chance from technique vs defense\n const attributeDiff = attacker.technique - defender.defense;\n let baseChance = 0.5 + attributeDiff * 0.02; // ±2% per point difference\n\n // Speed advantage\n if (attacker.speed > defender.speed) {\n baseChance += (attacker.speed - defender.speed) * 0.01;\n }\n\n // Stance modifiers\n if (attacker.currentStance === TrigramStance.GON) {\n baseChance += 0.15; // GON stance excels at grappling\n }\n\n if (defender.combatState === CombatState.ATTACKING) {\n baseChance += 0.2; // Easier to grapple during attack\n } else if (defender.combatState === CombatState.DEFENDING) {\n baseChance -= 0.15; // Harder to grapple defensive opponent\n }\n\n // Target difficulty\n switch (target) {\n case GrappleTarget.HAND:\n baseChance += 0.1; // Easier to grab hand\n break;\n case GrappleTarget.BOTH_ARMS:\n baseChance -= 0.2; // Much harder to grab both arms\n break;\n case GrappleTarget.NECK:\n baseChance -= 0.1; // Risky target\n break;\n }\n\n // Clamp between 0.05 and 0.95\n return Math.max(0.05, Math.min(0.95, baseChance));\n }\n\n /**\n * Calculate escape chance from grapple.\n *\n * **Korean**: 탈출 성공률 계산 (Calculate Escape Chance)\n *\n * @private\n */\n private calculateEscapeChance(\n grappleControl: GrappleControl,\n controller: PlayerState,\n target: PlayerState\n ): number {\n // Base chance from strength vs grip\n const gripFactor = grappleControl.gripStrength / this.config.maxGripStrength;\n let baseChance = 0.5 - gripFactor * 0.3; // Stronger grip = harder escape\n\n // Attribute comparison\n const strengthDiff = target.attackPower - controller.attackPower;\n baseChance += strengthDiff * 0.02;\n\n // Speed advantage helps escape\n if (target.speed > controller.speed) {\n baseChance += (target.speed - controller.speed) * 0.015;\n }\n\n // Technique helps find weaknesses in grip\n baseChance += target.technique * 0.005;\n\n // Stance modifiers - certain stances are better at escaping grapples\n // **Korean**: 곤(坤) 자세는 탈출에 유리 (+30%), 간(艮) 자세는 방어적인 탈출 (+15%)\n if (target.currentStance === TrigramStance.GON) {\n baseChance += 0.3; // GON stance excels at grounding and escape\n } else if (target.currentStance === TrigramStance.GAN) {\n baseChance += 0.15; // GAN stance has defensive escape advantage\n }\n\n // Time factor - longer control makes escape harder\n const durationSeconds = grappleControl.duration / 1000;\n const timePenalty = Math.min(0.2, durationSeconds * 0.02);\n baseChance -= timePenalty;\n\n // Clamp between 0.05 and 0.85\n return Math.max(0.05, Math.min(0.85, baseChance));\n }\n\n /**\n * Calculate stamina cost to maintain control.\n *\n * **Korean**: 체력 소모 계산 (Calculate Stamina Cost)\n *\n * @private\n */\n private calculateStaminaCost(\n target: GrappleTarget,\n gripStrength: number\n ): number {\n let cost = this.config.baseStaminaCostPerSecond;\n\n // Target affects stamina cost\n switch (target) {\n case GrappleTarget.HAND:\n cost *= 0.8; // Easier to maintain\n break;\n case GrappleTarget.ARM:\n cost *= 1.0; // Standard\n break;\n case GrappleTarget.LEG:\n cost *= 1.2; // Harder to maintain\n break;\n case GrappleTarget.TORSO:\n cost *= 1.3; // Much harder to maintain\n break;\n case GrappleTarget.NECK:\n cost *= 1.5; // Very demanding\n break;\n case GrappleTarget.BOTH_ARMS:\n cost *= 1.8; // Extremely demanding\n break;\n }\n\n // Higher grip strength costs more stamina\n const gripFactor = gripStrength / this.config.maxGripStrength;\n cost *= 0.7 + gripFactor * 0.6; // 70-130% based on grip\n\n return cost;\n }\n\n /**\n * Check if a grapple can be transitioned to a throw.\n *\n * **Korean**: 던지기 전환 확인 (Check Throw Transition)\n *\n * @param grappleControl - Current grapple control state\n * @param controller - Player attempting throw\n * @returns Whether throw transition is possible\n */\n canTransitionToThrow(\n grappleControl: GrappleControl,\n controller: PlayerState\n ): boolean {\n // Need sufficient control duration\n if (grappleControl.duration < 1000) {\n return false; // Need at least 1 second of control\n }\n\n // Need sufficient grip strength\n if (grappleControl.gripStrength < 60) {\n return false;\n }\n\n // Need sufficient stamina for throw\n if (controller.stamina < 20) {\n return false;\n }\n\n // Certain targets are better for throws\n const goodThrowTargets = [\n GrappleTarget.ARM,\n GrappleTarget.TORSO,\n GrappleTarget.BOTH_ARMS,\n ];\n\n return goodThrowTargets.includes(grappleControl.target);\n }\n\n /**\n * Check if a grapple can be transitioned to a joint lock.\n *\n * **Korean**: 관절기 전환 확인 (Check Joint Lock Transition)\n *\n * @param grappleControl - Current grapple control state\n * @param controller - Player attempting lock\n * @returns Whether joint lock transition is possible\n */\n canTransitionToJointLock(\n grappleControl: GrappleControl,\n controller: PlayerState\n ): boolean {\n // Need sufficient control duration\n if (grappleControl.duration < 800) {\n return false;\n }\n\n // Need high technique for joint locks\n if (controller.technique < 10) {\n return false;\n }\n\n // Joint locks work on limbs\n const lockTargets = [\n GrappleTarget.HAND,\n GrappleTarget.ARM,\n GrappleTarget.LEG,\n ];\n\n return lockTargets.includes(grappleControl.target);\n }\n\n /**\n * Get technique-specific control duration from Gon metadata.\n *\n * **Korean**: 기술별 제어 시간 조회 (Get Technique Control Duration)\n *\n * Retrieves the post-throw positional advantage duration from\n * ExtendedGonTechnique metadata. Falls back to default duration\n * if technique doesn't have Gon-specific enhancements.\n *\n * **Control Duration Philosophy**:\n * - Traditional Ssireum techniques (800-2000ms) provide longer control\n * - Aggressive slam techniques (800-1200ms) provide brief control\n * - Sacrifice throws (1500-2000ms) provide extended ground control\n *\n * **Use Cases**:\n * - Determining follow-up attack windows after throws\n * - Calculating defender recovery time before counterattack\n * - Applying post-throw positional advantage in game state\n *\n * @param technique - Korean martial arts technique (checks for ExtendedGonTechnique)\n * @param defaultDuration - Fallback duration if technique has no metadata (default: 1000ms)\n * @returns Control duration in milliseconds\n *\n * @example\n * ```typescript\n * const controlTime = grappleSystem.getTechniqueControlDuration(\n * ssireumThrowTechnique, // controlDuration: 1800\n * 1000 // default fallback\n * );\n * // Result: 1800ms (uses technique metadata)\n * ```\n *\n * @korean 기술별제어시간조회\n */\n getTechniqueControlDuration(\n technique: KoreanTechnique,\n defaultDuration: number = 1000,\n ): number {\n // Use helper function for safe type casting\n const gonTechnique = asExtendedGonTechnique(technique);\n if (!gonTechnique) {\n // Non-Gon technique: use default duration\n return defaultDuration;\n }\n\n // Extract control duration from validated Gon technique\n return gonTechnique.controlDuration;\n }\n\n /**\n * Apply post-throw control advantage window.\n *\n * **Korean**: 던지기 후 우세 적용 (Apply Post-Throw Advantage)\n *\n * Creates a control advantage state after a successful throw,\n * using the technique's `controlDuration` to determine how long\n * the attacker maintains positional dominance.\n *\n * **Advantage Effects**:\n * - Attacker gains priority for follow-up attacks\n * - Defender must wait for control duration to expire\n * - Applies to throw transitions from grapple control\n *\n * @param technique - Throw technique executed\n * @param attackerId - Player who executed throw\n * @param defenderId - Player who was thrown\n * @param currentTime - Current game time in milliseconds\n * @returns Control advantage state with duration from technique metadata\n *\n * @example\n * ```typescript\n * const advantage = grappleSystem.applyPostThrowAdvantage(\n * ssireumThrowTechnique,\n * \"player1\",\n * \"player2\",\n * Date.now()\n * );\n * // advantage.duration = 1800ms (from technique metadata)\n * ```\n *\n * @korean 던지기후우세적용\n */\n applyPostThrowAdvantage(\n technique: KoreanTechnique,\n attackerId: string,\n defenderId: string,\n currentTime: number,\n ): {\n controllerId: string;\n targetId: string;\n duration: number;\n startTime: number;\n endTime: number;\n } {\n // Get technique-specific control duration with 1200ms fallback\n const controlDuration = this.getTechniqueControlDuration(technique, 1200);\n\n return {\n controllerId: attackerId,\n targetId: defenderId,\n duration: controlDuration,\n startTime: currentTime,\n endTime: currentTime + controlDuration,\n };\n }\n}\n\nexport default GrappleSystem;\n"],"mappings":"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"}
@@ -31,7 +31,6 @@ import type { BreakingResult, BreakingTarget, CounterOpportunity, ExposedLimbTyp
31
31
  * @param currentTime - Current time in technique execution (ms)
32
32
  * @returns Counter opportunity if one exists, undefined otherwise
33
33
  *
34
- * @public
35
34
  * @korean 반격기회계산
36
35
  */
37
36
  export declare function calculateCounterOpportunity(technique: KoreanTechnique, currentTime: number): CounterOpportunity | undefined;
@@ -47,7 +46,6 @@ export declare function calculateCounterOpportunity(technique: KoreanTechnique,
47
46
  * @param currentTime - Current time in technique execution (ms)
48
47
  * @returns Vulnerability multiplier (1.0 = normal, >1.0 = more vulnerable)
49
48
  *
50
- * @public
51
49
  * @korean 취약성배수계산
52
50
  */
53
51
  export declare function calculateVulnerabilityMultiplier(technique: KoreanTechnique, currentTime: number): number;
@@ -63,7 +61,6 @@ export declare function calculateVulnerabilityMultiplier(technique: KoreanTechni
63
61
  * @param isLeftSided - Whether the technique uses the left side
64
62
  * @returns The exposed limb type
65
63
  *
66
- * @public
67
64
  * @korean 노출사지결정
68
65
  */
69
66
  export declare function determineExposedLimb(technique: KoreanTechnique, isLeftSided?: boolean): ExposedLimbType;
@@ -78,7 +75,6 @@ export declare function determineExposedLimb(technique: KoreanTechnique, isLeftS
78
75
  * @param exposedLimb - The exposed limb
79
76
  * @returns The breaking target joint/bone
80
77
  *
81
- * @public
82
78
  * @korean 파쇄목표매핑
83
79
  */
84
80
  export declare function mapLimbToBreakingTarget(exposedLimb: ExposedLimbType): BreakingTarget;
@@ -100,7 +96,6 @@ export declare function mapLimbToBreakingTarget(exposedLimb: ExposedLimbType): B
100
96
  * extensibility. It may be used to apply technique-specific modifiers or
101
97
  * validate technique compatibility with the breaking target.
102
98
  *
103
- * @public
104
99
  * @korean 파쇄기술효과계산
105
100
  */
106
101
  export declare function calculateBreakingResult(breakingTechnique: KoreanTechnique, counterOpportunity: CounterOpportunity, force: number): BreakingResult;
@@ -117,7 +112,6 @@ export declare function calculateBreakingResult(breakingTechnique: KoreanTechniq
117
112
  * @param distance - Distance between attacker and defender (meters)
118
113
  * @returns Whether the counter can be executed
119
114
  *
120
- * @public
121
115
  * @korean 반격실행가능확인
122
116
  */
123
117
  export declare function canExecuteCounter(defenderStamina: number, counterTechnique: KoreanTechnique, distance: number): boolean;
@@ -133,7 +127,6 @@ export declare function canExecuteCounter(defenderStamina: number, counterTechni
133
127
  * @param technique - The technique to generate exposure for
134
128
  * @returns Generated limb exposure window
135
129
  *
136
- * @public
137
130
  * @korean 사지노출시간생성
138
131
  */
139
132
  export declare function generateLimbExposureWindow(technique: KoreanTechnique): LimbExposureWindow;
@@ -1 +1 @@
1
- {"version":3,"file":"LimbExposureSystem.d.ts","sourceRoot":"","sources":["../../../src/systems/combat/LimbExposureSystem.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAEnB,MAAM,qBAAqB,CAAC;AA8B7B;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,eAAe,EAC1B,WAAW,EAAE,MAAM,GAClB,kBAAkB,GAAG,SAAS,CAkChC;AA2DD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gCAAgC,CAC9C,SAAS,EAAE,eAAe,EAC1B,WAAW,EAAE,MAAM,GAClB,MAAM,CAoCR;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,eAAe,EAC1B,WAAW,GAAE,OAAe,GAC3B,eAAe,CAuCjB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,eAAe,GAC3B,cAAc,CAWhB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,uBAAuB,CACrC,iBAAiB,EAAE,eAAe,EAClC,kBAAkB,EAAE,kBAAkB,EACtC,KAAK,EAAE,MAAM,GACZ,cAAc,CA4EhB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAC/B,eAAe,EAAE,MAAM,EACvB,gBAAgB,EAAE,eAAe,EACjC,QAAQ,EAAE,MAAM,GACf,OAAO,CAYT;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,eAAe,GACzB,kBAAkB,CAqCpB;;;;;;;;;;AAED,wBAQE"}
1
+ {"version":3,"file":"LimbExposureSystem.d.ts","sourceRoot":"","sources":["../../../src/systems/combat/LimbExposureSystem.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAEnB,MAAM,qBAAqB,CAAC;AA8B7B;;;;;;;;;;;;;GAaG;AACH,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,eAAe,EAC1B,WAAW,EAAE,MAAM,GAClB,kBAAkB,GAAG,SAAS,CAkChC;AA2DD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gCAAgC,CAC9C,SAAS,EAAE,eAAe,EAC1B,WAAW,EAAE,MAAM,GAClB,MAAM,CAoCR;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,eAAe,EAC1B,WAAW,GAAE,OAAe,GAC3B,eAAe,CAuCjB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,eAAe,GAC3B,cAAc,CAWhB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,uBAAuB,CACrC,iBAAiB,EAAE,eAAe,EAClC,kBAAkB,EAAE,kBAAkB,EACtC,KAAK,EAAE,MAAM,GACZ,cAAc,CA4EhB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAC/B,eAAe,EAAE,MAAM,EACvB,gBAAgB,EAAE,eAAe,EACjC,QAAQ,EAAE,MAAM,GACf,OAAO,CAYT;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,eAAe,GACzB,kBAAkB,CAqCpB;;;;;;;;;;AAED,wBAQE"}
@@ -35,7 +35,6 @@ var MAX_COUNTER_RANGE_METERS = 1;
35
35
  * @param currentTime - Current time in technique execution (ms)
36
36
  * @returns Counter opportunity if one exists, undefined otherwise
37
37
  *
38
- * @public
39
38
  * @korean 반격기회계산
40
39
  */
41
40
  function calculateCounterOpportunity(technique, currentTime) {
@@ -101,7 +100,6 @@ function getRecommendedCounters(exposedLimb, reachConfig, allowsBreaking) {
101
100
  * @param currentTime - Current time in technique execution (ms)
102
101
  * @returns Vulnerability multiplier (1.0 = normal, >1.0 = more vulnerable)
103
102
  *
104
- * @public
105
103
  * @korean 취약성배수계산
106
104
  */
107
105
  function calculateVulnerabilityMultiplier(technique, currentTime) {
@@ -132,7 +130,6 @@ function calculateVulnerabilityMultiplier(technique, currentTime) {
132
130
  * @param isLeftSided - Whether the technique uses the left side
133
131
  * @returns The exposed limb type
134
132
  *
135
- * @public
136
133
  * @korean 노출사지결정
137
134
  */
138
135
  function determineExposedLimb(technique, isLeftSided = false) {
@@ -161,7 +158,6 @@ function determineExposedLimb(technique, isLeftSided = false) {
161
158
  * @param exposedLimb - The exposed limb
162
159
  * @returns The breaking target joint/bone
163
160
  *
164
- * @public
165
161
  * @korean 파쇄목표매핑
166
162
  */
167
163
  function mapLimbToBreakingTarget(exposedLimb) {
@@ -191,7 +187,6 @@ function mapLimbToBreakingTarget(exposedLimb) {
191
187
  * extensibility. It may be used to apply technique-specific modifiers or
192
188
  * validate technique compatibility with the breaking target.
193
189
  *
194
- * @public
195
190
  * @korean 파쇄기술효과계산
196
191
  */
197
192
  function calculateBreakingResult(breakingTechnique, counterOpportunity, force) {
@@ -254,7 +249,6 @@ function calculateBreakingResult(breakingTechnique, counterOpportunity, force) {
254
249
  * @param distance - Distance between attacker and defender (meters)
255
250
  * @returns Whether the counter can be executed
256
251
  *
257
- * @public
258
252
  * @korean 반격실행가능확인
259
253
  */
260
254
  function canExecuteCounter(defenderStamina, counterTechnique, distance) {
@@ -274,7 +268,6 @@ function canExecuteCounter(defenderStamina, counterTechnique, distance) {
274
268
  * @param technique - The technique to generate exposure for
275
269
  * @returns Generated limb exposure window
276
270
  *
277
- * @public
278
271
  * @korean 사지노출시간생성
279
272
  */
280
273
  function generateLimbExposureWindow(technique) {
@@ -1 +1 @@
1
- {"version":3,"file":"LimbExposureSystem.js","names":[],"sources":["../../../src/systems/combat/LimbExposureSystem.ts"],"sourcesContent":["/**\n * Limb Exposure System for Counter-Attack Detection\n *\n * **Korean**: 사지 노출 시스템 (Saji Nochul System)\n *\n * Analyzes technique animations to determine when limbs become exposed and vulnerable\n * during attack execution. This enables:\n * - Defensive counter-attacks (반격 - banggyeok)\n * - Breaking techniques (파쇄기 - paswaegi)\n * - Exploiting overextension (과다신장 약점 - gwada sinjang yakjeom)\n *\n * **Martial Arts Philosophy**:\n * - **허점공격** (Heojeom Gonggyeok) - Attacking openings/weaknesses\n * - **후수필승** (Husu Pilseung) - Victory through counter-attack timing\n * - **이순응변** (Isun Eungbyeon) - Adapt and exploit opponent's mistakes\n *\n * @module systems/combat/LimbExposureSystem\n * @korean 사지노출시스템\n */\n\nimport type { KoreanTechnique } from \"../vitalpoint/types\";\nimport type {\n BreakingResult,\n BreakingTarget,\n CounterOpportunity,\n ExposedLimbType,\n LimbExposureWindow,\n PhysicalReachConfig,\n} from \"../../types/physics\";\nimport { BREAKING_STATUS_EFFECT_IDS } from \"./BreakingStatusEffects\";\n\n/**\n * Breaking technique constants\n * **Korean**: 파쇄기술 상수\n */\n\n/**\n * Minimum effective force required to successfully execute a breaking technique.\n * Force below this threshold will not break joints/bones.\n * Typical damage values range from 20-80, with 40 being the minimum for effective breaks.\n * @korean 파쇄최소힘\n */\nconst BREAKING_FORCE_THRESHOLD = 40;\n\n/**\n * Maximum effective force for calculating break severity on 0-1 scale.\n * Force values above 80 are clamped to 1.0 severity (complete break).\n * @korean 파쇄최대힘\n */\nconst BREAKING_MAX_FORCE = 80;\n\n/**\n * Maximum range in meters for executing counter-attacks.\n * Counter-attacks are close-range defensive techniques requiring proximity.\n * @korean 반격최대거리\n */\nconst MAX_COUNTER_RANGE_METERS = 1.0;\n\n/**\n * Calculate counter-attack opportunities from a technique's reach configuration.\n *\n * **Korean**: 반격 기회 계산\n *\n * Analyzes the technique's execution timeline and limb exposure to identify\n * windows where the opponent is vulnerable to counter-attacks.\n *\n * @param technique - The technique being executed\n * @param currentTime - Current time in technique execution (ms)\n * @returns Counter opportunity if one exists, undefined otherwise\n *\n * @public\n * @korean 반격기회계산\n */\nexport function calculateCounterOpportunity(\n technique: KoreanTechnique,\n currentTime: number\n): CounterOpportunity | undefined {\n const { reachConfig, executionTime } = technique;\n\n // No exposure window defined, no counter opportunity\n if (!reachConfig.exposureWindow) {\n return undefined;\n }\n\n const exposure = reachConfig.exposureWindow;\n\n // Calculate absolute timing of exposure window\n const windowStart = executionTime * exposure.startTime;\n const windowEnd = windowStart + exposure.duration;\n\n // Check if current time is within the exposure window\n if (currentTime < windowStart || currentTime > windowEnd) {\n return undefined;\n }\n\n // Determine recommended counter techniques based on exposed limb\n const recommendedCounters = getRecommendedCounters(\n exposure.exposedLimb,\n reachConfig,\n exposure.allowsBreaking\n );\n\n return {\n exposedLimb: exposure.exposedLimb,\n windowStart,\n windowDuration: exposure.duration,\n vulnerabilityMultiplier: exposure.vulnerabilityMultiplier,\n allowsBreaking: exposure.allowsBreaking,\n recommendedCounters,\n };\n}\n\n/**\n * Get recommended counter-technique IDs for an exposed limb.\n *\n * **Korean**: 추천 반격 기술 조회\n *\n * Returns technique IDs that would be effective against the exposed limb.\n * These IDs are string-based and should match techniques in the game's\n * technique library. When implementing, validate these IDs exist.\n *\n * **Note**: These are example/placeholder IDs. Actual implementation should\n * reference real technique definitions or use a typed enum of technique IDs.\n *\n * @param exposedLimb - The limb that is exposed\n * @param reachConfig - Reach configuration of the attacking technique\n * @param allowsBreaking - Whether breaking techniques are viable\n * @returns Array of recommended counter-technique IDs (unvalidated strings)\n *\n * @internal\n * @korean 추천반격기술조회\n */\nfunction getRecommendedCounters(\n exposedLimb: ExposedLimbType,\n reachConfig: PhysicalReachConfig,\n allowsBreaking: boolean\n): readonly string[] {\n const counters: string[] = [];\n\n // Breaking techniques for overextended limbs\n if (allowsBreaking) {\n if (exposedLimb.includes(\"leg\") || exposedLimb.includes(\"ankle\")) {\n counters.push(\"leg_sweep\", \"ankle_break\", \"knee_stomp\");\n } else if (exposedLimb.includes(\"knee\")) {\n counters.push(\"knee_break\", \"hyperextension_kick\");\n } else if (exposedLimb.includes(\"arm\") || exposedLimb.includes(\"elbow\")) {\n counters.push(\"arm_bar\", \"elbow_break\", \"joint_lock\");\n } else if (exposedLimb.includes(\"wrist\")) {\n counters.push(\"wrist_lock\", \"wrist_break\");\n }\n }\n\n // Vital point strikes on exposed limbs\n if (exposedLimb.includes(\"arm\")) {\n counters.push(\"ulnar_nerve_strike\", \"radial_nerve_pressure\");\n } else if (exposedLimb.includes(\"leg\")) {\n counters.push(\"peroneal_nerve_strike\", \"thigh_pressure_point\");\n }\n\n // Counter-strikes based on body part type\n if (reachConfig.bodyPart === \"leg\") {\n counters.push(\"leg_parry_counter\", \"inside_leg_kick\");\n } else if (reachConfig.bodyPart === \"arm\") {\n counters.push(\"arm_trap_counter\", \"redirect_punch\");\n }\n\n return counters;\n}\n\n/**\n * Calculate vulnerability multiplier for a technique at a specific time.\n *\n * **Korean**: 취약성 배수 계산\n *\n * Determines how vulnerable the attacker is at a given point in their\n * technique execution. Useful for damage calculation during counter-attacks.\n *\n * @param technique - The technique being executed\n * @param currentTime - Current time in technique execution (ms)\n * @returns Vulnerability multiplier (1.0 = normal, >1.0 = more vulnerable)\n *\n * @public\n * @korean 취약성배수계산\n */\nexport function calculateVulnerabilityMultiplier(\n technique: KoreanTechnique,\n currentTime: number\n): number {\n const { reachConfig, executionTime, recoveryTime } = technique;\n\n // No exposure window, return baseline vulnerability\n if (!reachConfig.exposureWindow) {\n return 1.0;\n }\n\n const exposure = reachConfig.exposureWindow;\n const windowStart = executionTime * exposure.startTime;\n const windowEnd = windowStart + exposure.duration;\n\n // Before exposure window: slight vulnerability during wind-up\n if (currentTime < windowStart) {\n return 1.1;\n }\n\n // Within exposure window: maximum vulnerability\n if (currentTime <= windowEnd) {\n return exposure.vulnerabilityMultiplier;\n }\n\n // Recovery phase: moderate vulnerability\n const recoveryStart = executionTime;\n const recoveryEnd = executionTime + recoveryTime;\n if (currentTime > recoveryStart && currentTime <= recoveryEnd) {\n const recoveryProgress = (currentTime - recoveryStart) / recoveryTime;\n // Linearly decrease from max vulnerability to baseline\n return (\n exposure.vulnerabilityMultiplier -\n (exposure.vulnerabilityMultiplier - 1.0) * recoveryProgress\n );\n }\n\n // After recovery: baseline vulnerability\n return 1.0;\n}\n\n/**\n * Determine which limb is exposed based on technique and animation state.\n *\n * **Korean**: 노출된 사지 결정\n *\n * Analyzes the technique's body part and animation to determine which\n * specific limb (left/right) is currently exposed.\n *\n * @param technique - The technique being executed\n * @param isLeftSided - Whether the technique uses the left side\n * @returns The exposed limb type\n *\n * @public\n * @korean 노출사지결정\n */\nexport function determineExposedLimb(\n technique: KoreanTechnique,\n isLeftSided: boolean = false\n): ExposedLimbType {\n const { reachConfig } = technique;\n\n // If exposure window explicitly defines the limb, use it\n if (reachConfig.exposureWindow?.exposedLimb) {\n return reachConfig.exposureWindow.exposedLimb;\n }\n\n // Otherwise, infer from body part and sidedness\n const side = isLeftSided ? \"left\" : \"right\";\n\n switch (reachConfig.bodyPart) {\n case \"arm\":\n // Determine joint based on reach extension\n if (reachConfig.baseExtension > 0.8) {\n return `${side}_arm` as ExposedLimbType;\n } else if (reachConfig.baseExtension > 0.5) {\n return `${side}_elbow` as ExposedLimbType;\n } else {\n return `${side}_wrist` as ExposedLimbType;\n }\n\n case \"leg\":\n // Kicks expose different parts based on extension\n if (reachConfig.baseExtension > 1.0) {\n return `${side}_leg` as ExposedLimbType;\n } else if (reachConfig.baseExtension > 0.7) {\n return `${side}_knee` as ExposedLimbType;\n } else {\n return `${side}_ankle` as ExposedLimbType;\n }\n\n case \"torso\":\n // Torso techniques typically expose arms\n return `${side}_arm` as ExposedLimbType;\n\n default:\n return \"right_arm\";\n }\n}\n\n/**\n * Map exposed limb to breaking technique target.\n *\n * **Korean**: 노출 사지를 파쇄 목표로 매핑\n *\n * Converts an exposed limb type to the appropriate breaking target\n * for joint and limb breaking techniques.\n *\n * @param exposedLimb - The exposed limb\n * @returns The breaking target joint/bone\n *\n * @public\n * @korean 파쇄목표매핑\n */\nexport function mapLimbToBreakingTarget(\n exposedLimb: ExposedLimbType\n): BreakingTarget {\n if (exposedLimb.includes(\"ankle\")) return \"ankle\";\n if (exposedLimb.includes(\"knee\")) return \"knee\";\n if (exposedLimb.includes(\"elbow\")) return \"elbow\";\n if (exposedLimb.includes(\"wrist\")) return \"wrist\";\n\n // Default mapping for general limbs\n if (exposedLimb.includes(\"leg\")) return \"knee\";\n if (exposedLimb.includes(\"arm\")) return \"elbow\";\n\n return \"elbow\"; // Default fallback\n}\n\n/**\n * Calculate breaking technique effectiveness.\n *\n * **Korean**: 파쇄 기술 효과 계산\n *\n * Determines the result of a breaking technique applied to an exposed limb,\n * considering the vulnerability window, force applied, and target joint.\n *\n * @param breakingTechnique - The breaking technique being applied (reserved for future use)\n * @param counterOpportunity - The counter opportunity being exploited\n * @param force - Force/damage of the breaking technique (typically 20-80 range)\n * @returns Result of the breaking attempt\n *\n * @remarks\n * The breakingTechnique parameter is currently unused but reserved for future\n * extensibility. It may be used to apply technique-specific modifiers or\n * validate technique compatibility with the breaking target.\n *\n * @public\n * @korean 파쇄기술효과계산\n */\nexport function calculateBreakingResult(\n breakingTechnique: KoreanTechnique,\n counterOpportunity: CounterOpportunity,\n force: number\n): BreakingResult {\n // Note: breakingTechnique parameter reserved for future use\n // (e.g., technique-specific breaking modifiers)\n void breakingTechnique;\n const target = mapLimbToBreakingTarget(counterOpportunity.exposedLimb);\n\n // Breaking only works during valid windows\n if (!counterOpportunity.allowsBreaking) {\n return {\n success: false,\n target,\n severity: 0,\n damage: force * 0.5, // Reduced damage without breaking\n mobilityReduction: 0,\n statusEffects: [],\n };\n }\n\n // Calculate breaking severity based on force and vulnerability\n const effectiveForce = force * counterOpportunity.vulnerabilityMultiplier;\n const baseSuccess = effectiveForce > BREAKING_FORCE_THRESHOLD;\n const severity = Math.min(effectiveForce / BREAKING_MAX_FORCE, 1.0);\n\n if (!baseSuccess) {\n return {\n success: false,\n target,\n severity: 0,\n damage: effectiveForce * 0.7,\n mobilityReduction: 0,\n statusEffects: [],\n };\n }\n\n // Successful break - apply appropriate effects\n // Status effect IDs from BREAKING_STATUS_EFFECT_IDS constants\n // See src/systems/combat/BreakingStatusEffects.ts for all available IDs\n const statusEffects: string[] = [BREAKING_STATUS_EFFECT_IDS.PAIN];\n let mobilityReduction: number;\n\n // Severity-based effects\n if (severity > 0.8) {\n // Severe break - dislocation or fracture\n statusEffects.push(\n BREAKING_STATUS_EFFECT_IDS.SEVERE_INJURY,\n BREAKING_STATUS_EFFECT_IDS.DISABLED_LIMB\n );\n mobilityReduction = 0.6;\n\n if (target === \"ankle\" || target === \"knee\") {\n statusEffects.push(BREAKING_STATUS_EFFECT_IDS.IMPAIRED_MOBILITY);\n mobilityReduction = 0.8; // Leg breaks severely impact movement\n }\n } else if (severity > 0.5) {\n // Moderate break\n statusEffects.push(BREAKING_STATUS_EFFECT_IDS.INJURED_LIMB);\n mobilityReduction = 0.4;\n } else {\n // Minor break - sprain or strain\n statusEffects.push(BREAKING_STATUS_EFFECT_IDS.SPRAINED_JOINT);\n mobilityReduction = 0.2;\n }\n\n // Bleeding for bone breaks\n if (severity > 0.6) {\n statusEffects.push(BREAKING_STATUS_EFFECT_IDS.BLEEDING);\n }\n\n return {\n success: true,\n target,\n severity,\n damage: effectiveForce,\n mobilityReduction,\n statusEffects,\n };\n}\n\n/**\n * Check if a defender can execute a counter-attack.\n *\n * **Korean**: 반격 실행 가능 여부 확인\n *\n * Validates whether a defender is in position and has the resources\n * to execute a counter-attack against an exposed limb.\n *\n * @param defenderStamina - Defender's current stamina\n * @param counterTechnique - The counter technique to execute\n * @param distance - Distance between attacker and defender (meters)\n * @returns Whether the counter can be executed\n *\n * @public\n * @korean 반격실행가능확인\n */\nexport function canExecuteCounter(\n defenderStamina: number,\n counterTechnique: KoreanTechnique,\n distance: number\n): boolean {\n // Check stamina requirement\n if (defenderStamina < counterTechnique.staminaCost) {\n return false;\n }\n\n // Counter must be executable at current distance\n if (distance > MAX_COUNTER_RANGE_METERS) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Generate limb exposure window for a technique.\n *\n * **Korean**: 사지 노출 시간 생성\n *\n * Creates a default limb exposure window for techniques that don't\n * explicitly define one, based on heuristics from the technique type\n * and reach configuration.\n *\n * @param technique - The technique to generate exposure for\n * @returns Generated limb exposure window\n *\n * @public\n * @korean 사지노출시간생성\n */\nexport function generateLimbExposureWindow(\n technique: KoreanTechnique\n): LimbExposureWindow {\n const { reachConfig, executionTime } = technique;\n const exposedLimb = determineExposedLimb(technique);\n\n // High extension = high vulnerability\n const isHighExtension = reachConfig.baseExtension > 1.0;\n const isMediumExtension = reachConfig.baseExtension > 0.8;\n\n // Determine vulnerability based on extension\n let vulnerabilityMultiplier: number;\n let allowsBreaking: boolean;\n\n if (isHighExtension) {\n vulnerabilityMultiplier = 2.2; // Very vulnerable\n allowsBreaking = true;\n } else if (isMediumExtension) {\n vulnerabilityMultiplier = 1.6;\n allowsBreaking = false;\n } else {\n vulnerabilityMultiplier = 1.2; // Low extension, low vulnerability\n allowsBreaking = false;\n }\n\n // Exposure starts during peak extension (typically 40-60% of execution)\n const startTime = 0.5;\n\n // Duration scales with execution time (20-40% of execution)\n const durationRatio = isHighExtension ? 0.4 : 0.25;\n const duration = Math.floor(executionTime * durationRatio);\n\n return {\n exposedLimb,\n startTime,\n duration,\n vulnerabilityMultiplier,\n allowsBreaking,\n };\n}\n\nexport default {\n calculateCounterOpportunity,\n calculateVulnerabilityMultiplier,\n determineExposedLimb,\n mapLimbToBreakingTarget,\n calculateBreakingResult,\n canExecuteCounter,\n generateLimbExposureWindow,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"LimbExposureSystem.js","names":[],"sources":["../../../src/systems/combat/LimbExposureSystem.ts"],"sourcesContent":["/**\n * Limb Exposure System for Counter-Attack Detection\n *\n * **Korean**: 사지 노출 시스템 (Saji Nochul System)\n *\n * Analyzes technique animations to determine when limbs become exposed and vulnerable\n * during attack execution. This enables:\n * - Defensive counter-attacks (반격 - banggyeok)\n * - Breaking techniques (파쇄기 - paswaegi)\n * - Exploiting overextension (과다신장 약점 - gwada sinjang yakjeom)\n *\n * **Martial Arts Philosophy**:\n * - **허점공격** (Heojeom Gonggyeok) - Attacking openings/weaknesses\n * - **후수필승** (Husu Pilseung) - Victory through counter-attack timing\n * - **이순응변** (Isun Eungbyeon) - Adapt and exploit opponent's mistakes\n *\n * @module systems/combat/LimbExposureSystem\n * @korean 사지노출시스템\n */\n\nimport type { KoreanTechnique } from \"../vitalpoint/types\";\nimport type {\n BreakingResult,\n BreakingTarget,\n CounterOpportunity,\n ExposedLimbType,\n LimbExposureWindow,\n PhysicalReachConfig,\n} from \"../../types/physics\";\nimport { BREAKING_STATUS_EFFECT_IDS } from \"./BreakingStatusEffects\";\n\n/**\n * Breaking technique constants\n * **Korean**: 파쇄기술 상수\n */\n\n/**\n * Minimum effective force required to successfully execute a breaking technique.\n * Force below this threshold will not break joints/bones.\n * Typical damage values range from 20-80, with 40 being the minimum for effective breaks.\n * @korean 파쇄최소힘\n */\nconst BREAKING_FORCE_THRESHOLD = 40;\n\n/**\n * Maximum effective force for calculating break severity on 0-1 scale.\n * Force values above 80 are clamped to 1.0 severity (complete break).\n * @korean 파쇄최대힘\n */\nconst BREAKING_MAX_FORCE = 80;\n\n/**\n * Maximum range in meters for executing counter-attacks.\n * Counter-attacks are close-range defensive techniques requiring proximity.\n * @korean 반격최대거리\n */\nconst MAX_COUNTER_RANGE_METERS = 1.0;\n\n/**\n * Calculate counter-attack opportunities from a technique's reach configuration.\n *\n * **Korean**: 반격 기회 계산\n *\n * Analyzes the technique's execution timeline and limb exposure to identify\n * windows where the opponent is vulnerable to counter-attacks.\n *\n * @param technique - The technique being executed\n * @param currentTime - Current time in technique execution (ms)\n * @returns Counter opportunity if one exists, undefined otherwise\n *\n * @korean 반격기회계산\n */\nexport function calculateCounterOpportunity(\n technique: KoreanTechnique,\n currentTime: number\n): CounterOpportunity | undefined {\n const { reachConfig, executionTime } = technique;\n\n // No exposure window defined, no counter opportunity\n if (!reachConfig.exposureWindow) {\n return undefined;\n }\n\n const exposure = reachConfig.exposureWindow;\n\n // Calculate absolute timing of exposure window\n const windowStart = executionTime * exposure.startTime;\n const windowEnd = windowStart + exposure.duration;\n\n // Check if current time is within the exposure window\n if (currentTime < windowStart || currentTime > windowEnd) {\n return undefined;\n }\n\n // Determine recommended counter techniques based on exposed limb\n const recommendedCounters = getRecommendedCounters(\n exposure.exposedLimb,\n reachConfig,\n exposure.allowsBreaking\n );\n\n return {\n exposedLimb: exposure.exposedLimb,\n windowStart,\n windowDuration: exposure.duration,\n vulnerabilityMultiplier: exposure.vulnerabilityMultiplier,\n allowsBreaking: exposure.allowsBreaking,\n recommendedCounters,\n };\n}\n\n/**\n * Get recommended counter-technique IDs for an exposed limb.\n *\n * **Korean**: 추천 반격 기술 조회\n *\n * Returns technique IDs that would be effective against the exposed limb.\n * These IDs are string-based and should match techniques in the game's\n * technique library. When implementing, validate these IDs exist.\n *\n * **Note**: These are example/placeholder IDs. Actual implementation should\n * reference real technique definitions or use a typed enum of technique IDs.\n *\n * @param exposedLimb - The limb that is exposed\n * @param reachConfig - Reach configuration of the attacking technique\n * @param allowsBreaking - Whether breaking techniques are viable\n * @returns Array of recommended counter-technique IDs (unvalidated strings)\n *\n * @internal\n * @korean 추천반격기술조회\n */\nfunction getRecommendedCounters(\n exposedLimb: ExposedLimbType,\n reachConfig: PhysicalReachConfig,\n allowsBreaking: boolean\n): readonly string[] {\n const counters: string[] = [];\n\n // Breaking techniques for overextended limbs\n if (allowsBreaking) {\n if (exposedLimb.includes(\"leg\") || exposedLimb.includes(\"ankle\")) {\n counters.push(\"leg_sweep\", \"ankle_break\", \"knee_stomp\");\n } else if (exposedLimb.includes(\"knee\")) {\n counters.push(\"knee_break\", \"hyperextension_kick\");\n } else if (exposedLimb.includes(\"arm\") || exposedLimb.includes(\"elbow\")) {\n counters.push(\"arm_bar\", \"elbow_break\", \"joint_lock\");\n } else if (exposedLimb.includes(\"wrist\")) {\n counters.push(\"wrist_lock\", \"wrist_break\");\n }\n }\n\n // Vital point strikes on exposed limbs\n if (exposedLimb.includes(\"arm\")) {\n counters.push(\"ulnar_nerve_strike\", \"radial_nerve_pressure\");\n } else if (exposedLimb.includes(\"leg\")) {\n counters.push(\"peroneal_nerve_strike\", \"thigh_pressure_point\");\n }\n\n // Counter-strikes based on body part type\n if (reachConfig.bodyPart === \"leg\") {\n counters.push(\"leg_parry_counter\", \"inside_leg_kick\");\n } else if (reachConfig.bodyPart === \"arm\") {\n counters.push(\"arm_trap_counter\", \"redirect_punch\");\n }\n\n return counters;\n}\n\n/**\n * Calculate vulnerability multiplier for a technique at a specific time.\n *\n * **Korean**: 취약성 배수 계산\n *\n * Determines how vulnerable the attacker is at a given point in their\n * technique execution. Useful for damage calculation during counter-attacks.\n *\n * @param technique - The technique being executed\n * @param currentTime - Current time in technique execution (ms)\n * @returns Vulnerability multiplier (1.0 = normal, >1.0 = more vulnerable)\n *\n * @korean 취약성배수계산\n */\nexport function calculateVulnerabilityMultiplier(\n technique: KoreanTechnique,\n currentTime: number\n): number {\n const { reachConfig, executionTime, recoveryTime } = technique;\n\n // No exposure window, return baseline vulnerability\n if (!reachConfig.exposureWindow) {\n return 1.0;\n }\n\n const exposure = reachConfig.exposureWindow;\n const windowStart = executionTime * exposure.startTime;\n const windowEnd = windowStart + exposure.duration;\n\n // Before exposure window: slight vulnerability during wind-up\n if (currentTime < windowStart) {\n return 1.1;\n }\n\n // Within exposure window: maximum vulnerability\n if (currentTime <= windowEnd) {\n return exposure.vulnerabilityMultiplier;\n }\n\n // Recovery phase: moderate vulnerability\n const recoveryStart = executionTime;\n const recoveryEnd = executionTime + recoveryTime;\n if (currentTime > recoveryStart && currentTime <= recoveryEnd) {\n const recoveryProgress = (currentTime - recoveryStart) / recoveryTime;\n // Linearly decrease from max vulnerability to baseline\n return (\n exposure.vulnerabilityMultiplier -\n (exposure.vulnerabilityMultiplier - 1.0) * recoveryProgress\n );\n }\n\n // After recovery: baseline vulnerability\n return 1.0;\n}\n\n/**\n * Determine which limb is exposed based on technique and animation state.\n *\n * **Korean**: 노출된 사지 결정\n *\n * Analyzes the technique's body part and animation to determine which\n * specific limb (left/right) is currently exposed.\n *\n * @param technique - The technique being executed\n * @param isLeftSided - Whether the technique uses the left side\n * @returns The exposed limb type\n *\n * @korean 노출사지결정\n */\nexport function determineExposedLimb(\n technique: KoreanTechnique,\n isLeftSided: boolean = false\n): ExposedLimbType {\n const { reachConfig } = technique;\n\n // If exposure window explicitly defines the limb, use it\n if (reachConfig.exposureWindow?.exposedLimb) {\n return reachConfig.exposureWindow.exposedLimb;\n }\n\n // Otherwise, infer from body part and sidedness\n const side = isLeftSided ? \"left\" : \"right\";\n\n switch (reachConfig.bodyPart) {\n case \"arm\":\n // Determine joint based on reach extension\n if (reachConfig.baseExtension > 0.8) {\n return `${side}_arm` as ExposedLimbType;\n } else if (reachConfig.baseExtension > 0.5) {\n return `${side}_elbow` as ExposedLimbType;\n } else {\n return `${side}_wrist` as ExposedLimbType;\n }\n\n case \"leg\":\n // Kicks expose different parts based on extension\n if (reachConfig.baseExtension > 1.0) {\n return `${side}_leg` as ExposedLimbType;\n } else if (reachConfig.baseExtension > 0.7) {\n return `${side}_knee` as ExposedLimbType;\n } else {\n return `${side}_ankle` as ExposedLimbType;\n }\n\n case \"torso\":\n // Torso techniques typically expose arms\n return `${side}_arm` as ExposedLimbType;\n\n default:\n return \"right_arm\";\n }\n}\n\n/**\n * Map exposed limb to breaking technique target.\n *\n * **Korean**: 노출 사지를 파쇄 목표로 매핑\n *\n * Converts an exposed limb type to the appropriate breaking target\n * for joint and limb breaking techniques.\n *\n * @param exposedLimb - The exposed limb\n * @returns The breaking target joint/bone\n *\n * @korean 파쇄목표매핑\n */\nexport function mapLimbToBreakingTarget(\n exposedLimb: ExposedLimbType\n): BreakingTarget {\n if (exposedLimb.includes(\"ankle\")) return \"ankle\";\n if (exposedLimb.includes(\"knee\")) return \"knee\";\n if (exposedLimb.includes(\"elbow\")) return \"elbow\";\n if (exposedLimb.includes(\"wrist\")) return \"wrist\";\n\n // Default mapping for general limbs\n if (exposedLimb.includes(\"leg\")) return \"knee\";\n if (exposedLimb.includes(\"arm\")) return \"elbow\";\n\n return \"elbow\"; // Default fallback\n}\n\n/**\n * Calculate breaking technique effectiveness.\n *\n * **Korean**: 파쇄 기술 효과 계산\n *\n * Determines the result of a breaking technique applied to an exposed limb,\n * considering the vulnerability window, force applied, and target joint.\n *\n * @param breakingTechnique - The breaking technique being applied (reserved for future use)\n * @param counterOpportunity - The counter opportunity being exploited\n * @param force - Force/damage of the breaking technique (typically 20-80 range)\n * @returns Result of the breaking attempt\n *\n * @remarks\n * The breakingTechnique parameter is currently unused but reserved for future\n * extensibility. It may be used to apply technique-specific modifiers or\n * validate technique compatibility with the breaking target.\n *\n * @korean 파쇄기술효과계산\n */\nexport function calculateBreakingResult(\n breakingTechnique: KoreanTechnique,\n counterOpportunity: CounterOpportunity,\n force: number\n): BreakingResult {\n // Note: breakingTechnique parameter reserved for future use\n // (e.g., technique-specific breaking modifiers)\n void breakingTechnique;\n const target = mapLimbToBreakingTarget(counterOpportunity.exposedLimb);\n\n // Breaking only works during valid windows\n if (!counterOpportunity.allowsBreaking) {\n return {\n success: false,\n target,\n severity: 0,\n damage: force * 0.5, // Reduced damage without breaking\n mobilityReduction: 0,\n statusEffects: [],\n };\n }\n\n // Calculate breaking severity based on force and vulnerability\n const effectiveForce = force * counterOpportunity.vulnerabilityMultiplier;\n const baseSuccess = effectiveForce > BREAKING_FORCE_THRESHOLD;\n const severity = Math.min(effectiveForce / BREAKING_MAX_FORCE, 1.0);\n\n if (!baseSuccess) {\n return {\n success: false,\n target,\n severity: 0,\n damage: effectiveForce * 0.7,\n mobilityReduction: 0,\n statusEffects: [],\n };\n }\n\n // Successful break - apply appropriate effects\n // Status effect IDs from BREAKING_STATUS_EFFECT_IDS constants\n // See src/systems/combat/BreakingStatusEffects.ts for all available IDs\n const statusEffects: string[] = [BREAKING_STATUS_EFFECT_IDS.PAIN];\n let mobilityReduction: number;\n\n // Severity-based effects\n if (severity > 0.8) {\n // Severe break - dislocation or fracture\n statusEffects.push(\n BREAKING_STATUS_EFFECT_IDS.SEVERE_INJURY,\n BREAKING_STATUS_EFFECT_IDS.DISABLED_LIMB\n );\n mobilityReduction = 0.6;\n\n if (target === \"ankle\" || target === \"knee\") {\n statusEffects.push(BREAKING_STATUS_EFFECT_IDS.IMPAIRED_MOBILITY);\n mobilityReduction = 0.8; // Leg breaks severely impact movement\n }\n } else if (severity > 0.5) {\n // Moderate break\n statusEffects.push(BREAKING_STATUS_EFFECT_IDS.INJURED_LIMB);\n mobilityReduction = 0.4;\n } else {\n // Minor break - sprain or strain\n statusEffects.push(BREAKING_STATUS_EFFECT_IDS.SPRAINED_JOINT);\n mobilityReduction = 0.2;\n }\n\n // Bleeding for bone breaks\n if (severity > 0.6) {\n statusEffects.push(BREAKING_STATUS_EFFECT_IDS.BLEEDING);\n }\n\n return {\n success: true,\n target,\n severity,\n damage: effectiveForce,\n mobilityReduction,\n statusEffects,\n };\n}\n\n/**\n * Check if a defender can execute a counter-attack.\n *\n * **Korean**: 반격 실행 가능 여부 확인\n *\n * Validates whether a defender is in position and has the resources\n * to execute a counter-attack against an exposed limb.\n *\n * @param defenderStamina - Defender's current stamina\n * @param counterTechnique - The counter technique to execute\n * @param distance - Distance between attacker and defender (meters)\n * @returns Whether the counter can be executed\n *\n * @korean 반격실행가능확인\n */\nexport function canExecuteCounter(\n defenderStamina: number,\n counterTechnique: KoreanTechnique,\n distance: number\n): boolean {\n // Check stamina requirement\n if (defenderStamina < counterTechnique.staminaCost) {\n return false;\n }\n\n // Counter must be executable at current distance\n if (distance > MAX_COUNTER_RANGE_METERS) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Generate limb exposure window for a technique.\n *\n * **Korean**: 사지 노출 시간 생성\n *\n * Creates a default limb exposure window for techniques that don't\n * explicitly define one, based on heuristics from the technique type\n * and reach configuration.\n *\n * @param technique - The technique to generate exposure for\n * @returns Generated limb exposure window\n *\n * @korean 사지노출시간생성\n */\nexport function generateLimbExposureWindow(\n technique: KoreanTechnique\n): LimbExposureWindow {\n const { reachConfig, executionTime } = technique;\n const exposedLimb = determineExposedLimb(technique);\n\n // High extension = high vulnerability\n const isHighExtension = reachConfig.baseExtension > 1.0;\n const isMediumExtension = reachConfig.baseExtension > 0.8;\n\n // Determine vulnerability based on extension\n let vulnerabilityMultiplier: number;\n let allowsBreaking: boolean;\n\n if (isHighExtension) {\n vulnerabilityMultiplier = 2.2; // Very vulnerable\n allowsBreaking = true;\n } else if (isMediumExtension) {\n vulnerabilityMultiplier = 1.6;\n allowsBreaking = false;\n } else {\n vulnerabilityMultiplier = 1.2; // Low extension, low vulnerability\n allowsBreaking = false;\n }\n\n // Exposure starts during peak extension (typically 40-60% of execution)\n const startTime = 0.5;\n\n // Duration scales with execution time (20-40% of execution)\n const durationRatio = isHighExtension ? 0.4 : 0.25;\n const duration = Math.floor(executionTime * durationRatio);\n\n return {\n exposedLimb,\n startTime,\n duration,\n vulnerabilityMultiplier,\n allowsBreaking,\n };\n}\n\nexport default {\n calculateCounterOpportunity,\n calculateVulnerabilityMultiplier,\n determineExposedLimb,\n mapLimbToBreakingTarget,\n calculateBreakingResult,\n canExecuteCounter,\n generateLimbExposureWindow,\n};\n"],"mappings":";;;;;;;;;;;;AA0CA,IAAM,2BAA2B;;;;;;AAOjC,IAAM,qBAAqB;;;;;;AAO3B,IAAM,2BAA2B;;;;;;;;;;;;;;;AAgBjC,SAAgB,4BACd,WACA,aACgC;CAChC,MAAM,EAAE,aAAa,kBAAkB;CAGvC,IAAI,CAAC,YAAY,gBACf;CAGF,MAAM,WAAW,YAAY;CAG7B,MAAM,cAAc,gBAAgB,SAAS;CAC7C,MAAM,YAAY,cAAc,SAAS;CAGzC,IAAI,cAAc,eAAe,cAAc,WAC7C;CAIF,MAAM,sBAAsB,uBAC1B,SAAS,aACT,aACA,SAAS,eACV;CAED,OAAO;EACL,aAAa,SAAS;EACtB;EACA,gBAAgB,SAAS;EACzB,yBAAyB,SAAS;EAClC,gBAAgB,SAAS;EACzB;EACD;;;;;;;;;;;;;;;;;;;;;;AAuBH,SAAS,uBACP,aACA,aACA,gBACmB;CACnB,MAAM,WAAqB,EAAE;CAG7B,IAAI;MACE,YAAY,SAAS,MAAM,IAAI,YAAY,SAAS,QAAQ,EAC9D,SAAS,KAAK,aAAa,eAAe,aAAa;OAClD,IAAI,YAAY,SAAS,OAAO,EACrC,SAAS,KAAK,cAAc,sBAAsB;OAC7C,IAAI,YAAY,SAAS,MAAM,IAAI,YAAY,SAAS,QAAQ,EACrE,SAAS,KAAK,WAAW,eAAe,aAAa;OAChD,IAAI,YAAY,SAAS,QAAQ,EACtC,SAAS,KAAK,cAAc,cAAc;;CAK9C,IAAI,YAAY,SAAS,MAAM,EAC7B,SAAS,KAAK,sBAAsB,wBAAwB;MACvD,IAAI,YAAY,SAAS,MAAM,EACpC,SAAS,KAAK,yBAAyB,uBAAuB;CAIhE,IAAI,YAAY,aAAa,OAC3B,SAAS,KAAK,qBAAqB,kBAAkB;MAChD,IAAI,YAAY,aAAa,OAClC,SAAS,KAAK,oBAAoB,iBAAiB;CAGrD,OAAO;;;;;;;;;;;;;;;;AAiBT,SAAgB,iCACd,WACA,aACQ;CACR,MAAM,EAAE,aAAa,eAAe,iBAAiB;CAGrD,IAAI,CAAC,YAAY,gBACf,OAAO;CAGT,MAAM,WAAW,YAAY;CAC7B,MAAM,cAAc,gBAAgB,SAAS;CAC7C,MAAM,YAAY,cAAc,SAAS;CAGzC,IAAI,cAAc,aAChB,OAAO;CAIT,IAAI,eAAe,WACjB,OAAO,SAAS;CAIlB,MAAM,gBAAgB;CACtB,MAAM,cAAc,gBAAgB;CACpC,IAAI,cAAc,iBAAiB,eAAe,aAAa;EAC7D,MAAM,oBAAoB,cAAc,iBAAiB;EAEzD,OACE,SAAS,2BACR,SAAS,0BAA0B,KAAO;;CAK/C,OAAO;;;;;;;;;;;;;;;;AAiBT,SAAgB,qBACd,WACA,cAAuB,OACN;CACjB,MAAM,EAAE,gBAAgB;CAGxB,IAAI,YAAY,gBAAgB,aAC9B,OAAO,YAAY,eAAe;CAIpC,MAAM,OAAO,cAAc,SAAS;CAEpC,QAAQ,YAAY,UAApB;EACE,KAAK,OAEH,IAAI,YAAY,gBAAgB,IAC9B,OAAO,GAAG,KAAK;OACV,IAAI,YAAY,gBAAgB,IACrC,OAAO,GAAG,KAAK;OAEf,OAAO,GAAG,KAAK;EAGnB,KAAK,OAEH,IAAI,YAAY,gBAAgB,GAC9B,OAAO,GAAG,KAAK;OACV,IAAI,YAAY,gBAAgB,IACrC,OAAO,GAAG,KAAK;OAEf,OAAO,GAAG,KAAK;EAGnB,KAAK,SAEH,OAAO,GAAG,KAAK;EAEjB,SACE,OAAO;;;;;;;;;;;;;;;;AAiBb,SAAgB,wBACd,aACgB;CAChB,IAAI,YAAY,SAAS,QAAQ,EAAE,OAAO;CAC1C,IAAI,YAAY,SAAS,OAAO,EAAE,OAAO;CACzC,IAAI,YAAY,SAAS,QAAQ,EAAE,OAAO;CAC1C,IAAI,YAAY,SAAS,QAAQ,EAAE,OAAO;CAG1C,IAAI,YAAY,SAAS,MAAM,EAAE,OAAO;CACxC,IAAI,YAAY,SAAS,MAAM,EAAE,OAAO;CAExC,OAAO;;;;;;;;;;;;;;;;;;;;;;AAuBT,SAAgB,wBACd,mBACA,oBACA,OACgB;CAIhB,MAAM,SAAS,wBAAwB,mBAAmB,YAAY;CAGtE,IAAI,CAAC,mBAAmB,gBACtB,OAAO;EACL,SAAS;EACT;EACA,UAAU;EACV,QAAQ,QAAQ;EAChB,mBAAmB;EACnB,eAAe,EAAE;EAClB;CAIH,MAAM,iBAAiB,QAAQ,mBAAmB;CAClD,MAAM,cAAc,iBAAiB;CACrC,MAAM,WAAW,KAAK,IAAI,iBAAiB,oBAAoB,EAAI;CAEnE,IAAI,CAAC,aACH,OAAO;EACL,SAAS;EACT;EACA,UAAU;EACV,QAAQ,iBAAiB;EACzB,mBAAmB;EACnB,eAAe,EAAE;EAClB;CAMH,MAAM,gBAA0B,CAAC,2BAA2B,KAAK;CACjE,IAAI;CAGJ,IAAI,WAAW,IAAK;EAElB,cAAc,KACZ,2BAA2B,eAC3B,2BAA2B,cAC5B;EACD,oBAAoB;EAEpB,IAAI,WAAW,WAAW,WAAW,QAAQ;GAC3C,cAAc,KAAK,2BAA2B,kBAAkB;GAChE,oBAAoB;;QAEjB,IAAI,WAAW,IAAK;EAEzB,cAAc,KAAK,2BAA2B,aAAa;EAC3D,oBAAoB;QACf;EAEL,cAAc,KAAK,2BAA2B,eAAe;EAC7D,oBAAoB;;CAItB,IAAI,WAAW,IACb,cAAc,KAAK,2BAA2B,SAAS;CAGzD,OAAO;EACL,SAAS;EACT;EACA;EACA,QAAQ;EACR;EACA;EACD;;;;;;;;;;;;;;;;;AAkBH,SAAgB,kBACd,iBACA,kBACA,UACS;CAET,IAAI,kBAAkB,iBAAiB,aACrC,OAAO;CAIT,IAAI,WAAW,0BACb,OAAO;CAGT,OAAO;;;;;;;;;;;;;;;;AAiBT,SAAgB,2BACd,WACoB;CACpB,MAAM,EAAE,aAAa,kBAAkB;CACvC,MAAM,cAAc,qBAAqB,UAAU;CAGnD,MAAM,kBAAkB,YAAY,gBAAgB;CACpD,MAAM,oBAAoB,YAAY,gBAAgB;CAGtD,IAAI;CACJ,IAAI;CAEJ,IAAI,iBAAiB;EACnB,0BAA0B;EAC1B,iBAAiB;QACZ,IAAI,mBAAmB;EAC5B,0BAA0B;EAC1B,iBAAiB;QACZ;EACL,0BAA0B;EAC1B,iBAAiB;;CAUnB,OAAO;EACL;EACA,WAAA;EACA,UALe,KAAK,MAAM,iBADN,kBAAkB,KAAM,KAM5C;EACA;EACA;EACD"}
@@ -98,7 +98,6 @@ interface PainEffects {
98
98
  * const recovered = painSystem.applyDissipation(newPlayer, 1000);
99
99
  * ```
100
100
  *
101
- * @public
102
101
  * @korean 고통반응시스템
103
102
  */
104
103
  export declare class PainResponseSystem {
@@ -174,7 +173,6 @@ export declare class PainResponseSystem {
174
173
  * }
175
174
  * ```
176
175
  *
177
- * @public
178
176
  * @korean 고통적용
179
177
  */
180
178
  applyPain(player: PlayerState, damage: number, severity?: VitalPointSeverity, category?: VitalPointCategory): {
@@ -197,7 +195,6 @@ export declare class PainResponseSystem {
197
195
  * player = system.applyDissipation(player, 16);
198
196
  * ```
199
197
  *
200
- * @public
201
198
  * @korean 고통감소
202
199
  */
203
200
  applyDissipation(player: PlayerState, deltaTime: number): PlayerState;
@@ -207,7 +204,6 @@ export declare class PainResponseSystem {
207
204
  * @param pain - Pain value (0-100)
208
205
  * @returns Current pain level
209
206
  *
210
- * @public
211
207
  * @korean 고통수준확인
212
208
  */
213
209
  getPainLevel(pain: number): PainLevel;
@@ -217,7 +213,6 @@ export declare class PainResponseSystem {
217
213
  * @param level - Pain level
218
214
  * @returns Effects applied at that level
219
215
  *
220
- * @public
221
216
  * @korean 고통효과
222
217
  */
223
218
  getEffects(level: PainLevel): PainEffects;
@@ -231,7 +226,6 @@ export declare class PainResponseSystem {
231
226
  * @param shockEffect - Optional active shock pain effect
232
227
  * @returns Modified player state with pain effects
233
228
  *
234
- * @public
235
229
  * @korean 고통효과적용
236
230
  */
237
231
  applyEffects(player: PlayerState, shockEffect?: ShockPainEffect): PlayerState;
@@ -244,7 +238,6 @@ export declare class PainResponseSystem {
244
238
  * @param player - Current player state
245
239
  * @returns True if player should be stunned from pain
246
240
  *
247
- * @public
248
241
  * @korean 고통기절확인
249
242
  */
250
243
  shouldTriggerStun(player: PlayerState): boolean;
@@ -254,7 +247,6 @@ export declare class PainResponseSystem {
254
247
  * @param player - Current player state
255
248
  * @returns True if pain is above overload threshold
256
249
  *
257
- * @public
258
250
  * @korean 고통과부하확인
259
251
  */
260
252
  isInPainOverload(player: PlayerState): boolean;
@@ -264,7 +256,6 @@ export declare class PainResponseSystem {
264
256
  * @param player - Current player state
265
257
  * @returns True if pain is at overload level
266
258
  *
267
- * @public
268
259
  * @korean 고통무력화확인
269
260
  */
270
261
  isIncapacitated(player: PlayerState): boolean;
@@ -274,7 +265,6 @@ export declare class PainResponseSystem {
274
265
  * @param level - Pain level
275
266
  * @returns Korean and English level names
276
267
  *
277
- * @public
278
268
  * @korean 고통이름
279
269
  */
280
270
  getLevelName(level: PainLevel): {
@@ -287,7 +277,6 @@ export declare class PainResponseSystem {
287
277
  * @param level - Pain level
288
278
  * @returns Bilingual description
289
279
  *
290
- * @public
291
280
  * @korean 고통설명
292
281
  */
293
282
  getLevelDescription(level: PainLevel): {
@@ -1 +1 @@
1
- {"version":3,"file":"PainResponseSystem.d.ts","sourceRoot":"","sources":["../../../src/systems/combat/PainResponseSystem.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PainResponseSystem.d.ts","sourceRoot":"","sources":["../../../src/systems/combat/PainResponseSystem.ts"],"names":[],"mappings":"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"}
@@ -37,7 +37,6 @@ var PainLevel = /* @__PURE__ */ function(PainLevel) {
37
37
  * const recovered = painSystem.applyDissipation(newPlayer, 1000);
38
38
  * ```
39
39
  *
40
- * @public
41
40
  * @korean 고통반응시스템
42
41
  */
43
42
  var PainResponseSystem = class {
@@ -173,7 +172,6 @@ var PainResponseSystem = class {
173
172
  * }
174
173
  * ```
175
174
  *
176
- * @public
177
175
  * @korean 고통적용
178
176
  */
179
177
  applyPain(player, damage, severity, category) {
@@ -212,7 +210,6 @@ var PainResponseSystem = class {
212
210
  * player = system.applyDissipation(player, 16);
213
211
  * ```
214
212
  *
215
- * @public
216
213
  * @korean 고통감소
217
214
  */
218
215
  applyDissipation(player, deltaTime) {
@@ -231,7 +228,6 @@ var PainResponseSystem = class {
231
228
  * @param pain - Pain value (0-100)
232
229
  * @returns Current pain level
233
230
  *
234
- * @public
235
231
  * @korean 고통수준확인
236
232
  */
237
233
  getPainLevel(pain) {
@@ -247,7 +243,6 @@ var PainResponseSystem = class {
247
243
  * @param level - Pain level
248
244
  * @returns Effects applied at that level
249
245
  *
250
- * @public
251
246
  * @korean 고통효과
252
247
  */
253
248
  getEffects(level) {
@@ -263,7 +258,6 @@ var PainResponseSystem = class {
263
258
  * @param shockEffect - Optional active shock pain effect
264
259
  * @returns Modified player state with pain effects
265
260
  *
266
- * @public
267
261
  * @korean 고통효과적용
268
262
  */
269
263
  applyEffects(player, shockEffect) {
@@ -294,7 +288,6 @@ var PainResponseSystem = class {
294
288
  * @param player - Current player state
295
289
  * @returns True if player should be stunned from pain
296
290
  *
297
- * @public
298
291
  * @korean 고통기절확인
299
292
  */
300
293
  shouldTriggerStun(player) {
@@ -309,7 +302,6 @@ var PainResponseSystem = class {
309
302
  * @param player - Current player state
310
303
  * @returns True if pain is above overload threshold
311
304
  *
312
- * @public
313
305
  * @korean 고통과부하확인
314
306
  */
315
307
  isInPainOverload(player) {
@@ -321,7 +313,6 @@ var PainResponseSystem = class {
321
313
  * @param player - Current player state
322
314
  * @returns True if pain is at overload level
323
315
  *
324
- * @public
325
316
  * @korean 고통무력화확인
326
317
  */
327
318
  isIncapacitated(player) {
@@ -333,7 +324,6 @@ var PainResponseSystem = class {
333
324
  * @param level - Pain level
334
325
  * @returns Korean and English level names
335
326
  *
336
- * @public
337
327
  * @korean 고통이름
338
328
  */
339
329
  getLevelName(level) {
@@ -366,7 +356,6 @@ var PainResponseSystem = class {
366
356
  * @param level - Pain level
367
357
  * @returns Bilingual description
368
358
  *
369
- * @public
370
359
  * @korean 고통설명
371
360
  */
372
361
  getLevelDescription(level) {