blacktrigram 0.7.47 → 0.7.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (471) hide show
  1. package/lib/App2.js.map +1 -1
  2. package/lib/audio/AudioAssetLoader.js.map +1 -1
  3. package/lib/audio/AudioAssetRegistry.js.map +1 -1
  4. package/lib/audio/AudioCache.js.map +1 -1
  5. package/lib/audio/AudioManager.js.map +1 -1
  6. package/lib/audio/AudioMonitor.js.map +1 -1
  7. package/lib/audio/AudioPool.js.map +1 -1
  8. package/lib/audio/AudioProvider.js.map +1 -1
  9. package/lib/audio/AudioUtils.js.map +1 -1
  10. package/lib/audio/BoneImpactAudioMap.js.map +1 -1
  11. package/lib/audio/VariantSelector.js.map +1 -1
  12. package/lib/audio/types.js.map +1 -1
  13. package/lib/components/screens/combat/CombatScreen3D.d.ts.map +1 -1
  14. package/lib/components/screens/combat/CombatScreen3D.js +29 -25
  15. package/lib/components/screens/combat/CombatScreen3D.js.map +1 -1
  16. package/lib/components/screens/combat/components/controls/CombatButtons.js.map +1 -1
  17. package/lib/components/screens/combat/components/controls/CombatControlsPanel.js.map +1 -1
  18. package/lib/components/screens/combat/components/controls/ControlsGuide.js.map +1 -1
  19. package/lib/components/screens/combat/components/controls/KeyboardHints.js.map +1 -1
  20. package/lib/components/screens/combat/components/controls/PauseMenu.js.map +1 -1
  21. package/lib/components/screens/combat/components/controls/PauseMenuButton.js.map +1 -1
  22. package/lib/components/screens/combat/components/controls/QuickSettings.js.map +1 -1
  23. package/lib/components/screens/combat/components/effects/BloodDecals3D.js.map +1 -1
  24. package/lib/components/screens/combat/components/effects/BloodLossOverlayHtml.js.map +1 -1
  25. package/lib/components/screens/combat/components/effects/BloodParticles3D.js.map +1 -1
  26. package/lib/components/screens/combat/components/effects/BloodViscosity3D.js.map +1 -1
  27. package/lib/components/screens/combat/components/effects/CombatParticleEffects3D.js.map +1 -1
  28. package/lib/components/screens/combat/components/effects/ConsciousnessBlur.js.map +1 -1
  29. package/lib/components/screens/combat/components/effects/InternalDamage3D.js.map +1 -1
  30. package/lib/components/screens/combat/components/effects/PainVignette.js.map +1 -1
  31. package/lib/components/screens/combat/components/effects/ParticleAudio3D.js.map +1 -1
  32. package/lib/components/screens/combat/components/effects/TraumaOverlay3D.js.map +1 -1
  33. package/lib/components/screens/combat/components/feedback/MatchCountdown.js.map +1 -1
  34. package/lib/components/screens/combat/components/feedback/RoundAnnouncementOverlayHtml.js.map +1 -1
  35. package/lib/components/screens/combat/components/feedback/RoundDisplayStatus.js.map +1 -1
  36. package/lib/components/screens/combat/components/feedback/RoundStartAnnouncementOverlayHtml.js.map +1 -1
  37. package/lib/components/screens/combat/components/hud/CombatBottomHUD.d.ts.map +1 -1
  38. package/lib/components/screens/combat/components/hud/CombatBottomHUD.js +2 -2
  39. package/lib/components/screens/combat/components/hud/CombatBottomHUD.js.map +1 -1
  40. package/lib/components/screens/combat/components/hud/CombatLeftHUD.js.map +1 -1
  41. package/lib/components/screens/combat/components/hud/CombatPortraitStatusStrip.js +1 -1
  42. package/lib/components/screens/combat/components/hud/CombatPortraitStatusStrip.js.map +1 -1
  43. package/lib/components/screens/combat/components/hud/CombatRightHUD.js.map +1 -1
  44. package/lib/components/screens/combat/components/hud/CombatTopHUD.d.ts.map +1 -1
  45. package/lib/components/screens/combat/components/hud/CombatTopHUD.js +2 -1
  46. package/lib/components/screens/combat/components/hud/CombatTopHUD.js.map +1 -1
  47. package/lib/components/screens/combat/components/hud/DifficultyIndicator.js.map +1 -1
  48. package/lib/components/screens/combat/components/hud/FPSMonitor.js.map +1 -1
  49. package/lib/components/screens/combat/components/hud/MobileControlsWrapper.js.map +1 -1
  50. package/lib/components/screens/combat/components/hud/PlayerStateOverlayHtml.js.map +1 -1
  51. package/lib/components/screens/combat/components/indicators/BalanceIndicator.js.map +1 -1
  52. package/lib/components/screens/combat/components/indicators/InputBufferDisplay.js.map +1 -1
  53. package/lib/components/screens/combat/components/indicators/StaminaWarning.js.map +1 -1
  54. package/lib/components/screens/combat/components/indicators/TechniqueNameDisplay.js.map +1 -1
  55. package/lib/components/screens/combat/helpers/AnimationUpdater.d.ts.map +1 -1
  56. package/lib/components/screens/combat/helpers/AnimationUpdater.js +4 -2
  57. package/lib/components/screens/combat/helpers/AnimationUpdater.js.map +1 -1
  58. package/lib/components/screens/combat/helpers/combatHelpers.js.map +1 -1
  59. package/lib/components/screens/combat/hooks/useAICombat.js.map +1 -1
  60. package/lib/components/screens/combat/hooks/useCombatActions.js.map +1 -1
  61. package/lib/components/screens/combat/hooks/useCombatAttackMovement.js.map +1 -1
  62. package/lib/components/screens/combat/hooks/useCombatAudio.js.map +1 -1
  63. package/lib/components/screens/combat/hooks/useCombatLayout.d.ts.map +1 -1
  64. package/lib/components/screens/combat/hooks/useCombatLayout.js +11 -5
  65. package/lib/components/screens/combat/hooks/useCombatLayout.js.map +1 -1
  66. package/lib/components/screens/combat/hooks/useCombatState.js.map +1 -1
  67. package/lib/components/screens/controls/ControlsScreen3D.js +1 -1
  68. package/lib/components/screens/controls/ControlsScreen3D.js.map +1 -1
  69. package/lib/components/screens/controls/components/ControlBindingsOverlayHtml.js.map +1 -1
  70. package/lib/components/screens/controls/components/ControlCategoryTabsOverlayHtml.js.map +1 -1
  71. package/lib/components/screens/controls/components/GamepadVisualization3D.js.map +1 -1
  72. package/lib/components/screens/controls/components/InteractiveControlDemoOverlayHtml.js.map +1 -1
  73. package/lib/components/screens/controls/components/Key3D.js.map +1 -1
  74. package/lib/components/screens/controls/components/VisualKeyboard3D.js.map +1 -1
  75. package/lib/components/screens/controls/constants/ControlsConstants.js.map +1 -1
  76. package/lib/components/screens/controls/hooks/useControlsState.js.map +1 -1
  77. package/lib/components/screens/endscreen/EndScreen3D.js.map +1 -1
  78. package/lib/components/screens/endscreen/components/DefeatAnimation3D.js.map +1 -1
  79. package/lib/components/screens/endscreen/components/MatchStatisticsDisplayOverlayHtml.js.map +1 -1
  80. package/lib/components/screens/endscreen/components/NavigationButtonsOverlayHtml.js.map +1 -1
  81. package/lib/components/screens/endscreen/components/PerformanceBreakdownOverlayHtml.js.map +1 -1
  82. package/lib/components/screens/endscreen/components/PerformanceRatingOverlayHtml.js.map +1 -1
  83. package/lib/components/screens/endscreen/components/VictoryAnimation3D.js.map +1 -1
  84. package/lib/components/screens/endscreen/components/WinnerDisplayOverlayHtml.js.map +1 -1
  85. package/lib/components/screens/intro/IntroScreen3D.js +1 -1
  86. package/lib/components/screens/intro/IntroScreen3D.js.map +1 -1
  87. package/lib/components/screens/intro/components/AbilityListOverlayHtml.js.map +1 -1
  88. package/lib/components/screens/intro/components/ArchetypeCardGridOverlayHtml.js.map +1 -1
  89. package/lib/components/screens/intro/components/ArchetypeCardOverlayHtml.js.map +1 -1
  90. package/lib/components/screens/intro/components/ArchetypeDisplayOverlayHtml.js.map +1 -1
  91. package/lib/components/screens/intro/components/EnhancedArchetypeDisplayOverlayHtml.js.map +1 -1
  92. package/lib/components/screens/intro/components/MenuButtonsOverlayHtml.js.map +1 -1
  93. package/lib/components/screens/intro/components/MenuSectionOverlayHtml.js.map +1 -1
  94. package/lib/components/screens/intro/components/StatBarOverlayHtml.js.map +1 -1
  95. package/lib/components/screens/philosophy/PhilosophyScreen3D.js +1 -1
  96. package/lib/components/screens/philosophy/PhilosophyScreen3D.js.map +1 -1
  97. package/lib/components/screens/training/TrainingScreen3D.d.ts.map +1 -1
  98. package/lib/components/screens/training/TrainingScreen3D.js +3 -11
  99. package/lib/components/screens/training/TrainingScreen3D.js.map +1 -1
  100. package/lib/components/screens/training/components/AnatomyControlsOverlayHtml.js.map +1 -1
  101. package/lib/components/screens/training/components/AnatomyOverlay3D.js.map +1 -1
  102. package/lib/components/screens/training/components/FootPlacementMarkers3D.js.map +1 -1
  103. package/lib/components/screens/training/components/FootworkDrillsOverlayHtml.js.map +1 -1
  104. package/lib/components/screens/training/components/HitFeedbackEffect3D.js.map +1 -1
  105. package/lib/components/screens/training/components/TrainingButtonsOverlayHtml.js.map +1 -1
  106. package/lib/components/screens/training/components/TrainingControlsOverlayHtml.js.map +1 -1
  107. package/lib/components/screens/training/components/TrainingDummy3D.js.map +1 -1
  108. package/lib/components/screens/training/components/TrainingFeedbackOverlayHtml.js.map +1 -1
  109. package/lib/components/screens/training/components/TrainingModeSelectorOverlayHtml.js.map +1 -1
  110. package/lib/components/screens/training/components/TrainingStatsOverlayHtml.js.map +1 -1
  111. package/lib/components/screens/training/components/VitalPointMarker3D.js.map +1 -1
  112. package/lib/components/screens/training/components/VitalPointTrainingOverlayHtml.js.map +1 -1
  113. package/lib/components/screens/training/components/hud/TrainingBottomHUD.d.ts.map +1 -1
  114. package/lib/components/screens/training/components/hud/TrainingBottomHUD.js +2 -2
  115. package/lib/components/screens/training/components/hud/TrainingBottomHUD.js.map +1 -1
  116. package/lib/components/screens/training/components/hud/TrainingLeftHUD.js.map +1 -1
  117. package/lib/components/screens/training/components/hud/TrainingRightHUD.js.map +1 -1
  118. package/lib/components/screens/training/components/hud/TrainingTopHUD.js.map +1 -1
  119. package/lib/components/screens/training/hooks/useAttackMovement.js.map +1 -1
  120. package/lib/components/screens/training/hooks/useTrainingActions.d.ts +1 -0
  121. package/lib/components/screens/training/hooks/useTrainingActions.d.ts.map +1 -1
  122. package/lib/components/screens/training/hooks/useTrainingActions.js +6 -4
  123. package/lib/components/screens/training/hooks/useTrainingActions.js.map +1 -1
  124. package/lib/components/screens/training/hooks/useTrainingLayout.d.ts.map +1 -1
  125. package/lib/components/screens/training/hooks/useTrainingLayout.js +11 -5
  126. package/lib/components/screens/training/hooks/useTrainingLayout.js.map +1 -1
  127. package/lib/components/screens/training/hooks/useTrainingState.js.map +1 -1
  128. package/lib/components/shared/base/BaseButton.js.map +1 -1
  129. package/lib/components/shared/base/BaseButtonOverlayHtml.js.map +1 -1
  130. package/lib/components/shared/base/BasePanel.js.map +1 -1
  131. package/lib/components/shared/base/BaseText.js.map +1 -1
  132. package/lib/components/shared/base/useKoreanTheme.js.map +1 -1
  133. package/lib/components/shared/debug/PerformanceDebugOverlayHtml.js.map +1 -1
  134. package/lib/components/shared/mobile/ActionButtons.js.map +1 -1
  135. package/lib/components/shared/mobile/GestureRecognizerPure.js.map +1 -1
  136. package/lib/components/shared/mobile/HapticController.js.map +1 -1
  137. package/lib/components/shared/mobile/MobileControlsPure.js.map +1 -1
  138. package/lib/components/shared/mobile/StanceWheelPure.js.map +1 -1
  139. package/lib/components/shared/mobile/TouchOptimizer.js.map +1 -1
  140. package/lib/components/shared/mobile/VirtualDPad.js.map +1 -1
  141. package/lib/components/shared/three/anatomy/BodySurface.js.map +1 -1
  142. package/lib/components/shared/three/anatomy/BoneAttachedMuscles.js.map +1 -1
  143. package/lib/components/shared/three/anatomy/BoneClothing.js.map +1 -1
  144. package/lib/components/shared/three/anatomy/BoneRenderer.js.map +1 -1
  145. package/lib/components/shared/three/anatomy/Face3D.js.map +1 -1
  146. package/lib/components/shared/three/anatomy/Foot3D.js.map +1 -1
  147. package/lib/components/shared/three/anatomy/Hand3D.js.map +1 -1
  148. package/lib/components/shared/three/effects/ActionFeedback.js.map +1 -1
  149. package/lib/components/shared/three/effects/DamageNumbers.js.map +1 -1
  150. package/lib/components/shared/three/effects/HitEffects3D.js.map +1 -1
  151. package/lib/components/shared/three/effects/PlayerStateIndicators.js.map +1 -1
  152. package/lib/components/shared/three/effects/StanceSymbol3D.js.map +1 -1
  153. package/lib/components/shared/three/effects/StanceTransitionEffect.js.map +1 -1
  154. package/lib/components/shared/three/effects/VitalPointMarkers3D.js.map +1 -1
  155. package/lib/components/shared/three/indicators/ElementalColorSystem.js.map +1 -1
  156. package/lib/components/shared/three/indicators/GuardIndicator.js.map +1 -1
  157. package/lib/components/shared/three/indicators/HapticFeedback.js.map +1 -1
  158. package/lib/components/shared/three/indicators/StanceChangeIndicator.js.map +1 -1
  159. package/lib/components/shared/three/models/Player3DWithTransitions.js.map +1 -1
  160. package/lib/components/shared/three/models/SkeletalPlayer3D.d.ts.map +1 -1
  161. package/lib/components/shared/three/models/SkeletalPlayer3D.js +7 -5
  162. package/lib/components/shared/three/models/SkeletalPlayer3D.js.map +1 -1
  163. package/lib/components/shared/three/optimization/AdaptiveQuality.js.map +1 -1
  164. package/lib/components/shared/three/scene/AtmosphericParticles3D.js.map +1 -1
  165. package/lib/components/shared/three/scene/BackgroundScene3D.js.map +1 -1
  166. package/lib/components/shared/three/scene/CombatArena3D.js.map +1 -1
  167. package/lib/components/shared/three/scene/KoreanSignage3D.js.map +1 -1
  168. package/lib/components/shared/three/ui/ArchetypeCard.js.map +1 -1
  169. package/lib/components/shared/three/ui/BodyPartHealthDisplay.js.map +1 -1
  170. package/lib/components/shared/three/ui/BreathingIndicator2.js.map +1 -1
  171. package/lib/components/shared/three/ui/CombatReadinessBar.js.map +1 -1
  172. package/lib/components/shared/three/ui/ComboCounter.js.map +1 -1
  173. package/lib/components/shared/three/ui/HealthBar.js.map +1 -1
  174. package/lib/components/shared/three/ui/KoreanButton.js.map +1 -1
  175. package/lib/components/shared/three/ui/KoreanPanel.js.map +1 -1
  176. package/lib/components/shared/three/ui/KoreanText.js.map +1 -1
  177. package/lib/components/shared/three/ui/MenuList.js.map +1 -1
  178. package/lib/components/shared/three/ui/PlayerHUD.js.map +1 -1
  179. package/lib/components/shared/three/ui/ProgressBar.js.map +1 -1
  180. package/lib/components/shared/three/ui/SpeedIndicatorHUD.js.map +1 -1
  181. package/lib/components/shared/three/ui/StaminaBar.js.map +1 -1
  182. package/lib/components/shared/three/ui/TechniqueBar.js.map +1 -1
  183. package/lib/components/shared/three/ui/TechniqueCard.js.map +1 -1
  184. package/lib/components/shared/three/ui/VitalPointOverlayControlsHtml.js.map +1 -1
  185. package/lib/components/shared/ui/BackButton.js.map +1 -1
  186. package/lib/components/shared/ui/BaseHUDContainer.js.map +1 -1
  187. package/lib/components/shared/ui/CombatTimer.js.map +1 -1
  188. package/lib/components/shared/ui/ErrorModal.js.map +1 -1
  189. package/lib/components/shared/ui/LoadingState.js.map +1 -1
  190. package/lib/components/shared/ui/SplashScreen.js +2 -2
  191. package/lib/components/shared/ui/SplashScreen.js.map +1 -1
  192. package/lib/components/shared/ui/VitalPointOverlayControlsPure.js.map +1 -1
  193. package/lib/components/shared/ui/VolumeControl.js.map +1 -1
  194. package/lib/components/shared/ui/shared/ConfirmDialog.js.map +1 -1
  195. package/lib/components/ui/combat/BalanceIndicatorOverlayHtml.js.map +1 -1
  196. package/lib/constants/bodyDimensions.js.map +1 -1
  197. package/lib/constants/bodyRenderingConstants.js.map +1 -1
  198. package/lib/data/archetypeClothing.js.map +1 -1
  199. package/lib/data/archetypePhysicalAttributes.js.map +1 -1
  200. package/lib/data/techniqueMappings.js.map +1 -1
  201. package/lib/data/techniques.js.map +1 -1
  202. package/lib/hooks/useActionFeedback.js.map +1 -1
  203. package/lib/hooks/useBalanceAnimations.js.map +1 -1
  204. package/lib/hooks/useCombatTimer.js.map +1 -1
  205. package/lib/hooks/useDebounce.js.map +1 -1
  206. package/lib/hooks/useHUDLayout.d.ts.map +1 -1
  207. package/lib/hooks/useHUDLayout.js +3 -2
  208. package/lib/hooks/useHUDLayout.js.map +1 -1
  209. package/lib/hooks/useHandPoseTransitions.js.map +1 -1
  210. package/lib/hooks/useKeyboardControls.js.map +1 -1
  211. package/lib/hooks/useMatchCountdown.js.map +1 -1
  212. package/lib/hooks/useMuscleActivation.js.map +1 -1
  213. package/lib/hooks/usePauseMenu.js.map +1 -1
  214. package/lib/hooks/usePlayerAnimation.js.map +1 -1
  215. package/lib/hooks/useResponsiveLayout.js.map +1 -1
  216. package/lib/hooks/useRoundTransition.js.map +1 -1
  217. package/lib/hooks/useSkeletalAnimation.d.ts.map +1 -1
  218. package/lib/hooks/useSkeletalAnimation.js +1 -1
  219. package/lib/hooks/useSkeletalAnimation.js.map +1 -1
  220. package/lib/hooks/useTechniqueSelection.js.map +1 -1
  221. package/lib/hooks/useThrottle.js.map +1 -1
  222. package/lib/hooks/useTouchControls.js.map +1 -1
  223. package/lib/hooks/useWebGLContextLossHandler.js.map +1 -1
  224. package/lib/hooks/useWindowSize.js.map +1 -1
  225. package/lib/systems/CombatSystem.js.map +1 -1
  226. package/lib/systems/EffectCalculator.js.map +1 -1
  227. package/lib/systems/LayoutSystem.js.map +1 -1
  228. package/lib/systems/PlayerEffectManager.js.map +1 -1
  229. package/lib/systems/ResponsiveScaling.js.map +1 -1
  230. package/lib/systems/TrigramSystem.js.map +1 -1
  231. package/lib/systems/VitalPointSystem.js.map +1 -1
  232. package/lib/systems/ai/AIPersonality.js.map +1 -1
  233. package/lib/systems/ai/AdaptiveDifficulty.js +16 -16
  234. package/lib/systems/ai/AdaptiveDifficulty.js.map +1 -1
  235. package/lib/systems/ai/ArchetypeEnforcer.js.map +1 -1
  236. package/lib/systems/ai/ComboSystem.js.map +1 -1
  237. package/lib/systems/ai/DecisionTree.js.map +1 -1
  238. package/lib/systems/ai/TrainingAI.js.map +1 -1
  239. package/lib/systems/ai/types.js.map +1 -1
  240. package/lib/systems/animation/builders/AnimationBuilder.js.map +1 -1
  241. package/lib/systems/animation/builders/HandPoseApplicator.js.map +1 -1
  242. package/lib/systems/animation/builders/HandPoses.js.map +1 -1
  243. package/lib/systems/animation/builders/KeyframeConfig.js.map +1 -1
  244. package/lib/systems/animation/builders/KeyframeInterpolation.js.map +1 -1
  245. package/lib/systems/animation/builders/KickPhaseApplicator.d.ts +6 -0
  246. package/lib/systems/animation/builders/KickPhaseApplicator.d.ts.map +1 -1
  247. package/lib/systems/animation/builders/KickPhaseApplicator.js +16 -9
  248. package/lib/systems/animation/builders/KickPhaseApplicator.js.map +1 -1
  249. package/lib/systems/animation/builders/KoreanGuardPositions.d.ts +4 -4
  250. package/lib/systems/animation/builders/KoreanGuardPositions.js.map +1 -1
  251. package/lib/systems/animation/builders/MartialArtsAnimationBuilder.d.ts +1 -1
  252. package/lib/systems/animation/builders/MartialArtsAnimationBuilder.d.ts.map +1 -1
  253. package/lib/systems/animation/builders/MartialArtsAnimationBuilder.js +5 -5
  254. package/lib/systems/animation/builders/MartialArtsAnimationBuilder.js.map +1 -1
  255. package/lib/systems/animation/builders/MartialArtsConstants.d.ts +112 -71
  256. package/lib/systems/animation/builders/MartialArtsConstants.d.ts.map +1 -1
  257. package/lib/systems/animation/builders/MartialArtsConstants.js +113 -72
  258. package/lib/systems/animation/builders/MartialArtsConstants.js.map +1 -1
  259. package/lib/systems/animation/builders/MartialPoseApplicator.js.map +1 -1
  260. package/lib/systems/animation/builders/PunchPhaseApplicator.js.map +1 -1
  261. package/lib/systems/animation/builders/SkeletonRig.js.map +1 -1
  262. package/lib/systems/animation/builders/TrigramGuardApplicator.js.map +1 -1
  263. package/lib/systems/animation/catalogs/AttackAnimations.js.map +1 -1
  264. package/lib/systems/animation/catalogs/BasicAnimations.js.map +1 -1
  265. package/lib/systems/animation/catalogs/ComboAnimations.js.map +1 -1
  266. package/lib/systems/animation/catalogs/DarkOpsAnimations.js.map +1 -1
  267. package/lib/systems/animation/catalogs/DefensiveAnimations.js.map +1 -1
  268. package/lib/systems/animation/catalogs/ElbowKneeAnimations.js.map +1 -1
  269. package/lib/systems/animation/catalogs/EnhancedAttackAnimations.js.map +1 -1
  270. package/lib/systems/animation/catalogs/EnhancedElbowKneeAnimations.js.map +1 -1
  271. package/lib/systems/animation/catalogs/FootworkSkeletalAnimations.js.map +1 -1
  272. package/lib/systems/animation/catalogs/GamRedirectionAnimations.js.map +1 -1
  273. package/lib/systems/animation/catalogs/GamStanceAnimations.js +21 -0
  274. package/lib/systems/animation/catalogs/GamStanceAnimations.js.map +1 -0
  275. package/lib/systems/animation/catalogs/GamTechniqueAnimations.js +34 -2
  276. package/lib/systems/animation/catalogs/GamTechniqueAnimations.js.map +1 -1
  277. package/lib/systems/animation/catalogs/GanStanceAnimations.js.map +1 -1
  278. package/lib/systems/animation/catalogs/GanTechniqueAnimations.js.map +1 -1
  279. package/lib/systems/animation/catalogs/GeonStanceAnimations.js.map +1 -1
  280. package/lib/systems/animation/catalogs/GonTechniqueAnimations.d.ts +9 -0
  281. package/lib/systems/animation/catalogs/GonTechniqueAnimations.d.ts.map +1 -1
  282. package/lib/systems/animation/catalogs/GonTechniqueAnimations.js +288 -0
  283. package/lib/systems/animation/catalogs/GonTechniqueAnimations.js.map +1 -0
  284. package/lib/systems/animation/catalogs/GrapplingAnimations.js.map +1 -1
  285. package/lib/systems/animation/catalogs/JinStanceAnimations.js.map +1 -1
  286. package/lib/systems/animation/catalogs/JinTechniqueAnimations.js.map +1 -1
  287. package/lib/systems/animation/catalogs/KickAnimations.d.ts +2 -2
  288. package/lib/systems/animation/catalogs/KickAnimations.js +2 -2
  289. package/lib/systems/animation/catalogs/KickAnimations.js.map +1 -1
  290. package/lib/systems/animation/catalogs/LiStanceAnimations.js +14 -1
  291. package/lib/systems/animation/catalogs/LiStanceAnimations.js.map +1 -1
  292. package/lib/systems/animation/catalogs/LiTechniqueAnimations.js.map +1 -1
  293. package/lib/systems/animation/catalogs/MovementAnimations.js.map +1 -1
  294. package/lib/systems/animation/catalogs/PunchAnimations.d.ts +1 -1
  295. package/lib/systems/animation/catalogs/PunchAnimations.js +1 -1
  296. package/lib/systems/animation/catalogs/PunchAnimations.js.map +1 -1
  297. package/lib/systems/animation/catalogs/RecoveryAnimations.js.map +1 -1
  298. package/lib/systems/animation/catalogs/SonStanceAnimations.js.map +1 -1
  299. package/lib/systems/animation/catalogs/SonTechniqueAnimations.js.map +1 -1
  300. package/lib/systems/animation/catalogs/SpecializedPunchAnimations.js.map +1 -1
  301. package/lib/systems/animation/catalogs/StanceAnimations.js.map +1 -1
  302. package/lib/systems/animation/catalogs/StanceAttackAnimations.js.map +1 -1
  303. package/lib/systems/animation/catalogs/StanceGuardPoses.d.ts +6 -6
  304. package/lib/systems/animation/catalogs/StanceGuardPoses.js +36 -36
  305. package/lib/systems/animation/catalogs/StanceGuardPoses.js.map +1 -1
  306. package/lib/systems/animation/catalogs/StanceIdleAnimations.js.map +1 -1
  307. package/lib/systems/animation/catalogs/StanceLocomotionAnimations.js.map +1 -1
  308. package/lib/systems/animation/catalogs/StepSkeletalAnimations.js.map +1 -1
  309. package/lib/systems/animation/catalogs/TaeJointLockAnimations.js.map +1 -1
  310. package/lib/systems/animation/catalogs/TaeStanceAnimations.js.map +1 -1
  311. package/lib/systems/animation/constants/AnatomicalLimits.js.map +1 -1
  312. package/lib/systems/animation/core/AnimationHitTiming.js.map +1 -1
  313. package/lib/systems/animation/core/AnimationOptimizations.js.map +1 -1
  314. package/lib/systems/animation/core/AnimationPriority.js +15 -15
  315. package/lib/systems/animation/core/AnimationPriority.js.map +1 -1
  316. package/lib/systems/animation/core/AnimationRegistry.d.ts +30 -0
  317. package/lib/systems/animation/core/AnimationRegistry.d.ts.map +1 -1
  318. package/lib/systems/animation/core/AnimationRegistry.js +74 -12
  319. package/lib/systems/animation/core/AnimationRegistry.js.map +1 -1
  320. package/lib/systems/animation/core/AnimationStateMachine.js +16 -16
  321. package/lib/systems/animation/core/AnimationStateMachine.js.map +1 -1
  322. package/lib/systems/animation/core/AnimationTransitions.d.ts.map +1 -1
  323. package/lib/systems/animation/core/AnimationTransitions.js +34 -0
  324. package/lib/systems/animation/core/AnimationTransitions.js.map +1 -1
  325. package/lib/systems/animation/core/LateralityTransform.js.map +1 -1
  326. package/lib/systems/animation/core/RecoveryPhaseEnhancer.js.map +1 -1
  327. package/lib/systems/animation/core/TechniqueAnimationMapper.js.map +1 -1
  328. package/lib/systems/animation/core/TechniqueAnimationMapping.js.map +1 -1
  329. package/lib/systems/animation/core/index.d.ts +1 -1
  330. package/lib/systems/animation/core/index.d.ts.map +1 -1
  331. package/lib/systems/animation/core/types.d.ts +24 -0
  332. package/lib/systems/animation/core/types.d.ts.map +1 -1
  333. package/lib/systems/animation/core/types.js +27 -11
  334. package/lib/systems/animation/core/types.js.map +1 -1
  335. package/lib/systems/animation/systems/AdvancedJointMovements.js.map +1 -1
  336. package/lib/systems/animation/systems/BodyFacingSystem.js.map +1 -1
  337. package/lib/systems/animation/systems/FacialExpressions.js.map +1 -1
  338. package/lib/systems/animation/systems/FallAnimations.js.map +1 -1
  339. package/lib/systems/animation/systems/MuscleActivation.js.map +1 -1
  340. package/lib/systems/bodypart/BodyPartDamageIntegration.js.map +1 -1
  341. package/lib/systems/bodypart/BodyPartHealthSystem.js.map +1 -1
  342. package/lib/systems/bodypart/BodyPartPositionMapping.js.map +1 -1
  343. package/lib/systems/bodypart/CombatInjuryIntegration.js.map +1 -1
  344. package/lib/systems/bodypart/InjuryIntegration.js.map +1 -1
  345. package/lib/systems/bodypart/InjuryTracker.js.map +1 -1
  346. package/lib/systems/bodypart/MovementPenaltySystem.js.map +1 -1
  347. package/lib/systems/bodypart/PlayerInjuryTrackingManager.js.map +1 -1
  348. package/lib/systems/bodypart/types.js.map +1 -1
  349. package/lib/systems/breathing/BreathingDisruptionSystem.js +19 -19
  350. package/lib/systems/breathing/BreathingDisruptionSystem.js.map +1 -1
  351. package/lib/systems/breathing/feedback.js.map +1 -1
  352. package/lib/systems/breathing/integration.js.map +1 -1
  353. package/lib/systems/combat/BalanceSystem.js +19 -19
  354. package/lib/systems/combat/BalanceSystem.js.map +1 -1
  355. package/lib/systems/combat/BreakingStatusEffects.js.map +1 -1
  356. package/lib/systems/combat/CombatStateSystem.js +17 -17
  357. package/lib/systems/combat/CombatStateSystem.js.map +1 -1
  358. package/lib/systems/combat/ConsciousnessSystem.js +24 -24
  359. package/lib/systems/combat/ConsciousnessSystem.js.map +1 -1
  360. package/lib/systems/combat/FallIntegration.js.map +1 -1
  361. package/lib/systems/combat/GrappleSystem.js.map +1 -1
  362. package/lib/systems/combat/LimbExposureSystem.js.map +1 -1
  363. package/lib/systems/combat/PainResponseSystem.js +21 -21
  364. package/lib/systems/combat/PainResponseSystem.js.map +1 -1
  365. package/lib/systems/combat/TrainingCombatSystem.js.map +1 -1
  366. package/lib/systems/combat/painConsciousnessUtils.js.map +1 -1
  367. package/lib/systems/combat/typeGuards.js.map +1 -1
  368. package/lib/systems/effects.js.map +1 -1
  369. package/lib/systems/game.js.map +1 -1
  370. package/lib/systems/movement/InjuryMovementModifier.js.map +1 -1
  371. package/lib/systems/movement/helpers/AccelerationUpdater.js.map +1 -1
  372. package/lib/systems/movement/helpers/accelerationUtils.js.map +1 -1
  373. package/lib/systems/movement/integration.js.map +1 -1
  374. package/lib/systems/physics/AttackMovementPhysics.js.map +1 -1
  375. package/lib/systems/physics/CollisionDetection.js.map +1 -1
  376. package/lib/systems/physics/CoordinateMapper.js.map +1 -1
  377. package/lib/systems/physics/KnockbackPhysics.js.map +1 -1
  378. package/lib/systems/physics/MovementPhysics.js.map +1 -1
  379. package/lib/systems/physics/PhysicalReachCalculator.js.map +1 -1
  380. package/lib/systems/physics/SpeedModifierSystem.js +6 -6
  381. package/lib/systems/physics/SpeedModifierSystem.js.map +1 -1
  382. package/lib/systems/trigram/KoreanCulture.js.map +1 -1
  383. package/lib/systems/trigram/KoreanTechniques.js.map +1 -1
  384. package/lib/systems/trigram/StanceManager.js.map +1 -1
  385. package/lib/systems/trigram/TransitionCalculator.js.map +1 -1
  386. package/lib/systems/trigram/TrigramCalculator.js.map +1 -1
  387. package/lib/systems/trigram/techniques/DarkOpsTechniques.js.map +1 -1
  388. package/lib/systems/trigram/techniques/GamTechniques.js.map +1 -1
  389. package/lib/systems/trigram/techniques/GanTechniques.js.map +1 -1
  390. package/lib/systems/trigram/techniques/GeonTechniques.js.map +1 -1
  391. package/lib/systems/trigram/techniques/GonTechniques.js.map +1 -1
  392. package/lib/systems/trigram/techniques/JinTechniques.js.map +1 -1
  393. package/lib/systems/trigram/techniques/LiTechniques.js.map +1 -1
  394. package/lib/systems/trigram/techniques/SonTechniques.js.map +1 -1
  395. package/lib/systems/trigram/techniques/TaeTechniques.js.map +1 -1
  396. package/lib/systems/trigram/techniques/TechniqueConfig.js.map +1 -1
  397. package/lib/systems/trigram/techniques/index.js.map +1 -1
  398. package/lib/systems/trigram/types/GonTechniqueExtensions.js.map +1 -1
  399. package/lib/systems/trigram/types.js.map +1 -1
  400. package/lib/systems/types.js.map +1 -1
  401. package/lib/systems/vitalpoint/DamageCalculator.js.map +1 -1
  402. package/lib/systems/vitalpoint/HitDetection.js.map +1 -1
  403. package/lib/systems/vitalpoint/KoreanAnatomy.js.map +1 -1
  404. package/lib/systems/vitalpoint/KoreanVitalPoints.js.map +1 -1
  405. package/lib/systems/vitalpoint/MeridianVitalPointMapping.js.map +1 -1
  406. package/lib/systems/vitalpoint/VitalPointsData.js.map +1 -1
  407. package/lib/types/AccessibilityTypes.js.map +1 -1
  408. package/lib/types/LayoutTypes.js.map +1 -1
  409. package/lib/types/PhysicsTypes.js.map +1 -1
  410. package/lib/types/common.js.map +1 -1
  411. package/lib/types/constants/animations.js.map +1 -1
  412. package/lib/types/constants/colors.js.map +1 -1
  413. package/lib/types/constants/designSystem.js.map +1 -1
  414. package/lib/types/constants/index.js.map +1 -1
  415. package/lib/types/constants/layout.d.ts +21 -0
  416. package/lib/types/constants/layout.d.ts.map +1 -1
  417. package/lib/types/constants/layout.js +22 -1
  418. package/lib/types/constants/layout.js.map +1 -1
  419. package/lib/types/constants/performance.js.map +1 -1
  420. package/lib/types/constants/typography.js.map +1 -1
  421. package/lib/types/constants/ui.js.map +1 -1
  422. package/lib/types/facial.js +19 -19
  423. package/lib/types/facial.js.map +1 -1
  424. package/lib/types/hand-animation.js.map +1 -1
  425. package/lib/types/injury.js.map +1 -1
  426. package/lib/types/muscle.js.map +1 -1
  427. package/lib/types/physics.js.map +1 -1
  428. package/lib/types/physicsConstants.js.map +1 -1
  429. package/lib/types/player-visual.d.ts +1 -1
  430. package/lib/types/player-visual.d.ts.map +1 -1
  431. package/lib/types/skeletal.js.map +1 -1
  432. package/lib/types/techniqueId.js.map +1 -1
  433. package/lib/utils/accessibility.js.map +1 -1
  434. package/lib/utils/arenaWorldDimensions.js.map +1 -1
  435. package/lib/utils/assetConfig.js.map +1 -1
  436. package/lib/utils/characterScaling.js.map +1 -1
  437. package/lib/utils/colorHelpers.js.map +1 -1
  438. package/lib/utils/colorUtils.js.map +1 -1
  439. package/lib/utils/combatReadiness.js.map +1 -1
  440. package/lib/utils/controlMapping.js.map +1 -1
  441. package/lib/utils/deviceDetection.js +6 -7
  442. package/lib/utils/deviceDetection.js.map +1 -1
  443. package/lib/utils/effectUtils.js.map +1 -1
  444. package/lib/utils/fabricTextures.js.map +1 -1
  445. package/lib/utils/hapticFeedback.js.map +1 -1
  446. package/lib/utils/haptics.js.map +1 -1
  447. package/lib/utils/htmlOverlayHelpers.js.map +1 -1
  448. package/lib/utils/inputSystem.js.map +1 -1
  449. package/lib/utils/koreanThemeHelpers.js.map +1 -1
  450. package/lib/utils/math.js.map +1 -1
  451. package/lib/utils/mobileLayoutHelpers.js.map +1 -1
  452. package/lib/utils/mobileUIUtils.js.map +1 -1
  453. package/lib/utils/performance/PerformanceMonitor.js.map +1 -1
  454. package/lib/utils/performance/PerformanceOverlay3D.js.map +1 -1
  455. package/lib/utils/performance/usePerformanceMonitor.js.map +1 -1
  456. package/lib/utils/performanceOptimization.js.map +1 -1
  457. package/lib/utils/player3DHelpers.js.map +1 -1
  458. package/lib/utils/playerUtils.js.map +1 -1
  459. package/lib/utils/responsiveLayout.js.map +1 -1
  460. package/lib/utils/responsiveLayoutHelpers.d.ts +7 -0
  461. package/lib/utils/responsiveLayoutHelpers.d.ts.map +1 -1
  462. package/lib/utils/responsiveLayoutHelpers.js +16 -2
  463. package/lib/utils/responsiveLayoutHelpers.js.map +1 -1
  464. package/lib/utils/responsiveOrientationConstants.js.map +1 -1
  465. package/lib/utils/safeAreaUtils.js.map +1 -1
  466. package/lib/utils/sharedPhysicsConfig.js.map +1 -1
  467. package/lib/utils/skeletonScaling.js.map +1 -1
  468. package/lib/utils/stanceHelpers.js.map +1 -1
  469. package/lib/utils/threeObjectPool.js.map +1 -1
  470. package/lib/utils/visualEffects.js.map +1 -1
  471. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"VitalPointsData.js","names":[],"sources":["../../../src/systems/vitalpoint/VitalPointsData.ts"],"sourcesContent":["/**\n * Comprehensive Korean Vital Points Database (급소 데이터베이스)\n *\n * **Korean**: 한국 무술 급소 시스템\n *\n * Contains all 70 Korean martial arts vital points (급소) based on traditional\n * martial arts knowledge and anatomical targeting. Points are organized by\n * body region and categorized by physiological system affected.\n *\n * @module systems/vitalpoint/VitalPointsData\n * @category Vital Point System\n * @korean 급소데이터\n */\n\nimport {\n BodyRegion,\n TrigramStance,\n VitalPointCategory,\n VitalPointEffectType,\n VitalPointSeverity,\n} from \"@/types\";\nimport { EffectIntensity } from \"../effects\";\nimport { VitalPoint } from \"./types\";\n\n/**\n * Complete database of 70 Korean vital points organized by body region.\n *\n * **Korean**: 70개 급소 데이터베이스\n *\n * Distribution:\n * - Head: 12 points\n * - Torso: 24 points\n * - Arms: 17 points (각 8-9 per arm)\n * - Legs: 17 points (각 8-9 per leg)\n *\n * @korean 급소데이터베이스\n */\nexport const VITAL_POINTS_DATA: readonly VitalPoint[] = [\n // ============= HEAD REGION (12 points) =============\n {\n id: \"head_temple\",\n names: {\n korean: \"태양혈\",\n english: \"Temple\",\n romanized: \"taeyang-hyeol\",\n },\n position: { x: 100, y: 50 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.CRITICAL,\n baseDamage: 35,\n effects: [\n {\n id: \"stun_major\",\n type: VitalPointEffectType.STUN,\n intensity: EffectIntensity.HIGH,\n duration: 3000,\n description: { korean: \"심각한 기절\", english: \"Severe stunning\" },\n stackable: false,\n },\n ],\n description: {\n korean: \"관자놀이의 압박점, 뇌진탕 위험\",\n english: \"Pressure point at temple, concussion risk\",\n romanized: \"gwanja-nori-ui apbakjeom\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.LI, TrigramStance.JIN],\n },\n {\n id: \"head_jaw\",\n names: {\n korean: \"턱끝\",\n english: \"Jaw Point\",\n romanized: \"teok-kkeut\",\n },\n position: { x: 105, y: 80 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 30,\n effects: [],\n description: {\n korean: \"턱 끝 타격으로 뇌진탕 유발\",\n english: \"Jaw strike causes concussion\",\n romanized: \"teok-kkeut tagyeok\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.GEON, TrigramStance.JIN],\n },\n {\n id: \"head_nose\",\n names: {\n korean: \"코\",\n english: \"Nose Bridge\",\n romanized: \"ko\",\n },\n position: { x: 102, y: 65 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 28,\n effects: [],\n description: {\n korean: \"코뼈 골절, 시야 방해\",\n english: \"Nasal bone fracture, vision impairment\",\n romanized: \"koppyeo goljeol\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.LI, TrigramStance.GEON],\n },\n {\n id: \"head_eye\",\n names: {\n korean: \"눈\",\n english: \"Eye\",\n romanized: \"nun\",\n },\n position: { x: 98, y: 55 },\n category: VitalPointCategory.ORGAN,\n severity: VitalPointSeverity.CRITICAL,\n baseDamage: 40,\n effects: [],\n description: {\n korean: \"눈 공격, 실명 위험\",\n english: \"Eye strike, blindness risk\",\n romanized: \"nun gonggyeok\",\n },\n targetingDifficulty: 0.8,\n effectiveStances: [TrigramStance.LI],\n },\n {\n id: \"head_ear\",\n names: {\n korean: \"귀\",\n english: \"Ear\",\n romanized: \"gwi\",\n },\n position: { x: 90, y: 60 },\n category: VitalPointCategory.ORGAN,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 22,\n effects: [\n {\n id: \"balance_loss\",\n type: VitalPointEffectType.DISORIENTATION,\n intensity: EffectIntensity.MEDIUM,\n duration: 2500,\n description: {\n korean: \"평형 감각 상실 및 청력 손상\",\n english: \"Balance and hearing impairment\",\n },\n stackable: false,\n },\n ],\n description: {\n korean: \"고막 손상, 평형 감각 상실\",\n english: \"Eardrum damage, balance loss\",\n romanized: \"gomak sonsang\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.GEON],\n },\n {\n id: \"head_back_skull\",\n names: {\n korean: \"뒤통수\",\n english: \"Back of Skull\",\n romanized: \"dwi-tongsu\",\n },\n position: { x: 80, y: 50 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.LETHAL,\n baseDamage: 50,\n effects: [\n {\n id: \"unconsciousness\",\n type: VitalPointEffectType.UNCONSCIOUSNESS,\n intensity: EffectIntensity.EXTREME,\n duration: 10000,\n description: {\n korean: \"즉각적 무의식\",\n english: \"Instant unconsciousness\",\n },\n stackable: false,\n },\n ],\n description: {\n korean: \"뇌간 손상, 즉각적 무의식\",\n english: \"Brainstem damage, instant unconsciousness\",\n romanized: \"noegan sonsang\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.JIN, TrigramStance.GEON],\n },\n {\n id: \"head_crown\",\n names: {\n korean: \"정수리\",\n english: \"Crown\",\n romanized: \"jeongsu-ri\",\n },\n position: { x: 100, y: 30 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.CRITICAL,\n baseDamage: 38,\n effects: [],\n description: {\n korean: \"두개골 타격, 뇌 손상\",\n english: \"Skull impact, brain damage\",\n romanized: \"dugaegol tagyeok\",\n },\n targetingDifficulty: 0.8,\n effectiveStances: [TrigramStance.GEON],\n },\n {\n id: \"head_philtrum\",\n names: {\n korean: \"인중\",\n english: \"Philtrum\",\n romanized: \"injung\",\n },\n position: { x: 102, y: 70 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 25,\n effects: [],\n description: {\n korean: \"인중 타격, 통증 및 기절\",\n english: \"Philtrum strike, pain and stunning\",\n romanized: \"injung tagyeok\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.LI],\n },\n {\n id: \"head_side_neck\",\n names: {\n korean: \"목옆\",\n english: \"Side Neck\",\n romanized: \"mog-yeop\",\n },\n position: { x: 92, y: 85 },\n category: VitalPointCategory.VASCULAR,\n severity: VitalPointSeverity.CRITICAL,\n baseDamage: 42,\n effects: [\n {\n id: \"unconsciousness_carotid\",\n type: VitalPointEffectType.UNCONSCIOUSNESS,\n intensity: EffectIntensity.HIGH,\n duration: 8000,\n description: {\n korean: \"경동맥 압박으로 실신\",\n english: \"Carotid compression unconsciousness\",\n },\n stackable: false,\n },\n ],\n description: {\n korean: \"경동맥 압박, 실신 유발\",\n english: \"Carotid compression, unconsciousness\",\n romanized: \"gyeongdongmaek apbak\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.SON, TrigramStance.GAM],\n },\n {\n id: \"head_throat\",\n names: {\n korean: \"목\",\n english: \"Throat\",\n romanized: \"mok\",\n },\n position: { x: 102, y: 90 },\n category: VitalPointCategory.RESPIRATORY,\n severity: VitalPointSeverity.LETHAL,\n baseDamage: 55,\n effects: [\n {\n id: \"breathing_difficulty\",\n type: VitalPointEffectType.BREATHLESSNESS,\n intensity: EffectIntensity.EXTREME,\n duration: 5000,\n description: {\n korean: \"호흡 곤란\",\n english: \"Severe breathing difficulty\",\n },\n stackable: false,\n },\n ],\n description: {\n korean: \"기도 폐쇄, 호흡 곤란\",\n english: \"Airway closure, breathing difficulty\",\n romanized: \"gido pyeshwe\",\n },\n targetingDifficulty: 0.8,\n effectiveStances: [TrigramStance.LI],\n },\n {\n id: \"head_mastoid\",\n names: {\n korean: \"유양돌기\",\n english: \"Mastoid Process\",\n romanized: \"yuyang-dolgi\",\n },\n position: { x: 88, y: 75 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 32,\n effects: [],\n description: {\n korean: \"귀 뒤 돌기, 평형 감각 손상\",\n english: \"Behind ear protrusion, balance disruption\",\n romanized: \"gwi dwi dolgi\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.LI, TrigramStance.GEON],\n },\n {\n id: \"head_chin\",\n names: {\n korean: \"턱\",\n english: \"Chin\",\n romanized: \"teok\",\n },\n position: { x: 102, y: 82 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 30,\n effects: [],\n description: {\n korean: \"턱 중앙 타격, 뇌진탕\",\n english: \"Chin center strike, concussion\",\n romanized: \"teok jungang tagyeok\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.GEON, TrigramStance.JIN],\n },\n\n // ============= TORSO REGION (24 points) =============\n {\n id: \"torso_solar_plexus\",\n names: {\n korean: \"명치\",\n english: \"Solar Plexus\",\n romanized: \"myeongchi\",\n },\n position: { x: 102, y: 140 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.CRITICAL,\n baseDamage: 40,\n effects: [\n {\n id: \"breath_knocked_out\",\n type: VitalPointEffectType.BREATHLESSNESS,\n intensity: EffectIntensity.HIGH,\n duration: 3000,\n description: {\n korean: \"호흡 곤란 및 신경 충격\",\n english: \"Breathing difficulty and nerve shock\",\n },\n stackable: false,\n },\n ],\n description: {\n korean: \"신경총 타격, 호흡 곤란\",\n english: \"Nerve plexus strike, breathing difficulty\",\n romanized: \"singyeongjong tagyeok\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.JIN, TrigramStance.GEON],\n },\n {\n id: \"torso_heart\",\n names: {\n korean: \"심장\",\n english: \"Heart Region\",\n romanized: \"simjang\",\n },\n position: { x: 98, y: 130 },\n category: VitalPointCategory.ORGAN,\n severity: VitalPointSeverity.LETHAL,\n baseDamage: 60,\n effects: [\n {\n id: \"cardiac_disruption\",\n type: VitalPointEffectType.ORGAN_DISRUPTION,\n intensity: EffectIntensity.EXTREME,\n duration: 10000,\n description: { korean: \"심장 충격\", english: \"Cardiac disruption\" },\n stackable: false,\n },\n ],\n description: {\n korean: \"심장 충격, 심정지 위험\",\n english: \"Heart shock, cardiac arrest risk\",\n romanized: \"simjang chunggyeok\",\n },\n targetingDifficulty: 0.9,\n effectiveStances: [TrigramStance.JIN, TrigramStance.LI],\n },\n {\n id: \"torso_liver\",\n names: {\n korean: \"간\",\n english: \"Liver\",\n romanized: \"gan\",\n },\n position: { x: 110, y: 145 },\n category: VitalPointCategory.ORGAN,\n severity: VitalPointSeverity.CRITICAL,\n baseDamage: 45,\n effects: [\n {\n id: \"internal_bleeding\",\n type: VitalPointEffectType.ORGAN_DISRUPTION,\n intensity: EffectIntensity.HIGH,\n duration: 8000,\n description: {\n korean: \"내출혈 및 극심한 통증\",\n english: \"Internal bleeding and severe pain\",\n },\n stackable: false,\n },\n {\n id: \"liver_pain\",\n type: VitalPointEffectType.PAIN,\n intensity: EffectIntensity.HIGH,\n duration: 6000,\n description: { korean: \"간 타격 통증\", english: \"Liver strike pain\" },\n stackable: false,\n },\n ],\n description: {\n korean: \"간 손상, 내출혈\",\n english: \"Liver damage, internal bleeding\",\n romanized: \"gan sonsang\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.GEON, TrigramStance.JIN],\n },\n {\n id: \"torso_spleen\",\n names: {\n korean: \"비장\",\n english: \"Spleen\",\n romanized: \"bijang\",\n },\n position: { x: 94, y: 145 },\n category: VitalPointCategory.ORGAN,\n severity: VitalPointSeverity.CRITICAL,\n baseDamage: 45,\n effects: [\n {\n id: \"spleen_rupture_risk\",\n type: VitalPointEffectType.ORGAN_DISRUPTION,\n intensity: EffectIntensity.HIGH,\n duration: 8000,\n description: {\n korean: \"비장 파열 위험\",\n english: \"Spleen rupture risk\",\n },\n stackable: false,\n },\n {\n id: \"internal_bleeding_spleen\",\n type: VitalPointEffectType.WEAKNESS,\n intensity: EffectIntensity.HIGH,\n duration: 10000,\n description: {\n korean: \"내출혈로 인한 약화\",\n english: \"Weakness from internal bleeding\",\n },\n stackable: false,\n },\n ],\n description: {\n korean: \"비장 파열 위험\",\n english: \"Spleen rupture risk\",\n romanized: \"bijang paryeol\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.GEON, TrigramStance.JIN],\n },\n {\n id: \"torso_kidney_left\",\n names: {\n korean: \"좌신장\",\n english: \"Left Kidney\",\n romanized: \"jwa-sinjang\",\n },\n position: { x: 94, y: 155 },\n category: VitalPointCategory.ORGAN,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 38,\n effects: [\n {\n id: \"kidney_pain\",\n type: VitalPointEffectType.PAIN,\n intensity: EffectIntensity.HIGH,\n duration: 4000,\n description: {\n korean: \"신장 타격 극심한 통증\",\n english: \"Severe kidney strike pain\",\n },\n stackable: false,\n },\n ],\n description: {\n korean: \"신장 타격, 심한 통증\",\n english: \"Kidney strike, severe pain\",\n romanized: \"sinjang tagyeok\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.GEON, TrigramStance.SON],\n },\n {\n id: \"torso_kidney_right\",\n names: {\n korean: \"우신장\",\n english: \"Right Kidney\",\n romanized: \"u-sinjang\",\n },\n position: { x: 110, y: 155 },\n category: VitalPointCategory.ORGAN,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 38,\n effects: [\n {\n id: \"kidney_pain_right\",\n type: VitalPointEffectType.PAIN,\n intensity: EffectIntensity.HIGH,\n duration: 4000,\n description: {\n korean: \"신장 타격 극심한 통증\",\n english: \"Severe kidney strike pain\",\n },\n stackable: false,\n },\n ],\n description: {\n korean: \"신장 타격, 심한 통증\",\n english: \"Kidney strike, severe pain\",\n romanized: \"sinjang tagyeok\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.GEON, TrigramStance.SON],\n },\n {\n id: \"torso_ribs_floating\",\n names: {\n korean: \"갈비뼈\",\n english: \"Floating Ribs\",\n romanized: \"galbi-ppyeo\",\n },\n position: { x: 106, y: 150 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 35,\n effects: [],\n description: {\n korean: \"늑골 골절, 내장 손상\",\n english: \"Rib fracture, organ damage\",\n romanized: \"neukgol goljeol\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.GEON, TrigramStance.SON],\n },\n {\n id: \"torso_sternum\",\n names: {\n korean: \"흉골\",\n english: \"Sternum\",\n romanized: \"hyunggol\",\n },\n position: { x: 102, y: 130 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.CRITICAL,\n baseDamage: 40,\n effects: [],\n description: {\n korean: \"흉골 골절, 심장 압박\",\n english: \"Sternum fracture, heart compression\",\n romanized: \"hyunggol goljeol\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.GEON, TrigramStance.JIN],\n },\n {\n id: \"torso_spine_upper\",\n names: {\n korean: \"상부척추\",\n english: \"Upper Spine\",\n romanized: \"sangbu-cheokchu\",\n },\n position: { x: 80, y: 120 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.LETHAL,\n baseDamage: 55,\n effects: [\n {\n id: \"spinal_trauma\",\n type: VitalPointEffectType.PARALYSIS,\n intensity: EffectIntensity.EXTREME,\n duration: 15000,\n description: {\n korean: \"척추 손상으로 마비\",\n english: \"Spinal trauma paralysis\",\n },\n stackable: false,\n },\n {\n id: \"nerve_disruption_spine\",\n type: VitalPointEffectType.NERVE_DISRUPTION,\n intensity: EffectIntensity.EXTREME,\n duration: 12000,\n description: {\n korean: \"신경 차단\",\n english: \"Nerve pathway disruption\",\n },\n stackable: false,\n },\n ],\n description: {\n korean: \"척추 손상, 마비 위험\",\n english: \"Spine damage, paralysis risk\",\n romanized: \"cheokchu sonsang\",\n },\n targetingDifficulty: 0.8,\n effectiveStances: [TrigramStance.GEON, TrigramStance.GON],\n },\n {\n id: \"torso_spine_mid\",\n names: {\n korean: \"중부척추\",\n english: \"Mid Spine\",\n romanized: \"jungbu-cheokchu\",\n },\n position: { x: 80, y: 145 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.CRITICAL,\n baseDamage: 42,\n effects: [\n {\n id: \"nerve_damage_mid_spine\",\n type: VitalPointEffectType.NERVE_DISRUPTION,\n intensity: EffectIntensity.HIGH,\n duration: 8000,\n description: { korean: \"신경 손상\", english: \"Nerve damage\" },\n stackable: false,\n },\n {\n id: \"spinal_pain\",\n type: VitalPointEffectType.PAIN,\n intensity: EffectIntensity.HIGH,\n duration: 6000,\n description: { korean: \"척추 통증\", english: \"Spinal pain\" },\n stackable: false,\n },\n ],\n description: {\n korean: \"척추 타격, 신경 손상\",\n english: \"Spine strike, nerve damage\",\n romanized: \"cheokchu tagyeok\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.GEON, TrigramStance.GON],\n },\n {\n id: \"torso_groin\",\n names: {\n korean: \"사타구니\",\n english: \"Groin\",\n romanized: \"sata-guni\",\n },\n position: { x: 102, y: 170 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.CRITICAL,\n baseDamage: 50,\n effects: [\n {\n id: \"extreme_pain\",\n type: VitalPointEffectType.PAIN,\n intensity: EffectIntensity.EXTREME,\n duration: 5000,\n description: { korean: \"극심한 통증\", english: \"Extreme pain\" },\n stackable: false,\n },\n {\n id: \"groin_stun\",\n type: VitalPointEffectType.STUN,\n intensity: EffectIntensity.HIGH,\n duration: 3000,\n description: {\n korean: \"충격으로 인한 기절\",\n english: \"Shock-induced incapacitation\",\n },\n stackable: false,\n },\n ],\n description: {\n korean: \"사타구니 타격, 극심한 통증\",\n english: \"Groin strike, extreme pain\",\n romanized: \"sata-guni tagyeok\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.LI, TrigramStance.GEON],\n },\n {\n id: \"torso_bladder\",\n names: {\n korean: \"방광\",\n english: \"Bladder\",\n romanized: \"banggwang\",\n },\n position: { x: 102, y: 165 },\n category: VitalPointCategory.ORGAN,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 35,\n effects: [],\n description: {\n korean: \"방광 압박, 통증 및 기능 장애\",\n english: \"Bladder compression, pain and dysfunction\",\n romanized: \"banggwang apbak\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.GEON, TrigramStance.SON],\n },\n // Additional torso points (continuing to 24 total)\n {\n id: \"torso_collarbone_left\",\n names: {\n korean: \"좌쇄골\",\n english: \"Left Collarbone\",\n romanized: \"jwa-swaegol\",\n },\n position: { x: 92, y: 110 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 32,\n effects: [],\n description: {\n korean: \"쇄골 골절, 팔 움직임 제한\",\n english: \"Collarbone fracture, arm movement limitation\",\n romanized: \"swaegol goljeol\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.GEON, TrigramStance.JIN],\n },\n {\n id: \"torso_collarbone_right\",\n names: {\n korean: \"우쇄골\",\n english: \"Right Collarbone\",\n romanized: \"u-swaegol\",\n },\n position: { x: 112, y: 110 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 32,\n effects: [],\n description: {\n korean: \"쇄골 골절, 팔 움직임 제한\",\n english: \"Collarbone fracture, arm movement limitation\",\n romanized: \"swaegol goljeol\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.GEON, TrigramStance.JIN],\n },\n {\n id: \"torso_armpit_nerve\",\n names: {\n korean: \"겨드랑이신경\",\n english: \"Armpit Nerve\",\n romanized: \"gyeodeu-rangi singyeong\",\n },\n position: { x: 85, y: 120 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 28,\n effects: [],\n description: {\n korean: \"신경총 타격, 팔 마비\",\n english: \"Nerve plexus strike, arm paralysis\",\n romanized: \"singyeongjong tagyeok\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.LI, TrigramStance.SON],\n },\n {\n id: \"torso_abs_center\",\n names: {\n korean: \"복부중앙\",\n english: \"Abdominal Center\",\n romanized: \"bokbu-jungang\",\n },\n position: { x: 102, y: 148 },\n category: VitalPointCategory.MUSCULAR,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 26,\n effects: [],\n description: {\n korean: \"복근 손상, 호흡 곤란\",\n english: \"Abdominal muscle damage, breathing difficulty\",\n romanized: \"bokgeun sonsang\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.GEON, TrigramStance.SON],\n },\n {\n id: \"torso_diaphragm\",\n names: {\n korean: \"횡격막\",\n english: \"Diaphragm\",\n romanized: \"hyeokgyeongmak\",\n },\n position: { x: 102, y: 142 },\n category: VitalPointCategory.RESPIRATORY,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 35,\n effects: [],\n description: {\n korean: \"횡격막 충격, 호흡 정지\",\n english: \"Diaphragm shock, breathing cessation\",\n romanized: \"hyeokgyeongmak chunggyeok\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.JIN, TrigramStance.GEON],\n },\n {\n id: \"torso_lower_back\",\n names: {\n korean: \"요추\",\n english: \"Lower Back\",\n romanized: \"yochu\",\n },\n position: { x: 80, y: 160 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 36,\n effects: [],\n description: {\n korean: \"요추 타격, 다리 통증\",\n english: \"Lower back strike, leg pain\",\n romanized: \"yochu tagyeok\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.GEON, TrigramStance.GON],\n },\n {\n id: \"torso_side_ribs_left\",\n names: {\n korean: \"좌측늑골\",\n english: \"Left Side Ribs\",\n romanized: \"jwa-cheuk neukgol\",\n },\n position: { x: 90, y: 140 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 33,\n effects: [],\n description: {\n korean: \"늑골 타격, 호흡 곤란\",\n english: \"Rib strike, breathing difficulty\",\n romanized: \"neukgol tagyeok\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.SON, TrigramStance.GEON],\n },\n {\n id: \"torso_side_ribs_right\",\n names: {\n korean: \"우측늑골\",\n english: \"Right Side Ribs\",\n romanized: \"u-cheuk neukgol\",\n },\n position: { x: 114, y: 140 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 33,\n effects: [],\n description: {\n korean: \"늑골 타격, 호흡 곤란\",\n english: \"Rib strike, breathing difficulty\",\n romanized: \"neukgol tagyeok\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.SON, TrigramStance.GEON],\n },\n {\n id: \"torso_navel\",\n names: {\n korean: \"배꼽\",\n english: \"Navel\",\n romanized: \"bae-kkop\",\n },\n position: { x: 102, y: 152 },\n category: VitalPointCategory.ORGAN,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 27,\n effects: [],\n description: {\n korean: \"복부 중심 타격\",\n english: \"Abdominal center strike\",\n romanized: \"bokbu jungsim tagyeok\",\n },\n targetingDifficulty: 0.4,\n effectiveStances: [TrigramStance.GEON, TrigramStance.SON],\n },\n {\n id: \"torso_shoulder_blade_left\",\n names: {\n korean: \"좌견갑골\",\n english: \"Left Shoulder Blade\",\n romanized: \"jwa-gyeongapgol\",\n },\n position: { x: 75, y: 115 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 28,\n effects: [],\n description: {\n korean: \"견갑골 타격, 팔 기능 저하\",\n english: \"Shoulder blade strike, arm function reduction\",\n romanized: \"gyeongapgol tagyeok\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.GEON, TrigramStance.GON],\n },\n {\n id: \"torso_shoulder_blade_right\",\n names: {\n korean: \"우견갑골\",\n english: \"Right Shoulder Blade\",\n romanized: \"u-gyeongapgol\",\n },\n position: { x: 129, y: 115 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 28,\n effects: [],\n description: {\n korean: \"견갑골 타격, 팔 기능 저하\",\n english: \"Shoulder blade strike, arm function reduction\",\n romanized: \"gyeongapgol tagyeok\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.GEON, TrigramStance.GON],\n },\n {\n id: \"torso_tailbone\",\n names: {\n korean: \"미골\",\n english: \"Tailbone\",\n romanized: \"migol\",\n },\n position: { x: 80, y: 170 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 34,\n effects: [],\n description: {\n korean: \"미골 골절, 앉기 곤란\",\n english: \"Tailbone fracture, sitting difficulty\",\n romanized: \"migol goljeol\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.GON, TrigramStance.JIN],\n },\n\n // ============= LEFT ARM REGION (8 points) =============\n {\n id: \"arm_left_shoulder\",\n names: {\n korean: \"좌어깨\",\n english: \"Left Shoulder\",\n romanized: \"jwa-eokkae\",\n },\n position: { x: 82, y: 110 },\n category: VitalPointCategory.JOINT,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 26,\n effects: [],\n description: {\n korean: \"어깨 관절 탈구\",\n english: \"Shoulder joint dislocation\",\n romanized: \"eokkae gwanjeol talgoo\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.TAE, TrigramStance.GAM],\n },\n {\n id: \"arm_left_bicep\",\n names: {\n korean: \"좌상완\",\n english: \"Left Bicep\",\n romanized: \"jwa-sangwan\",\n },\n position: { x: 78, y: 125 },\n category: VitalPointCategory.MUSCULAR,\n severity: VitalPointSeverity.MINOR,\n baseDamage: 18,\n effects: [],\n description: {\n korean: \"상완 근육 손상\",\n english: \"Bicep muscle damage\",\n romanized: \"sangwan geunnyuk sonsang\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.GEON, TrigramStance.SON],\n },\n {\n id: \"arm_left_elbow\",\n names: {\n korean: \"좌팔꿈치\",\n english: \"Left Elbow\",\n romanized: \"jwa-palkumchi\",\n },\n position: { x: 74, y: 142 },\n category: VitalPointCategory.JOINT,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 30,\n effects: [],\n description: {\n korean: \"팔꿈치 골절 또는 탈구\",\n english: \"Elbow fracture or dislocation\",\n romanized: \"palkumchi goljeol\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.TAE, TrigramStance.GON],\n },\n {\n id: \"arm_left_forearm\",\n names: {\n korean: \"좌전완\",\n english: \"Left Forearm\",\n romanized: \"jwa-jeonwan\",\n },\n position: { x: 72, y: 155 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 24,\n effects: [],\n description: {\n korean: \"전완부 골절\",\n english: \"Forearm fracture\",\n romanized: \"jeonwanbu goljeol\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.GAN],\n },\n {\n id: \"arm_left_wrist\",\n names: {\n korean: \"좌손목\",\n english: \"Left Wrist\",\n romanized: \"jwa-sonmok\",\n },\n position: { x: 70, y: 168 },\n category: VitalPointCategory.JOINT,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 22,\n effects: [],\n description: {\n korean: \"손목 골절 또는 염좌\",\n english: \"Wrist fracture or sprain\",\n romanized: \"sonmok goljeol\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.TAE, TrigramStance.GAM],\n },\n {\n id: \"arm_left_hand\",\n names: {\n korean: \"좌손등\",\n english: \"Left Hand\",\n romanized: \"jwa-sondeung\",\n },\n position: { x: 68, y: 178 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MINOR,\n baseDamage: 16,\n effects: [],\n description: {\n korean: \"손등 타격, 기능 저하\",\n english: \"Hand strike, function reduction\",\n romanized: \"sondeung tagyeok\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.LI],\n },\n {\n id: \"arm_left_radial_nerve\",\n names: {\n korean: \"좌요골신경\",\n english: \"Left Radial Nerve\",\n romanized: \"jwa-yogol singyeong\",\n },\n position: { x: 72, y: 148 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 25,\n effects: [],\n description: {\n korean: \"요골 신경 타격, 팔 마비\",\n english: \"Radial nerve strike, arm paralysis\",\n romanized: \"yogol singyeong tagyeok\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.LI, TrigramStance.SON],\n },\n {\n id: \"arm_left_ulnar_nerve\",\n names: {\n korean: \"좌척골신경\",\n english: \"Left Ulnar Nerve\",\n romanized: \"jwa-cheokgol singyeong\",\n },\n position: { x: 74, y: 150 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 24,\n effects: [],\n description: {\n korean: \"척골 신경 타격, 손 기능 상실\",\n english: \"Ulnar nerve strike, hand function loss\",\n romanized: \"cheokgol singyeong tagyeok\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.LI],\n },\n\n // ============= RIGHT ARM REGION (9 points) =============\n {\n id: \"arm_right_shoulder\",\n names: {\n korean: \"우어깨\",\n english: \"Right Shoulder\",\n romanized: \"u-eokkae\",\n },\n position: { x: 122, y: 110 },\n category: VitalPointCategory.JOINT,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 26,\n effects: [],\n description: {\n korean: \"어깨 관절 탈구\",\n english: \"Shoulder joint dislocation\",\n romanized: \"eokkae gwanjeol talgoo\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.TAE, TrigramStance.GAM],\n },\n {\n id: \"arm_right_bicep\",\n names: {\n korean: \"우상완\",\n english: \"Right Bicep\",\n romanized: \"u-sangwan\",\n },\n position: { x: 126, y: 125 },\n category: VitalPointCategory.MUSCULAR,\n severity: VitalPointSeverity.MINOR,\n baseDamage: 18,\n effects: [],\n description: {\n korean: \"상완 근육 손상\",\n english: \"Bicep muscle damage\",\n romanized: \"sangwan geunnyuk sonsang\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.GEON, TrigramStance.SON],\n },\n {\n id: \"arm_right_elbow\",\n names: {\n korean: \"우팔꿈치\",\n english: \"Right Elbow\",\n romanized: \"u-palkumchi\",\n },\n position: { x: 130, y: 142 },\n category: VitalPointCategory.JOINT,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 30,\n effects: [],\n description: {\n korean: \"팔꿈치 골절 또는 탈구\",\n english: \"Elbow fracture or dislocation\",\n romanized: \"palkumchi goljeol\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.TAE, TrigramStance.GON],\n },\n {\n id: \"arm_right_forearm\",\n names: {\n korean: \"우전완\",\n english: \"Right Forearm\",\n romanized: \"u-jeonwan\",\n },\n position: { x: 132, y: 155 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 24,\n effects: [],\n description: {\n korean: \"전완부 골절\",\n english: \"Forearm fracture\",\n romanized: \"jeonwanbu goljeol\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.GAN],\n },\n {\n id: \"arm_right_wrist\",\n names: {\n korean: \"우손목\",\n english: \"Right Wrist\",\n romanized: \"u-sonmok\",\n },\n position: { x: 134, y: 168 },\n category: VitalPointCategory.JOINT,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 22,\n effects: [],\n description: {\n korean: \"손목 골절 또는 염좌\",\n english: \"Wrist fracture or sprain\",\n romanized: \"sonmok goljeol\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.TAE, TrigramStance.GAM],\n },\n {\n id: \"arm_right_hand\",\n names: {\n korean: \"우손등\",\n english: \"Right Hand\",\n romanized: \"u-sondeung\",\n },\n position: { x: 136, y: 178 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MINOR,\n baseDamage: 16,\n effects: [],\n description: {\n korean: \"손등 타격, 기능 저하\",\n english: \"Hand strike, function reduction\",\n romanized: \"sondeung tagyeok\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.LI],\n },\n {\n id: \"arm_right_radial_nerve\",\n names: {\n korean: \"우요골신경\",\n english: \"Right Radial Nerve\",\n romanized: \"u-yogol singyeong\",\n },\n position: { x: 132, y: 148 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 25,\n effects: [],\n description: {\n korean: \"요골 신경 타격, 팔 마비\",\n english: \"Radial nerve strike, arm paralysis\",\n romanized: \"yogol singyeong tagyeok\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.LI, TrigramStance.SON],\n },\n {\n id: \"arm_right_ulnar_nerve\",\n names: {\n korean: \"우척골신경\",\n english: \"Right Ulnar Nerve\",\n romanized: \"u-cheokgol singyeong\",\n },\n position: { x: 130, y: 150 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 24,\n effects: [],\n description: {\n korean: \"척골 신경 타격, 손 기능 상실\",\n english: \"Ulnar nerve strike, hand function loss\",\n romanized: \"cheokgol singyeong tagyeok\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.LI],\n },\n {\n id: \"arm_right_tricep\",\n names: {\n korean: \"우삼두\",\n english: \"Right Tricep\",\n romanized: \"u-samdu\",\n },\n position: { x: 128, y: 135 },\n category: VitalPointCategory.MUSCULAR,\n severity: VitalPointSeverity.MINOR,\n baseDamage: 17,\n effects: [],\n description: {\n korean: \"삼두근 손상\",\n english: \"Tricep muscle damage\",\n romanized: \"samdugeun sonsang\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.GEON],\n },\n\n // ============= LEFT LEG REGION (8 points) =============\n {\n id: \"leg_left_thigh\",\n names: {\n korean: \"좌대퇴\",\n english: \"Left Thigh\",\n romanized: \"jwa-daetwe\",\n },\n position: { x: 94, y: 185 },\n category: VitalPointCategory.MUSCULAR,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 22,\n effects: [],\n description: {\n korean: \"대퇴근 손상, 이동 곤란\",\n english: \"Thigh muscle damage, movement difficulty\",\n romanized: \"daetwegeun sonsang\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.GEON, TrigramStance.SON],\n },\n {\n id: \"leg_left_knee\",\n names: {\n korean: \"좌무릎\",\n english: \"Left Knee\",\n romanized: \"jwa-mureup\",\n },\n position: { x: 94, y: 205 },\n category: VitalPointCategory.JOINT,\n severity: VitalPointSeverity.CRITICAL,\n baseDamage: 38,\n effects: [\n {\n id: \"knee_destruction\",\n type: VitalPointEffectType.WEAKNESS,\n intensity: EffectIntensity.HIGH,\n duration: 10000,\n description: {\n korean: \"무릎 파괴로 보행 불가\",\n english: \"Knee destruction, unable to walk\",\n },\n stackable: false,\n },\n {\n id: \"mobility_loss\",\n type: VitalPointEffectType.PARALYSIS,\n intensity: EffectIntensity.MEDIUM,\n duration: 8000,\n description: { korean: \"이동력 상실\", english: \"Mobility loss\" },\n stackable: false,\n },\n ],\n description: {\n korean: \"무릎 관절 파괴, 보행 불가\",\n english: \"Knee joint destruction, unable to walk\",\n romanized: \"mureup gwanjeol pagoe\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.TAE, TrigramStance.GON],\n },\n {\n id: \"leg_left_shin\",\n names: {\n korean: \"좌정강이\",\n english: \"Left Shin\",\n romanized: \"jwa-jeonggang-i\",\n },\n position: { x: 94, y: 220 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 26,\n effects: [],\n description: {\n korean: \"정강이 골절\",\n english: \"Shin fracture\",\n romanized: \"jeonggang-i goljeol\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.GEON, TrigramStance.GAN],\n },\n {\n id: \"leg_left_ankle\",\n names: {\n korean: \"좌발목\",\n english: \"Left Ankle\",\n romanized: \"jwa-balmok\",\n },\n position: { x: 94, y: 235 },\n category: VitalPointCategory.JOINT,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 28,\n effects: [],\n description: {\n korean: \"발목 염좌 또는 골절\",\n english: \"Ankle sprain or fracture\",\n romanized: \"balmok yeomjwa\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.TAE, TrigramStance.GON],\n },\n {\n id: \"leg_left_foot\",\n names: {\n korean: \"좌발등\",\n english: \"Left Foot\",\n romanized: \"jwa-baldeung\",\n },\n position: { x: 94, y: 245 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MINOR,\n baseDamage: 18,\n effects: [],\n description: {\n korean: \"발등 골절, 보행 곤란\",\n english: \"Foot fracture, walking difficulty\",\n romanized: \"baldeung goljeol\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.GON],\n },\n {\n id: \"leg_left_calf\",\n names: {\n korean: \"좌종아리\",\n english: \"Left Calf\",\n romanized: \"jwa-jong-ari\",\n },\n position: { x: 92, y: 225 },\n category: VitalPointCategory.MUSCULAR,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 23,\n effects: [],\n description: {\n korean: \"종아리 근육 손상\",\n english: \"Calf muscle damage\",\n romanized: \"jong-ari geunnyuk sonsang\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.SON, TrigramStance.GEON],\n },\n {\n id: \"leg_left_achilles\",\n names: {\n korean: \"좌아킬레스건\",\n english: \"Left Achilles Tendon\",\n romanized: \"jwa-akilleseugeon\",\n },\n position: { x: 90, y: 238 },\n category: VitalPointCategory.MUSCULAR,\n severity: VitalPointSeverity.CRITICAL,\n baseDamage: 40,\n effects: [\n {\n id: \"achilles_rupture\",\n type: VitalPointEffectType.WEAKNESS,\n intensity: EffectIntensity.EXTREME,\n duration: 12000,\n description: {\n korean: \"아킬레스건 파열\",\n english: \"Achilles tendon rupture\",\n },\n stackable: false,\n },\n {\n id: \"movement_impossible\",\n type: VitalPointEffectType.PARALYSIS,\n intensity: EffectIntensity.HIGH,\n duration: 10000,\n description: { korean: \"이동 불가\", english: \"Cannot move\" },\n stackable: false,\n },\n ],\n description: {\n korean: \"아킬레스건 파열, 이동 불가\",\n english: \"Achilles tendon rupture, cannot move\",\n romanized: \"akilleseugeon paryeol\",\n },\n targetingDifficulty: 0.8,\n effectiveStances: [TrigramStance.LI, TrigramStance.GON],\n },\n {\n id: \"leg_left_femoral_nerve\",\n names: {\n korean: \"좌대퇴신경\",\n english: \"Left Femoral Nerve\",\n romanized: \"jwa-daetwe singyeong\",\n },\n position: { x: 96, y: 180 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 32,\n effects: [],\n description: {\n korean: \"대퇴 신경 타격, 다리 마비\",\n english: \"Femoral nerve strike, leg paralysis\",\n romanized: \"daetwe singyeong tagyeok\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.LI, TrigramStance.SON],\n },\n\n // ============= RIGHT LEG REGION (9 points) =============\n {\n id: \"leg_right_thigh\",\n names: {\n korean: \"우대퇴\",\n english: \"Right Thigh\",\n romanized: \"u-daetwe\",\n },\n position: { x: 110, y: 185 },\n category: VitalPointCategory.MUSCULAR,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 22,\n effects: [],\n description: {\n korean: \"대퇴근 손상, 이동 곤란\",\n english: \"Thigh muscle damage, movement difficulty\",\n romanized: \"daetwegeun sonsang\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.GEON, TrigramStance.SON],\n },\n {\n id: \"leg_right_knee\",\n names: {\n korean: \"우무릎\",\n english: \"Right Knee\",\n romanized: \"u-mureup\",\n },\n position: { x: 110, y: 205 },\n category: VitalPointCategory.JOINT,\n severity: VitalPointSeverity.CRITICAL,\n baseDamage: 38,\n effects: [\n {\n id: \"knee_destruction_right\",\n type: VitalPointEffectType.WEAKNESS,\n intensity: EffectIntensity.HIGH,\n duration: 10000,\n description: {\n korean: \"무릎 파괴로 보행 불가\",\n english: \"Knee destruction, unable to walk\",\n },\n stackable: false,\n },\n {\n id: \"mobility_loss_right\",\n type: VitalPointEffectType.PARALYSIS,\n intensity: EffectIntensity.MEDIUM,\n duration: 8000,\n description: { korean: \"이동력 상실\", english: \"Mobility loss\" },\n stackable: false,\n },\n ],\n description: {\n korean: \"무릎 관절 파괴, 보행 불가\",\n english: \"Knee joint destruction, unable to walk\",\n romanized: \"mureup gwanjeol pagoe\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.TAE, TrigramStance.GON],\n },\n {\n id: \"leg_right_shin\",\n names: {\n korean: \"우정강이\",\n english: \"Right Shin\",\n romanized: \"u-jeonggang-i\",\n },\n position: { x: 110, y: 220 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 26,\n effects: [],\n description: {\n korean: \"정강이 골절\",\n english: \"Shin fracture\",\n romanized: \"jeonggang-i goljeol\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.GEON, TrigramStance.GAN],\n },\n {\n id: \"leg_right_ankle\",\n names: {\n korean: \"우발목\",\n english: \"Right Ankle\",\n romanized: \"u-balmok\",\n },\n position: { x: 110, y: 235 },\n category: VitalPointCategory.JOINT,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 28,\n effects: [],\n description: {\n korean: \"발목 염좌 또는 골절\",\n english: \"Ankle sprain or fracture\",\n romanized: \"balmok yeomjwa\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.TAE, TrigramStance.GON],\n },\n {\n id: \"leg_right_foot\",\n names: {\n korean: \"우발등\",\n english: \"Right Foot\",\n romanized: \"u-baldeung\",\n },\n position: { x: 110, y: 245 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MINOR,\n baseDamage: 18,\n effects: [],\n description: {\n korean: \"발등 골절, 보행 곤란\",\n english: \"Foot fracture, walking difficulty\",\n romanized: \"baldeung goljeol\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.GON],\n },\n {\n id: \"leg_right_calf\",\n names: {\n korean: \"우종아리\",\n english: \"Right Calf\",\n romanized: \"u-jong-ari\",\n },\n position: { x: 112, y: 225 },\n category: VitalPointCategory.MUSCULAR,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 23,\n effects: [],\n description: {\n korean: \"종아리 근육 손상\",\n english: \"Calf muscle damage\",\n romanized: \"jong-ari geunnyuk sonsang\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.SON, TrigramStance.GEON],\n },\n {\n id: \"leg_right_achilles\",\n names: {\n korean: \"우아킬레스건\",\n english: \"Right Achilles Tendon\",\n romanized: \"u-akilleseugeon\",\n },\n position: { x: 114, y: 238 },\n category: VitalPointCategory.MUSCULAR,\n severity: VitalPointSeverity.CRITICAL,\n baseDamage: 40,\n effects: [\n {\n id: \"achilles_rupture_right\",\n type: VitalPointEffectType.WEAKNESS,\n intensity: EffectIntensity.EXTREME,\n duration: 12000,\n description: {\n korean: \"아킬레스건 파열\",\n english: \"Achilles tendon rupture\",\n },\n stackable: false,\n },\n {\n id: \"movement_impossible_right\",\n type: VitalPointEffectType.PARALYSIS,\n intensity: EffectIntensity.HIGH,\n duration: 10000,\n description: { korean: \"이동 불가\", english: \"Cannot move\" },\n stackable: false,\n },\n ],\n description: {\n korean: \"아킬레스건 파열, 이동 불가\",\n english: \"Achilles tendon rupture, cannot move\",\n romanized: \"akilleseugeon paryeol\",\n },\n targetingDifficulty: 0.8,\n effectiveStances: [TrigramStance.LI, TrigramStance.GON],\n },\n {\n id: \"leg_right_femoral_nerve\",\n names: {\n korean: \"우대퇴신경\",\n english: \"Right Femoral Nerve\",\n romanized: \"u-daetwe singyeong\",\n },\n position: { x: 108, y: 180 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 32,\n effects: [],\n description: {\n korean: \"대퇴 신경 타격, 다리 마비\",\n english: \"Femoral nerve strike, leg paralysis\",\n romanized: \"daetwe singyeong tagyeok\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.LI, TrigramStance.SON],\n },\n {\n id: \"leg_right_peroneal_nerve\",\n names: {\n korean: \"우비골신경\",\n english: \"Right Peroneal Nerve\",\n romanized: \"u-bigol singyeong\",\n },\n position: { x: 112, y: 210 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 27,\n effects: [],\n description: {\n korean: \"비골 신경 타격, 발 기능 상실\",\n english: \"Peroneal nerve strike, foot function loss\",\n romanized: \"bigol singyeong tagyeok\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.LI],\n },\n] as const;\n\n/**\n * Gets vital points by body region.\n *\n * @param region - Body region to filter by\n * @returns Array of vital points in that region\n *\n * @korean 부위별급소\n */\nexport function getVitalPointsByRegion(\n region: BodyRegion\n): readonly VitalPoint[] {\n // This is a simplified implementation - in production you'd map IDs to regions properly\n const regionPrefixes: Record<BodyRegion, string[]> = {\n [BodyRegion.HEAD]: [\"head_\"],\n [BodyRegion.NECK]: [\"head_side_neck\", \"head_throat\"],\n [BodyRegion.TORSO]: [\"torso_\"],\n [BodyRegion.LEFT_ARM]: [\"arm_left_\"],\n [BodyRegion.RIGHT_ARM]: [\"arm_right_\"],\n [BodyRegion.LEFT_LEG]: [\"leg_left_\"],\n [BodyRegion.RIGHT_LEG]: [\"leg_right_\"],\n [BodyRegion.CORE]: [\n \"torso_solar_plexus\",\n \"torso_diaphragm\",\n \"torso_abs_center\",\n ],\n };\n\n const prefixes = regionPrefixes[region] ?? [];\n return VITAL_POINTS_DATA.filter((vp) =>\n prefixes.some((prefix) => vp.id.startsWith(prefix))\n );\n}\n\n/**\n * Gets total count of vital points.\n *\n * @returns Total number of vital points\n *\n * @korean 급소총개수\n */\nexport function getTotalVitalPointsCount(): number {\n return VITAL_POINTS_DATA.length;\n}\n\nexport default VITAL_POINTS_DATA;\n"],"mappings":"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"}
1
+ {"version":3,"file":"VitalPointsData.js","names":[],"sources":["../../../src/systems/vitalpoint/VitalPointsData.ts"],"sourcesContent":["/**\n * Comprehensive Korean Vital Points Database (급소 데이터베이스)\n *\n * **Korean**: 한국 무술 급소 시스템\n *\n * Contains all 70 Korean martial arts vital points (급소) based on traditional\n * martial arts knowledge and anatomical targeting. Points are organized by\n * body region and categorized by physiological system affected.\n *\n * @module systems/vitalpoint/VitalPointsData\n * @category Vital Point System\n * @korean 급소데이터\n */\n\nimport {\n BodyRegion,\n TrigramStance,\n VitalPointCategory,\n VitalPointEffectType,\n VitalPointSeverity,\n} from \"@/types\";\nimport { EffectIntensity } from \"../effects\";\nimport { VitalPoint } from \"./types\";\n\n/**\n * Complete database of 70 Korean vital points organized by body region.\n *\n * **Korean**: 70개 급소 데이터베이스\n *\n * Distribution:\n * - Head: 12 points\n * - Torso: 24 points\n * - Arms: 17 points (각 8-9 per arm)\n * - Legs: 17 points (각 8-9 per leg)\n *\n * @korean 급소데이터베이스\n */\nexport const VITAL_POINTS_DATA: readonly VitalPoint[] = [\n // ============= HEAD REGION (12 points) =============\n {\n id: \"head_temple\",\n names: {\n korean: \"태양혈\",\n english: \"Temple\",\n romanized: \"taeyang-hyeol\",\n },\n position: { x: 100, y: 50 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.CRITICAL,\n baseDamage: 35,\n effects: [\n {\n id: \"stun_major\",\n type: VitalPointEffectType.STUN,\n intensity: EffectIntensity.HIGH,\n duration: 3000,\n description: { korean: \"심각한 기절\", english: \"Severe stunning\" },\n stackable: false,\n },\n ],\n description: {\n korean: \"관자놀이의 압박점, 뇌진탕 위험\",\n english: \"Pressure point at temple, concussion risk\",\n romanized: \"gwanja-nori-ui apbakjeom\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.LI, TrigramStance.JIN],\n },\n {\n id: \"head_jaw\",\n names: {\n korean: \"턱끝\",\n english: \"Jaw Point\",\n romanized: \"teok-kkeut\",\n },\n position: { x: 105, y: 80 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 30,\n effects: [],\n description: {\n korean: \"턱 끝 타격으로 뇌진탕 유발\",\n english: \"Jaw strike causes concussion\",\n romanized: \"teok-kkeut tagyeok\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.GEON, TrigramStance.JIN],\n },\n {\n id: \"head_nose\",\n names: {\n korean: \"코\",\n english: \"Nose Bridge\",\n romanized: \"ko\",\n },\n position: { x: 102, y: 65 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 28,\n effects: [],\n description: {\n korean: \"코뼈 골절, 시야 방해\",\n english: \"Nasal bone fracture, vision impairment\",\n romanized: \"koppyeo goljeol\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.LI, TrigramStance.GEON],\n },\n {\n id: \"head_eye\",\n names: {\n korean: \"눈\",\n english: \"Eye\",\n romanized: \"nun\",\n },\n position: { x: 98, y: 55 },\n category: VitalPointCategory.ORGAN,\n severity: VitalPointSeverity.CRITICAL,\n baseDamage: 40,\n effects: [],\n description: {\n korean: \"눈 공격, 실명 위험\",\n english: \"Eye strike, blindness risk\",\n romanized: \"nun gonggyeok\",\n },\n targetingDifficulty: 0.8,\n effectiveStances: [TrigramStance.LI],\n },\n {\n id: \"head_ear\",\n names: {\n korean: \"귀\",\n english: \"Ear\",\n romanized: \"gwi\",\n },\n position: { x: 90, y: 60 },\n category: VitalPointCategory.ORGAN,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 22,\n effects: [\n {\n id: \"balance_loss\",\n type: VitalPointEffectType.DISORIENTATION,\n intensity: EffectIntensity.MEDIUM,\n duration: 2500,\n description: {\n korean: \"평형 감각 상실 및 청력 손상\",\n english: \"Balance and hearing impairment\",\n },\n stackable: false,\n },\n ],\n description: {\n korean: \"고막 손상, 평형 감각 상실\",\n english: \"Eardrum damage, balance loss\",\n romanized: \"gomak sonsang\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.GEON],\n },\n {\n id: \"head_back_skull\",\n names: {\n korean: \"뒤통수\",\n english: \"Back of Skull\",\n romanized: \"dwi-tongsu\",\n },\n position: { x: 80, y: 50 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.LETHAL,\n baseDamage: 50,\n effects: [\n {\n id: \"unconsciousness\",\n type: VitalPointEffectType.UNCONSCIOUSNESS,\n intensity: EffectIntensity.EXTREME,\n duration: 10000,\n description: {\n korean: \"즉각적 무의식\",\n english: \"Instant unconsciousness\",\n },\n stackable: false,\n },\n ],\n description: {\n korean: \"뇌간 손상, 즉각적 무의식\",\n english: \"Brainstem damage, instant unconsciousness\",\n romanized: \"noegan sonsang\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.JIN, TrigramStance.GEON],\n },\n {\n id: \"head_crown\",\n names: {\n korean: \"정수리\",\n english: \"Crown\",\n romanized: \"jeongsu-ri\",\n },\n position: { x: 100, y: 30 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.CRITICAL,\n baseDamage: 38,\n effects: [],\n description: {\n korean: \"두개골 타격, 뇌 손상\",\n english: \"Skull impact, brain damage\",\n romanized: \"dugaegol tagyeok\",\n },\n targetingDifficulty: 0.8,\n effectiveStances: [TrigramStance.GEON],\n },\n {\n id: \"head_philtrum\",\n names: {\n korean: \"인중\",\n english: \"Philtrum\",\n romanized: \"injung\",\n },\n position: { x: 102, y: 70 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 25,\n effects: [],\n description: {\n korean: \"인중 타격, 통증 및 기절\",\n english: \"Philtrum strike, pain and stunning\",\n romanized: \"injung tagyeok\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.LI],\n },\n {\n id: \"head_side_neck\",\n names: {\n korean: \"목옆\",\n english: \"Side Neck\",\n romanized: \"mog-yeop\",\n },\n position: { x: 92, y: 85 },\n category: VitalPointCategory.VASCULAR,\n severity: VitalPointSeverity.CRITICAL,\n baseDamage: 42,\n effects: [\n {\n id: \"unconsciousness_carotid\",\n type: VitalPointEffectType.UNCONSCIOUSNESS,\n intensity: EffectIntensity.HIGH,\n duration: 8000,\n description: {\n korean: \"경동맥 압박으로 실신\",\n english: \"Carotid compression unconsciousness\",\n },\n stackable: false,\n },\n ],\n description: {\n korean: \"경동맥 압박, 실신 유발\",\n english: \"Carotid compression, unconsciousness\",\n romanized: \"gyeongdongmaek apbak\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.SON, TrigramStance.GAM],\n },\n {\n id: \"head_throat\",\n names: {\n korean: \"목\",\n english: \"Throat\",\n romanized: \"mok\",\n },\n position: { x: 102, y: 90 },\n category: VitalPointCategory.RESPIRATORY,\n severity: VitalPointSeverity.LETHAL,\n baseDamage: 55,\n effects: [\n {\n id: \"breathing_difficulty\",\n type: VitalPointEffectType.BREATHLESSNESS,\n intensity: EffectIntensity.EXTREME,\n duration: 5000,\n description: {\n korean: \"호흡 곤란\",\n english: \"Severe breathing difficulty\",\n },\n stackable: false,\n },\n ],\n description: {\n korean: \"기도 폐쇄, 호흡 곤란\",\n english: \"Airway closure, breathing difficulty\",\n romanized: \"gido pyeshwe\",\n },\n targetingDifficulty: 0.8,\n effectiveStances: [TrigramStance.LI],\n },\n {\n id: \"head_mastoid\",\n names: {\n korean: \"유양돌기\",\n english: \"Mastoid Process\",\n romanized: \"yuyang-dolgi\",\n },\n position: { x: 88, y: 75 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 32,\n effects: [],\n description: {\n korean: \"귀 뒤 돌기, 평형 감각 손상\",\n english: \"Behind ear protrusion, balance disruption\",\n romanized: \"gwi dwi dolgi\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.LI, TrigramStance.GEON],\n },\n {\n id: \"head_chin\",\n names: {\n korean: \"턱\",\n english: \"Chin\",\n romanized: \"teok\",\n },\n position: { x: 102, y: 82 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 30,\n effects: [],\n description: {\n korean: \"턱 중앙 타격, 뇌진탕\",\n english: \"Chin center strike, concussion\",\n romanized: \"teok jungang tagyeok\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.GEON, TrigramStance.JIN],\n },\n\n // ============= TORSO REGION (24 points) =============\n {\n id: \"torso_solar_plexus\",\n names: {\n korean: \"명치\",\n english: \"Solar Plexus\",\n romanized: \"myeongchi\",\n },\n position: { x: 102, y: 140 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.CRITICAL,\n baseDamage: 40,\n effects: [\n {\n id: \"breath_knocked_out\",\n type: VitalPointEffectType.BREATHLESSNESS,\n intensity: EffectIntensity.HIGH,\n duration: 3000,\n description: {\n korean: \"호흡 곤란 및 신경 충격\",\n english: \"Breathing difficulty and nerve shock\",\n },\n stackable: false,\n },\n ],\n description: {\n korean: \"신경총 타격, 호흡 곤란\",\n english: \"Nerve plexus strike, breathing difficulty\",\n romanized: \"singyeongjong tagyeok\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.JIN, TrigramStance.GEON],\n },\n {\n id: \"torso_heart\",\n names: {\n korean: \"심장\",\n english: \"Heart Region\",\n romanized: \"simjang\",\n },\n position: { x: 98, y: 130 },\n category: VitalPointCategory.ORGAN,\n severity: VitalPointSeverity.LETHAL,\n baseDamage: 60,\n effects: [\n {\n id: \"cardiac_disruption\",\n type: VitalPointEffectType.ORGAN_DISRUPTION,\n intensity: EffectIntensity.EXTREME,\n duration: 10000,\n description: { korean: \"심장 충격\", english: \"Cardiac disruption\" },\n stackable: false,\n },\n ],\n description: {\n korean: \"심장 충격, 심정지 위험\",\n english: \"Heart shock, cardiac arrest risk\",\n romanized: \"simjang chunggyeok\",\n },\n targetingDifficulty: 0.9,\n effectiveStances: [TrigramStance.JIN, TrigramStance.LI],\n },\n {\n id: \"torso_liver\",\n names: {\n korean: \"간\",\n english: \"Liver\",\n romanized: \"gan\",\n },\n position: { x: 110, y: 145 },\n category: VitalPointCategory.ORGAN,\n severity: VitalPointSeverity.CRITICAL,\n baseDamage: 45,\n effects: [\n {\n id: \"internal_bleeding\",\n type: VitalPointEffectType.ORGAN_DISRUPTION,\n intensity: EffectIntensity.HIGH,\n duration: 8000,\n description: {\n korean: \"내출혈 및 극심한 통증\",\n english: \"Internal bleeding and severe pain\",\n },\n stackable: false,\n },\n {\n id: \"liver_pain\",\n type: VitalPointEffectType.PAIN,\n intensity: EffectIntensity.HIGH,\n duration: 6000,\n description: { korean: \"간 타격 통증\", english: \"Liver strike pain\" },\n stackable: false,\n },\n ],\n description: {\n korean: \"간 손상, 내출혈\",\n english: \"Liver damage, internal bleeding\",\n romanized: \"gan sonsang\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.GEON, TrigramStance.JIN],\n },\n {\n id: \"torso_spleen\",\n names: {\n korean: \"비장\",\n english: \"Spleen\",\n romanized: \"bijang\",\n },\n position: { x: 94, y: 145 },\n category: VitalPointCategory.ORGAN,\n severity: VitalPointSeverity.CRITICAL,\n baseDamage: 45,\n effects: [\n {\n id: \"spleen_rupture_risk\",\n type: VitalPointEffectType.ORGAN_DISRUPTION,\n intensity: EffectIntensity.HIGH,\n duration: 8000,\n description: {\n korean: \"비장 파열 위험\",\n english: \"Spleen rupture risk\",\n },\n stackable: false,\n },\n {\n id: \"internal_bleeding_spleen\",\n type: VitalPointEffectType.WEAKNESS,\n intensity: EffectIntensity.HIGH,\n duration: 10000,\n description: {\n korean: \"내출혈로 인한 약화\",\n english: \"Weakness from internal bleeding\",\n },\n stackable: false,\n },\n ],\n description: {\n korean: \"비장 파열 위험\",\n english: \"Spleen rupture risk\",\n romanized: \"bijang paryeol\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.GEON, TrigramStance.JIN],\n },\n {\n id: \"torso_kidney_left\",\n names: {\n korean: \"좌신장\",\n english: \"Left Kidney\",\n romanized: \"jwa-sinjang\",\n },\n position: { x: 94, y: 155 },\n category: VitalPointCategory.ORGAN,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 38,\n effects: [\n {\n id: \"kidney_pain\",\n type: VitalPointEffectType.PAIN,\n intensity: EffectIntensity.HIGH,\n duration: 4000,\n description: {\n korean: \"신장 타격 극심한 통증\",\n english: \"Severe kidney strike pain\",\n },\n stackable: false,\n },\n ],\n description: {\n korean: \"신장 타격, 심한 통증\",\n english: \"Kidney strike, severe pain\",\n romanized: \"sinjang tagyeok\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.GEON, TrigramStance.SON],\n },\n {\n id: \"torso_kidney_right\",\n names: {\n korean: \"우신장\",\n english: \"Right Kidney\",\n romanized: \"u-sinjang\",\n },\n position: { x: 110, y: 155 },\n category: VitalPointCategory.ORGAN,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 38,\n effects: [\n {\n id: \"kidney_pain_right\",\n type: VitalPointEffectType.PAIN,\n intensity: EffectIntensity.HIGH,\n duration: 4000,\n description: {\n korean: \"신장 타격 극심한 통증\",\n english: \"Severe kidney strike pain\",\n },\n stackable: false,\n },\n ],\n description: {\n korean: \"신장 타격, 심한 통증\",\n english: \"Kidney strike, severe pain\",\n romanized: \"sinjang tagyeok\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.GEON, TrigramStance.SON],\n },\n {\n id: \"torso_ribs_floating\",\n names: {\n korean: \"갈비뼈\",\n english: \"Floating Ribs\",\n romanized: \"galbi-ppyeo\",\n },\n position: { x: 106, y: 150 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 35,\n effects: [],\n description: {\n korean: \"늑골 골절, 내장 손상\",\n english: \"Rib fracture, organ damage\",\n romanized: \"neukgol goljeol\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.GEON, TrigramStance.SON],\n },\n {\n id: \"torso_sternum\",\n names: {\n korean: \"흉골\",\n english: \"Sternum\",\n romanized: \"hyunggol\",\n },\n position: { x: 102, y: 130 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.CRITICAL,\n baseDamage: 40,\n effects: [],\n description: {\n korean: \"흉골 골절, 심장 압박\",\n english: \"Sternum fracture, heart compression\",\n romanized: \"hyunggol goljeol\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.GEON, TrigramStance.JIN],\n },\n {\n id: \"torso_spine_upper\",\n names: {\n korean: \"상부척추\",\n english: \"Upper Spine\",\n romanized: \"sangbu-cheokchu\",\n },\n position: { x: 80, y: 120 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.LETHAL,\n baseDamage: 55,\n effects: [\n {\n id: \"spinal_trauma\",\n type: VitalPointEffectType.PARALYSIS,\n intensity: EffectIntensity.EXTREME,\n duration: 15000,\n description: {\n korean: \"척추 손상으로 마비\",\n english: \"Spinal trauma paralysis\",\n },\n stackable: false,\n },\n {\n id: \"nerve_disruption_spine\",\n type: VitalPointEffectType.NERVE_DISRUPTION,\n intensity: EffectIntensity.EXTREME,\n duration: 12000,\n description: {\n korean: \"신경 차단\",\n english: \"Nerve pathway disruption\",\n },\n stackable: false,\n },\n ],\n description: {\n korean: \"척추 손상, 마비 위험\",\n english: \"Spine damage, paralysis risk\",\n romanized: \"cheokchu sonsang\",\n },\n targetingDifficulty: 0.8,\n effectiveStances: [TrigramStance.GEON, TrigramStance.GON],\n },\n {\n id: \"torso_spine_mid\",\n names: {\n korean: \"중부척추\",\n english: \"Mid Spine\",\n romanized: \"jungbu-cheokchu\",\n },\n position: { x: 80, y: 145 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.CRITICAL,\n baseDamage: 42,\n effects: [\n {\n id: \"nerve_damage_mid_spine\",\n type: VitalPointEffectType.NERVE_DISRUPTION,\n intensity: EffectIntensity.HIGH,\n duration: 8000,\n description: { korean: \"신경 손상\", english: \"Nerve damage\" },\n stackable: false,\n },\n {\n id: \"spinal_pain\",\n type: VitalPointEffectType.PAIN,\n intensity: EffectIntensity.HIGH,\n duration: 6000,\n description: { korean: \"척추 통증\", english: \"Spinal pain\" },\n stackable: false,\n },\n ],\n description: {\n korean: \"척추 타격, 신경 손상\",\n english: \"Spine strike, nerve damage\",\n romanized: \"cheokchu tagyeok\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.GEON, TrigramStance.GON],\n },\n {\n id: \"torso_groin\",\n names: {\n korean: \"사타구니\",\n english: \"Groin\",\n romanized: \"sata-guni\",\n },\n position: { x: 102, y: 170 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.CRITICAL,\n baseDamage: 50,\n effects: [\n {\n id: \"extreme_pain\",\n type: VitalPointEffectType.PAIN,\n intensity: EffectIntensity.EXTREME,\n duration: 5000,\n description: { korean: \"극심한 통증\", english: \"Extreme pain\" },\n stackable: false,\n },\n {\n id: \"groin_stun\",\n type: VitalPointEffectType.STUN,\n intensity: EffectIntensity.HIGH,\n duration: 3000,\n description: {\n korean: \"충격으로 인한 기절\",\n english: \"Shock-induced incapacitation\",\n },\n stackable: false,\n },\n ],\n description: {\n korean: \"사타구니 타격, 극심한 통증\",\n english: \"Groin strike, extreme pain\",\n romanized: \"sata-guni tagyeok\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.LI, TrigramStance.GEON],\n },\n {\n id: \"torso_bladder\",\n names: {\n korean: \"방광\",\n english: \"Bladder\",\n romanized: \"banggwang\",\n },\n position: { x: 102, y: 165 },\n category: VitalPointCategory.ORGAN,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 35,\n effects: [],\n description: {\n korean: \"방광 압박, 통증 및 기능 장애\",\n english: \"Bladder compression, pain and dysfunction\",\n romanized: \"banggwang apbak\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.GEON, TrigramStance.SON],\n },\n // Additional torso points (continuing to 24 total)\n {\n id: \"torso_collarbone_left\",\n names: {\n korean: \"좌쇄골\",\n english: \"Left Collarbone\",\n romanized: \"jwa-swaegol\",\n },\n position: { x: 92, y: 110 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 32,\n effects: [],\n description: {\n korean: \"쇄골 골절, 팔 움직임 제한\",\n english: \"Collarbone fracture, arm movement limitation\",\n romanized: \"swaegol goljeol\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.GEON, TrigramStance.JIN],\n },\n {\n id: \"torso_collarbone_right\",\n names: {\n korean: \"우쇄골\",\n english: \"Right Collarbone\",\n romanized: \"u-swaegol\",\n },\n position: { x: 112, y: 110 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 32,\n effects: [],\n description: {\n korean: \"쇄골 골절, 팔 움직임 제한\",\n english: \"Collarbone fracture, arm movement limitation\",\n romanized: \"swaegol goljeol\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.GEON, TrigramStance.JIN],\n },\n {\n id: \"torso_armpit_nerve\",\n names: {\n korean: \"겨드랑이신경\",\n english: \"Armpit Nerve\",\n romanized: \"gyeodeu-rangi singyeong\",\n },\n position: { x: 85, y: 120 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 28,\n effects: [],\n description: {\n korean: \"신경총 타격, 팔 마비\",\n english: \"Nerve plexus strike, arm paralysis\",\n romanized: \"singyeongjong tagyeok\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.LI, TrigramStance.SON],\n },\n {\n id: \"torso_abs_center\",\n names: {\n korean: \"복부중앙\",\n english: \"Abdominal Center\",\n romanized: \"bokbu-jungang\",\n },\n position: { x: 102, y: 148 },\n category: VitalPointCategory.MUSCULAR,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 26,\n effects: [],\n description: {\n korean: \"복근 손상, 호흡 곤란\",\n english: \"Abdominal muscle damage, breathing difficulty\",\n romanized: \"bokgeun sonsang\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.GEON, TrigramStance.SON],\n },\n {\n id: \"torso_diaphragm\",\n names: {\n korean: \"횡격막\",\n english: \"Diaphragm\",\n romanized: \"hyeokgyeongmak\",\n },\n position: { x: 102, y: 142 },\n category: VitalPointCategory.RESPIRATORY,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 35,\n effects: [],\n description: {\n korean: \"횡격막 충격, 호흡 정지\",\n english: \"Diaphragm shock, breathing cessation\",\n romanized: \"hyeokgyeongmak chunggyeok\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.JIN, TrigramStance.GEON],\n },\n {\n id: \"torso_lower_back\",\n names: {\n korean: \"요추\",\n english: \"Lower Back\",\n romanized: \"yochu\",\n },\n position: { x: 80, y: 160 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 36,\n effects: [],\n description: {\n korean: \"요추 타격, 다리 통증\",\n english: \"Lower back strike, leg pain\",\n romanized: \"yochu tagyeok\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.GEON, TrigramStance.GON],\n },\n {\n id: \"torso_side_ribs_left\",\n names: {\n korean: \"좌측늑골\",\n english: \"Left Side Ribs\",\n romanized: \"jwa-cheuk neukgol\",\n },\n position: { x: 90, y: 140 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 33,\n effects: [],\n description: {\n korean: \"늑골 타격, 호흡 곤란\",\n english: \"Rib strike, breathing difficulty\",\n romanized: \"neukgol tagyeok\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.SON, TrigramStance.GEON],\n },\n {\n id: \"torso_side_ribs_right\",\n names: {\n korean: \"우측늑골\",\n english: \"Right Side Ribs\",\n romanized: \"u-cheuk neukgol\",\n },\n position: { x: 114, y: 140 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 33,\n effects: [],\n description: {\n korean: \"늑골 타격, 호흡 곤란\",\n english: \"Rib strike, breathing difficulty\",\n romanized: \"neukgol tagyeok\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.SON, TrigramStance.GEON],\n },\n {\n id: \"torso_navel\",\n names: {\n korean: \"배꼽\",\n english: \"Navel\",\n romanized: \"bae-kkop\",\n },\n position: { x: 102, y: 152 },\n category: VitalPointCategory.ORGAN,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 27,\n effects: [],\n description: {\n korean: \"복부 중심 타격\",\n english: \"Abdominal center strike\",\n romanized: \"bokbu jungsim tagyeok\",\n },\n targetingDifficulty: 0.4,\n effectiveStances: [TrigramStance.GEON, TrigramStance.SON],\n },\n {\n id: \"torso_shoulder_blade_left\",\n names: {\n korean: \"좌견갑골\",\n english: \"Left Shoulder Blade\",\n romanized: \"jwa-gyeongapgol\",\n },\n position: { x: 75, y: 115 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 28,\n effects: [],\n description: {\n korean: \"견갑골 타격, 팔 기능 저하\",\n english: \"Shoulder blade strike, arm function reduction\",\n romanized: \"gyeongapgol tagyeok\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.GEON, TrigramStance.GON],\n },\n {\n id: \"torso_shoulder_blade_right\",\n names: {\n korean: \"우견갑골\",\n english: \"Right Shoulder Blade\",\n romanized: \"u-gyeongapgol\",\n },\n position: { x: 129, y: 115 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 28,\n effects: [],\n description: {\n korean: \"견갑골 타격, 팔 기능 저하\",\n english: \"Shoulder blade strike, arm function reduction\",\n romanized: \"gyeongapgol tagyeok\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.GEON, TrigramStance.GON],\n },\n {\n id: \"torso_tailbone\",\n names: {\n korean: \"미골\",\n english: \"Tailbone\",\n romanized: \"migol\",\n },\n position: { x: 80, y: 170 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 34,\n effects: [],\n description: {\n korean: \"미골 골절, 앉기 곤란\",\n english: \"Tailbone fracture, sitting difficulty\",\n romanized: \"migol goljeol\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.GON, TrigramStance.JIN],\n },\n\n // ============= LEFT ARM REGION (8 points) =============\n {\n id: \"arm_left_shoulder\",\n names: {\n korean: \"좌어깨\",\n english: \"Left Shoulder\",\n romanized: \"jwa-eokkae\",\n },\n position: { x: 82, y: 110 },\n category: VitalPointCategory.JOINT,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 26,\n effects: [],\n description: {\n korean: \"어깨 관절 탈구\",\n english: \"Shoulder joint dislocation\",\n romanized: \"eokkae gwanjeol talgoo\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.TAE, TrigramStance.GAM],\n },\n {\n id: \"arm_left_bicep\",\n names: {\n korean: \"좌상완\",\n english: \"Left Bicep\",\n romanized: \"jwa-sangwan\",\n },\n position: { x: 78, y: 125 },\n category: VitalPointCategory.MUSCULAR,\n severity: VitalPointSeverity.MINOR,\n baseDamage: 18,\n effects: [],\n description: {\n korean: \"상완 근육 손상\",\n english: \"Bicep muscle damage\",\n romanized: \"sangwan geunnyuk sonsang\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.GEON, TrigramStance.SON],\n },\n {\n id: \"arm_left_elbow\",\n names: {\n korean: \"좌팔꿈치\",\n english: \"Left Elbow\",\n romanized: \"jwa-palkumchi\",\n },\n position: { x: 74, y: 142 },\n category: VitalPointCategory.JOINT,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 30,\n effects: [],\n description: {\n korean: \"팔꿈치 골절 또는 탈구\",\n english: \"Elbow fracture or dislocation\",\n romanized: \"palkumchi goljeol\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.TAE, TrigramStance.GON],\n },\n {\n id: \"arm_left_forearm\",\n names: {\n korean: \"좌전완\",\n english: \"Left Forearm\",\n romanized: \"jwa-jeonwan\",\n },\n position: { x: 72, y: 155 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 24,\n effects: [],\n description: {\n korean: \"전완부 골절\",\n english: \"Forearm fracture\",\n romanized: \"jeonwanbu goljeol\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.GAN],\n },\n {\n id: \"arm_left_wrist\",\n names: {\n korean: \"좌손목\",\n english: \"Left Wrist\",\n romanized: \"jwa-sonmok\",\n },\n position: { x: 70, y: 168 },\n category: VitalPointCategory.JOINT,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 22,\n effects: [],\n description: {\n korean: \"손목 골절 또는 염좌\",\n english: \"Wrist fracture or sprain\",\n romanized: \"sonmok goljeol\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.TAE, TrigramStance.GAM],\n },\n {\n id: \"arm_left_hand\",\n names: {\n korean: \"좌손등\",\n english: \"Left Hand\",\n romanized: \"jwa-sondeung\",\n },\n position: { x: 68, y: 178 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MINOR,\n baseDamage: 16,\n effects: [],\n description: {\n korean: \"손등 타격, 기능 저하\",\n english: \"Hand strike, function reduction\",\n romanized: \"sondeung tagyeok\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.LI],\n },\n {\n id: \"arm_left_radial_nerve\",\n names: {\n korean: \"좌요골신경\",\n english: \"Left Radial Nerve\",\n romanized: \"jwa-yogol singyeong\",\n },\n position: { x: 72, y: 148 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 25,\n effects: [],\n description: {\n korean: \"요골 신경 타격, 팔 마비\",\n english: \"Radial nerve strike, arm paralysis\",\n romanized: \"yogol singyeong tagyeok\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.LI, TrigramStance.SON],\n },\n {\n id: \"arm_left_ulnar_nerve\",\n names: {\n korean: \"좌척골신경\",\n english: \"Left Ulnar Nerve\",\n romanized: \"jwa-cheokgol singyeong\",\n },\n position: { x: 74, y: 150 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 24,\n effects: [],\n description: {\n korean: \"척골 신경 타격, 손 기능 상실\",\n english: \"Ulnar nerve strike, hand function loss\",\n romanized: \"cheokgol singyeong tagyeok\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.LI],\n },\n\n // ============= RIGHT ARM REGION (9 points) =============\n {\n id: \"arm_right_shoulder\",\n names: {\n korean: \"우어깨\",\n english: \"Right Shoulder\",\n romanized: \"u-eokkae\",\n },\n position: { x: 122, y: 110 },\n category: VitalPointCategory.JOINT,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 26,\n effects: [],\n description: {\n korean: \"어깨 관절 탈구\",\n english: \"Shoulder joint dislocation\",\n romanized: \"eokkae gwanjeol talgoo\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.TAE, TrigramStance.GAM],\n },\n {\n id: \"arm_right_bicep\",\n names: {\n korean: \"우상완\",\n english: \"Right Bicep\",\n romanized: \"u-sangwan\",\n },\n position: { x: 126, y: 125 },\n category: VitalPointCategory.MUSCULAR,\n severity: VitalPointSeverity.MINOR,\n baseDamage: 18,\n effects: [],\n description: {\n korean: \"상완 근육 손상\",\n english: \"Bicep muscle damage\",\n romanized: \"sangwan geunnyuk sonsang\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.GEON, TrigramStance.SON],\n },\n {\n id: \"arm_right_elbow\",\n names: {\n korean: \"우팔꿈치\",\n english: \"Right Elbow\",\n romanized: \"u-palkumchi\",\n },\n position: { x: 130, y: 142 },\n category: VitalPointCategory.JOINT,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 30,\n effects: [],\n description: {\n korean: \"팔꿈치 골절 또는 탈구\",\n english: \"Elbow fracture or dislocation\",\n romanized: \"palkumchi goljeol\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.TAE, TrigramStance.GON],\n },\n {\n id: \"arm_right_forearm\",\n names: {\n korean: \"우전완\",\n english: \"Right Forearm\",\n romanized: \"u-jeonwan\",\n },\n position: { x: 132, y: 155 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 24,\n effects: [],\n description: {\n korean: \"전완부 골절\",\n english: \"Forearm fracture\",\n romanized: \"jeonwanbu goljeol\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.GAN],\n },\n {\n id: \"arm_right_wrist\",\n names: {\n korean: \"우손목\",\n english: \"Right Wrist\",\n romanized: \"u-sonmok\",\n },\n position: { x: 134, y: 168 },\n category: VitalPointCategory.JOINT,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 22,\n effects: [],\n description: {\n korean: \"손목 골절 또는 염좌\",\n english: \"Wrist fracture or sprain\",\n romanized: \"sonmok goljeol\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.TAE, TrigramStance.GAM],\n },\n {\n id: \"arm_right_hand\",\n names: {\n korean: \"우손등\",\n english: \"Right Hand\",\n romanized: \"u-sondeung\",\n },\n position: { x: 136, y: 178 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MINOR,\n baseDamage: 16,\n effects: [],\n description: {\n korean: \"손등 타격, 기능 저하\",\n english: \"Hand strike, function reduction\",\n romanized: \"sondeung tagyeok\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.LI],\n },\n {\n id: \"arm_right_radial_nerve\",\n names: {\n korean: \"우요골신경\",\n english: \"Right Radial Nerve\",\n romanized: \"u-yogol singyeong\",\n },\n position: { x: 132, y: 148 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 25,\n effects: [],\n description: {\n korean: \"요골 신경 타격, 팔 마비\",\n english: \"Radial nerve strike, arm paralysis\",\n romanized: \"yogol singyeong tagyeok\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.LI, TrigramStance.SON],\n },\n {\n id: \"arm_right_ulnar_nerve\",\n names: {\n korean: \"우척골신경\",\n english: \"Right Ulnar Nerve\",\n romanized: \"u-cheokgol singyeong\",\n },\n position: { x: 130, y: 150 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 24,\n effects: [],\n description: {\n korean: \"척골 신경 타격, 손 기능 상실\",\n english: \"Ulnar nerve strike, hand function loss\",\n romanized: \"cheokgol singyeong tagyeok\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.LI],\n },\n {\n id: \"arm_right_tricep\",\n names: {\n korean: \"우삼두\",\n english: \"Right Tricep\",\n romanized: \"u-samdu\",\n },\n position: { x: 128, y: 135 },\n category: VitalPointCategory.MUSCULAR,\n severity: VitalPointSeverity.MINOR,\n baseDamage: 17,\n effects: [],\n description: {\n korean: \"삼두근 손상\",\n english: \"Tricep muscle damage\",\n romanized: \"samdugeun sonsang\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.GEON],\n },\n\n // ============= LEFT LEG REGION (8 points) =============\n {\n id: \"leg_left_thigh\",\n names: {\n korean: \"좌대퇴\",\n english: \"Left Thigh\",\n romanized: \"jwa-daetwe\",\n },\n position: { x: 94, y: 185 },\n category: VitalPointCategory.MUSCULAR,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 22,\n effects: [],\n description: {\n korean: \"대퇴근 손상, 이동 곤란\",\n english: \"Thigh muscle damage, movement difficulty\",\n romanized: \"daetwegeun sonsang\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.GEON, TrigramStance.SON],\n },\n {\n id: \"leg_left_knee\",\n names: {\n korean: \"좌무릎\",\n english: \"Left Knee\",\n romanized: \"jwa-mureup\",\n },\n position: { x: 94, y: 205 },\n category: VitalPointCategory.JOINT,\n severity: VitalPointSeverity.CRITICAL,\n baseDamage: 38,\n effects: [\n {\n id: \"knee_destruction\",\n type: VitalPointEffectType.WEAKNESS,\n intensity: EffectIntensity.HIGH,\n duration: 10000,\n description: {\n korean: \"무릎 파괴로 보행 불가\",\n english: \"Knee destruction, unable to walk\",\n },\n stackable: false,\n },\n {\n id: \"mobility_loss\",\n type: VitalPointEffectType.PARALYSIS,\n intensity: EffectIntensity.MEDIUM,\n duration: 8000,\n description: { korean: \"이동력 상실\", english: \"Mobility loss\" },\n stackable: false,\n },\n ],\n description: {\n korean: \"무릎 관절 파괴, 보행 불가\",\n english: \"Knee joint destruction, unable to walk\",\n romanized: \"mureup gwanjeol pagoe\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.TAE, TrigramStance.GON],\n },\n {\n id: \"leg_left_shin\",\n names: {\n korean: \"좌정강이\",\n english: \"Left Shin\",\n romanized: \"jwa-jeonggang-i\",\n },\n position: { x: 94, y: 220 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 26,\n effects: [],\n description: {\n korean: \"정강이 골절\",\n english: \"Shin fracture\",\n romanized: \"jeonggang-i goljeol\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.GEON, TrigramStance.GAN],\n },\n {\n id: \"leg_left_ankle\",\n names: {\n korean: \"좌발목\",\n english: \"Left Ankle\",\n romanized: \"jwa-balmok\",\n },\n position: { x: 94, y: 235 },\n category: VitalPointCategory.JOINT,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 28,\n effects: [],\n description: {\n korean: \"발목 염좌 또는 골절\",\n english: \"Ankle sprain or fracture\",\n romanized: \"balmok yeomjwa\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.TAE, TrigramStance.GON],\n },\n {\n id: \"leg_left_foot\",\n names: {\n korean: \"좌발등\",\n english: \"Left Foot\",\n romanized: \"jwa-baldeung\",\n },\n position: { x: 94, y: 245 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MINOR,\n baseDamage: 18,\n effects: [],\n description: {\n korean: \"발등 골절, 보행 곤란\",\n english: \"Foot fracture, walking difficulty\",\n romanized: \"baldeung goljeol\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.GON],\n },\n {\n id: \"leg_left_calf\",\n names: {\n korean: \"좌종아리\",\n english: \"Left Calf\",\n romanized: \"jwa-jong-ari\",\n },\n position: { x: 92, y: 225 },\n category: VitalPointCategory.MUSCULAR,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 23,\n effects: [],\n description: {\n korean: \"종아리 근육 손상\",\n english: \"Calf muscle damage\",\n romanized: \"jong-ari geunnyuk sonsang\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.SON, TrigramStance.GEON],\n },\n {\n id: \"leg_left_achilles\",\n names: {\n korean: \"좌아킬레스건\",\n english: \"Left Achilles Tendon\",\n romanized: \"jwa-akilleseugeon\",\n },\n position: { x: 90, y: 238 },\n category: VitalPointCategory.MUSCULAR,\n severity: VitalPointSeverity.CRITICAL,\n baseDamage: 40,\n effects: [\n {\n id: \"achilles_rupture\",\n type: VitalPointEffectType.WEAKNESS,\n intensity: EffectIntensity.EXTREME,\n duration: 12000,\n description: {\n korean: \"아킬레스건 파열\",\n english: \"Achilles tendon rupture\",\n },\n stackable: false,\n },\n {\n id: \"movement_impossible\",\n type: VitalPointEffectType.PARALYSIS,\n intensity: EffectIntensity.HIGH,\n duration: 10000,\n description: { korean: \"이동 불가\", english: \"Cannot move\" },\n stackable: false,\n },\n ],\n description: {\n korean: \"아킬레스건 파열, 이동 불가\",\n english: \"Achilles tendon rupture, cannot move\",\n romanized: \"akilleseugeon paryeol\",\n },\n targetingDifficulty: 0.8,\n effectiveStances: [TrigramStance.LI, TrigramStance.GON],\n },\n {\n id: \"leg_left_femoral_nerve\",\n names: {\n korean: \"좌대퇴신경\",\n english: \"Left Femoral Nerve\",\n romanized: \"jwa-daetwe singyeong\",\n },\n position: { x: 96, y: 180 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 32,\n effects: [],\n description: {\n korean: \"대퇴 신경 타격, 다리 마비\",\n english: \"Femoral nerve strike, leg paralysis\",\n romanized: \"daetwe singyeong tagyeok\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.LI, TrigramStance.SON],\n },\n\n // ============= RIGHT LEG REGION (9 points) =============\n {\n id: \"leg_right_thigh\",\n names: {\n korean: \"우대퇴\",\n english: \"Right Thigh\",\n romanized: \"u-daetwe\",\n },\n position: { x: 110, y: 185 },\n category: VitalPointCategory.MUSCULAR,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 22,\n effects: [],\n description: {\n korean: \"대퇴근 손상, 이동 곤란\",\n english: \"Thigh muscle damage, movement difficulty\",\n romanized: \"daetwegeun sonsang\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.GEON, TrigramStance.SON],\n },\n {\n id: \"leg_right_knee\",\n names: {\n korean: \"우무릎\",\n english: \"Right Knee\",\n romanized: \"u-mureup\",\n },\n position: { x: 110, y: 205 },\n category: VitalPointCategory.JOINT,\n severity: VitalPointSeverity.CRITICAL,\n baseDamage: 38,\n effects: [\n {\n id: \"knee_destruction_right\",\n type: VitalPointEffectType.WEAKNESS,\n intensity: EffectIntensity.HIGH,\n duration: 10000,\n description: {\n korean: \"무릎 파괴로 보행 불가\",\n english: \"Knee destruction, unable to walk\",\n },\n stackable: false,\n },\n {\n id: \"mobility_loss_right\",\n type: VitalPointEffectType.PARALYSIS,\n intensity: EffectIntensity.MEDIUM,\n duration: 8000,\n description: { korean: \"이동력 상실\", english: \"Mobility loss\" },\n stackable: false,\n },\n ],\n description: {\n korean: \"무릎 관절 파괴, 보행 불가\",\n english: \"Knee joint destruction, unable to walk\",\n romanized: \"mureup gwanjeol pagoe\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.TAE, TrigramStance.GON],\n },\n {\n id: \"leg_right_shin\",\n names: {\n korean: \"우정강이\",\n english: \"Right Shin\",\n romanized: \"u-jeonggang-i\",\n },\n position: { x: 110, y: 220 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 26,\n effects: [],\n description: {\n korean: \"정강이 골절\",\n english: \"Shin fracture\",\n romanized: \"jeonggang-i goljeol\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.GEON, TrigramStance.GAN],\n },\n {\n id: \"leg_right_ankle\",\n names: {\n korean: \"우발목\",\n english: \"Right Ankle\",\n romanized: \"u-balmok\",\n },\n position: { x: 110, y: 235 },\n category: VitalPointCategory.JOINT,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 28,\n effects: [],\n description: {\n korean: \"발목 염좌 또는 골절\",\n english: \"Ankle sprain or fracture\",\n romanized: \"balmok yeomjwa\",\n },\n targetingDifficulty: 0.6,\n effectiveStances: [TrigramStance.TAE, TrigramStance.GON],\n },\n {\n id: \"leg_right_foot\",\n names: {\n korean: \"우발등\",\n english: \"Right Foot\",\n romanized: \"u-baldeung\",\n },\n position: { x: 110, y: 245 },\n category: VitalPointCategory.SKELETAL,\n severity: VitalPointSeverity.MINOR,\n baseDamage: 18,\n effects: [],\n description: {\n korean: \"발등 골절, 보행 곤란\",\n english: \"Foot fracture, walking difficulty\",\n romanized: \"baldeung goljeol\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.GON],\n },\n {\n id: \"leg_right_calf\",\n names: {\n korean: \"우종아리\",\n english: \"Right Calf\",\n romanized: \"u-jong-ari\",\n },\n position: { x: 112, y: 225 },\n category: VitalPointCategory.MUSCULAR,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 23,\n effects: [],\n description: {\n korean: \"종아리 근육 손상\",\n english: \"Calf muscle damage\",\n romanized: \"jong-ari geunnyuk sonsang\",\n },\n targetingDifficulty: 0.5,\n effectiveStances: [TrigramStance.SON, TrigramStance.GEON],\n },\n {\n id: \"leg_right_achilles\",\n names: {\n korean: \"우아킬레스건\",\n english: \"Right Achilles Tendon\",\n romanized: \"u-akilleseugeon\",\n },\n position: { x: 114, y: 238 },\n category: VitalPointCategory.MUSCULAR,\n severity: VitalPointSeverity.CRITICAL,\n baseDamage: 40,\n effects: [\n {\n id: \"achilles_rupture_right\",\n type: VitalPointEffectType.WEAKNESS,\n intensity: EffectIntensity.EXTREME,\n duration: 12000,\n description: {\n korean: \"아킬레스건 파열\",\n english: \"Achilles tendon rupture\",\n },\n stackable: false,\n },\n {\n id: \"movement_impossible_right\",\n type: VitalPointEffectType.PARALYSIS,\n intensity: EffectIntensity.HIGH,\n duration: 10000,\n description: { korean: \"이동 불가\", english: \"Cannot move\" },\n stackable: false,\n },\n ],\n description: {\n korean: \"아킬레스건 파열, 이동 불가\",\n english: \"Achilles tendon rupture, cannot move\",\n romanized: \"akilleseugeon paryeol\",\n },\n targetingDifficulty: 0.8,\n effectiveStances: [TrigramStance.LI, TrigramStance.GON],\n },\n {\n id: \"leg_right_femoral_nerve\",\n names: {\n korean: \"우대퇴신경\",\n english: \"Right Femoral Nerve\",\n romanized: \"u-daetwe singyeong\",\n },\n position: { x: 108, y: 180 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.MAJOR,\n baseDamage: 32,\n effects: [],\n description: {\n korean: \"대퇴 신경 타격, 다리 마비\",\n english: \"Femoral nerve strike, leg paralysis\",\n romanized: \"daetwe singyeong tagyeok\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.LI, TrigramStance.SON],\n },\n {\n id: \"leg_right_peroneal_nerve\",\n names: {\n korean: \"우비골신경\",\n english: \"Right Peroneal Nerve\",\n romanized: \"u-bigol singyeong\",\n },\n position: { x: 112, y: 210 },\n category: VitalPointCategory.NEUROLOGICAL,\n severity: VitalPointSeverity.MODERATE,\n baseDamage: 27,\n effects: [],\n description: {\n korean: \"비골 신경 타격, 발 기능 상실\",\n english: \"Peroneal nerve strike, foot function loss\",\n romanized: \"bigol singyeong tagyeok\",\n },\n targetingDifficulty: 0.7,\n effectiveStances: [TrigramStance.LI],\n },\n] as const;\n\n/**\n * Gets vital points by body region.\n *\n * @param region - Body region to filter by\n * @returns Array of vital points in that region\n *\n * @korean 부위별급소\n */\nexport function getVitalPointsByRegion(\n region: BodyRegion\n): readonly VitalPoint[] {\n // This is a simplified implementation - in production you'd map IDs to regions properly\n const regionPrefixes: Record<BodyRegion, string[]> = {\n [BodyRegion.HEAD]: [\"head_\"],\n [BodyRegion.NECK]: [\"head_side_neck\", \"head_throat\"],\n [BodyRegion.TORSO]: [\"torso_\"],\n [BodyRegion.LEFT_ARM]: [\"arm_left_\"],\n [BodyRegion.RIGHT_ARM]: [\"arm_right_\"],\n [BodyRegion.LEFT_LEG]: [\"leg_left_\"],\n [BodyRegion.RIGHT_LEG]: [\"leg_right_\"],\n [BodyRegion.CORE]: [\n \"torso_solar_plexus\",\n \"torso_diaphragm\",\n \"torso_abs_center\",\n ],\n };\n\n const prefixes = regionPrefixes[region] ?? [];\n return VITAL_POINTS_DATA.filter((vp) =>\n prefixes.some((prefix) => vp.id.startsWith(prefix))\n );\n}\n\n/**\n * Gets total count of vital points.\n *\n * @returns Total number of vital points\n *\n * @korean 급소총개수\n */\nexport function getTotalVitalPointsCount(): number {\n return VITAL_POINTS_DATA.length;\n}\n\nexport default VITAL_POINTS_DATA;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AccessibilityTypes.js","names":[],"sources":["../../src/types/AccessibilityTypes.ts"],"sourcesContent":["/**\n * Accessibility type definitions for WCAG 2.1 Level AA compliance\n * Provides type-safe ARIA attributes and keyboard navigation interfaces\n * \n * @module types/AccessibilityTypes\n * @category Accessibility\n * @korean 접근성 타입\n */\n\n/**\n * ARIA role types for semantic HTML elements\n */\nexport type AriaRole =\n | 'button'\n | 'navigation'\n | 'main'\n | 'complementary'\n | 'contentinfo'\n | 'banner'\n | 'form'\n | 'search'\n | 'region'\n | 'article'\n | 'alert'\n | 'alertdialog'\n | 'dialog'\n | 'menu'\n | 'menubar'\n | 'menuitem'\n | 'menuitemcheckbox'\n | 'menuitemradio'\n | 'progressbar'\n | 'slider'\n | 'spinbutton'\n | 'tab'\n | 'tablist'\n | 'tabpanel'\n | 'toolbar'\n | 'tooltip'\n | 'group'\n | 'listbox'\n | 'option'\n | 'radio'\n | 'radiogroup'\n | 'switch'\n | 'link'\n | 'img'\n | 'presentation'\n | 'none';\n\n/**\n * ARIA live region politeness levels\n */\nexport type AriaLive = 'off' | 'polite' | 'assertive';\n\n/**\n * ARIA current state values\n */\nexport type AriaCurrent =\n | 'page'\n | 'step'\n | 'location'\n | 'date'\n | 'time'\n | 'true'\n | 'false';\n\n/**\n * Keyboard key codes for navigation\n */\nexport enum KeyCode {\n ENTER = 'Enter',\n SPACE = ' ',\n ESCAPE = 'Escape',\n TAB = 'Tab',\n ARROW_UP = 'ArrowUp',\n ARROW_DOWN = 'ArrowDown',\n ARROW_LEFT = 'ArrowLeft',\n ARROW_RIGHT = 'ArrowRight',\n HOME = 'Home',\n END = 'End',\n PAGE_UP = 'PageUp',\n PAGE_DOWN = 'PageDown',\n}\n\n/**\n * Keyboard navigation actions\n */\nexport interface KeyboardActions {\n /** Action triggered on Enter or Space */\n readonly onActivate?: () => void;\n /** Action triggered on Escape */\n readonly onCancel?: () => void;\n /** Action triggered on arrow keys */\n readonly onNavigate?: (direction: 'up' | 'down' | 'left' | 'right') => void;\n /** Action triggered on Tab key */\n readonly onTab?: (shiftKey: boolean) => void;\n /** Action triggered on Home/End keys */\n readonly onJump?: (to: 'start' | 'end') => void;\n}\n\n/**\n * ARIA attributes for components\n */\nexport interface AriaAttributes {\n /** ARIA role */\n readonly role?: AriaRole;\n /** ARIA label (Korean | English bilingual format) */\n readonly 'aria-label'?: string;\n /** ARIA labelled by element ID */\n readonly 'aria-labelledby'?: string;\n /** ARIA described by element ID */\n readonly 'aria-describedby'?: string;\n /** ARIA live region politeness */\n readonly 'aria-live'?: AriaLive;\n /** ARIA expanded state */\n readonly 'aria-expanded'?: boolean;\n /** ARIA pressed state */\n readonly 'aria-pressed'?: boolean;\n /** ARIA selected state */\n readonly 'aria-selected'?: boolean;\n /** ARIA checked state */\n readonly 'aria-checked'?: boolean | 'mixed';\n /** ARIA disabled state */\n readonly 'aria-disabled'?: boolean;\n /** ARIA hidden state */\n readonly 'aria-hidden'?: boolean;\n /** ARIA current state */\n readonly 'aria-current'?: AriaCurrent;\n /** ARIA modal state */\n readonly 'aria-modal'?: boolean;\n /** ARIA controls element ID */\n readonly 'aria-controls'?: string;\n /** ARIA owns element IDs */\n readonly 'aria-owns'?: string;\n /** ARIA has popup type */\n readonly 'aria-haspopup'?: boolean | 'menu' | 'listbox' | 'tree' | 'grid' | 'dialog';\n /** ARIA value now (for progress indicators) */\n readonly 'aria-valuenow'?: number;\n /** ARIA value min */\n readonly 'aria-valuemin'?: number;\n /** ARIA value max */\n readonly 'aria-valuemax'?: number;\n /** ARIA value text */\n readonly 'aria-valuetext'?: string;\n /** ARIA orientation */\n readonly 'aria-orientation'?: 'horizontal' | 'vertical';\n /** ARIA atomic (for live regions) */\n readonly 'aria-atomic'?: boolean;\n /** ARIA relevant (for live regions) */\n readonly 'aria-relevant'?: 'additions' | 'removals' | 'text' | 'all';\n /** ARIA busy state */\n readonly 'aria-busy'?: boolean;\n /** ARIA invalid state */\n readonly 'aria-invalid'?: boolean | 'grammar' | 'spelling';\n /** ARIA required state */\n readonly 'aria-required'?: boolean;\n /** ARIA readonly state */\n readonly 'aria-readonly'?: boolean;\n}\n\n/**\n * Focus management configuration\n */\nexport interface FocusConfig {\n /** Whether element should receive focus on mount */\n readonly autoFocus?: boolean;\n /** Whether focus should be trapped within element */\n readonly trapFocus?: boolean;\n /** Whether focus should be restored on unmount */\n readonly restoreFocus?: boolean;\n /** Initial focus target selector */\n readonly initialFocus?: string;\n /** Return focus target selector */\n readonly returnFocus?: string;\n}\n\n/**\n * Focus indicator style configuration\n */\nexport interface FocusIndicatorStyle {\n /** Outline width in pixels */\n readonly outlineWidth?: number;\n /** Outline color (hex) */\n readonly outlineColor?: number;\n /** Outline offset in pixels */\n readonly outlineOffset?: number;\n /** Outline style */\n readonly outlineStyle?: 'solid' | 'dashed' | 'dotted';\n /** Box shadow for glow effect */\n readonly boxShadow?: string;\n /** Transition duration in seconds */\n readonly transitionDuration?: number;\n}\n\n/**\n * Keyboard event handler type\n */\nexport type KeyboardEventHandler = (event: KeyboardEvent) => void;\n\n/**\n * Focus event handler type\n */\nexport type FocusEventHandler = (event: FocusEvent) => void;\n\n/**\n * Screen reader announcement configuration\n */\nexport interface ScreenReaderAnnouncement {\n /** Message to announce (Korean | English bilingual) */\n readonly message: string;\n /** Politeness level */\n readonly politeness?: AriaLive;\n /** Delay before announcement in milliseconds */\n readonly delay?: number;\n}\n\n/**\n * Color contrast configuration for WCAG compliance\n */\nexport interface ColorContrastConfig {\n /** Foreground color (hex) */\n readonly foreground: number;\n /** Background color (hex) */\n readonly background: number;\n /** Target contrast ratio (4.5:1 for normal text, 3:1 for large text or UI) */\n readonly targetRatio: 4.5 | 3;\n /** Whether this is for large text (18pt+ or 14pt+ bold) */\n readonly isLargeText?: boolean;\n}\n\n/**\n * Accessibility validation result\n */\nexport interface AccessibilityValidation {\n /** Whether validation passed */\n readonly passed: boolean;\n /** Validation errors */\n readonly errors: readonly string[];\n /** Validation warnings */\n readonly warnings: readonly string[];\n /** Validation recommendations */\n readonly recommendations: readonly string[];\n}\n\n/**\n * WCAG compliance level\n */\nexport enum WCAGLevel {\n A = 'A',\n AA = 'AA',\n AAA = 'AAA',\n}\n\n/**\n * WCAG compliance check result\n */\nexport interface WCAGComplianceResult {\n /** Compliance level achieved */\n readonly level: WCAGLevel;\n /** Whether component meets target level */\n readonly compliant: boolean;\n /** Specific criteria results */\n readonly criteria: {\n readonly keyboardAccessible: boolean;\n readonly colorContrast: boolean;\n readonly focusVisible: boolean;\n readonly ariaLabels: boolean;\n readonly semanticHTML: boolean;\n readonly errorIdentification: boolean;\n };\n /** Issues found */\n readonly issues: readonly string[];\n}\n\n/**\n * Bilingual label format (Korean | English)\n */\nexport interface BilingualLabel {\n /** Korean text */\n readonly korean: string;\n /** English text */\n readonly english: string;\n /** Formatted label string (Korean | English) */\n readonly label: string;\n}\n\n/**\n * Helper function to create bilingual labels\n */\nexport const createBilingualLabel = (\n korean: string,\n english: string\n): BilingualLabel => ({\n korean,\n english,\n label: `${korean} | ${english}`,\n});\n"],"mappings":";;;;AAsEA,IAAY,UAAL,yBAAA,SAAA;CACL,QAAA,WAAQ;CACR,QAAA,WAAQ;CACR,QAAA,YAAS;CACT,QAAA,SAAM;CACN,QAAA,cAAW;CACX,QAAA,gBAAa;CACb,QAAA,gBAAa;CACb,QAAA,iBAAc;CACd,QAAA,UAAO;CACP,QAAA,SAAM;CACN,QAAA,aAAU;CACV,QAAA,eAAY;;KACb;;;;AAqKD,IAAY,YAAL,yBAAA,WAAA;CACL,UAAA,OAAI;CACJ,UAAA,QAAK;CACL,UAAA,SAAM;;KACP;;;;AAsCD,IAAa,wBACX,QACA,aACoB;CACpB;CACA;CACA,OAAO,GAAG,OAAO,KAAK;CACvB"}
1
+ {"version":3,"file":"AccessibilityTypes.js","names":[],"sources":["../../src/types/AccessibilityTypes.ts"],"sourcesContent":["/**\n * Accessibility type definitions for WCAG 2.1 Level AA compliance\n * Provides type-safe ARIA attributes and keyboard navigation interfaces\n * \n * @module types/AccessibilityTypes\n * @category Accessibility\n * @korean 접근성 타입\n */\n\n/**\n * ARIA role types for semantic HTML elements\n */\nexport type AriaRole =\n | 'button'\n | 'navigation'\n | 'main'\n | 'complementary'\n | 'contentinfo'\n | 'banner'\n | 'form'\n | 'search'\n | 'region'\n | 'article'\n | 'alert'\n | 'alertdialog'\n | 'dialog'\n | 'menu'\n | 'menubar'\n | 'menuitem'\n | 'menuitemcheckbox'\n | 'menuitemradio'\n | 'progressbar'\n | 'slider'\n | 'spinbutton'\n | 'tab'\n | 'tablist'\n | 'tabpanel'\n | 'toolbar'\n | 'tooltip'\n | 'group'\n | 'listbox'\n | 'option'\n | 'radio'\n | 'radiogroup'\n | 'switch'\n | 'link'\n | 'img'\n | 'presentation'\n | 'none';\n\n/**\n * ARIA live region politeness levels\n */\nexport type AriaLive = 'off' | 'polite' | 'assertive';\n\n/**\n * ARIA current state values\n */\nexport type AriaCurrent =\n | 'page'\n | 'step'\n | 'location'\n | 'date'\n | 'time'\n | 'true'\n | 'false';\n\n/**\n * Keyboard key codes for navigation\n */\nexport enum KeyCode {\n ENTER = 'Enter',\n SPACE = ' ',\n ESCAPE = 'Escape',\n TAB = 'Tab',\n ARROW_UP = 'ArrowUp',\n ARROW_DOWN = 'ArrowDown',\n ARROW_LEFT = 'ArrowLeft',\n ARROW_RIGHT = 'ArrowRight',\n HOME = 'Home',\n END = 'End',\n PAGE_UP = 'PageUp',\n PAGE_DOWN = 'PageDown',\n}\n\n/**\n * Keyboard navigation actions\n */\nexport interface KeyboardActions {\n /** Action triggered on Enter or Space */\n readonly onActivate?: () => void;\n /** Action triggered on Escape */\n readonly onCancel?: () => void;\n /** Action triggered on arrow keys */\n readonly onNavigate?: (direction: 'up' | 'down' | 'left' | 'right') => void;\n /** Action triggered on Tab key */\n readonly onTab?: (shiftKey: boolean) => void;\n /** Action triggered on Home/End keys */\n readonly onJump?: (to: 'start' | 'end') => void;\n}\n\n/**\n * ARIA attributes for components\n */\nexport interface AriaAttributes {\n /** ARIA role */\n readonly role?: AriaRole;\n /** ARIA label (Korean | English bilingual format) */\n readonly 'aria-label'?: string;\n /** ARIA labelled by element ID */\n readonly 'aria-labelledby'?: string;\n /** ARIA described by element ID */\n readonly 'aria-describedby'?: string;\n /** ARIA live region politeness */\n readonly 'aria-live'?: AriaLive;\n /** ARIA expanded state */\n readonly 'aria-expanded'?: boolean;\n /** ARIA pressed state */\n readonly 'aria-pressed'?: boolean;\n /** ARIA selected state */\n readonly 'aria-selected'?: boolean;\n /** ARIA checked state */\n readonly 'aria-checked'?: boolean | 'mixed';\n /** ARIA disabled state */\n readonly 'aria-disabled'?: boolean;\n /** ARIA hidden state */\n readonly 'aria-hidden'?: boolean;\n /** ARIA current state */\n readonly 'aria-current'?: AriaCurrent;\n /** ARIA modal state */\n readonly 'aria-modal'?: boolean;\n /** ARIA controls element ID */\n readonly 'aria-controls'?: string;\n /** ARIA owns element IDs */\n readonly 'aria-owns'?: string;\n /** ARIA has popup type */\n readonly 'aria-haspopup'?: boolean | 'menu' | 'listbox' | 'tree' | 'grid' | 'dialog';\n /** ARIA value now (for progress indicators) */\n readonly 'aria-valuenow'?: number;\n /** ARIA value min */\n readonly 'aria-valuemin'?: number;\n /** ARIA value max */\n readonly 'aria-valuemax'?: number;\n /** ARIA value text */\n readonly 'aria-valuetext'?: string;\n /** ARIA orientation */\n readonly 'aria-orientation'?: 'horizontal' | 'vertical';\n /** ARIA atomic (for live regions) */\n readonly 'aria-atomic'?: boolean;\n /** ARIA relevant (for live regions) */\n readonly 'aria-relevant'?: 'additions' | 'removals' | 'text' | 'all';\n /** ARIA busy state */\n readonly 'aria-busy'?: boolean;\n /** ARIA invalid state */\n readonly 'aria-invalid'?: boolean | 'grammar' | 'spelling';\n /** ARIA required state */\n readonly 'aria-required'?: boolean;\n /** ARIA readonly state */\n readonly 'aria-readonly'?: boolean;\n}\n\n/**\n * Focus management configuration\n */\nexport interface FocusConfig {\n /** Whether element should receive focus on mount */\n readonly autoFocus?: boolean;\n /** Whether focus should be trapped within element */\n readonly trapFocus?: boolean;\n /** Whether focus should be restored on unmount */\n readonly restoreFocus?: boolean;\n /** Initial focus target selector */\n readonly initialFocus?: string;\n /** Return focus target selector */\n readonly returnFocus?: string;\n}\n\n/**\n * Focus indicator style configuration\n */\nexport interface FocusIndicatorStyle {\n /** Outline width in pixels */\n readonly outlineWidth?: number;\n /** Outline color (hex) */\n readonly outlineColor?: number;\n /** Outline offset in pixels */\n readonly outlineOffset?: number;\n /** Outline style */\n readonly outlineStyle?: 'solid' | 'dashed' | 'dotted';\n /** Box shadow for glow effect */\n readonly boxShadow?: string;\n /** Transition duration in seconds */\n readonly transitionDuration?: number;\n}\n\n/**\n * Keyboard event handler type\n */\nexport type KeyboardEventHandler = (event: KeyboardEvent) => void;\n\n/**\n * Focus event handler type\n */\nexport type FocusEventHandler = (event: FocusEvent) => void;\n\n/**\n * Screen reader announcement configuration\n */\nexport interface ScreenReaderAnnouncement {\n /** Message to announce (Korean | English bilingual) */\n readonly message: string;\n /** Politeness level */\n readonly politeness?: AriaLive;\n /** Delay before announcement in milliseconds */\n readonly delay?: number;\n}\n\n/**\n * Color contrast configuration for WCAG compliance\n */\nexport interface ColorContrastConfig {\n /** Foreground color (hex) */\n readonly foreground: number;\n /** Background color (hex) */\n readonly background: number;\n /** Target contrast ratio (4.5:1 for normal text, 3:1 for large text or UI) */\n readonly targetRatio: 4.5 | 3;\n /** Whether this is for large text (18pt+ or 14pt+ bold) */\n readonly isLargeText?: boolean;\n}\n\n/**\n * Accessibility validation result\n */\nexport interface AccessibilityValidation {\n /** Whether validation passed */\n readonly passed: boolean;\n /** Validation errors */\n readonly errors: readonly string[];\n /** Validation warnings */\n readonly warnings: readonly string[];\n /** Validation recommendations */\n readonly recommendations: readonly string[];\n}\n\n/**\n * WCAG compliance level\n */\nexport enum WCAGLevel {\n A = 'A',\n AA = 'AA',\n AAA = 'AAA',\n}\n\n/**\n * WCAG compliance check result\n */\nexport interface WCAGComplianceResult {\n /** Compliance level achieved */\n readonly level: WCAGLevel;\n /** Whether component meets target level */\n readonly compliant: boolean;\n /** Specific criteria results */\n readonly criteria: {\n readonly keyboardAccessible: boolean;\n readonly colorContrast: boolean;\n readonly focusVisible: boolean;\n readonly ariaLabels: boolean;\n readonly semanticHTML: boolean;\n readonly errorIdentification: boolean;\n };\n /** Issues found */\n readonly issues: readonly string[];\n}\n\n/**\n * Bilingual label format (Korean | English)\n */\nexport interface BilingualLabel {\n /** Korean text */\n readonly korean: string;\n /** English text */\n readonly english: string;\n /** Formatted label string (Korean | English) */\n readonly label: string;\n}\n\n/**\n * Helper function to create bilingual labels\n */\nexport const createBilingualLabel = (\n korean: string,\n english: string\n): BilingualLabel => ({\n korean,\n english,\n label: `${korean} | ${english}`,\n});\n"],"mappings":";;;;AAsEA,IAAY,UAAL,yBAAA,SAAA;CACL,QAAA,WAAA;CACA,QAAA,WAAA;CACA,QAAA,YAAA;CACA,QAAA,SAAA;CACA,QAAA,cAAA;CACA,QAAA,gBAAA;CACA,QAAA,gBAAA;CACA,QAAA,iBAAA;CACA,QAAA,UAAA;CACA,QAAA,SAAA;CACA,QAAA,aAAA;CACA,QAAA,eAAA;;AACF,EAAA,CAAA,CAAA;;;;AAqKA,IAAY,YAAL,yBAAA,WAAA;CACL,UAAA,OAAA;CACA,UAAA,QAAA;CACA,UAAA,SAAA;;AACF,EAAA,CAAA,CAAA;;;;AAsCA,IAAa,wBACX,QACA,aACoB;CACpB;CACA;CACA,OAAO,GAAG,OAAO,KAAK;AACxB"}
@@ -1 +1 @@
1
- {"version":3,"file":"LayoutTypes.js","names":[],"sources":["../../src/types/LayoutTypes.ts"],"sourcesContent":["/**\n * Layout-related type definitions for unified positioning system\n *\n * Provides type-safe interfaces for grid-based layout, responsive positioning,\n * and z-index hierarchy management across all screens.\n *\n * @module types/LayoutTypes\n * @category Type Definitions\n * @korean 레이아웃타입\n */\n\nimport { Position } from \"./common\";\n\n/**\n * Screen size breakpoints for responsive design\n *\n * @category Layout Types\n * @korean 화면크기\n */\nexport interface ScreenSize {\n /** Screen width in pixels */\n readonly width: number;\n /** Screen height in pixels */\n readonly height: number;\n /** Whether the device is mobile (<768px) */\n readonly isMobile: boolean;\n /** Whether the device is tablet (768-1199px) */\n readonly isTablet: boolean;\n /** Whether the device is desktop (≥1200px) */\n readonly isDesktop: boolean;\n /** Whether the screen is in landscape orientation */\n readonly isLandscape: boolean;\n}\n\n/**\n * Grid-based position configuration\n *\n * Uses 12-column grid system for consistent alignment.\n * \n * **Important:** Valid combinations must satisfy:\n * - column: 0-11 (starting column)\n * - span: 1-12 (number of columns to span)\n * - column + span ≤ 12 (must not exceed grid width)\n * \n * Invalid combinations (e.g., column: 10, span: 5) will throw runtime errors.\n * Use LayoutSystem.calculateGridPosition() which validates inputs.\n *\n * @category Layout Types\n * @korean 그리드위치\n * \n * @example Valid positions\n * ```typescript\n * { column: 0, span: 12 } // Full width\n * { column: 2, span: 8 } // Centered 8 columns\n * { column: 0, span: 6 } // Left half\n * { column: 6, span: 6 } // Right half\n * ```\n * \n * @example Invalid positions (will throw errors)\n * ```typescript\n * { column: 10, span: 5 } // ERROR: 10 + 5 = 15 > 12\n * { column: -1, span: 6 } // ERROR: column < 0\n * { column: 5, span: 0 } // ERROR: span < 1\n * ```\n */\nexport interface GridPosition {\n /** Grid column to start from (0-11) */\n readonly column: number;\n /** Number of columns to span (1-12) */\n readonly span: number;\n /** Row index for vertical positioning (multiplied by DEFAULT_ROW_HEIGHT=100px) */\n readonly row?: number;\n /** Gutter size in pixels (default: 20) */\n readonly gutter?: number;\n}\n\n/**\n * Responsive position that adapts to screen size\n *\n * @category Layout Types\n * @korean 반응형위치\n */\nexport interface ResponsivePosition {\n /** Base position for desktop (1200px+) */\n readonly base: Position;\n /** Position override for tablet (768-1199px) */\n readonly tablet?: Position;\n /** Position override for mobile (<768px) */\n readonly mobile?: Position;\n /** Whether to scale proportionally based on screen width */\n readonly scaleProportionally?: boolean;\n}\n\n/**\n * Z-index hierarchy for layering UI elements\n *\n * Ensures consistent stacking order across all screens\n *\n * **Usage Guidelines:**\n * - NEVER use arbitrary z-index values (e.g., 999)\n * - Use these constants to maintain consistent layer ordering\n * - Layer order: Scene → HUD → Overlay → Modal → Pause Menu\n *\n * @category Layout Constants\n * @korean z인덱스계층\n */\nexport const Z_INDEX = {\n // 3D Scene layers (0-30)\n /** Background scenes and effects - 배경 */\n BACKGROUND: 0,\n /** Combat arena and training grounds - 경기장 */\n ARENA: 10,\n /** Player characters and enemies - 플레이어 */\n PLAYERS: 20,\n /** Visual effects and particles - 효과 */\n EFFECTS: 30,\n\n // HUD layers (40-99)\n /** HUD background elements - HUD 배경 */\n HUD_BACKGROUND: 40,\n /** Main HUD elements (health bars, timers, stats) - 주 HUD */\n HUD: 50,\n /** TechniqueBar for combat techniques - 기술바 */\n TECHNIQUE_BAR: 55,\n /** HUD overlay elements (within HUD components) - HUD 오버레이 */\n HUD_OVERLAY: 60,\n\n // Top-level UI (100+)\n /** Mobile touch controls - 모바일제어 */\n MOBILE_CONTROLS: 100,\n /** Modal dialogs and overlays - 모달 */\n MODAL: 200,\n /** Tooltips and hints - 툴팁 */\n TOOLTIP: 300,\n /** Pause menu - 일시정지 메뉴 */\n PAUSE_MENU: 1000,\n /** Loading screens - 로딩 */\n LOADING: 2000,\n /** Debug and performance overlays - 디버그 */\n DEBUG: 9000,\n} as const;\n\n/**\n * Type for Z_INDEX values\n *\n * @category Layout Types\n */\nexport type ZIndexValue = (typeof Z_INDEX)[keyof typeof Z_INDEX];\n\n/**\n * Alignment options for positioning elements\n *\n * @category Layout Types\n * @korean 정렬\n */\nexport type HorizontalAlignment = \"left\" | \"center\" | \"right\";\nexport type VerticalAlignment = \"top\" | \"middle\" | \"bottom\";\n\n/**\n * Layout configuration for a component\n *\n * @category Layout Types\n * @korean 레이아웃설정\n */\nexport interface LayoutConfig {\n /** Grid-based position (if using grid system) */\n readonly grid?: GridPosition;\n /** Responsive position (if not using grid) */\n readonly position?: ResponsivePosition;\n /** Z-index layer for stacking */\n readonly zIndex?: ZIndexValue;\n /** Horizontal alignment within container */\n readonly horizontalAlign?: HorizontalAlignment;\n /** Vertical alignment within container */\n readonly verticalAlign?: VerticalAlignment;\n /** Margin in pixels */\n readonly margin?: number;\n /** Padding in pixels */\n readonly padding?: number;\n}\n\n/**\n * Safe area insets for mobile devices with notches\n *\n * @category Layout Types\n * @korean 안전영역\n */\nexport interface SafeAreaInsets {\n /** Top inset (notch, status bar) */\n readonly top: number;\n /** Right inset (typically 0) */\n readonly right: number;\n /** Bottom inset (home indicator) */\n readonly bottom: number;\n /** Left inset (typically 0) */\n readonly left: number;\n}\n\n/**\n * Container bounds for positioning child elements\n *\n * @category Layout Types\n * @korean 컨테이너경계\n */\nexport interface ContainerBounds {\n /** X position in pixels */\n readonly x: number;\n /** Y position in pixels */\n readonly y: number;\n /** Width in pixels */\n readonly width: number;\n /** Height in pixels */\n readonly height: number;\n /** Scale factor (1.0 = no scaling) */\n readonly scale?: number;\n}\n\n/**\n * HUD Positioning Strategy Documentation\n *\n * This section defines the standardized approach for positioning HUD elements\n * across all screens in the Black Trigram game.\n *\n * **Screen-Level HUDs (Left/Right/Top/Bottom)**:\n * - Use `position: \"absolute\"` to anchor to screen edges\n * - Anchor directly to edges: `left: 0`, `right: 0`, `top: 0`, `bottom: 0`\n * - Size using percentage-based calculations: `width: ${width * 0.14}px`\n * - Use Z_INDEX.HUD for consistent layering\n * - Example: Combat Left/Right HUDs, Top/Bottom bars\n *\n * **HUD Internal Content**:\n * - Use `position: \"relative\"` for natural document flow\n * - Use Flexbox for vertical/horizontal layouts: `display: \"flex\"`, `flexDirection`, `gap`\n * - Use CSS Grid for complex multi-dimensional layouts\n * - Avoid absolute positioning within HUDs (except for special cases)\n * - Example: Player stats, technique cards, control buttons\n *\n * **Special Cases (Overlays/Tooltips)**:\n * - Use `position: \"absolute\"` for floating elements that must overlay content\n * - Position relative to parent container\n * - Use Z_INDEX.HUD_OVERLAY or Z_INDEX.TOOLTIP\n * - Example: Combat messages, feedback overlays, tooltips\n *\n * **Responsive Design**:\n * - All components must support `isMobile` prop\n * - Use responsive calculations: `isMobile ? 18 : 14` for mobile scaling\n * - Apply `positionScale` multiplier for 4K displays (1.0-1.5)\n *\n * @category Layout Guidelines\n * @korean HUD위치전략\n */\n\n/**\n * HUD width percentages for screen-level HUDs\n *\n * These constants define the standard widths for left and right HUD panels.\n * Values are decimals (0.14 = 14% of screen width).\n *\n * **Usage:**\n * ```tsx\n * const hudWidth = width * HUD_WIDTH_PERCENT.LEFT_DESKTOP;\n * ```\n *\n * @category Layout Constants\n * @korean HUD너비\n */\nexport const HUD_WIDTH_PERCENT = {\n /** Left HUD width on desktop (14% = leaves 72% for arena) */\n LEFT_DESKTOP: 0.14,\n /** Left HUD width on mobile (18% for touch targets) */\n LEFT_MOBILE: 0.18,\n /** Right HUD width on desktop (14% = leaves 72% for arena) */\n RIGHT_DESKTOP: 0.14,\n /** Right HUD width on mobile (18% for touch targets) */\n RIGHT_MOBILE: 0.18,\n /** Top HUD width (full screen width) */\n TOP: 1.0,\n /** Bottom HUD width (full screen width) */\n BOTTOM: 1.0,\n} as const;\n\n/**\n * HUD height constants for top and bottom bars\n *\n * These constants define the standard heights for top and bottom HUD bars.\n * Values are in pixels and should be scaled with `positionScale` for 4K displays.\n *\n * **Usage:**\n * ```tsx\n * const hudHeight = HUD_HEIGHT.TOP_DESKTOP * positionScale;\n * ```\n *\n * @category Layout Constants\n * @korean HUD높이\n */\nexport const HUD_HEIGHT = {\n /** Top bar height on desktop (slim for minimal obstruction) */\n TOP_DESKTOP: 70,\n /** Top bar height on mobile (extra slim) */\n TOP_MOBILE: 50,\n /** Bottom bar height on desktop (fits technique cards) */\n BOTTOM_DESKTOP: 120,\n /** Bottom bar height on mobile (compact) */\n BOTTOM_MOBILE: 100,\n /** Combat-specific top bar height */\n COMBAT_TOP_DESKTOP: 70,\n /** Combat-specific top bar height on mobile */\n COMBAT_TOP_MOBILE: 55,\n /** Combat-specific bottom bar height */\n COMBAT_BOTTOM_DESKTOP: 120,\n /** Combat-specific bottom bar height on mobile */\n COMBAT_BOTTOM_MOBILE: 100,\n /** Training-specific top bar height */\n TRAINING_TOP_DESKTOP: 70,\n /** Training-specific top bar height on mobile */\n TRAINING_TOP_MOBILE: 50,\n /** Training-specific bottom bar height */\n TRAINING_BOTTOM_DESKTOP: 130,\n /** Training-specific bottom bar height on mobile */\n TRAINING_BOTTOM_MOBILE: 110,\n} as const;\n\n/**\n * HUD positioning configuration interface\n *\n * Defines the positioning strategy for a HUD component.\n *\n * @category Layout Types\n * @korean HUD위치설정\n */\nexport interface HUDPositionConfig {\n /** Positioning strategy */\n readonly strategy: \"absolute\" | \"relative\" | \"flex\" | \"grid\";\n /** Anchor point for absolute positioning */\n readonly anchor?: \"left\" | \"right\" | \"top\" | \"bottom\" | \"center\";\n /** Offset from anchor point */\n readonly offset?: { x?: number; y?: number };\n /** Size configuration */\n readonly size?: { width?: string | number; height?: string | number };\n /** Z-index layer */\n readonly zIndex?: ZIndexValue;\n}\n"],"mappings":";;;;;;;;;;;;;;AA0GA,IAAa,UAAU;;CAGrB,YAAY;;CAEZ,OAAO;;CAEP,SAAS;;CAET,SAAS;;CAIT,gBAAgB;;CAEhB,KAAK;;CAEL,eAAe;;CAEf,aAAa;;CAIb,iBAAiB;;CAEjB,OAAO;;CAEP,SAAS;;CAET,YAAY;;CAEZ,SAAS;;CAET,OAAO;CACR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8HD,IAAa,oBAAoB;;CAE/B,cAAc;;CAEd,aAAa;;CAEb,eAAe;;CAEf,cAAc;;CAEd,KAAK;;CAEL,QAAQ;CACT;;;;;;;;;;;;;;;AAgBD,IAAa,aAAa;;CAExB,aAAa;;CAEb,YAAY;;CAEZ,gBAAgB;;CAEhB,eAAe;;CAEf,oBAAoB;;CAEpB,mBAAmB;;CAEnB,uBAAuB;;CAEvB,sBAAsB;;CAEtB,sBAAsB;;CAEtB,qBAAqB;;CAErB,yBAAyB;;CAEzB,wBAAwB;CACzB"}
1
+ {"version":3,"file":"LayoutTypes.js","names":[],"sources":["../../src/types/LayoutTypes.ts"],"sourcesContent":["/**\n * Layout-related type definitions for unified positioning system\n *\n * Provides type-safe interfaces for grid-based layout, responsive positioning,\n * and z-index hierarchy management across all screens.\n *\n * @module types/LayoutTypes\n * @category Type Definitions\n * @korean 레이아웃타입\n */\n\nimport { Position } from \"./common\";\n\n/**\n * Screen size breakpoints for responsive design\n *\n * @category Layout Types\n * @korean 화면크기\n */\nexport interface ScreenSize {\n /** Screen width in pixels */\n readonly width: number;\n /** Screen height in pixels */\n readonly height: number;\n /** Whether the device is mobile (<768px) */\n readonly isMobile: boolean;\n /** Whether the device is tablet (768-1199px) */\n readonly isTablet: boolean;\n /** Whether the device is desktop (≥1200px) */\n readonly isDesktop: boolean;\n /** Whether the screen is in landscape orientation */\n readonly isLandscape: boolean;\n}\n\n/**\n * Grid-based position configuration\n *\n * Uses 12-column grid system for consistent alignment.\n * \n * **Important:** Valid combinations must satisfy:\n * - column: 0-11 (starting column)\n * - span: 1-12 (number of columns to span)\n * - column + span ≤ 12 (must not exceed grid width)\n * \n * Invalid combinations (e.g., column: 10, span: 5) will throw runtime errors.\n * Use LayoutSystem.calculateGridPosition() which validates inputs.\n *\n * @category Layout Types\n * @korean 그리드위치\n * \n * @example Valid positions\n * ```typescript\n * { column: 0, span: 12 } // Full width\n * { column: 2, span: 8 } // Centered 8 columns\n * { column: 0, span: 6 } // Left half\n * { column: 6, span: 6 } // Right half\n * ```\n * \n * @example Invalid positions (will throw errors)\n * ```typescript\n * { column: 10, span: 5 } // ERROR: 10 + 5 = 15 > 12\n * { column: -1, span: 6 } // ERROR: column < 0\n * { column: 5, span: 0 } // ERROR: span < 1\n * ```\n */\nexport interface GridPosition {\n /** Grid column to start from (0-11) */\n readonly column: number;\n /** Number of columns to span (1-12) */\n readonly span: number;\n /** Row index for vertical positioning (multiplied by DEFAULT_ROW_HEIGHT=100px) */\n readonly row?: number;\n /** Gutter size in pixels (default: 20) */\n readonly gutter?: number;\n}\n\n/**\n * Responsive position that adapts to screen size\n *\n * @category Layout Types\n * @korean 반응형위치\n */\nexport interface ResponsivePosition {\n /** Base position for desktop (1200px+) */\n readonly base: Position;\n /** Position override for tablet (768-1199px) */\n readonly tablet?: Position;\n /** Position override for mobile (<768px) */\n readonly mobile?: Position;\n /** Whether to scale proportionally based on screen width */\n readonly scaleProportionally?: boolean;\n}\n\n/**\n * Z-index hierarchy for layering UI elements\n *\n * Ensures consistent stacking order across all screens\n *\n * **Usage Guidelines:**\n * - NEVER use arbitrary z-index values (e.g., 999)\n * - Use these constants to maintain consistent layer ordering\n * - Layer order: Scene → HUD → Overlay → Modal → Pause Menu\n *\n * @category Layout Constants\n * @korean z인덱스계층\n */\nexport const Z_INDEX = {\n // 3D Scene layers (0-30)\n /** Background scenes and effects - 배경 */\n BACKGROUND: 0,\n /** Combat arena and training grounds - 경기장 */\n ARENA: 10,\n /** Player characters and enemies - 플레이어 */\n PLAYERS: 20,\n /** Visual effects and particles - 효과 */\n EFFECTS: 30,\n\n // HUD layers (40-99)\n /** HUD background elements - HUD 배경 */\n HUD_BACKGROUND: 40,\n /** Main HUD elements (health bars, timers, stats) - 주 HUD */\n HUD: 50,\n /** TechniqueBar for combat techniques - 기술바 */\n TECHNIQUE_BAR: 55,\n /** HUD overlay elements (within HUD components) - HUD 오버레이 */\n HUD_OVERLAY: 60,\n\n // Top-level UI (100+)\n /** Mobile touch controls - 모바일제어 */\n MOBILE_CONTROLS: 100,\n /** Modal dialogs and overlays - 모달 */\n MODAL: 200,\n /** Tooltips and hints - 툴팁 */\n TOOLTIP: 300,\n /** Pause menu - 일시정지 메뉴 */\n PAUSE_MENU: 1000,\n /** Loading screens - 로딩 */\n LOADING: 2000,\n /** Debug and performance overlays - 디버그 */\n DEBUG: 9000,\n} as const;\n\n/**\n * Type for Z_INDEX values\n *\n * @category Layout Types\n */\nexport type ZIndexValue = (typeof Z_INDEX)[keyof typeof Z_INDEX];\n\n/**\n * Alignment options for positioning elements\n *\n * @category Layout Types\n * @korean 정렬\n */\nexport type HorizontalAlignment = \"left\" | \"center\" | \"right\";\nexport type VerticalAlignment = \"top\" | \"middle\" | \"bottom\";\n\n/**\n * Layout configuration for a component\n *\n * @category Layout Types\n * @korean 레이아웃설정\n */\nexport interface LayoutConfig {\n /** Grid-based position (if using grid system) */\n readonly grid?: GridPosition;\n /** Responsive position (if not using grid) */\n readonly position?: ResponsivePosition;\n /** Z-index layer for stacking */\n readonly zIndex?: ZIndexValue;\n /** Horizontal alignment within container */\n readonly horizontalAlign?: HorizontalAlignment;\n /** Vertical alignment within container */\n readonly verticalAlign?: VerticalAlignment;\n /** Margin in pixels */\n readonly margin?: number;\n /** Padding in pixels */\n readonly padding?: number;\n}\n\n/**\n * Safe area insets for mobile devices with notches\n *\n * @category Layout Types\n * @korean 안전영역\n */\nexport interface SafeAreaInsets {\n /** Top inset (notch, status bar) */\n readonly top: number;\n /** Right inset (typically 0) */\n readonly right: number;\n /** Bottom inset (home indicator) */\n readonly bottom: number;\n /** Left inset (typically 0) */\n readonly left: number;\n}\n\n/**\n * Container bounds for positioning child elements\n *\n * @category Layout Types\n * @korean 컨테이너경계\n */\nexport interface ContainerBounds {\n /** X position in pixels */\n readonly x: number;\n /** Y position in pixels */\n readonly y: number;\n /** Width in pixels */\n readonly width: number;\n /** Height in pixels */\n readonly height: number;\n /** Scale factor (1.0 = no scaling) */\n readonly scale?: number;\n}\n\n/**\n * HUD Positioning Strategy Documentation\n *\n * This section defines the standardized approach for positioning HUD elements\n * across all screens in the Black Trigram game.\n *\n * **Screen-Level HUDs (Left/Right/Top/Bottom)**:\n * - Use `position: \"absolute\"` to anchor to screen edges\n * - Anchor directly to edges: `left: 0`, `right: 0`, `top: 0`, `bottom: 0`\n * - Size using percentage-based calculations: `width: ${width * 0.14}px`\n * - Use Z_INDEX.HUD for consistent layering\n * - Example: Combat Left/Right HUDs, Top/Bottom bars\n *\n * **HUD Internal Content**:\n * - Use `position: \"relative\"` for natural document flow\n * - Use Flexbox for vertical/horizontal layouts: `display: \"flex\"`, `flexDirection`, `gap`\n * - Use CSS Grid for complex multi-dimensional layouts\n * - Avoid absolute positioning within HUDs (except for special cases)\n * - Example: Player stats, technique cards, control buttons\n *\n * **Special Cases (Overlays/Tooltips)**:\n * - Use `position: \"absolute\"` for floating elements that must overlay content\n * - Position relative to parent container\n * - Use Z_INDEX.HUD_OVERLAY or Z_INDEX.TOOLTIP\n * - Example: Combat messages, feedback overlays, tooltips\n *\n * **Responsive Design**:\n * - All components must support `isMobile` prop\n * - Use responsive calculations: `isMobile ? 18 : 14` for mobile scaling\n * - Apply `positionScale` multiplier for 4K displays (1.0-1.5)\n *\n * @category Layout Guidelines\n * @korean HUD위치전략\n */\n\n/**\n * HUD width percentages for screen-level HUDs\n *\n * These constants define the standard widths for left and right HUD panels.\n * Values are decimals (0.14 = 14% of screen width).\n *\n * **Usage:**\n * ```tsx\n * const hudWidth = width * HUD_WIDTH_PERCENT.LEFT_DESKTOP;\n * ```\n *\n * @category Layout Constants\n * @korean HUD너비\n */\nexport const HUD_WIDTH_PERCENT = {\n /** Left HUD width on desktop (14% = leaves 72% for arena) */\n LEFT_DESKTOP: 0.14,\n /** Left HUD width on mobile (18% for touch targets) */\n LEFT_MOBILE: 0.18,\n /** Right HUD width on desktop (14% = leaves 72% for arena) */\n RIGHT_DESKTOP: 0.14,\n /** Right HUD width on mobile (18% for touch targets) */\n RIGHT_MOBILE: 0.18,\n /** Top HUD width (full screen width) */\n TOP: 1.0,\n /** Bottom HUD width (full screen width) */\n BOTTOM: 1.0,\n} as const;\n\n/**\n * HUD height constants for top and bottom bars\n *\n * These constants define the standard heights for top and bottom HUD bars.\n * Values are in pixels and should be scaled with `positionScale` for 4K displays.\n *\n * **Usage:**\n * ```tsx\n * const hudHeight = HUD_HEIGHT.TOP_DESKTOP * positionScale;\n * ```\n *\n * @category Layout Constants\n * @korean HUD높이\n */\nexport const HUD_HEIGHT = {\n /** Top bar height on desktop (slim for minimal obstruction) */\n TOP_DESKTOP: 70,\n /** Top bar height on mobile (extra slim) */\n TOP_MOBILE: 50,\n /** Bottom bar height on desktop (fits technique cards) */\n BOTTOM_DESKTOP: 120,\n /** Bottom bar height on mobile (compact) */\n BOTTOM_MOBILE: 100,\n /** Combat-specific top bar height */\n COMBAT_TOP_DESKTOP: 70,\n /** Combat-specific top bar height on mobile */\n COMBAT_TOP_MOBILE: 55,\n /** Combat-specific bottom bar height */\n COMBAT_BOTTOM_DESKTOP: 120,\n /** Combat-specific bottom bar height on mobile */\n COMBAT_BOTTOM_MOBILE: 100,\n /** Training-specific top bar height */\n TRAINING_TOP_DESKTOP: 70,\n /** Training-specific top bar height on mobile */\n TRAINING_TOP_MOBILE: 50,\n /** Training-specific bottom bar height */\n TRAINING_BOTTOM_DESKTOP: 130,\n /** Training-specific bottom bar height on mobile */\n TRAINING_BOTTOM_MOBILE: 110,\n} as const;\n\n/**\n * HUD positioning configuration interface\n *\n * Defines the positioning strategy for a HUD component.\n *\n * @category Layout Types\n * @korean HUD위치설정\n */\nexport interface HUDPositionConfig {\n /** Positioning strategy */\n readonly strategy: \"absolute\" | \"relative\" | \"flex\" | \"grid\";\n /** Anchor point for absolute positioning */\n readonly anchor?: \"left\" | \"right\" | \"top\" | \"bottom\" | \"center\";\n /** Offset from anchor point */\n readonly offset?: { x?: number; y?: number };\n /** Size configuration */\n readonly size?: { width?: string | number; height?: string | number };\n /** Z-index layer */\n readonly zIndex?: ZIndexValue;\n}\n"],"mappings":";;;;;;;;;;;;;;AA0GA,IAAa,UAAU;;CAGrB,YAAY;;CAEZ,OAAO;;CAEP,SAAS;;CAET,SAAS;;CAIT,gBAAgB;;CAEhB,KAAK;;CAEL,eAAe;;CAEf,aAAa;;CAIb,iBAAiB;;CAEjB,OAAO;;CAEP,SAAS;;CAET,YAAY;;CAEZ,SAAS;;CAET,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8HA,IAAa,oBAAoB;;CAE/B,cAAc;;CAEd,aAAa;;CAEb,eAAe;;CAEf,cAAc;;CAEd,KAAK;;CAEL,QAAQ;AACV;;;;;;;;;;;;;;;AAgBA,IAAa,aAAa;;CAExB,aAAa;;CAEb,YAAY;;CAEZ,gBAAgB;;CAEhB,eAAe;;CAEf,oBAAoB;;CAEpB,mBAAmB;;CAEnB,uBAAuB;;CAEvB,sBAAsB;;CAEtB,sBAAsB;;CAEtB,qBAAqB;;CAErB,yBAAyB;;CAEzB,wBAAwB;AAC1B"}
@@ -1 +1 @@
1
- {"version":3,"file":"PhysicsTypes.js","names":[],"sources":["../../src/types/PhysicsTypes.ts"],"sourcesContent":["/**\n * Physics-based type definitions for Black Trigram (흑괘)\n * \n * This module defines physics-first types where all positions, distances,\n * and measurements are in **meters** or **centimeters**, never pixels.\n * Pixel conversions happen ONLY at render time.\n * \n * @module types/PhysicsTypes\n * @category Type Definitions\n * @korean 물리타입\n */\n\nimport * as THREE from \"three\";\nimport type { Position3D } from \"./physics\";\n\n/**\n * Arena bounds with both pixel dimensions (for rendering) and \n * world dimensions (for physics calculations).\n * \n * This allows proper conversion between screen space (pixels) and\n * physics space (meters) without fixed constants.\n * \n * **Korean**: 경기장 경계 (Arena Bounds)\n * \n * @category Physics Types\n */\nexport interface PhysicsArenaBounds {\n /** X coordinate of arena top-left corner (pixels, for rendering) */\n readonly x: number;\n /** Y coordinate of arena top-left corner (pixels, for rendering) */\n readonly y: number;\n /** Arena width in pixels (for rendering) */\n readonly width: number;\n /** Arena height in pixels (for rendering) */\n readonly height: number;\n /** Arena scale factor (1.0 = desktop, <1.0 = mobile, for 3D scene scaling) */\n readonly scale: number;\n /**\n * Physical arena width in meters.\n * Combined with width (pixels), gives pixels-per-meter: `width / worldWidthMeters`\n */\n readonly worldWidthMeters: number;\n /**\n * Physical arena depth in meters.\n * Typically same as worldWidthMeters for square arenas.\n */\n readonly worldDepthMeters: number;\n}\n\n/**\n * Default arena bounds used across visual effect components.\n * \n * Represents a standard 10m × 7.5m arena at desktop resolution (1200×800px).\n * Components should use this as their default to ensure consistency.\n * \n * **Korean**: 기본경기장경계 (Default Arena Bounds)\n * \n * @category Physics Types\n */\nexport const DEFAULT_PHYSICS_ARENA_BOUNDS: PhysicsArenaBounds = {\n x: 0,\n y: 0,\n width: 1200,\n height: 800,\n scale: 1.0,\n worldWidthMeters: 10,\n worldDepthMeters: 7.5,\n} as const;\n\n/**\n * Validates if a value is a valid Position3D or THREE.Vector3.\n * \n * @param pos - Value to check\n * @returns True if valid position with x, y, z properties\n * @internal\n */\nfunction isValidPosition(pos: unknown): pos is Position3D | THREE.Vector3 {\n return (\n pos !== null &&\n pos !== undefined &&\n typeof pos === \"object\" &&\n \"x\" in pos &&\n \"y\" in pos &&\n \"z\" in pos &&\n typeof (pos as Position3D).x === \"number\" &&\n typeof (pos as Position3D).y === \"number\" &&\n typeof (pos as Position3D).z === \"number\" &&\n Number.isFinite((pos as Position3D).x) &&\n Number.isFinite((pos as Position3D).y) &&\n Number.isFinite((pos as Position3D).z)\n );\n}\n\n/**\n * Calculate pixels-per-meter ratio from arena bounds.\n * \n * **Korean**: 픽셀당미터비율 (Pixels Per Meter Ratio)\n * \n * @param bounds - Arena bounds with pixel and meter dimensions\n * @returns Conversion ratio (pixels per meter)\n * @throws Error if worldWidthMeters is not positive\n * \n * @example\n * ```typescript\n * // Desktop: 960px arena, 10m world\n * const desktopPxPerM = getPixelsPerMeter({ width: 960, worldWidthMeters: 10, ... });\n * // Result: 96 px/m\n * \n * // Mobile: 300px arena, 6m world \n * const mobilePxPerM = getPixelsPerMeter({ width: 300, worldWidthMeters: 6, ... });\n * // Result: 50 px/m\n * ```\n * \n * @category Physics Types\n */\nexport function getPixelsPerMeter(bounds: PhysicsArenaBounds): number {\n if (bounds.worldWidthMeters <= 0) {\n throw new Error(\n `worldWidthMeters must be positive, got: ${bounds.worldWidthMeters}`\n );\n }\n return bounds.width / bounds.worldWidthMeters;\n}\n\n/**\n * Convert physics position (meters) to screen position (pixels).\n * \n * **IMPORTANT**: Only handles scaling conversion between meters and pixels.\n * Does NOT account for arena position offsets (bounds.x and bounds.y).\n * Callers must add these offsets separately when rendering to screen.\n * \n * Example:\n * ```typescript\n * const pixelPos = metersToPixels(physicsPos, bounds);\n * const screenX = bounds.x + pixelPos.x; // Add arena offset\n * const screenY = bounds.y + pixelPos.y; // Add arena offset\n * ```\n * \n * **Korean**: 미터를픽셀로 (Meters To Pixels)\n * \n * @param positionMeters - Position in meters\n * @param bounds - Arena bounds for conversion\n * @returns Position in pixels RELATIVE to arena origin (add bounds.x/y for screen position)\n * @throws Error if position is invalid\n * \n * @category Physics Types\n */\nexport function metersToPixels(\n positionMeters: Position3D | THREE.Vector3,\n bounds: PhysicsArenaBounds\n): { x: number; y: number } {\n if (!isValidPosition(positionMeters)) {\n throw new Error(\n \"Invalid position: must be Vector3 or Position3D with numeric x, y, z properties\"\n );\n }\n \n const pixelsPerMeter = getPixelsPerMeter(bounds);\n \n return {\n x: positionMeters.x * pixelsPerMeter,\n y: positionMeters.z * pixelsPerMeter, // Z axis maps to screen Y\n };\n}\n\n/**\n * Convert screen position (pixels) to physics position (meters).\n * \n * **IMPORTANT**: Only handles scaling conversion between pixels and meters.\n * If converting from screen coordinates, subtract arena position offsets first.\n * \n * Example:\n * ```typescript\n * const arenaRelativeX = screenX - bounds.x; // Remove arena offset\n * const arenaRelativeY = screenY - bounds.y; // Remove arena offset\n * const physicsPos = pixelsToMeters({ x: arenaRelativeX, y: arenaRelativeY }, bounds);\n * ```\n * \n * **Korean**: 픽셀을미터로 (Pixels To Meters)\n * \n * @param pixelPosition - Position in pixels RELATIVE to arena origin (subtract bounds.x/y first)\n * @param bounds - Arena bounds for conversion\n * @returns Position in meters\n * @throws Error if pixel coordinates are not finite numbers\n * \n * @category Physics Types\n */\nexport function pixelsToMeters(\n pixelPosition: { x: number; y: number },\n bounds: PhysicsArenaBounds\n): Position3D {\n if (!Number.isFinite(pixelPosition.x) || !Number.isFinite(pixelPosition.y)) {\n throw new Error(\n `Invalid pixel coordinates: x=${pixelPosition.x}, y=${pixelPosition.y}`\n );\n }\n \n const pixelsPerMeter = getPixelsPerMeter(bounds);\n \n return {\n x: pixelPosition.x / pixelsPerMeter,\n y: 0, // Ground plane\n z: pixelPosition.y / pixelsPerMeter, // Screen Y maps to Z axis\n };\n}\n\n/**\n * Calculate distance between two positions in meters.\n * \n * **Korean**: 거리계산 (Distance Calculation)\n * \n * @param pos1 - First position in meters\n * @param pos2 - Second position in meters\n * @returns Distance in meters\n * @throws Error if either position is invalid\n * \n * @category Physics Types\n */\nexport function calculateDistanceMeters(\n pos1: Position3D | THREE.Vector3,\n pos2: Position3D | THREE.Vector3\n): number {\n if (!isValidPosition(pos1) || !isValidPosition(pos2)) {\n throw new Error(\n \"Invalid positions for distance calculation: both positions must be valid Vector3 or Position3D objects\"\n );\n }\n \n const dx = pos2.x - pos1.x;\n const dy = pos2.y - pos1.y;\n const dz = pos2.z - pos1.z;\n \n return Math.sqrt(dx * dx + dy * dy + dz * dz);\n}\n\n/**\n * Movement-specific arena bounds in world coordinates (meters).\n * \n * Defines the playable area boundaries for player/AI movement.\n * All arenas are centered at origin (0, 0) and extend symmetrically.\n * \n * **Korean**: 이동 경기장 경계 (Movement Arena Bounds)\n * \n * @remarks\n * Distinct from `ArenaBounds` interfaces in layout/test code which include\n * pixel-based screen coordinates. MovementArenaBounds only contains\n * world-space meter coordinates for physics calculations.\n * \n * @category Physics Types\n */\nexport interface MovementArenaBounds {\n /** Minimum X position in meters (left edge) */\n readonly minX: number;\n /** Maximum X position in meters (right edge) */\n readonly maxX: number;\n /** Minimum Z position in meters (back edge) */\n readonly minZ: number;\n /** Maximum Z position in meters (front edge) */\n readonly maxZ: number;\n /** Arena center X in meters (typically 0) */\n readonly centerX: number;\n /** Arena center Z in meters (typically 0) */\n readonly centerZ: number;\n /** Arena width in meters */\n readonly widthMeters: number;\n /** Arena depth in meters */\n readonly depthMeters: number;\n}\n\n/**\n * Calculate arena bounds from arena configuration.\n * \n * Creates bounds with a margin to account for character radius,\n * preventing characters from walking through edges.\n * \n * **Korean**: 경기장 경계 계산 (Calculate Arena Bounds)\n * \n * @param bounds - Arena configuration with meter dimensions\n * @param margin - Character radius/margin in meters (default: 0.3m)\n * @returns Arena bounds for physics calculations\n * @throws Error if dimensions are invalid or margin is invalid\n * \n * @example\n * ```typescript\n * const config = { worldWidthMeters: 10, worldDepthMeters: 7.5 };\n * const arenaBounds = calculateArenaBounds(config, 0.3);\n * // Result: { minX: -4.7, maxX: 4.7, minZ: -3.45, maxZ: 3.45, ... }\n * ```\n * \n * @category Physics Types\n */\nexport function calculateArenaBounds(\n bounds: Pick<PhysicsArenaBounds, 'worldWidthMeters' | 'worldDepthMeters'>,\n margin: number = 0.3\n): MovementArenaBounds {\n if (!Number.isFinite(bounds.worldWidthMeters) || bounds.worldWidthMeters <= 0) {\n throw new Error(\n `worldWidthMeters must be a positive finite number, got: ${bounds.worldWidthMeters}`\n );\n }\n if (!Number.isFinite(bounds.worldDepthMeters) || bounds.worldDepthMeters <= 0) {\n throw new Error(\n `worldDepthMeters must be a positive finite number, got: ${bounds.worldDepthMeters}`\n );\n }\n \n if (!Number.isFinite(margin) || margin < 0) {\n throw new Error(\n `margin must be a non-negative finite number, got: ${margin}`\n );\n }\n \n const halfWidth = bounds.worldWidthMeters / 2;\n const halfDepth = bounds.worldDepthMeters / 2;\n \n if (margin >= halfWidth) {\n throw new Error(\n `margin (${margin}m) must be less than half the arena width (${halfWidth}m)`\n );\n }\n if (margin >= halfDepth) {\n throw new Error(\n `margin (${margin}m) must be less than half the arena depth (${halfDepth}m)`\n );\n }\n \n return {\n minX: -halfWidth + margin,\n maxX: halfWidth - margin,\n minZ: -halfDepth + margin,\n maxZ: halfDepth - margin,\n centerX: 0,\n centerZ: 0,\n widthMeters: bounds.worldWidthMeters,\n depthMeters: bounds.worldDepthMeters,\n };\n}\n\n/**\n * Clamp a 3D position to stay within arena boundaries.\n * \n * Only clamps X and Z axes (horizontal plane). Y axis (height) is unchanged.\n * \n * **Korean**: 위치를 경기장 경계로 제한 (Clamp Position To Bounds)\n * \n * @param position - 3D position in meters\n * @param bounds - Arena bounds with min/max values\n * @returns Clamped position as new THREE.Vector3\n * \n * @example\n * ```typescript\n * const position = new THREE.Vector3(6, 0, 4); // Outside bounds\n * const bounds = calculateArenaBounds(config);\n * const clamped = clampPositionToBounds(position, bounds);\n * // Result: Vector3(4.7, 0, 3.45) - clamped to edges\n * ```\n * \n * @category Physics Types\n */\nexport function clampPositionToBounds(\n position: THREE.Vector3 | Position3D,\n bounds: MovementArenaBounds\n): THREE.Vector3 {\n return new THREE.Vector3(\n Math.max(bounds.minX, Math.min(bounds.maxX, position.x)),\n position.y, // Y is height, not bounds-checked\n Math.max(bounds.minZ, Math.min(bounds.maxZ, position.z))\n );\n}\n\n/**\n * Check if a position is within arena boundaries.\n * \n * Only checks X and Z axes. For 2D positions `{x, y}`, `y` maps to world Z.\n * \n * **Korean**: 경기장 경계 내 위치 확인 (Check Position In Bounds)\n * \n * @param position - Position to check (2D {x,y} where y=depth, or 3D Vector3/Position3D)\n * @param bounds - Arena bounds\n * @returns True if position is within bounds\n * \n * @category Physics Types\n */\nexport function isPositionInBounds(\n position: { x: number; y: number } | THREE.Vector3 | Position3D,\n bounds: MovementArenaBounds\n): boolean {\n const x = position.x;\n // For 2D positions {x,y}, y maps to world Z (depth)\n // For 3D positions, use z directly\n const z = 'z' in position ? position.z : position.y;\n \n return (\n x >= bounds.minX &&\n x <= bounds.maxX &&\n z >= bounds.minZ &&\n z <= bounds.maxZ\n );\n}\n\n/**\n * Clamp a 2D position to stay within arena boundaries in meters.\n * \n * Works in projected 2D arena space where:\n * - `position.x` → world **X** (horizontal)\n * - `position.y` → world **Z** (depth)\n * \n * @param position - 2D projected position in meters (may exceed arena bounds)\n * @param bounds - Arena bounds with meter dimensions\n * @returns Position clamped to arena boundaries\n * \n * @example\n * ```typescript\n * const bounds = { worldWidthMeters: 10, worldDepthMeters: 7.5, ... };\n * const position = { x: 6, y: 4 }; // Outside arena\n * const clamped = clampToArenaBounds(position, bounds);\n * // Result: { x: 5, y: 3.75 }\n * ```\n * \n * @category Physics Types\n */\nexport function clampToArenaBounds(\n position: { x: number; y: number },\n bounds: PhysicsArenaBounds\n): { x: number; y: number } {\n const halfWidth = bounds.worldWidthMeters / 2;\n const halfDepth = bounds.worldDepthMeters / 2;\n \n return {\n x: Math.max(-halfWidth, Math.min(halfWidth, position.x)),\n y: Math.max(-halfDepth, Math.min(halfDepth, position.y)),\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"PhysicsTypes.js","names":[],"sources":["../../src/types/PhysicsTypes.ts"],"sourcesContent":["/**\n * Physics-based type definitions for Black Trigram (흑괘)\n * \n * This module defines physics-first types where all positions, distances,\n * and measurements are in **meters** or **centimeters**, never pixels.\n * Pixel conversions happen ONLY at render time.\n * \n * @module types/PhysicsTypes\n * @category Type Definitions\n * @korean 물리타입\n */\n\nimport * as THREE from \"three\";\nimport type { Position3D } from \"./physics\";\n\n/**\n * Arena bounds with both pixel dimensions (for rendering) and \n * world dimensions (for physics calculations).\n * \n * This allows proper conversion between screen space (pixels) and\n * physics space (meters) without fixed constants.\n * \n * **Korean**: 경기장 경계 (Arena Bounds)\n * \n * @category Physics Types\n */\nexport interface PhysicsArenaBounds {\n /** X coordinate of arena top-left corner (pixels, for rendering) */\n readonly x: number;\n /** Y coordinate of arena top-left corner (pixels, for rendering) */\n readonly y: number;\n /** Arena width in pixels (for rendering) */\n readonly width: number;\n /** Arena height in pixels (for rendering) */\n readonly height: number;\n /** Arena scale factor (1.0 = desktop, <1.0 = mobile, for 3D scene scaling) */\n readonly scale: number;\n /**\n * Physical arena width in meters.\n * Combined with width (pixels), gives pixels-per-meter: `width / worldWidthMeters`\n */\n readonly worldWidthMeters: number;\n /**\n * Physical arena depth in meters.\n * Typically same as worldWidthMeters for square arenas.\n */\n readonly worldDepthMeters: number;\n}\n\n/**\n * Default arena bounds used across visual effect components.\n * \n * Represents a standard 10m × 7.5m arena at desktop resolution (1200×800px).\n * Components should use this as their default to ensure consistency.\n * \n * **Korean**: 기본경기장경계 (Default Arena Bounds)\n * \n * @category Physics Types\n */\nexport const DEFAULT_PHYSICS_ARENA_BOUNDS: PhysicsArenaBounds = {\n x: 0,\n y: 0,\n width: 1200,\n height: 800,\n scale: 1.0,\n worldWidthMeters: 10,\n worldDepthMeters: 7.5,\n} as const;\n\n/**\n * Validates if a value is a valid Position3D or THREE.Vector3.\n * \n * @param pos - Value to check\n * @returns True if valid position with x, y, z properties\n * @internal\n */\nfunction isValidPosition(pos: unknown): pos is Position3D | THREE.Vector3 {\n return (\n pos !== null &&\n pos !== undefined &&\n typeof pos === \"object\" &&\n \"x\" in pos &&\n \"y\" in pos &&\n \"z\" in pos &&\n typeof (pos as Position3D).x === \"number\" &&\n typeof (pos as Position3D).y === \"number\" &&\n typeof (pos as Position3D).z === \"number\" &&\n Number.isFinite((pos as Position3D).x) &&\n Number.isFinite((pos as Position3D).y) &&\n Number.isFinite((pos as Position3D).z)\n );\n}\n\n/**\n * Calculate pixels-per-meter ratio from arena bounds.\n * \n * **Korean**: 픽셀당미터비율 (Pixels Per Meter Ratio)\n * \n * @param bounds - Arena bounds with pixel and meter dimensions\n * @returns Conversion ratio (pixels per meter)\n * @throws Error if worldWidthMeters is not positive\n * \n * @example\n * ```typescript\n * // Desktop: 960px arena, 10m world\n * const desktopPxPerM = getPixelsPerMeter({ width: 960, worldWidthMeters: 10, ... });\n * // Result: 96 px/m\n * \n * // Mobile: 300px arena, 6m world \n * const mobilePxPerM = getPixelsPerMeter({ width: 300, worldWidthMeters: 6, ... });\n * // Result: 50 px/m\n * ```\n * \n * @category Physics Types\n */\nexport function getPixelsPerMeter(bounds: PhysicsArenaBounds): number {\n if (bounds.worldWidthMeters <= 0) {\n throw new Error(\n `worldWidthMeters must be positive, got: ${bounds.worldWidthMeters}`\n );\n }\n return bounds.width / bounds.worldWidthMeters;\n}\n\n/**\n * Convert physics position (meters) to screen position (pixels).\n * \n * **IMPORTANT**: Only handles scaling conversion between meters and pixels.\n * Does NOT account for arena position offsets (bounds.x and bounds.y).\n * Callers must add these offsets separately when rendering to screen.\n * \n * Example:\n * ```typescript\n * const pixelPos = metersToPixels(physicsPos, bounds);\n * const screenX = bounds.x + pixelPos.x; // Add arena offset\n * const screenY = bounds.y + pixelPos.y; // Add arena offset\n * ```\n * \n * **Korean**: 미터를픽셀로 (Meters To Pixels)\n * \n * @param positionMeters - Position in meters\n * @param bounds - Arena bounds for conversion\n * @returns Position in pixels RELATIVE to arena origin (add bounds.x/y for screen position)\n * @throws Error if position is invalid\n * \n * @category Physics Types\n */\nexport function metersToPixels(\n positionMeters: Position3D | THREE.Vector3,\n bounds: PhysicsArenaBounds\n): { x: number; y: number } {\n if (!isValidPosition(positionMeters)) {\n throw new Error(\n \"Invalid position: must be Vector3 or Position3D with numeric x, y, z properties\"\n );\n }\n \n const pixelsPerMeter = getPixelsPerMeter(bounds);\n \n return {\n x: positionMeters.x * pixelsPerMeter,\n y: positionMeters.z * pixelsPerMeter, // Z axis maps to screen Y\n };\n}\n\n/**\n * Convert screen position (pixels) to physics position (meters).\n * \n * **IMPORTANT**: Only handles scaling conversion between pixels and meters.\n * If converting from screen coordinates, subtract arena position offsets first.\n * \n * Example:\n * ```typescript\n * const arenaRelativeX = screenX - bounds.x; // Remove arena offset\n * const arenaRelativeY = screenY - bounds.y; // Remove arena offset\n * const physicsPos = pixelsToMeters({ x: arenaRelativeX, y: arenaRelativeY }, bounds);\n * ```\n * \n * **Korean**: 픽셀을미터로 (Pixels To Meters)\n * \n * @param pixelPosition - Position in pixels RELATIVE to arena origin (subtract bounds.x/y first)\n * @param bounds - Arena bounds for conversion\n * @returns Position in meters\n * @throws Error if pixel coordinates are not finite numbers\n * \n * @category Physics Types\n */\nexport function pixelsToMeters(\n pixelPosition: { x: number; y: number },\n bounds: PhysicsArenaBounds\n): Position3D {\n if (!Number.isFinite(pixelPosition.x) || !Number.isFinite(pixelPosition.y)) {\n throw new Error(\n `Invalid pixel coordinates: x=${pixelPosition.x}, y=${pixelPosition.y}`\n );\n }\n \n const pixelsPerMeter = getPixelsPerMeter(bounds);\n \n return {\n x: pixelPosition.x / pixelsPerMeter,\n y: 0, // Ground plane\n z: pixelPosition.y / pixelsPerMeter, // Screen Y maps to Z axis\n };\n}\n\n/**\n * Calculate distance between two positions in meters.\n * \n * **Korean**: 거리계산 (Distance Calculation)\n * \n * @param pos1 - First position in meters\n * @param pos2 - Second position in meters\n * @returns Distance in meters\n * @throws Error if either position is invalid\n * \n * @category Physics Types\n */\nexport function calculateDistanceMeters(\n pos1: Position3D | THREE.Vector3,\n pos2: Position3D | THREE.Vector3\n): number {\n if (!isValidPosition(pos1) || !isValidPosition(pos2)) {\n throw new Error(\n \"Invalid positions for distance calculation: both positions must be valid Vector3 or Position3D objects\"\n );\n }\n \n const dx = pos2.x - pos1.x;\n const dy = pos2.y - pos1.y;\n const dz = pos2.z - pos1.z;\n \n return Math.sqrt(dx * dx + dy * dy + dz * dz);\n}\n\n/**\n * Movement-specific arena bounds in world coordinates (meters).\n * \n * Defines the playable area boundaries for player/AI movement.\n * All arenas are centered at origin (0, 0) and extend symmetrically.\n * \n * **Korean**: 이동 경기장 경계 (Movement Arena Bounds)\n * \n * @remarks\n * Distinct from `ArenaBounds` interfaces in layout/test code which include\n * pixel-based screen coordinates. MovementArenaBounds only contains\n * world-space meter coordinates for physics calculations.\n * \n * @category Physics Types\n */\nexport interface MovementArenaBounds {\n /** Minimum X position in meters (left edge) */\n readonly minX: number;\n /** Maximum X position in meters (right edge) */\n readonly maxX: number;\n /** Minimum Z position in meters (back edge) */\n readonly minZ: number;\n /** Maximum Z position in meters (front edge) */\n readonly maxZ: number;\n /** Arena center X in meters (typically 0) */\n readonly centerX: number;\n /** Arena center Z in meters (typically 0) */\n readonly centerZ: number;\n /** Arena width in meters */\n readonly widthMeters: number;\n /** Arena depth in meters */\n readonly depthMeters: number;\n}\n\n/**\n * Calculate arena bounds from arena configuration.\n * \n * Creates bounds with a margin to account for character radius,\n * preventing characters from walking through edges.\n * \n * **Korean**: 경기장 경계 계산 (Calculate Arena Bounds)\n * \n * @param bounds - Arena configuration with meter dimensions\n * @param margin - Character radius/margin in meters (default: 0.3m)\n * @returns Arena bounds for physics calculations\n * @throws Error if dimensions are invalid or margin is invalid\n * \n * @example\n * ```typescript\n * const config = { worldWidthMeters: 10, worldDepthMeters: 7.5 };\n * const arenaBounds = calculateArenaBounds(config, 0.3);\n * // Result: { minX: -4.7, maxX: 4.7, minZ: -3.45, maxZ: 3.45, ... }\n * ```\n * \n * @category Physics Types\n */\nexport function calculateArenaBounds(\n bounds: Pick<PhysicsArenaBounds, 'worldWidthMeters' | 'worldDepthMeters'>,\n margin: number = 0.3\n): MovementArenaBounds {\n if (!Number.isFinite(bounds.worldWidthMeters) || bounds.worldWidthMeters <= 0) {\n throw new Error(\n `worldWidthMeters must be a positive finite number, got: ${bounds.worldWidthMeters}`\n );\n }\n if (!Number.isFinite(bounds.worldDepthMeters) || bounds.worldDepthMeters <= 0) {\n throw new Error(\n `worldDepthMeters must be a positive finite number, got: ${bounds.worldDepthMeters}`\n );\n }\n \n if (!Number.isFinite(margin) || margin < 0) {\n throw new Error(\n `margin must be a non-negative finite number, got: ${margin}`\n );\n }\n \n const halfWidth = bounds.worldWidthMeters / 2;\n const halfDepth = bounds.worldDepthMeters / 2;\n \n if (margin >= halfWidth) {\n throw new Error(\n `margin (${margin}m) must be less than half the arena width (${halfWidth}m)`\n );\n }\n if (margin >= halfDepth) {\n throw new Error(\n `margin (${margin}m) must be less than half the arena depth (${halfDepth}m)`\n );\n }\n \n return {\n minX: -halfWidth + margin,\n maxX: halfWidth - margin,\n minZ: -halfDepth + margin,\n maxZ: halfDepth - margin,\n centerX: 0,\n centerZ: 0,\n widthMeters: bounds.worldWidthMeters,\n depthMeters: bounds.worldDepthMeters,\n };\n}\n\n/**\n * Clamp a 3D position to stay within arena boundaries.\n * \n * Only clamps X and Z axes (horizontal plane). Y axis (height) is unchanged.\n * \n * **Korean**: 위치를 경기장 경계로 제한 (Clamp Position To Bounds)\n * \n * @param position - 3D position in meters\n * @param bounds - Arena bounds with min/max values\n * @returns Clamped position as new THREE.Vector3\n * \n * @example\n * ```typescript\n * const position = new THREE.Vector3(6, 0, 4); // Outside bounds\n * const bounds = calculateArenaBounds(config);\n * const clamped = clampPositionToBounds(position, bounds);\n * // Result: Vector3(4.7, 0, 3.45) - clamped to edges\n * ```\n * \n * @category Physics Types\n */\nexport function clampPositionToBounds(\n position: THREE.Vector3 | Position3D,\n bounds: MovementArenaBounds\n): THREE.Vector3 {\n return new THREE.Vector3(\n Math.max(bounds.minX, Math.min(bounds.maxX, position.x)),\n position.y, // Y is height, not bounds-checked\n Math.max(bounds.minZ, Math.min(bounds.maxZ, position.z))\n );\n}\n\n/**\n * Check if a position is within arena boundaries.\n * \n * Only checks X and Z axes. For 2D positions `{x, y}`, `y` maps to world Z.\n * \n * **Korean**: 경기장 경계 내 위치 확인 (Check Position In Bounds)\n * \n * @param position - Position to check (2D {x,y} where y=depth, or 3D Vector3/Position3D)\n * @param bounds - Arena bounds\n * @returns True if position is within bounds\n * \n * @category Physics Types\n */\nexport function isPositionInBounds(\n position: { x: number; y: number } | THREE.Vector3 | Position3D,\n bounds: MovementArenaBounds\n): boolean {\n const x = position.x;\n // For 2D positions {x,y}, y maps to world Z (depth)\n // For 3D positions, use z directly\n const z = 'z' in position ? position.z : position.y;\n \n return (\n x >= bounds.minX &&\n x <= bounds.maxX &&\n z >= bounds.minZ &&\n z <= bounds.maxZ\n );\n}\n\n/**\n * Clamp a 2D position to stay within arena boundaries in meters.\n * \n * Works in projected 2D arena space where:\n * - `position.x` → world **X** (horizontal)\n * - `position.y` → world **Z** (depth)\n * \n * @param position - 2D projected position in meters (may exceed arena bounds)\n * @param bounds - Arena bounds with meter dimensions\n * @returns Position clamped to arena boundaries\n * \n * @example\n * ```typescript\n * const bounds = { worldWidthMeters: 10, worldDepthMeters: 7.5, ... };\n * const position = { x: 6, y: 4 }; // Outside arena\n * const clamped = clampToArenaBounds(position, bounds);\n * // Result: { x: 5, y: 3.75 }\n * ```\n * \n * @category Physics Types\n */\nexport function clampToArenaBounds(\n position: { x: number; y: number },\n bounds: PhysicsArenaBounds\n): { x: number; y: number } {\n const halfWidth = bounds.worldWidthMeters / 2;\n const halfDepth = bounds.worldDepthMeters / 2;\n \n return {\n x: Math.max(-halfWidth, Math.min(halfWidth, position.x)),\n y: Math.max(-halfDepth, Math.min(halfDepth, position.y)),\n };\n}\n"],"mappings":"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"}