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":"performance.js","names":[],"sources":["../../../src/types/constants/performance.ts"],"sourcesContent":["/**\n * Performance constants and optimization settings for Black Trigram\n * \n * Optimized settings for different device categories to maintain 60fps target\n * Special attention to low-end mobile devices (<380px, older hardware)\n * \n * @module types/constants/performance\n * @category Performance\n * @korean 성능설정상수\n */\n\n/**\n * Performance tier levels based on device capabilities\n * \n * @category Performance\n * @korean 성능등급\n */\nexport type PerformanceTier = 'low' | 'medium' | 'high' | 'mobile-high';\n\n/**\n * Performance settings for different device tiers\n * Balances visual quality with frame rate targets\n * \n * @category Performance\n * @korean 성능설정\n */\nexport interface PerformanceSettings {\n /** Maximum particle count for effects */\n readonly maxParticles: number;\n /** Shadow map resolution (512, 1024, 2048) */\n readonly shadowMapSize: number;\n /** Enable antialiasing */\n readonly antialias: boolean;\n /** Device pixel ratio limit ([min, max] or single value) */\n readonly dpr: number | [number, number];\n /** Enable post-processing effects */\n readonly postProcessing: boolean;\n /** Target frame rate (fps) */\n readonly targetFPS: number;\n}\n\n/**\n * Performance settings by tier\n * \n * Low tier: Extra-small mobile (<380px), older devices, budget hardware\n * Medium tier: Standard mobile (380-768px), tablets\n * Mobile-high tier: High-resolution mobile devices (≥768px, 2K+, Motorola Edge, etc.)\n * High tier: Desktop, large displays, modern hardware\n * \n * @constant\n * @category Performance\n * @korean 성능등급별설정\n */\nexport const PERFORMANCE_SETTINGS_BY_TIER: Record<PerformanceTier, PerformanceSettings> = {\n low: {\n maxParticles: 20,\n shadowMapSize: 512,\n antialias: false, // Disable AA for performance\n dpr: 1, // Cap at 1x for low-end devices\n postProcessing: false,\n targetFPS: 50, // Realistic target for low-end\n },\n medium: {\n maxParticles: 40,\n shadowMapSize: 1024,\n antialias: true,\n dpr: [1, 2], // Allow up to 2x\n postProcessing: false, // Keep disabled for mobile\n targetFPS: 55,\n },\n 'mobile-high': {\n maxParticles: 50, // Between medium and high\n shadowMapSize: 1536, // Between 1024 and 2048\n antialias: true,\n dpr: [1, 2], // Cap at 2x to keep 2K-4K mobile WebGL buffers sustainable\n postProcessing: false, // Keep disabled for mobile battery life\n targetFPS: 55, // Realistic for high-end mobile\n },\n high: {\n maxParticles: 100,\n shadowMapSize: 2048,\n antialias: true,\n dpr: [1, 2],\n postProcessing: true,\n targetFPS: 60,\n },\n} as const;\n\n/**\n * Determine performance tier based on device characteristics\n * \n * Now properly handles high-resolution mobile devices (Motorola Edge 60 Pro, etc.)\n * by checking isMobile flag before using screen width to determine tier.\n * \n * @param screenWidth - Screen width in pixels\n * @param isMobile - Whether device is mobile (from user-agent detection)\n * @returns Performance tier\n * \n * @example\n * ```typescript\n * getPerformanceTier(320, true); // 'low' (extra-small mobile)\n * getPerformanceTier(768, true); // 'medium' (standard mobile)\n * getPerformanceTier(2712, true); // 'mobile-high' (Motorola Edge 60 Pro, 2K+ mobile)\n * getPerformanceTier(768, false); // 'medium' (tablet)\n * getPerformanceTier(1920, false); // 'high' (desktop)\n * ```\n * \n * @korean 성능등급결정\n */\nexport function getPerformanceTier(\n screenWidth: number,\n isMobile: boolean\n): PerformanceTier {\n if (isMobile) {\n if (screenWidth < 380) {\n return 'low';\n }\n\n if (screenWidth >= 768) {\n return 'mobile-high';\n }\n\n return 'medium';\n }\n\n if (screenWidth < 1024) {\n return 'medium';\n }\n\n return 'high';\n}\n\n/**\n * Get performance settings for current device\n * \n * Properly handles high-resolution mobile devices (2K+, Super HD) by using\n * the isMobile flag from user-agent detection before screen width classification.\n * \n * This ensures devices like Motorola Edge 60 Pro (2712x1220) get mobile-optimized\n * settings with proper dpr support up to 3.5x for their Super HD displays.\n * \n * @param screenWidth - Screen width in pixels\n * @param isMobile - Whether device is mobile (from user-agent detection)\n * @returns Performance settings object\n * \n * @example\n * ```typescript\n * // Standard mobile (iPhone SE)\n * const settings = getPerformanceSettings(375, true);\n * // { maxParticles: 40, shadowMapSize: 1024, dpr: [1, 2], ... }\n * \n * // High-res mobile (Motorola Edge 60 Pro)\n * const settingsHD = getPerformanceSettings(2712, true);\n * // { maxParticles: 50, shadowMapSize: 1536, dpr: [1, 3.5], ... }\n * \n * // Desktop\n * const settingsDesktop = getPerformanceSettings(1920, false);\n * // { maxParticles: 100, shadowMapSize: 2048, dpr: [1, 2], ... }\n * \n * <Canvas\n * dpr={settings.dpr}\n * gl={{ antialias: settings.antialias }}\n * />\n * ```\n * \n * @korean 성능설정얻기\n */\nexport function getPerformanceSettings(\n screenWidth: number,\n isMobile: boolean\n): PerformanceSettings {\n const tier = getPerformanceTier(screenWidth, isMobile);\n return PERFORMANCE_SETTINGS_BY_TIER[tier];\n}\n\n/**\n * Frame time budget in milliseconds for target FPS\n * \n * @constant\n * @category Performance\n * @korean 프레임시간예산\n */\nexport const FRAME_TIME_BUDGET = {\n /** 60fps = 16.67ms per frame */\n FPS_60: 16.67,\n /** 55fps = 18.18ms per frame */\n FPS_55: 18.18,\n /** 50fps = 20ms per frame */\n FPS_50: 20,\n /** 30fps = 33.33ms per frame (minimum acceptable) */\n FPS_30: 33.33,\n} as const;\n\n/**\n * Performance optimization thresholds for mobile\n * \n * Target values for mobile performance optimization:\n * - FPS: 55+ sustained during combat\n * - Draw calls: <100 per frame\n * - Memory: <200MB heap usage\n * - Particle count: 50% of desktop\n * \n * Note: shadowMapSize (512) represents the baseline/minimum for mobile.\n * The adaptive quality system can dynamically adjust above this baseline\n * (512 → 1024 → 1536) when performance allows, providing better visuals\n * on higher-end mobile devices while maintaining the 512 minimum for\n * low-end devices.\n * \n * @constant\n * @category Performance\n * @korean 모바일성능임계값\n */\nexport const MOBILE_PERFORMANCE_THRESHOLDS = {\n /** Target FPS for mobile devices */\n targetFPS: 55,\n /** Minimum acceptable FPS before quality downgrade */\n minAcceptableFPS: 45,\n /** Maximum draw calls per frame */\n maxDrawCalls: 100,\n /** Maximum memory usage in MB */\n maxMemoryMB: 200,\n /** Particle count reduction factor (0.5 = 50% of desktop) */\n particleReduction: 0.5,\n /** Shadow map size for mobile (baseline - adaptive quality can increase) */\n shadowMapSize: 512,\n} as const;\n\n/**\n * Desktop performance thresholds\n * \n * @constant\n * @category Performance\n * @korean 데스크톱성능임계값\n */\nexport const DESKTOP_PERFORMANCE_THRESHOLDS = {\n /** Target FPS for desktop */\n targetFPS: 60,\n /** Minimum acceptable FPS before quality downgrade */\n minAcceptableFPS: 55,\n /** Maximum draw calls per frame */\n maxDrawCalls: 150,\n /** Maximum memory usage in MB */\n maxMemoryMB: 300,\n /** Particle count reduction factor (1.0 = full desktop quality) */\n particleReduction: 1.0,\n /** Shadow map size for desktop */\n shadowMapSize: 2048,\n} as const;\n"],"mappings":";;;;;;;;;;;;;AAqDA,IAAa,+BAA6E;CACxF,KAAK;EACH,cAAc;EACd,eAAe;EACf,WAAW;EACX,KAAK;EACL,gBAAgB;EAChB,WAAW;EACZ;CACD,QAAQ;EACN,cAAc;EACd,eAAe;EACf,WAAW;EACX,KAAK,CAAC,GAAG,EAAE;EACX,gBAAgB;EAChB,WAAW;EACZ;CACD,eAAe;EACb,cAAc;EACd,eAAe;EACf,WAAW;EACX,KAAK,CAAC,GAAG,EAAE;EACX,gBAAgB;EAChB,WAAW;EACZ;CACD,MAAM;EACJ,cAAc;EACd,eAAe;EACf,WAAW;EACX,KAAK,CAAC,GAAG,EAAE;EACX,gBAAgB;EAChB,WAAW;EACZ;CACF;;;;;;;;;;;;;;;;;;;;;;AAuBD,SAAgB,mBACd,aACA,UACiB;CACjB,IAAI,UAAU;EACZ,IAAI,cAAc,KAChB,OAAO;EAGT,IAAI,eAAe,KACjB,OAAO;EAGT,OAAO;;CAGT,IAAI,cAAc,MAChB,OAAO;CAGT,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCT,SAAgB,uBACd,aACA,UACqB;CAErB,OAAO,6BADM,mBAAmB,aAAa,SACT;;;;;;;;;AAUtC,IAAa,oBAAoB;;CAE/B,QAAQ;;CAER,QAAQ;;CAER,QAAQ;;CAER,QAAQ;CACT"}
1
+ {"version":3,"file":"performance.js","names":[],"sources":["../../../src/types/constants/performance.ts"],"sourcesContent":["/**\n * Performance constants and optimization settings for Black Trigram\n * \n * Optimized settings for different device categories to maintain 60fps target\n * Special attention to low-end mobile devices (<380px, older hardware)\n * \n * @module types/constants/performance\n * @category Performance\n * @korean 성능설정상수\n */\n\n/**\n * Performance tier levels based on device capabilities\n * \n * @category Performance\n * @korean 성능등급\n */\nexport type PerformanceTier = 'low' | 'medium' | 'high' | 'mobile-high';\n\n/**\n * Performance settings for different device tiers\n * Balances visual quality with frame rate targets\n * \n * @category Performance\n * @korean 성능설정\n */\nexport interface PerformanceSettings {\n /** Maximum particle count for effects */\n readonly maxParticles: number;\n /** Shadow map resolution (512, 1024, 2048) */\n readonly shadowMapSize: number;\n /** Enable antialiasing */\n readonly antialias: boolean;\n /** Device pixel ratio limit ([min, max] or single value) */\n readonly dpr: number | [number, number];\n /** Enable post-processing effects */\n readonly postProcessing: boolean;\n /** Target frame rate (fps) */\n readonly targetFPS: number;\n}\n\n/**\n * Performance settings by tier\n * \n * Low tier: Extra-small mobile (<380px), older devices, budget hardware\n * Medium tier: Standard mobile (380-768px), tablets\n * Mobile-high tier: High-resolution mobile devices (≥768px, 2K+, Motorola Edge, etc.)\n * High tier: Desktop, large displays, modern hardware\n * \n * @constant\n * @category Performance\n * @korean 성능등급별설정\n */\nexport const PERFORMANCE_SETTINGS_BY_TIER: Record<PerformanceTier, PerformanceSettings> = {\n low: {\n maxParticles: 20,\n shadowMapSize: 512,\n antialias: false, // Disable AA for performance\n dpr: 1, // Cap at 1x for low-end devices\n postProcessing: false,\n targetFPS: 50, // Realistic target for low-end\n },\n medium: {\n maxParticles: 40,\n shadowMapSize: 1024,\n antialias: true,\n dpr: [1, 2], // Allow up to 2x\n postProcessing: false, // Keep disabled for mobile\n targetFPS: 55,\n },\n 'mobile-high': {\n maxParticles: 50, // Between medium and high\n shadowMapSize: 1536, // Between 1024 and 2048\n antialias: true,\n dpr: [1, 2], // Cap at 2x to keep 2K-4K mobile WebGL buffers sustainable\n postProcessing: false, // Keep disabled for mobile battery life\n targetFPS: 55, // Realistic for high-end mobile\n },\n high: {\n maxParticles: 100,\n shadowMapSize: 2048,\n antialias: true,\n dpr: [1, 2],\n postProcessing: true,\n targetFPS: 60,\n },\n} as const;\n\n/**\n * Determine performance tier based on device characteristics\n * \n * Now properly handles high-resolution mobile devices (Motorola Edge 60 Pro, etc.)\n * by checking isMobile flag before using screen width to determine tier.\n * \n * @param screenWidth - Screen width in pixels\n * @param isMobile - Whether device is mobile (from user-agent detection)\n * @returns Performance tier\n * \n * @example\n * ```typescript\n * getPerformanceTier(320, true); // 'low' (extra-small mobile)\n * getPerformanceTier(768, true); // 'medium' (standard mobile)\n * getPerformanceTier(2712, true); // 'mobile-high' (Motorola Edge 60 Pro, 2K+ mobile)\n * getPerformanceTier(768, false); // 'medium' (tablet)\n * getPerformanceTier(1920, false); // 'high' (desktop)\n * ```\n * \n * @korean 성능등급결정\n */\nexport function getPerformanceTier(\n screenWidth: number,\n isMobile: boolean\n): PerformanceTier {\n if (isMobile) {\n if (screenWidth < 380) {\n return 'low';\n }\n\n if (screenWidth >= 768) {\n return 'mobile-high';\n }\n\n return 'medium';\n }\n\n if (screenWidth < 1024) {\n return 'medium';\n }\n\n return 'high';\n}\n\n/**\n * Get performance settings for current device\n * \n * Properly handles high-resolution mobile devices (2K+, Super HD) by using\n * the isMobile flag from user-agent detection before screen width classification.\n * \n * This ensures devices like Motorola Edge 60 Pro (2712x1220) get mobile-optimized\n * settings with proper dpr support up to 3.5x for their Super HD displays.\n * \n * @param screenWidth - Screen width in pixels\n * @param isMobile - Whether device is mobile (from user-agent detection)\n * @returns Performance settings object\n * \n * @example\n * ```typescript\n * // Standard mobile (iPhone SE)\n * const settings = getPerformanceSettings(375, true);\n * // { maxParticles: 40, shadowMapSize: 1024, dpr: [1, 2], ... }\n * \n * // High-res mobile (Motorola Edge 60 Pro)\n * const settingsHD = getPerformanceSettings(2712, true);\n * // { maxParticles: 50, shadowMapSize: 1536, dpr: [1, 3.5], ... }\n * \n * // Desktop\n * const settingsDesktop = getPerformanceSettings(1920, false);\n * // { maxParticles: 100, shadowMapSize: 2048, dpr: [1, 2], ... }\n * \n * <Canvas\n * dpr={settings.dpr}\n * gl={{ antialias: settings.antialias }}\n * />\n * ```\n * \n * @korean 성능설정얻기\n */\nexport function getPerformanceSettings(\n screenWidth: number,\n isMobile: boolean\n): PerformanceSettings {\n const tier = getPerformanceTier(screenWidth, isMobile);\n return PERFORMANCE_SETTINGS_BY_TIER[tier];\n}\n\n/**\n * Frame time budget in milliseconds for target FPS\n * \n * @constant\n * @category Performance\n * @korean 프레임시간예산\n */\nexport const FRAME_TIME_BUDGET = {\n /** 60fps = 16.67ms per frame */\n FPS_60: 16.67,\n /** 55fps = 18.18ms per frame */\n FPS_55: 18.18,\n /** 50fps = 20ms per frame */\n FPS_50: 20,\n /** 30fps = 33.33ms per frame (minimum acceptable) */\n FPS_30: 33.33,\n} as const;\n\n/**\n * Performance optimization thresholds for mobile\n * \n * Target values for mobile performance optimization:\n * - FPS: 55+ sustained during combat\n * - Draw calls: <100 per frame\n * - Memory: <200MB heap usage\n * - Particle count: 50% of desktop\n * \n * Note: shadowMapSize (512) represents the baseline/minimum for mobile.\n * The adaptive quality system can dynamically adjust above this baseline\n * (512 → 1024 → 1536) when performance allows, providing better visuals\n * on higher-end mobile devices while maintaining the 512 minimum for\n * low-end devices.\n * \n * @constant\n * @category Performance\n * @korean 모바일성능임계값\n */\nexport const MOBILE_PERFORMANCE_THRESHOLDS = {\n /** Target FPS for mobile devices */\n targetFPS: 55,\n /** Minimum acceptable FPS before quality downgrade */\n minAcceptableFPS: 45,\n /** Maximum draw calls per frame */\n maxDrawCalls: 100,\n /** Maximum memory usage in MB */\n maxMemoryMB: 200,\n /** Particle count reduction factor (0.5 = 50% of desktop) */\n particleReduction: 0.5,\n /** Shadow map size for mobile (baseline - adaptive quality can increase) */\n shadowMapSize: 512,\n} as const;\n\n/**\n * Desktop performance thresholds\n * \n * @constant\n * @category Performance\n * @korean 데스크톱성능임계값\n */\nexport const DESKTOP_PERFORMANCE_THRESHOLDS = {\n /** Target FPS for desktop */\n targetFPS: 60,\n /** Minimum acceptable FPS before quality downgrade */\n minAcceptableFPS: 55,\n /** Maximum draw calls per frame */\n maxDrawCalls: 150,\n /** Maximum memory usage in MB */\n maxMemoryMB: 300,\n /** Particle count reduction factor (1.0 = full desktop quality) */\n particleReduction: 1.0,\n /** Shadow map size for desktop */\n shadowMapSize: 2048,\n} as const;\n"],"mappings":";;;;;;;;;;;;;AAqDA,IAAa,+BAA6E;CACxF,KAAK;EACH,cAAc;EACd,eAAe;EACf,WAAW;EACX,KAAK;EACL,gBAAgB;EAChB,WAAW;CACb;CACA,QAAQ;EACN,cAAc;EACd,eAAe;EACf,WAAW;EACX,KAAK,CAAC,GAAG,CAAC;EACV,gBAAgB;EAChB,WAAW;CACb;CACA,eAAe;EACb,cAAc;EACd,eAAe;EACf,WAAW;EACX,KAAK,CAAC,GAAG,CAAC;EACV,gBAAgB;EAChB,WAAW;CACb;CACA,MAAM;EACJ,cAAc;EACd,eAAe;EACf,WAAW;EACX,KAAK,CAAC,GAAG,CAAC;EACV,gBAAgB;EAChB,WAAW;CACb;AACF;;;;;;;;;;;;;;;;;;;;;;AAuBA,SAAgB,mBACd,aACA,UACiB;CACjB,IAAI,UAAU;EACZ,IAAI,cAAc,KAChB,OAAO;EAGT,IAAI,eAAe,KACjB,OAAO;EAGT,OAAO;CACT;CAEA,IAAI,cAAc,MAChB,OAAO;CAGT,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCA,SAAgB,uBACd,aACA,UACqB;CAErB,OAAO,6BADM,mBAAmB,aAAa,QACT;AACtC;;;;;;;;AASA,IAAa,oBAAoB;;CAE/B,QAAQ;;CAER,QAAQ;;CAER,QAAQ;;CAER,QAAQ;AACV"}
@@ -1 +1 @@
1
- {"version":3,"file":"typography.js","names":[],"sources":["../../../src/types/constants/typography.ts"],"sourcesContent":["/**\n * Typography constants for Black Trigram Korean martial arts.\n *\n * @module types/constants/typography\n * @category Typography Constants\n * @korean 타이포그래피상수\n */\n\n/**\n * Font family stacks for Korean and Latin text rendering.\n *\n * @constant\n * @category Typography Constants\n * @korean 폰트패밀리\n */\nexport const FONT_FAMILY = {\n PRIMARY: '\"Noto Sans KR\", \"Malgun Gothic\", Arial, sans-serif',\n SECONDARY: '\"Nanum Gothic\", Arial, sans-serif',\n MONO: '\"Nanum Gothic Coding\", monospace',\n KOREAN_BATTLE: '\"Noto Sans KR\", Impact, sans-serif',\n CYBER: '\"Orbitron\", \"Noto Sans KR\", monospace',\n SYMBOL: '\"Arial Unicode MS\", Arial, sans-serif',\n KOREAN: '\"Noto Sans KR\", \"Malgun Gothic\", Arial, sans-serif',\n} as const;\n\n/**\n * Font size scale in pixels for UI text elements.\n *\n * @constant\n * @category Typography Constants\n * @korean 폰트크기\n */\nexport const FONT_SIZES = {\n xsmall: 8,\n tiny: 10,\n small: 12,\n medium: 16,\n large: 20,\n xlarge: 24,\n xxlarge: 28,\n huge: 32,\n title: 36,\n subtitle: 28,\n} as const;\n\n/**\n * Font weight numeric values for text hierarchy.\n *\n * @constant\n * @category Typography Constants\n * @korean 폰트굵기\n */\nexport const FONT_WEIGHTS = {\n light: 300,\n normal: 400,\n regular: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n heavy: 900,\n} as const;\n\n/**\n * Korean text size scale in pixels with appropriate Hangul sizing.\n *\n * @constant\n * @category Typography Constants\n * @korean 한국어텍스트크기\n */\nexport const KOREAN_TEXT_SIZES: Record<string, number> = {\n tiny: 10,\n small: 12,\n medium: 16,\n large: 20,\n xlarge: 24,\n huge: 32,\n title: 36,\n};\n\n/**\n * Korean font sizes optimized for mobile devices\n * Korean characters need ~10-15% larger size than Latin for equal readability\n * \n * UPDATED: Minimum mobile size increased from 14px to 16px for better readability\n * \n * Extra-small: <380px width (iPhone SE, old Android, budget phones)\n * Small: 380-450px width (standard mobile phones)\n * Regular: 450+ width (large phones, tablets, desktop)\n * \n * @category Typography\n * @korean 한글모바일글꼴크기\n */\nexport const KOREAN_MOBILE_FONT_SIZES = {\n SMALL: {\n extraSmall: 15, // 320-380px width (was 13)\n small: 16, // 380-450px width (was 14)\n regular: 17, // 450+ width (was 16)\n },\n MEDIUM: {\n extraSmall: 17, // 320-380px width (was 15)\n small: 18, // 380-450px width (was 17)\n regular: 20, // 450+ width (was 19)\n },\n LARGE: {\n extraSmall: 20, // 320-380px width (was 18)\n small: 22, // 380-450px width (was 20)\n regular: 24, // 450+ width (was 22)\n },\n} as const;\n\n/**\n * Get Korean font size based on screen width\n * Automatically scales Korean text for readability on small screens\n * \n * @param baseSize - Base font size category ('SMALL', 'MEDIUM', 'LARGE')\n * @param screenWidth - Screen width in pixels\n * @returns Optimized font size in pixels\n * \n * @example\n * ```typescript\n * getKoreanFontSize('MEDIUM', 375); // 15 (extra-small)\n * getKoreanFontSize('MEDIUM', 410); // 17 (small)\n * getKoreanFontSize('MEDIUM', 768); // 19 (regular)\n * ```\n * \n * @korean 한글글꼴크기얻기\n */\nexport function getKoreanFontSize(\n baseSize: keyof typeof KOREAN_MOBILE_FONT_SIZES,\n screenWidth: number\n): number {\n const sizeMap = KOREAN_MOBILE_FONT_SIZES[baseSize];\n \n if (screenWidth < 380) {\n return sizeMap.extraSmall;\n } else if (screenWidth < 450) {\n return sizeMap.small;\n } else {\n return sizeMap.regular;\n }\n}\n\n/**\n * Korean font weights for text emphasis and hierarchy.\n *\n * @constant\n * @category Typography Constants\n * @korean 한국어폰트굵기\n */\nexport const KOREAN_FONT_WEIGHTS: Record<string, number> = {\n light: 300,\n normal: 400,\n regular: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n heavy: 900,\n} as const;\n"],"mappings":";;;;;;;;;;;;;;;AAeA,IAAa,cAAc;CACzB,SAAS;CACT,WAAW;CACX,MAAM;CACN,eAAe;CACf,OAAO;CACP,QAAQ;CACR,QAAQ;CACT;;;;;;;;AASD,IAAa,aAAa;CACxB,QAAQ;CACR,MAAM;CACN,OAAO;CACP,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,SAAS;CACT,MAAM;CACN,OAAO;CACP,UAAU;CACX;;;;;;;;AASD,IAAa,eAAe;CAC1B,OAAO;CACP,QAAQ;CACR,SAAS;CACT,QAAQ;CACR,UAAU;CACV,MAAM;CACN,OAAO;CACR;;;;;;;;AASD,IAAa,oBAA4C;CACvD,MAAM;CACN,OAAO;CACP,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,MAAM;CACN,OAAO;CACR;;;;;;;;;;;;;;AAeD,IAAa,2BAA2B;CACtC,OAAO;EACL,YAAY;EACZ,OAAO;EACP,SAAS;EACV;CACD,QAAQ;EACN,YAAY;EACZ,OAAO;EACP,SAAS;EACV;CACD,OAAO;EACL,YAAY;EACZ,OAAO;EACP,SAAS;EACV;CACF;;;;;;;;;;;;;;;;;;AAmBD,SAAgB,kBACd,UACA,aACQ;CACR,MAAM,UAAU,yBAAyB;CAEzC,IAAI,cAAc,KAChB,OAAO,QAAQ;MACV,IAAI,cAAc,KACvB,OAAO,QAAQ;MAEf,OAAO,QAAQ;;;;;;;;;AAWnB,IAAa,sBAA8C;CACzD,OAAO;CACP,QAAQ;CACR,SAAS;CACT,QAAQ;CACR,UAAU;CACV,MAAM;CACN,OAAO;CACR"}
1
+ {"version":3,"file":"typography.js","names":[],"sources":["../../../src/types/constants/typography.ts"],"sourcesContent":["/**\n * Typography constants for Black Trigram Korean martial arts.\n *\n * @module types/constants/typography\n * @category Typography Constants\n * @korean 타이포그래피상수\n */\n\n/**\n * Font family stacks for Korean and Latin text rendering.\n *\n * @constant\n * @category Typography Constants\n * @korean 폰트패밀리\n */\nexport const FONT_FAMILY = {\n PRIMARY: '\"Noto Sans KR\", \"Malgun Gothic\", Arial, sans-serif',\n SECONDARY: '\"Nanum Gothic\", Arial, sans-serif',\n MONO: '\"Nanum Gothic Coding\", monospace',\n KOREAN_BATTLE: '\"Noto Sans KR\", Impact, sans-serif',\n CYBER: '\"Orbitron\", \"Noto Sans KR\", monospace',\n SYMBOL: '\"Arial Unicode MS\", Arial, sans-serif',\n KOREAN: '\"Noto Sans KR\", \"Malgun Gothic\", Arial, sans-serif',\n} as const;\n\n/**\n * Font size scale in pixels for UI text elements.\n *\n * @constant\n * @category Typography Constants\n * @korean 폰트크기\n */\nexport const FONT_SIZES = {\n xsmall: 8,\n tiny: 10,\n small: 12,\n medium: 16,\n large: 20,\n xlarge: 24,\n xxlarge: 28,\n huge: 32,\n title: 36,\n subtitle: 28,\n} as const;\n\n/**\n * Font weight numeric values for text hierarchy.\n *\n * @constant\n * @category Typography Constants\n * @korean 폰트굵기\n */\nexport const FONT_WEIGHTS = {\n light: 300,\n normal: 400,\n regular: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n heavy: 900,\n} as const;\n\n/**\n * Korean text size scale in pixels with appropriate Hangul sizing.\n *\n * @constant\n * @category Typography Constants\n * @korean 한국어텍스트크기\n */\nexport const KOREAN_TEXT_SIZES: Record<string, number> = {\n tiny: 10,\n small: 12,\n medium: 16,\n large: 20,\n xlarge: 24,\n huge: 32,\n title: 36,\n};\n\n/**\n * Korean font sizes optimized for mobile devices\n * Korean characters need ~10-15% larger size than Latin for equal readability\n * \n * UPDATED: Minimum mobile size increased from 14px to 16px for better readability\n * \n * Extra-small: <380px width (iPhone SE, old Android, budget phones)\n * Small: 380-450px width (standard mobile phones)\n * Regular: 450+ width (large phones, tablets, desktop)\n * \n * @category Typography\n * @korean 한글모바일글꼴크기\n */\nexport const KOREAN_MOBILE_FONT_SIZES = {\n SMALL: {\n extraSmall: 15, // 320-380px width (was 13)\n small: 16, // 380-450px width (was 14)\n regular: 17, // 450+ width (was 16)\n },\n MEDIUM: {\n extraSmall: 17, // 320-380px width (was 15)\n small: 18, // 380-450px width (was 17)\n regular: 20, // 450+ width (was 19)\n },\n LARGE: {\n extraSmall: 20, // 320-380px width (was 18)\n small: 22, // 380-450px width (was 20)\n regular: 24, // 450+ width (was 22)\n },\n} as const;\n\n/**\n * Get Korean font size based on screen width\n * Automatically scales Korean text for readability on small screens\n * \n * @param baseSize - Base font size category ('SMALL', 'MEDIUM', 'LARGE')\n * @param screenWidth - Screen width in pixels\n * @returns Optimized font size in pixels\n * \n * @example\n * ```typescript\n * getKoreanFontSize('MEDIUM', 375); // 15 (extra-small)\n * getKoreanFontSize('MEDIUM', 410); // 17 (small)\n * getKoreanFontSize('MEDIUM', 768); // 19 (regular)\n * ```\n * \n * @korean 한글글꼴크기얻기\n */\nexport function getKoreanFontSize(\n baseSize: keyof typeof KOREAN_MOBILE_FONT_SIZES,\n screenWidth: number\n): number {\n const sizeMap = KOREAN_MOBILE_FONT_SIZES[baseSize];\n \n if (screenWidth < 380) {\n return sizeMap.extraSmall;\n } else if (screenWidth < 450) {\n return sizeMap.small;\n } else {\n return sizeMap.regular;\n }\n}\n\n/**\n * Korean font weights for text emphasis and hierarchy.\n *\n * @constant\n * @category Typography Constants\n * @korean 한국어폰트굵기\n */\nexport const KOREAN_FONT_WEIGHTS: Record<string, number> = {\n light: 300,\n normal: 400,\n regular: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n heavy: 900,\n} as const;\n"],"mappings":";;;;;;;;;;;;;;;AAeA,IAAa,cAAc;CACzB,SAAS;CACT,WAAW;CACX,MAAM;CACN,eAAe;CACf,OAAO;CACP,QAAQ;CACR,QAAQ;AACV;;;;;;;;AASA,IAAa,aAAa;CACxB,QAAQ;CACR,MAAM;CACN,OAAO;CACP,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,SAAS;CACT,MAAM;CACN,OAAO;CACP,UAAU;AACZ;;;;;;;;AASA,IAAa,eAAe;CAC1B,OAAO;CACP,QAAQ;CACR,SAAS;CACT,QAAQ;CACR,UAAU;CACV,MAAM;CACN,OAAO;AACT;;;;;;;;AASA,IAAa,oBAA4C;CACvD,MAAM;CACN,OAAO;CACP,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,MAAM;CACN,OAAO;AACT;;;;;;;;;;;;;;AAeA,IAAa,2BAA2B;CACtC,OAAO;EACL,YAAY;EACZ,OAAO;EACP,SAAS;CACX;CACA,QAAQ;EACN,YAAY;EACZ,OAAO;EACP,SAAS;CACX;CACA,OAAO;EACL,YAAY;EACZ,OAAO;EACP,SAAS;CACX;AACF;;;;;;;;;;;;;;;;;;AAmBA,SAAgB,kBACd,UACA,aACQ;CACR,MAAM,UAAU,yBAAyB;CAEzC,IAAI,cAAc,KAChB,OAAO,QAAQ;MACV,IAAI,cAAc,KACvB,OAAO,QAAQ;MAEf,OAAO,QAAQ;AAEnB;;;;;;;;AASA,IAAa,sBAA8C;CACzD,OAAO;CACP,QAAQ;CACR,SAAS;CACT,QAAQ;CACR,UAAU;CACV,MAAM;CACN,OAAO;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"ui.js","names":[],"sources":["../../../src/types/constants/ui.ts"],"sourcesContent":["/**\n * UI constants for Black Trigram Korean martial arts interface.\n *\n * @module types/constants/ui\n * @category UI Constants\n * @korean UI상수\n */\n\nimport { KOREAN_COLORS } from \"./colors\";\n\n/**\n * Safe area inset defaults for notched devices\n * iOS devices: iPhone X+ have notches and home indicators\n * Android devices: Various implementations\n * \n * @category UI Constants\n * @korean 안전영역삽입\n */\nexport const SAFE_AREA_INSETS = {\n TOP: 44, // Status bar and notch area\n BOTTOM: 34, // Home indicator area\n LEFT: 0, // No side notches on most devices\n RIGHT: 0, // No side notches on most devices\n} as const;\n\n/**\n * Layout dimension constants for UI components.\n *\n * @constant\n * @category UI Constants\n * @korean UI치수\n */\nexport const UI_DIMENSIONS = {\n HEADER_HEIGHT: 80,\n FOOTER_HEIGHT: 60,\n SIDEBAR_WIDTH: 250,\n CONTENT_PADDING: 20,\n\n // Button sizes\n BUTTON_SMALL: { width: 80, height: 32 },\n BUTTON_MEDIUM: { width: 120, height: 40 },\n BUTTON_LARGE: { width: 200, height: 50 },\n\n // Modal sizes\n MODAL_SMALL: { width: 400, height: 300 },\n MODAL_MEDIUM: { width: 600, height: 450 },\n MODAL_LARGE: { width: 800, height: 600 },\n\n // Default screen dimensions for fallback calculations\n DEFAULT_SCREEN_WIDTH: 1920,\n DEFAULT_SCREEN_HEIGHT: 1080,\n\n // Mobile touch target sizes (iOS/Android guidelines: 48px minimum)\n TOUCH_TARGET_MIN: 48,\n TOUCH_TARGET_COMFORTABLE: 56,\n TOUCH_TARGET_SPACING: 8, // Minimum spacing between touch targets\n} as const;\n\n/**\n * Z-index layer values for UI stacking context.\n *\n * @constant\n * @category UI Constants\n * @korean Z인덱스레이어\n */\nexport const Z_INDEX = {\n BACKGROUND: 0,\n GAME_WORLD: 100,\n UI_BACKGROUND: 200,\n UI_ELEMENTS: 300,\n MODALS: 400,\n TOOLTIPS: 500,\n DEBUG_OVERLAY: 1000,\n} as const;\n\n/**\n * Spacing values in pixels for consistent layout margins and padding.\n *\n * @constant\n * @category UI Constants\n * @korean UI간격\n */\nexport const SPACING = {\n XS: 4,\n SM: 8,\n MD: 16,\n LG: 24,\n XL: 32,\n XXL: 48,\n COMPACT: 12, // Mobile compact spacing\n} as const;\n\n/**\n * Border radius values in pixels for consistent rounded corners.\n *\n * @constant\n * @category UI Constants\n * @korean 테두리반경\n */\nexport const BORDER_RADIUS = {\n NONE: 0,\n SM: 4,\n MD: 8,\n LG: 12,\n XL: 16,\n ROUND: 9999,\n} as const;\n\n/**\n * Box shadow definitions for depth and elevation effects.\n *\n * @constant\n * @category UI Constants\n * @korean UI그림자\n */\nexport const SHADOWS = {\n SM: \"0 1px 2px 0 rgba(0, 0, 0, 0.05)\",\n MD: \"0 4px 6px -1px rgba(0, 0, 0, 0.1)\",\n LG: \"0 10px 15px -3px rgba(0, 0, 0, 0.1)\",\n XL: \"0 20px 25px -5px rgba(0, 0, 0, 0.1)\",\n CYBER: \"0 0 20px rgba(0, 255, 255, 0.3)\",\n KOREAN_GLOW: \"0 0 15px rgba(255, 215, 0, 0.4)\",\n} as const;\n\n/**\n * Animation curve CSS transition strings for UI.\n *\n * @constant\n * @category UI Constants\n * @korean UI애니메이션타이밍\n */\nexport const UI_ANIMATIONS = {\n FAST: \"150ms ease-out\",\n NORMAL: \"250ms ease-in-out\",\n SLOW: \"400ms ease-in-out\",\n BOUNCE: \"300ms cubic-bezier(0.68, -0.55, 0.265, 1.55)\",\n} as const;\n\n/**\n * Button state color tokens for normal, hover, pressed, and disabled states.\n *\n * @constant\n * @category UI Constants\n * @korean 버튼상태\n */\nexport const BUTTON_STATES = {\n NORMAL: {\n background: KOREAN_COLORS.UI_BACKGROUND_MEDIUM,\n border: KOREAN_COLORS.UI_BORDER,\n text: KOREAN_COLORS.TEXT_PRIMARY,\n alpha: 1.0,\n },\n HOVER: {\n background: KOREAN_COLORS.UI_BACKGROUND_LIGHT,\n border: KOREAN_COLORS.ACTIVE_BORDER,\n text: KOREAN_COLORS.TEXT_ACCENT,\n alpha: 1.0,\n },\n PRESSED: {\n background: KOREAN_COLORS.UI_BACKGROUND_DARK,\n border: KOREAN_COLORS.ACTIVE_BORDER,\n text: KOREAN_COLORS.TEXT_ACCENT,\n alpha: 0.8,\n },\n DISABLED: {\n background: KOREAN_COLORS.UI_DISABLED_FILL,\n border: KOREAN_COLORS.UI_DISABLED_BORDER,\n text: KOREAN_COLORS.TEXT_TERTIARY,\n alpha: 0.5,\n },\n} as const;\n\n/**\n * Health bar color thresholds for player vital display.\n *\n * @constant\n * @category UI Constants\n * @korean 체력바색상\n */\nexport const HEALTH_COLORS = {\n FULL: KOREAN_COLORS.POSITIVE_GREEN,\n HIGH: KOREAN_COLORS.ACCENT_YELLOW,\n MEDIUM: KOREAN_COLORS.WARNING_ORANGE,\n LOW: KOREAN_COLORS.WARNING_YELLOW,\n CRITICAL: KOREAN_COLORS.NEGATIVE_RED,\n UNCONSCIOUS: KOREAN_COLORS.UI_GRAY,\n} as const;\n\n/**\n * Status effect color tokens for positive, negative, and neutral effects.\n *\n * @constant\n * @category UI Constants\n * @korean 상태효과색상\n */\nexport const STATUS_COLORS = {\n POSITIVE: KOREAN_COLORS.POSITIVE_GREEN,\n NEGATIVE: KOREAN_COLORS.NEGATIVE_RED,\n NEUTRAL: KOREAN_COLORS.TEXT_SECONDARY,\n TEMPORARY: KOREAN_COLORS.ACCENT_YELLOW,\n PERMANENT: KOREAN_COLORS.ACCENT_PURPLE,\n} as const;\n\n/**\n * Combat feedback color tokens for hit, block, and special strike results.\n *\n * @constant\n * @category UI Constants\n * @korean 전투피드백색상\n */\nexport const COMBAT_FEEDBACK_COLORS = {\n HIT: KOREAN_COLORS.ACCENT_RED,\n CRITICAL_HIT: KOREAN_COLORS.CRITICAL_HIT,\n BLOCKED: KOREAN_COLORS.BLOCKED_ATTACK,\n MISS: KOREAN_COLORS.UI_GRAY,\n PERFECT: KOREAN_COLORS.PERFECT_STRIKE,\n COUNTER: KOREAN_COLORS.ACCENT_CYAN,\n VITAL_POINT: KOREAN_COLORS.VITAL_POINT_HIT,\n} as const;\n\n/**\n * UI Layout and component constants for Korean martial arts game\n */\n\nexport const UI_CONSTANTS = {\n // Layout dimensions\n HEADER_HEIGHT: 80,\n FOOTER_HEIGHT: 60,\n SIDEBAR_WIDTH: 240,\n PANEL_WIDTH: 320,\n\n // Component sizes\n BUTTON_HEIGHT: 48,\n BUTTON_WIDTH: 160,\n INPUT_HEIGHT: 40,\n CARD_MIN_HEIGHT: 120,\n\n // Spacing\n MARGIN_SMALL: 8,\n MARGIN_MEDIUM: 16,\n MARGIN_LARGE: 24,\n MARGIN_XLARGE: 32,\n\n // Borders and radii\n BORDER_RADIUS: 8,\n BORDER_WIDTH: 2,\n\n // Animation durations (ms)\n ANIMATION_FAST: 150,\n ANIMATION_NORMAL: 300,\n ANIMATION_SLOW: 500,\n\n // Z-index layers\n Z_BACKGROUND: 0,\n Z_CONTENT: 10,\n Z_OVERLAY: 100,\n Z_MODAL: 1000,\n Z_TOOLTIP: 2000,\n} as const;\n\n/**\n * Cyberpunk visual-effect intensity values for glows, flickers, and scanlines.\n *\n * @constant\n * @category UI Constants\n * @korean 사이버팡크UI효과\n */\nexport const CYBERPUNK_UI_EFFECTS = {\n GLOW_INTENSITY: 0.3,\n PULSE_SPEED: 2.0,\n FLICKER_FREQUENCY: 0.1,\n SCAN_LINE_OPACITY: 0.1,\n NOISE_INTENSITY: 0.05,\n} as const;\n\n/**\n * Korean traditional layout proportions and spacing ratios.\n *\n * @constant\n * @category UI Constants\n * @korean 한국UI레이아웃\n */\nexport const KOREAN_UI_LAYOUTS = {\n // Traditional Korean proportions\n GOLDEN_RATIO: 1.618,\n HANGEUL_LINE_HEIGHT: 1.4,\n KOREAN_ENGLISH_RATIO: 0.7,\n\n // Text hierarchy\n TITLE_SCALE: 2.0,\n SUBTITLE_SCALE: 1.5,\n BODY_SCALE: 1.0,\n CAPTION_SCALE: 0.8,\n} as const;\n\nexport default UI_CONSTANTS;\n"],"mappings":";;;;;;;;;;;;;;;;;AAkBA,IAAa,mBAAmB;CAC9B,KAAK;CACL,QAAQ;CACR,MAAM;CACN,OAAO;CACR;;;;;;;;AASD,IAAa,gBAAgB;CAC3B,eAAe;CACf,eAAe;CACf,eAAe;CACf,iBAAiB;CAGjB,cAAc;EAAE,OAAO;EAAI,QAAQ;EAAI;CACvC,eAAe;EAAE,OAAO;EAAK,QAAQ;EAAI;CACzC,cAAc;EAAE,OAAO;EAAK,QAAQ;EAAI;CAGxC,aAAa;EAAE,OAAO;EAAK,QAAQ;EAAK;CACxC,cAAc;EAAE,OAAO;EAAK,QAAQ;EAAK;CACzC,aAAa;EAAE,OAAO;EAAK,QAAQ;EAAK;CAGxC,sBAAsB;CACtB,uBAAuB;CAGvB,kBAAkB;CAClB,0BAA0B;CAC1B,sBAAsB;CACvB;;;;;;;;AA0BD,IAAa,UAAU;CACrB,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,KAAK;CACL,SAAS;CACV;;;;;;;;AASD,IAAa,gBAAgB;CAC3B,MAAM;CACN,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,OAAO;CACR;AAyCe,cAAc,sBAClB,cAAc,WAChB,cAAc,cAIR,cAAc,qBAClB,cAAc,eAChB,cAAc,aAIR,cAAc,oBAClB,cAAc,eAChB,cAAc,aAIR,cAAc,kBAClB,cAAc,oBAChB,cAAc;;;;;;;;AAYxB,IAAa,gBAAgB;CAC3B,MAAM,cAAc;CACpB,MAAM,cAAc;CACpB,QAAQ,cAAc;CACtB,KAAK,cAAc;CACnB,UAAU,cAAc;CACxB,aAAa,cAAc;CAC5B;AAUW,cAAc,gBACd,cAAc,cACf,cAAc,gBACZ,cAAc,eACd,cAAc;AAWpB,cAAc,YACL,cAAc,cACnB,cAAc,gBACjB,cAAc,SACX,cAAc,gBACd,cAAc,aACV,cAAc;;;;AAO7B,IAAa,eAAe;CAE1B,eAAe;CACf,eAAe;CACf,eAAe;CACf,aAAa;CAGb,eAAe;CACf,cAAc;CACd,cAAc;CACd,iBAAiB;CAGjB,cAAc;CACd,eAAe;CACf,cAAc;CACd,eAAe;CAGf,eAAe;CACf,cAAc;CAGd,gBAAgB;CAChB,kBAAkB;CAClB,gBAAgB;CAGhB,cAAc;CACd,WAAW;CACX,WAAW;CACX,SAAS;CACT,WAAW;CACZ"}
1
+ {"version":3,"file":"ui.js","names":[],"sources":["../../../src/types/constants/ui.ts"],"sourcesContent":["/**\n * UI constants for Black Trigram Korean martial arts interface.\n *\n * @module types/constants/ui\n * @category UI Constants\n * @korean UI상수\n */\n\nimport { KOREAN_COLORS } from \"./colors\";\n\n/**\n * Safe area inset defaults for notched devices\n * iOS devices: iPhone X+ have notches and home indicators\n * Android devices: Various implementations\n * \n * @category UI Constants\n * @korean 안전영역삽입\n */\nexport const SAFE_AREA_INSETS = {\n TOP: 44, // Status bar and notch area\n BOTTOM: 34, // Home indicator area\n LEFT: 0, // No side notches on most devices\n RIGHT: 0, // No side notches on most devices\n} as const;\n\n/**\n * Layout dimension constants for UI components.\n *\n * @constant\n * @category UI Constants\n * @korean UI치수\n */\nexport const UI_DIMENSIONS = {\n HEADER_HEIGHT: 80,\n FOOTER_HEIGHT: 60,\n SIDEBAR_WIDTH: 250,\n CONTENT_PADDING: 20,\n\n // Button sizes\n BUTTON_SMALL: { width: 80, height: 32 },\n BUTTON_MEDIUM: { width: 120, height: 40 },\n BUTTON_LARGE: { width: 200, height: 50 },\n\n // Modal sizes\n MODAL_SMALL: { width: 400, height: 300 },\n MODAL_MEDIUM: { width: 600, height: 450 },\n MODAL_LARGE: { width: 800, height: 600 },\n\n // Default screen dimensions for fallback calculations\n DEFAULT_SCREEN_WIDTH: 1920,\n DEFAULT_SCREEN_HEIGHT: 1080,\n\n // Mobile touch target sizes (iOS/Android guidelines: 48px minimum)\n TOUCH_TARGET_MIN: 48,\n TOUCH_TARGET_COMFORTABLE: 56,\n TOUCH_TARGET_SPACING: 8, // Minimum spacing between touch targets\n} as const;\n\n/**\n * Z-index layer values for UI stacking context.\n *\n * @constant\n * @category UI Constants\n * @korean Z인덱스레이어\n */\nexport const Z_INDEX = {\n BACKGROUND: 0,\n GAME_WORLD: 100,\n UI_BACKGROUND: 200,\n UI_ELEMENTS: 300,\n MODALS: 400,\n TOOLTIPS: 500,\n DEBUG_OVERLAY: 1000,\n} as const;\n\n/**\n * Spacing values in pixels for consistent layout margins and padding.\n *\n * @constant\n * @category UI Constants\n * @korean UI간격\n */\nexport const SPACING = {\n XS: 4,\n SM: 8,\n MD: 16,\n LG: 24,\n XL: 32,\n XXL: 48,\n COMPACT: 12, // Mobile compact spacing\n} as const;\n\n/**\n * Border radius values in pixels for consistent rounded corners.\n *\n * @constant\n * @category UI Constants\n * @korean 테두리반경\n */\nexport const BORDER_RADIUS = {\n NONE: 0,\n SM: 4,\n MD: 8,\n LG: 12,\n XL: 16,\n ROUND: 9999,\n} as const;\n\n/**\n * Box shadow definitions for depth and elevation effects.\n *\n * @constant\n * @category UI Constants\n * @korean UI그림자\n */\nexport const SHADOWS = {\n SM: \"0 1px 2px 0 rgba(0, 0, 0, 0.05)\",\n MD: \"0 4px 6px -1px rgba(0, 0, 0, 0.1)\",\n LG: \"0 10px 15px -3px rgba(0, 0, 0, 0.1)\",\n XL: \"0 20px 25px -5px rgba(0, 0, 0, 0.1)\",\n CYBER: \"0 0 20px rgba(0, 255, 255, 0.3)\",\n KOREAN_GLOW: \"0 0 15px rgba(255, 215, 0, 0.4)\",\n} as const;\n\n/**\n * Animation curve CSS transition strings for UI.\n *\n * @constant\n * @category UI Constants\n * @korean UI애니메이션타이밍\n */\nexport const UI_ANIMATIONS = {\n FAST: \"150ms ease-out\",\n NORMAL: \"250ms ease-in-out\",\n SLOW: \"400ms ease-in-out\",\n BOUNCE: \"300ms cubic-bezier(0.68, -0.55, 0.265, 1.55)\",\n} as const;\n\n/**\n * Button state color tokens for normal, hover, pressed, and disabled states.\n *\n * @constant\n * @category UI Constants\n * @korean 버튼상태\n */\nexport const BUTTON_STATES = {\n NORMAL: {\n background: KOREAN_COLORS.UI_BACKGROUND_MEDIUM,\n border: KOREAN_COLORS.UI_BORDER,\n text: KOREAN_COLORS.TEXT_PRIMARY,\n alpha: 1.0,\n },\n HOVER: {\n background: KOREAN_COLORS.UI_BACKGROUND_LIGHT,\n border: KOREAN_COLORS.ACTIVE_BORDER,\n text: KOREAN_COLORS.TEXT_ACCENT,\n alpha: 1.0,\n },\n PRESSED: {\n background: KOREAN_COLORS.UI_BACKGROUND_DARK,\n border: KOREAN_COLORS.ACTIVE_BORDER,\n text: KOREAN_COLORS.TEXT_ACCENT,\n alpha: 0.8,\n },\n DISABLED: {\n background: KOREAN_COLORS.UI_DISABLED_FILL,\n border: KOREAN_COLORS.UI_DISABLED_BORDER,\n text: KOREAN_COLORS.TEXT_TERTIARY,\n alpha: 0.5,\n },\n} as const;\n\n/**\n * Health bar color thresholds for player vital display.\n *\n * @constant\n * @category UI Constants\n * @korean 체력바색상\n */\nexport const HEALTH_COLORS = {\n FULL: KOREAN_COLORS.POSITIVE_GREEN,\n HIGH: KOREAN_COLORS.ACCENT_YELLOW,\n MEDIUM: KOREAN_COLORS.WARNING_ORANGE,\n LOW: KOREAN_COLORS.WARNING_YELLOW,\n CRITICAL: KOREAN_COLORS.NEGATIVE_RED,\n UNCONSCIOUS: KOREAN_COLORS.UI_GRAY,\n} as const;\n\n/**\n * Status effect color tokens for positive, negative, and neutral effects.\n *\n * @constant\n * @category UI Constants\n * @korean 상태효과색상\n */\nexport const STATUS_COLORS = {\n POSITIVE: KOREAN_COLORS.POSITIVE_GREEN,\n NEGATIVE: KOREAN_COLORS.NEGATIVE_RED,\n NEUTRAL: KOREAN_COLORS.TEXT_SECONDARY,\n TEMPORARY: KOREAN_COLORS.ACCENT_YELLOW,\n PERMANENT: KOREAN_COLORS.ACCENT_PURPLE,\n} as const;\n\n/**\n * Combat feedback color tokens for hit, block, and special strike results.\n *\n * @constant\n * @category UI Constants\n * @korean 전투피드백색상\n */\nexport const COMBAT_FEEDBACK_COLORS = {\n HIT: KOREAN_COLORS.ACCENT_RED,\n CRITICAL_HIT: KOREAN_COLORS.CRITICAL_HIT,\n BLOCKED: KOREAN_COLORS.BLOCKED_ATTACK,\n MISS: KOREAN_COLORS.UI_GRAY,\n PERFECT: KOREAN_COLORS.PERFECT_STRIKE,\n COUNTER: KOREAN_COLORS.ACCENT_CYAN,\n VITAL_POINT: KOREAN_COLORS.VITAL_POINT_HIT,\n} as const;\n\n/**\n * UI Layout and component constants for Korean martial arts game\n */\n\nexport const UI_CONSTANTS = {\n // Layout dimensions\n HEADER_HEIGHT: 80,\n FOOTER_HEIGHT: 60,\n SIDEBAR_WIDTH: 240,\n PANEL_WIDTH: 320,\n\n // Component sizes\n BUTTON_HEIGHT: 48,\n BUTTON_WIDTH: 160,\n INPUT_HEIGHT: 40,\n CARD_MIN_HEIGHT: 120,\n\n // Spacing\n MARGIN_SMALL: 8,\n MARGIN_MEDIUM: 16,\n MARGIN_LARGE: 24,\n MARGIN_XLARGE: 32,\n\n // Borders and radii\n BORDER_RADIUS: 8,\n BORDER_WIDTH: 2,\n\n // Animation durations (ms)\n ANIMATION_FAST: 150,\n ANIMATION_NORMAL: 300,\n ANIMATION_SLOW: 500,\n\n // Z-index layers\n Z_BACKGROUND: 0,\n Z_CONTENT: 10,\n Z_OVERLAY: 100,\n Z_MODAL: 1000,\n Z_TOOLTIP: 2000,\n} as const;\n\n/**\n * Cyberpunk visual-effect intensity values for glows, flickers, and scanlines.\n *\n * @constant\n * @category UI Constants\n * @korean 사이버팡크UI효과\n */\nexport const CYBERPUNK_UI_EFFECTS = {\n GLOW_INTENSITY: 0.3,\n PULSE_SPEED: 2.0,\n FLICKER_FREQUENCY: 0.1,\n SCAN_LINE_OPACITY: 0.1,\n NOISE_INTENSITY: 0.05,\n} as const;\n\n/**\n * Korean traditional layout proportions and spacing ratios.\n *\n * @constant\n * @category UI Constants\n * @korean 한국UI레이아웃\n */\nexport const KOREAN_UI_LAYOUTS = {\n // Traditional Korean proportions\n GOLDEN_RATIO: 1.618,\n HANGEUL_LINE_HEIGHT: 1.4,\n KOREAN_ENGLISH_RATIO: 0.7,\n\n // Text hierarchy\n TITLE_SCALE: 2.0,\n SUBTITLE_SCALE: 1.5,\n BODY_SCALE: 1.0,\n CAPTION_SCALE: 0.8,\n} as const;\n\nexport default UI_CONSTANTS;\n"],"mappings":";;;;;;;;;;;;;;;;;AAkBA,IAAa,mBAAmB;CAC9B,KAAK;CACL,QAAQ;CACR,MAAM;CACN,OAAO;AACT;;;;;;;;AASA,IAAa,gBAAgB;CAC3B,eAAe;CACf,eAAe;CACf,eAAe;CACf,iBAAiB;CAGjB,cAAc;EAAE,OAAO;EAAI,QAAQ;CAAG;CACtC,eAAe;EAAE,OAAO;EAAK,QAAQ;CAAG;CACxC,cAAc;EAAE,OAAO;EAAK,QAAQ;CAAG;CAGvC,aAAa;EAAE,OAAO;EAAK,QAAQ;CAAI;CACvC,cAAc;EAAE,OAAO;EAAK,QAAQ;CAAI;CACxC,aAAa;EAAE,OAAO;EAAK,QAAQ;CAAI;CAGvC,sBAAsB;CACtB,uBAAuB;CAGvB,kBAAkB;CAClB,0BAA0B;CAC1B,sBAAsB;AACxB;;;;;;;;AA0BA,IAAa,UAAU;CACrB,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,KAAK;CACL,SAAS;AACX;;;;;;;;AASA,IAAa,gBAAgB;CAC3B,MAAM;CACN,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,OAAO;AACT;AAyCgB,cAAc,sBAClB,cAAc,WAChB,cAAc,cAIR,cAAc,qBAClB,cAAc,eAChB,cAAc,aAIR,cAAc,oBAClB,cAAc,eAChB,cAAc,aAIR,cAAc,kBAClB,cAAc,oBAChB,cAAc;;;;;;;;AAYxB,IAAa,gBAAgB;CAC3B,MAAM,cAAc;CACpB,MAAM,cAAc;CACpB,QAAQ,cAAc;CACtB,KAAK,cAAc;CACnB,UAAU,cAAc;CACxB,aAAa,cAAc;AAC7B;AAUY,cAAc,gBACd,cAAc,cACf,cAAc,gBACZ,cAAc,eACd,cAAc;AAWpB,cAAc,YACL,cAAc,cACnB,cAAc,gBACjB,cAAc,SACX,cAAc,gBACd,cAAc,aACV,cAAc;;;;AAO7B,IAAa,eAAe;CAE1B,eAAe;CACf,eAAe;CACf,eAAe;CACf,aAAa;CAGb,eAAe;CACf,cAAc;CACd,cAAc;CACd,iBAAiB;CAGjB,cAAc;CACd,eAAe;CACf,cAAc;CACd,eAAe;CAGf,eAAe;CACf,cAAc;CAGd,gBAAgB;CAChB,kBAAkB;CAClB,gBAAgB;CAGhB,cAAc;CACd,WAAW;CACX,WAAW;CACX,SAAS;CACT,WAAW;AACb"}
@@ -41,32 +41,32 @@ var FacialExpression = /* @__PURE__ */ function(FacialExpression) {
41
41
  * @korean 표정이름
42
42
  */
43
43
  var FACIAL_EXPRESSION_NAMES = {
44
- [FacialExpression.NEUTRAL]: {
44
+ ["neutral"]: {
45
45
  korean: "평온",
46
46
  english: "Neutral",
47
47
  romanized: "pyeong-on"
48
48
  },
49
- [FacialExpression.FOCUSED]: {
49
+ ["focused"]: {
50
50
  korean: "집중",
51
51
  english: "Focused",
52
52
  romanized: "jipjung"
53
53
  },
54
- [FacialExpression.PAINED]: {
54
+ ["pained"]: {
55
55
  korean: "고통",
56
56
  english: "Pained",
57
57
  romanized: "gotong"
58
58
  },
59
- [FacialExpression.EXHAUSTED]: {
59
+ ["exhausted"]: {
60
60
  korean: "지침",
61
61
  english: "Exhausted",
62
62
  romanized: "jichim"
63
63
  },
64
- [FacialExpression.VICTORIOUS]: {
64
+ ["victorious"]: {
65
65
  korean: "승리",
66
66
  english: "Victorious",
67
67
  romanized: "seungri"
68
68
  },
69
- [FacialExpression.DEFEATED]: {
69
+ ["defeated"]: {
70
70
  korean: "패배",
71
71
  english: "Defeated",
72
72
  romanized: "paebae"
@@ -79,12 +79,12 @@ var FACIAL_EXPRESSION_NAMES = {
79
79
  * @korean 눈개방도
80
80
  */
81
81
  var EYE_OPENNESS = {
82
- [FacialExpression.NEUTRAL]: 1,
83
- [FacialExpression.FOCUSED]: .7,
84
- [FacialExpression.PAINED]: .3,
85
- [FacialExpression.EXHAUSTED]: .5,
86
- [FacialExpression.VICTORIOUS]: .9,
87
- [FacialExpression.DEFEATED]: 0
82
+ ["neutral"]: 1,
83
+ ["focused"]: .7,
84
+ ["pained"]: .3,
85
+ ["exhausted"]: .5,
86
+ ["victorious"]: .9,
87
+ ["defeated"]: 0
88
88
  };
89
89
  /**
90
90
  * Mouth openness values for expressions
@@ -93,12 +93,12 @@ var EYE_OPENNESS = {
93
93
  * @korean 입개방도
94
94
  */
95
95
  var MOUTH_OPENNESS = {
96
- [FacialExpression.NEUTRAL]: 0,
97
- [FacialExpression.FOCUSED]: 0,
98
- [FacialExpression.PAINED]: .8,
99
- [FacialExpression.EXHAUSTED]: .4,
100
- [FacialExpression.VICTORIOUS]: .2,
101
- [FacialExpression.DEFEATED]: .1
96
+ ["neutral"]: 0,
97
+ ["focused"]: 0,
98
+ ["pained"]: .8,
99
+ ["exhausted"]: .4,
100
+ ["victorious"]: .2,
101
+ ["defeated"]: .1
102
102
  };
103
103
  /**
104
104
  * Head movement animation type
@@ -147,7 +147,7 @@ var DEFAULT_FACIAL_DAMAGE = {
147
147
  * @korean 기본표정상태
148
148
  */
149
149
  var DEFAULT_EXPRESSION_STATE = {
150
- expression: FacialExpression.NEUTRAL,
150
+ expression: "neutral",
151
151
  intensity: 1,
152
152
  transitionTime: .2
153
153
  };
@@ -1 +1 @@
1
- {"version":3,"file":"facial.js","names":[],"sources":["../../src/types/facial.ts"],"sourcesContent":["/**\n * Facial animation types for realistic combat emotion and damage\n * \n * Defines facial expression system with damage tracking, eye tracking,\n * and smooth expression transitions for authentic human-like combat feedback.\n * \n * @module types/facial\n * @category Type Definitions\n * @korean 얼굴애니메이션타입\n */\n\nimport * as THREE from \"three\";\n\n/**\n * Facial expression states for combat\n * \n * Represents emotional and physical states visible on fighter's face.\n * Each expression corresponds to specific combat situations.\n * \n * @category Facial Animation\n * @korean 얼굴표정\n */\nexport enum FacialExpression {\n /** Calm, ready state */\n NEUTRAL = \"neutral\",\n /** Concentrated, ready to attack */\n FOCUSED = \"focused\",\n /** Pain response after hit */\n PAINED = \"pained\",\n /** Low stamina, heavy breathing */\n EXHAUSTED = \"exhausted\",\n /** Brief satisfaction after successful strike */\n VICTORIOUS = \"victorious\",\n /** Knocked out, unconscious */\n DEFEATED = \"defeated\",\n}\n\n/**\n * Bilingual names for facial expressions\n * \n * @category Facial Animation\n * @korean 표정이름\n */\nexport const FACIAL_EXPRESSION_NAMES: Record<\n FacialExpression,\n { korean: string; english: string; romanized: string }\n> = {\n [FacialExpression.NEUTRAL]: {\n korean: \"평온\",\n english: \"Neutral\",\n romanized: \"pyeong-on\",\n },\n [FacialExpression.FOCUSED]: {\n korean: \"집중\",\n english: \"Focused\",\n romanized: \"jipjung\",\n },\n [FacialExpression.PAINED]: {\n korean: \"고통\",\n english: \"Pained\",\n romanized: \"gotong\",\n },\n [FacialExpression.EXHAUSTED]: {\n korean: \"지침\",\n english: \"Exhausted\",\n romanized: \"jichim\",\n },\n [FacialExpression.VICTORIOUS]: {\n korean: \"승리\",\n english: \"Victorious\",\n romanized: \"seungri\",\n },\n [FacialExpression.DEFEATED]: {\n korean: \"패배\",\n english: \"Defeated\",\n romanized: \"paebae\",\n },\n};\n\n/**\n * Facial damage state tracking\n * \n * Tracks accumulated damage to face for visual feedback.\n * Includes bruising, swelling, and bleeding effects.\n * \n * @category Facial Animation\n * @korean 얼굴손상상태\n */\nexport interface FacialDamageState {\n /** Left eye swelling (0-1, 0=none, 1=fully swollen) */\n readonly leftEyeSwelling: number;\n /** Right eye swelling (0-1, 0=none, 1=fully swollen) */\n readonly rightEyeSwelling: number;\n /** Mouth/lip bleeding intensity (0-1) */\n readonly mouthBleeding: number;\n /** Nose bleeding intensity (0-1) */\n readonly noseBleeding: number;\n /** Bruise intensity on left cheek (0-1) */\n readonly leftCheekBruise: number;\n /** Bruise intensity on right cheek (0-1) */\n readonly rightCheekBruise: number;\n /** Forehead bruise/cut intensity (0-1) */\n readonly foreheadBruise: number;\n /** Jaw bruise intensity (0-1) */\n readonly jawBruise: number;\n /** Total facial damage accumulation (0-100) */\n readonly totalFacialDamage: number;\n}\n\n/**\n * Expression state with transition timing\n * \n * Manages current expression and smooth transition to next expression.\n * \n * @category Facial Animation\n * @korean 표정상태\n */\nexport interface ExpressionState {\n /** Current facial expression */\n readonly expression: FacialExpression;\n /** Expression intensity (0-1, affects degree of expression) */\n readonly intensity: number;\n /** Time to transition to new expression (seconds) */\n readonly transitionTime: number;\n /** Previous expression (for blending) */\n readonly previousExpression?: FacialExpression;\n /** Transition progress (0-1, 0=start, 1=complete) */\n readonly transitionProgress?: number;\n}\n\n/**\n * Eye openness values for expressions\n * \n * @category Facial Animation\n * @korean 눈개방도\n */\nexport const EYE_OPENNESS: Record<FacialExpression, number> = {\n [FacialExpression.NEUTRAL]: 1.0, // Fully open\n [FacialExpression.FOCUSED]: 0.7, // Narrowed\n [FacialExpression.PAINED]: 0.3, // Squinted\n [FacialExpression.EXHAUSTED]: 0.5, // Half-closed\n [FacialExpression.VICTORIOUS]: 0.9, // Nearly fully open\n [FacialExpression.DEFEATED]: 0.0, // Closed\n};\n\n/**\n * Mouth openness values for expressions\n * \n * @category Facial Animation\n * @korean 입개방도\n */\nexport const MOUTH_OPENNESS: Record<FacialExpression, number> = {\n [FacialExpression.NEUTRAL]: 0.0, // Closed\n [FacialExpression.FOCUSED]: 0.0, // Closed, determined\n [FacialExpression.PAINED]: 0.8, // Open, yelling\n [FacialExpression.EXHAUSTED]: 0.4, // Panting\n [FacialExpression.VICTORIOUS]: 0.2, // Slight smile\n [FacialExpression.DEFEATED]: 0.1, // Slack\n};\n\n/**\n * Head movement animation type\n * \n * Defines types of head movements for combat reactions.\n * \n * @category Facial Animation\n * @korean 머리움직임타입\n */\nexport enum HeadMovementType {\n /** Head snaps back when hit */\n RECOIL = \"recoil\",\n /** Slight nod forward during attack */\n NOD = \"nod\",\n /** Head tilts to avoid strike */\n TILT = \"tilt\",\n /** Head turns to track opponent */\n TURN = \"turn\",\n /** Head shakes when stunned */\n SHAKE = \"shake\",\n /** Head drops when defeated */\n DROP = \"drop\",\n}\n\n/**\n * Head movement animation keyframes\n * \n * Sequence of Euler rotations for head movement animations.\n * \n * @category Facial Animation\n * @korean 머리움직임키프레임\n */\nexport interface HeadMovementKeyframes {\n /** Movement type identifier */\n readonly type: HeadMovementType;\n /** Sequence of rotation keyframes */\n readonly rotations: readonly THREE.Euler[];\n /** Duration of each keyframe in seconds */\n readonly frameDuration: number;\n /** Total animation duration in seconds */\n readonly totalDuration: number;\n /** Whether animation loops */\n readonly loop: boolean;\n}\n\n/**\n * Eye tracking state\n * \n * Manages eye direction and pupil position for opponent tracking.\n * \n * @category Facial Animation\n * @korean 눈추적상태\n */\nexport interface EyeTrackingState {\n /** Target position to look at (opponent position) */\n readonly targetPosition: THREE.Vector3;\n /** Current look direction (normalized) */\n readonly lookDirection: THREE.Vector3;\n /** Pupil offset from center (-1 to 1 for each axis) */\n readonly pupilOffset: { x: number; y: number };\n /** Tracking speed (smoothing factor) */\n readonly trackingSpeed: number;\n /** Whether tracking is enabled */\n readonly enabled: boolean;\n}\n\n/**\n * Default facial damage state (no damage)\n * \n * @category Facial Animation\n * @korean 기본얼굴손상상태\n */\nexport const DEFAULT_FACIAL_DAMAGE: FacialDamageState = {\n leftEyeSwelling: 0,\n rightEyeSwelling: 0,\n mouthBleeding: 0,\n noseBleeding: 0,\n leftCheekBruise: 0,\n rightCheekBruise: 0,\n foreheadBruise: 0,\n jawBruise: 0,\n totalFacialDamage: 0,\n};\n\n/**\n * Default expression state (neutral)\n * \n * @category Facial Animation\n * @korean 기본표정상태\n */\nexport const DEFAULT_EXPRESSION_STATE: ExpressionState = {\n expression: FacialExpression.NEUTRAL,\n intensity: 1.0,\n transitionTime: 0.2,\n};\n\n/**\n * Default eye tracking state\n * \n * @category Facial Animation\n * @korean 기본눈추적상태\n */\nexport const DEFAULT_EYE_TRACKING: EyeTrackingState = {\n targetPosition: new THREE.Vector3(0, 1.9, 5), // Looking forward\n lookDirection: new THREE.Vector3(0, 0, 1), // Forward\n pupilOffset: { x: 0, y: 0 },\n trackingSpeed: 0.1,\n enabled: true,\n};\n\n/**\n * Face3D component props\n * \n * @category Facial Animation\n * @korean 얼굴3D속성\n */\nexport interface Face3DProps {\n /** Current facial expression */\n readonly expression: FacialExpression;\n /** Facial damage state */\n readonly damage: FacialDamageState;\n /** Opponent position for eye tracking */\n readonly opponentPosition: THREE.Vector3;\n /** Current head rotation (Euler angles) */\n readonly headRotation: THREE.Euler;\n /** Enable eye tracking (default: true) */\n readonly enableEyeTracking?: boolean;\n /** Enable damage visualization (default: true) */\n readonly enableDamageVisuals?: boolean;\n /** Mobile mode (simplified rendering) */\n readonly isMobile?: boolean;\n /** Skin tone color (default: 0xffdbac) */\n readonly skinColor?: number;\n}\n\n/**\n * Eye component props\n * \n * @category Facial Animation\n * @korean 눈3D속성\n */\nexport interface EyeProps {\n /** Eye position relative to head */\n readonly position: [number, number, number];\n /** Current facial expression */\n readonly expression: FacialExpression;\n /** Look direction for pupil tracking */\n readonly lookDirection: THREE.Vector3;\n /** Eye swelling amount (0-1) */\n readonly swelling: number;\n /** Whether this is the left or right eye */\n readonly side: \"left\" | \"right\";\n}\n\n/**\n * Mouth component props\n * \n * @category Facial Animation\n * @korean 입3D속성\n */\nexport interface MouthProps {\n /** Mouth position relative to head */\n readonly position: [number, number, number];\n /** Current facial expression */\n readonly expression: FacialExpression;\n /** Bleeding intensity (0-1) */\n readonly bleeding: number;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAsBA,IAAY,mBAAL,yBAAA,kBAAA;;CAEL,iBAAA,aAAU;;CAEV,iBAAA,aAAU;;CAEV,iBAAA,YAAS;;CAET,iBAAA,eAAY;;CAEZ,iBAAA,gBAAa;;CAEb,iBAAA,cAAW;;KACZ;;;;;;;AAQD,IAAa,0BAGT;EACD,iBAAiB,UAAU;EAC1B,QAAQ;EACR,SAAS;EACT,WAAW;EACZ;EACA,iBAAiB,UAAU;EAC1B,QAAQ;EACR,SAAS;EACT,WAAW;EACZ;EACA,iBAAiB,SAAS;EACzB,QAAQ;EACR,SAAS;EACT,WAAW;EACZ;EACA,iBAAiB,YAAY;EAC5B,QAAQ;EACR,SAAS;EACT,WAAW;EACZ;EACA,iBAAiB,aAAa;EAC7B,QAAQ;EACR,SAAS;EACT,WAAW;EACZ;EACA,iBAAiB,WAAW;EAC3B,QAAQ;EACR,SAAS;EACT,WAAW;EACZ;CACF;;;;;;;AA2DD,IAAa,eAAiD;EAC3D,iBAAiB,UAAU;EAC3B,iBAAiB,UAAU;EAC3B,iBAAiB,SAAS;EAC1B,iBAAiB,YAAY;EAC7B,iBAAiB,aAAa;EAC9B,iBAAiB,WAAW;CAC9B;;;;;;;AAQD,IAAa,iBAAmD;EAC7D,iBAAiB,UAAU;EAC3B,iBAAiB,UAAU;EAC3B,iBAAiB,SAAS;EAC1B,iBAAiB,YAAY;EAC7B,iBAAiB,aAAa;EAC9B,iBAAiB,WAAW;CAC9B;;;;;;;;;AAUD,IAAY,mBAAL,yBAAA,kBAAA;;CAEL,iBAAA,YAAS;;CAET,iBAAA,SAAM;;CAEN,iBAAA,UAAO;;CAEP,iBAAA,UAAO;;CAEP,iBAAA,WAAQ;;CAER,iBAAA,UAAO;;KACR;;;;;;;AAkDD,IAAa,wBAA2C;CACtD,iBAAiB;CACjB,kBAAkB;CAClB,eAAe;CACf,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,gBAAgB;CAChB,WAAW;CACX,mBAAmB;CACpB;;;;;;;AAQD,IAAa,2BAA4C;CACvD,YAAY,iBAAiB;CAC7B,WAAW;CACX,gBAAgB;CACjB;;;;;;;AAQD,IAAa,uBAAyC;CACpD,gBAAgB,IAAI,MAAM,QAAQ,GAAG,KAAK,EAAE;CAC5C,eAAe,IAAI,MAAM,QAAQ,GAAG,GAAG,EAAE;CACzC,aAAa;EAAE,GAAG;EAAG,GAAG;EAAG;CAC3B,eAAe;CACf,SAAS;CACV"}
1
+ {"version":3,"file":"facial.js","names":[],"sources":["../../src/types/facial.ts"],"sourcesContent":["/**\n * Facial animation types for realistic combat emotion and damage\n * \n * Defines facial expression system with damage tracking, eye tracking,\n * and smooth expression transitions for authentic human-like combat feedback.\n * \n * @module types/facial\n * @category Type Definitions\n * @korean 얼굴애니메이션타입\n */\n\nimport * as THREE from \"three\";\n\n/**\n * Facial expression states for combat\n * \n * Represents emotional and physical states visible on fighter's face.\n * Each expression corresponds to specific combat situations.\n * \n * @category Facial Animation\n * @korean 얼굴표정\n */\nexport enum FacialExpression {\n /** Calm, ready state */\n NEUTRAL = \"neutral\",\n /** Concentrated, ready to attack */\n FOCUSED = \"focused\",\n /** Pain response after hit */\n PAINED = \"pained\",\n /** Low stamina, heavy breathing */\n EXHAUSTED = \"exhausted\",\n /** Brief satisfaction after successful strike */\n VICTORIOUS = \"victorious\",\n /** Knocked out, unconscious */\n DEFEATED = \"defeated\",\n}\n\n/**\n * Bilingual names for facial expressions\n * \n * @category Facial Animation\n * @korean 표정이름\n */\nexport const FACIAL_EXPRESSION_NAMES: Record<\n FacialExpression,\n { korean: string; english: string; romanized: string }\n> = {\n [FacialExpression.NEUTRAL]: {\n korean: \"평온\",\n english: \"Neutral\",\n romanized: \"pyeong-on\",\n },\n [FacialExpression.FOCUSED]: {\n korean: \"집중\",\n english: \"Focused\",\n romanized: \"jipjung\",\n },\n [FacialExpression.PAINED]: {\n korean: \"고통\",\n english: \"Pained\",\n romanized: \"gotong\",\n },\n [FacialExpression.EXHAUSTED]: {\n korean: \"지침\",\n english: \"Exhausted\",\n romanized: \"jichim\",\n },\n [FacialExpression.VICTORIOUS]: {\n korean: \"승리\",\n english: \"Victorious\",\n romanized: \"seungri\",\n },\n [FacialExpression.DEFEATED]: {\n korean: \"패배\",\n english: \"Defeated\",\n romanized: \"paebae\",\n },\n};\n\n/**\n * Facial damage state tracking\n * \n * Tracks accumulated damage to face for visual feedback.\n * Includes bruising, swelling, and bleeding effects.\n * \n * @category Facial Animation\n * @korean 얼굴손상상태\n */\nexport interface FacialDamageState {\n /** Left eye swelling (0-1, 0=none, 1=fully swollen) */\n readonly leftEyeSwelling: number;\n /** Right eye swelling (0-1, 0=none, 1=fully swollen) */\n readonly rightEyeSwelling: number;\n /** Mouth/lip bleeding intensity (0-1) */\n readonly mouthBleeding: number;\n /** Nose bleeding intensity (0-1) */\n readonly noseBleeding: number;\n /** Bruise intensity on left cheek (0-1) */\n readonly leftCheekBruise: number;\n /** Bruise intensity on right cheek (0-1) */\n readonly rightCheekBruise: number;\n /** Forehead bruise/cut intensity (0-1) */\n readonly foreheadBruise: number;\n /** Jaw bruise intensity (0-1) */\n readonly jawBruise: number;\n /** Total facial damage accumulation (0-100) */\n readonly totalFacialDamage: number;\n}\n\n/**\n * Expression state with transition timing\n * \n * Manages current expression and smooth transition to next expression.\n * \n * @category Facial Animation\n * @korean 표정상태\n */\nexport interface ExpressionState {\n /** Current facial expression */\n readonly expression: FacialExpression;\n /** Expression intensity (0-1, affects degree of expression) */\n readonly intensity: number;\n /** Time to transition to new expression (seconds) */\n readonly transitionTime: number;\n /** Previous expression (for blending) */\n readonly previousExpression?: FacialExpression;\n /** Transition progress (0-1, 0=start, 1=complete) */\n readonly transitionProgress?: number;\n}\n\n/**\n * Eye openness values for expressions\n * \n * @category Facial Animation\n * @korean 눈개방도\n */\nexport const EYE_OPENNESS: Record<FacialExpression, number> = {\n [FacialExpression.NEUTRAL]: 1.0, // Fully open\n [FacialExpression.FOCUSED]: 0.7, // Narrowed\n [FacialExpression.PAINED]: 0.3, // Squinted\n [FacialExpression.EXHAUSTED]: 0.5, // Half-closed\n [FacialExpression.VICTORIOUS]: 0.9, // Nearly fully open\n [FacialExpression.DEFEATED]: 0.0, // Closed\n};\n\n/**\n * Mouth openness values for expressions\n * \n * @category Facial Animation\n * @korean 입개방도\n */\nexport const MOUTH_OPENNESS: Record<FacialExpression, number> = {\n [FacialExpression.NEUTRAL]: 0.0, // Closed\n [FacialExpression.FOCUSED]: 0.0, // Closed, determined\n [FacialExpression.PAINED]: 0.8, // Open, yelling\n [FacialExpression.EXHAUSTED]: 0.4, // Panting\n [FacialExpression.VICTORIOUS]: 0.2, // Slight smile\n [FacialExpression.DEFEATED]: 0.1, // Slack\n};\n\n/**\n * Head movement animation type\n * \n * Defines types of head movements for combat reactions.\n * \n * @category Facial Animation\n * @korean 머리움직임타입\n */\nexport enum HeadMovementType {\n /** Head snaps back when hit */\n RECOIL = \"recoil\",\n /** Slight nod forward during attack */\n NOD = \"nod\",\n /** Head tilts to avoid strike */\n TILT = \"tilt\",\n /** Head turns to track opponent */\n TURN = \"turn\",\n /** Head shakes when stunned */\n SHAKE = \"shake\",\n /** Head drops when defeated */\n DROP = \"drop\",\n}\n\n/**\n * Head movement animation keyframes\n * \n * Sequence of Euler rotations for head movement animations.\n * \n * @category Facial Animation\n * @korean 머리움직임키프레임\n */\nexport interface HeadMovementKeyframes {\n /** Movement type identifier */\n readonly type: HeadMovementType;\n /** Sequence of rotation keyframes */\n readonly rotations: readonly THREE.Euler[];\n /** Duration of each keyframe in seconds */\n readonly frameDuration: number;\n /** Total animation duration in seconds */\n readonly totalDuration: number;\n /** Whether animation loops */\n readonly loop: boolean;\n}\n\n/**\n * Eye tracking state\n * \n * Manages eye direction and pupil position for opponent tracking.\n * \n * @category Facial Animation\n * @korean 눈추적상태\n */\nexport interface EyeTrackingState {\n /** Target position to look at (opponent position) */\n readonly targetPosition: THREE.Vector3;\n /** Current look direction (normalized) */\n readonly lookDirection: THREE.Vector3;\n /** Pupil offset from center (-1 to 1 for each axis) */\n readonly pupilOffset: { x: number; y: number };\n /** Tracking speed (smoothing factor) */\n readonly trackingSpeed: number;\n /** Whether tracking is enabled */\n readonly enabled: boolean;\n}\n\n/**\n * Default facial damage state (no damage)\n * \n * @category Facial Animation\n * @korean 기본얼굴손상상태\n */\nexport const DEFAULT_FACIAL_DAMAGE: FacialDamageState = {\n leftEyeSwelling: 0,\n rightEyeSwelling: 0,\n mouthBleeding: 0,\n noseBleeding: 0,\n leftCheekBruise: 0,\n rightCheekBruise: 0,\n foreheadBruise: 0,\n jawBruise: 0,\n totalFacialDamage: 0,\n};\n\n/**\n * Default expression state (neutral)\n * \n * @category Facial Animation\n * @korean 기본표정상태\n */\nexport const DEFAULT_EXPRESSION_STATE: ExpressionState = {\n expression: FacialExpression.NEUTRAL,\n intensity: 1.0,\n transitionTime: 0.2,\n};\n\n/**\n * Default eye tracking state\n * \n * @category Facial Animation\n * @korean 기본눈추적상태\n */\nexport const DEFAULT_EYE_TRACKING: EyeTrackingState = {\n targetPosition: new THREE.Vector3(0, 1.9, 5), // Looking forward\n lookDirection: new THREE.Vector3(0, 0, 1), // Forward\n pupilOffset: { x: 0, y: 0 },\n trackingSpeed: 0.1,\n enabled: true,\n};\n\n/**\n * Face3D component props\n * \n * @category Facial Animation\n * @korean 얼굴3D속성\n */\nexport interface Face3DProps {\n /** Current facial expression */\n readonly expression: FacialExpression;\n /** Facial damage state */\n readonly damage: FacialDamageState;\n /** Opponent position for eye tracking */\n readonly opponentPosition: THREE.Vector3;\n /** Current head rotation (Euler angles) */\n readonly headRotation: THREE.Euler;\n /** Enable eye tracking (default: true) */\n readonly enableEyeTracking?: boolean;\n /** Enable damage visualization (default: true) */\n readonly enableDamageVisuals?: boolean;\n /** Mobile mode (simplified rendering) */\n readonly isMobile?: boolean;\n /** Skin tone color (default: 0xffdbac) */\n readonly skinColor?: number;\n}\n\n/**\n * Eye component props\n * \n * @category Facial Animation\n * @korean 눈3D속성\n */\nexport interface EyeProps {\n /** Eye position relative to head */\n readonly position: [number, number, number];\n /** Current facial expression */\n readonly expression: FacialExpression;\n /** Look direction for pupil tracking */\n readonly lookDirection: THREE.Vector3;\n /** Eye swelling amount (0-1) */\n readonly swelling: number;\n /** Whether this is the left or right eye */\n readonly side: \"left\" | \"right\";\n}\n\n/**\n * Mouth component props\n * \n * @category Facial Animation\n * @korean 입3D속성\n */\nexport interface MouthProps {\n /** Mouth position relative to head */\n readonly position: [number, number, number];\n /** Current facial expression */\n readonly expression: FacialExpression;\n /** Bleeding intensity (0-1) */\n readonly bleeding: number;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAsBA,IAAY,mBAAL,yBAAA,kBAAA;;CAEL,iBAAA,aAAA;;CAEA,iBAAA,aAAA;;CAEA,iBAAA,YAAA;;CAEA,iBAAA,eAAA;;CAEA,iBAAA,gBAAA;;CAEA,iBAAA,cAAA;;AACF,EAAA,CAAA,CAAA;;;;;;;AAQA,IAAa,0BAGT;cAC0B;EAC1B,QAAQ;EACR,SAAS;EACT,WAAW;CACb;cAC4B;EAC1B,QAAQ;EACR,SAAS;EACT,WAAW;CACb;aAC2B;EACzB,QAAQ;EACR,SAAS;EACT,WAAW;CACb;gBAC8B;EAC5B,QAAQ;EACR,SAAS;EACT,WAAW;CACb;iBAC+B;EAC7B,QAAQ;EACR,SAAS;EACT,WAAW;CACb;eAC6B;EAC3B,QAAQ;EACR,SAAS;EACT,WAAW;CACb;AACF;;;;;;;AA2DA,IAAa,eAAiD;cAChC;cACA;aACD;gBACG;iBACC;eACF;AAC/B;;;;;;;AAQA,IAAa,iBAAmD;cAClC;cACA;aACD;gBACG;iBACC;eACF;AAC/B;;;;;;;;;AAUA,IAAY,mBAAL,yBAAA,kBAAA;;CAEL,iBAAA,YAAA;;CAEA,iBAAA,SAAA;;CAEA,iBAAA,UAAA;;CAEA,iBAAA,UAAA;;CAEA,iBAAA,WAAA;;CAEA,iBAAA,UAAA;;AACF,EAAA,CAAA,CAAA;;;;;;;AAkDA,IAAa,wBAA2C;CACtD,iBAAiB;CACjB,kBAAkB;CAClB,eAAe;CACf,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,gBAAgB;CAChB,WAAW;CACX,mBAAmB;AACrB;;;;;;;AAQA,IAAa,2BAA4C;CACvD,YAAA;CACA,WAAW;CACX,gBAAgB;AAClB;;;;;;;AAQA,IAAa,uBAAyC;CACpD,gBAAgB,IAAI,MAAM,QAAQ,GAAG,KAAK,CAAC;CAC3C,eAAe,IAAI,MAAM,QAAQ,GAAG,GAAG,CAAC;CACxC,aAAa;EAAE,GAAG;EAAG,GAAG;CAAE;CAC1B,eAAe;CACf,SAAS;AACX"}
@@ -1 +1 @@
1
- {"version":3,"file":"hand-animation.js","names":[],"sources":["../../src/types/hand-animation.ts"],"sourcesContent":["/**\n * Hand animation types for Korean martial arts techniques\n *\n * Defines hand poses, finger positions, and animation states for realistic\n * martial arts hand techniques including strikes, grappling, and precise\n * vital point targeting.\n *\n * @module types/hand-animation\n * @category Type Definitions\n * @korean 손애니메이션타입\n */\n\nimport * as THREE from \"three\";\n\n/**\n * Martial arts hand pose types\n *\n * Traditional Korean martial arts hand formations:\n * - FIST (주먹): Closed fist for punching\n * - KNIFE_HAND (수도): Extended fingers, rigid hand edge for strikes\n * - SPEAR_HAND (관수): Extended fingers together, pointed thrust\n * - PALM_HEEL (장력): Palm-heel strike position with curled fingers\n * - GRAPPLING (잡기): Fingers curved for grabs and control\n * - OPEN (펴기): Neutral open hand position\n *\n * @korean 손자세타입\n */\nexport enum HandPoseType {\n /** 주먹 - Closed fist for punching */\n FIST = \"fist\",\n /** 수도 - Knife-hand strike with rigid edge */\n KNIFE_HAND = \"knife_hand\",\n /** 관수 - Spear-hand thrust with pointed fingers */\n SPEAR_HAND = \"spear_hand\",\n /** 장력 - Palm-heel strike with curled fingers */\n PALM_HEEL = \"palm_heel\",\n /** 잡기 - Grappling hand for grabs */\n GRAPPLING = \"grappling\",\n /** 펴기 - Open hand neutral position */\n OPEN = \"open\",\n /** 휴식 - Relaxed natural hand position for walking/idle */\n RELAXED = \"relaxed\",\n}\n\n/**\n * Finger identification\n *\n * @korean 손가락\n */\nexport enum FingerType {\n /** 엄지 - Thumb */\n THUMB = \"thumb\",\n /** 검지 - Index finger */\n INDEX = \"index\",\n /** 중지 - Middle finger */\n MIDDLE = \"middle\",\n /** 약지 - Ring finger */\n RING = \"ring\",\n /** 새끼 - Pinky finger */\n PINKY = \"pinky\",\n}\n\n/**\n * Finger curl amount (0 = fully extended, 1 = fully curled)\n *\n * Normalized values for finger joint angles:\n * - 0.0: Fully extended (straight)\n * - 0.5: Half curled (slightly bent)\n * - 1.0: Fully curled (tight fist)\n *\n * @korean 손가락구부림량\n */\nexport interface FingerCurl {\n /** Thumb curl amount (0-1) */\n readonly thumb: number;\n /** Index finger curl amount (0-1) */\n readonly index: number;\n /** Middle finger curl amount (0-1) */\n readonly middle: number;\n /** Ring finger curl amount (0-1) */\n readonly ring: number;\n /** Pinky finger curl amount (0-1) */\n readonly pinky: number;\n}\n\n/**\n * Finger spread amount (0 = together, 1 = spread apart)\n *\n * Controls the lateral spacing between fingers.\n *\n * @korean 손가락벌림량\n */\nexport interface FingerSpread {\n /** Spread between thumb and index (0-1) */\n readonly thumbIndex: number;\n /** Spread between index and middle (0-1) */\n readonly indexMiddle: number;\n /** Spread between middle and ring (0-1) */\n readonly middleRing: number;\n /** Spread between ring and pinky (0-1) */\n readonly ringPinky: number;\n}\n\n/**\n * Hand pose definition for martial arts techniques\n *\n * Complete hand configuration including finger positions and wrist rotation\n * for authentic Korean martial arts hand techniques.\n *\n * @korean 손자세정의\n */\nexport interface HandPose {\n /** Pose identifier @korean 자세ID */\n readonly type: HandPoseType;\n /** Korean name for the pose @korean 한글이름 */\n readonly nameKorean: string;\n /** English name for the pose @korean 영어이름 */\n readonly nameEnglish: string;\n /** Romanized Korean name @korean 로마자이름 */\n readonly romanized: string;\n /** Finger curl amounts (0-1 per finger) @korean 손가락구부림 */\n readonly fingerCurl: FingerCurl;\n /** Finger spread amounts (0-1 between fingers) @korean 손가락벌림 */\n readonly fingerSpread: FingerSpread;\n /** Wrist rotation for the technique @korean 손목회전 */\n readonly wristRotation: THREE.Euler;\n /** Description of the technique @korean 설명 */\n readonly description: {\n readonly korean: string;\n readonly english: string;\n };\n /** Which martial art this pose comes from @korean 무술출처 */\n readonly martialArtOrigin:\n | \"taekwondo\"\n | \"hapkido\"\n | \"taekyon\"\n | \"traditional\";\n /** Primary striking surface @korean 타격면 */\n readonly strikingSurface:\n | \"knuckles\"\n | \"palm_heel\"\n | \"knife_edge\"\n | \"fingertips\"\n | \"whole_hand\";\n}\n\n/**\n * Hand animation state\n *\n * Current state of hand animation including pose transition progress.\n *\n * @korean 손애니메이션상태\n */\nexport interface HandAnimationState {\n /** Current hand pose @korean 현재자세 */\n readonly currentPose: HandPoseType;\n /** Target hand pose (during transition) @korean 목표자세 */\n readonly targetPose: HandPoseType | null;\n /** Transition progress (0-1) @korean 전환진행률 */\n readonly transitionProgress: number;\n /** Current finger curl values (interpolated) @korean 현재손가락구부림 */\n readonly currentFingerCurl: FingerCurl;\n /** Current finger spread values (interpolated) @korean 현재손가락벌림 */\n readonly currentFingerSpread: FingerSpread;\n /** Current wrist rotation (interpolated) @korean 현재손목회전 */\n readonly currentWristRotation: THREE.Euler;\n /** Whether hand is highlighted for vital point targeting @korean 급소표시여부 */\n readonly isHighlighted: boolean;\n /** Highlight mode for different striking surfaces @korean 표시모드 */\n readonly highlightMode:\n | \"none\"\n | \"knuckles\"\n | \"palm\"\n | \"knife_edge\"\n | \"fingertips\"\n | null;\n}\n\n/**\n * Hand side identification\n *\n * @korean 손쪽\n */\nexport type HandSide = \"left\" | \"right\";\n\n/**\n * Hand pose configuration for attack techniques\n *\n * Maps attack technique names to appropriate hand poses.\n *\n * @korean 공격기술손자세\n */\nexport interface TechniqueHandPose {\n /** Technique name (e.g., \"jab\", \"cross\", \"knife_hand_strike\") @korean 기술이름 */\n readonly techniqueName: string;\n /** Hand pose for left hand @korean 왼손자세 */\n readonly leftHandPose: HandPoseType;\n /** Hand pose for right hand @korean 오른손자세 */\n readonly rightHandPose: HandPoseType;\n /** Transition duration in seconds @korean 전환시간 */\n readonly transitionDuration: number;\n}\n\n/**\n * Hand level of detail (LOD) settings\n *\n * Performance optimization by adjusting hand detail based on camera distance.\n *\n * @korean 손상세도설정\n */\nexport interface HandLODConfig {\n /**\n * Detail level\n * - high: Full finger geometry (4 bones per finger)\n * - medium: Simplified fingers (3 bones per finger)\n * - low: No finger detail (hand as single unit)\n * @korean 상세도\n */\n readonly detailLevel: \"high\" | \"medium\" | \"low\";\n /**\n * Distance thresholds for LOD switching\n * @korean 거리기준\n */\n readonly distanceThresholds: {\n readonly high: number; // Camera distance for high detail (< 5 units)\n readonly medium: number; // Camera distance for medium detail (< 15 units)\n readonly low: number; // Camera distance for low detail (>= 15 units)\n };\n /** Whether to render individual fingers @korean 손가락렌더링여부 */\n readonly renderFingers: boolean;\n /** Number of segments per finger @korean 손가락세그먼트수 */\n readonly fingerSegments: number;\n}\n\n/**\n * Finger bone segments\n *\n * Anatomically correct finger bone structure:\n * - Metacarpal: Knuckle base (hand to finger connection)\n * - Proximal: First joint (knuckle joint)\n * - Intermediate: Middle joint\n * - Distal: Fingertip\n *\n * Note: Thumb has no intermediate phalanx (2 bones instead of 3)\n *\n * @korean 손가락뼈세그먼트\n */\nexport interface FingerSegments {\n /** Metacarpal bone (knuckle base) @korean 중수골 */\n readonly metacarpal: THREE.Vector3;\n /** Proximal phalanx (first joint) @korean 근위지골 */\n readonly proximal: THREE.Vector3;\n /**\n * Intermediate phalanx (middle joint)\n * Note: Thumb does not have this bone\n * @korean 중위지골\n */\n readonly intermediate: THREE.Vector3 | null;\n /** Distal phalanx (fingertip) @korean 원위지골 */\n readonly distal: THREE.Vector3;\n}\n\n/**\n * Complete hand structure with all finger bones\n *\n * @korean 손뼈구조\n */\nexport interface HandStructure {\n /** Palm base position @korean 손바닥위치 */\n readonly palm: THREE.Vector3;\n /** Wrist position @korean 손목위치 */\n readonly wrist: THREE.Vector3;\n /** Thumb segments (2 bones: no intermediate) @korean 엄지뼈 */\n readonly thumb: FingerSegments;\n /** Index finger segments (3 bones) @korean 검지뼈 */\n readonly index: FingerSegments;\n /** Middle finger segments (3 bones) @korean 중지뼈 */\n readonly middle: FingerSegments;\n /** Ring finger segments (3 bones) @korean 약지뼈 */\n readonly ring: FingerSegments;\n /** Pinky finger segments (3 bones) @korean 새끼뼈 */\n readonly pinky: FingerSegments;\n}\n"],"mappings":";;;;;;;;;;;;;;AA2BA,IAAY,eAAL,yBAAA,cAAA;;CAEL,aAAA,UAAO;;CAEP,aAAA,gBAAa;;CAEb,aAAA,gBAAa;;CAEb,aAAA,eAAY;;CAEZ,aAAA,eAAY;;CAEZ,aAAA,UAAO;;CAEP,aAAA,aAAU;;KACX;;;;;;AAOD,IAAY,aAAL,yBAAA,YAAA;;CAEL,WAAA,WAAQ;;CAER,WAAA,WAAQ;;CAER,WAAA,YAAS;;CAET,WAAA,UAAO;;CAEP,WAAA,WAAQ;;KACT"}
1
+ {"version":3,"file":"hand-animation.js","names":[],"sources":["../../src/types/hand-animation.ts"],"sourcesContent":["/**\n * Hand animation types for Korean martial arts techniques\n *\n * Defines hand poses, finger positions, and animation states for realistic\n * martial arts hand techniques including strikes, grappling, and precise\n * vital point targeting.\n *\n * @module types/hand-animation\n * @category Type Definitions\n * @korean 손애니메이션타입\n */\n\nimport * as THREE from \"three\";\n\n/**\n * Martial arts hand pose types\n *\n * Traditional Korean martial arts hand formations:\n * - FIST (주먹): Closed fist for punching\n * - KNIFE_HAND (수도): Extended fingers, rigid hand edge for strikes\n * - SPEAR_HAND (관수): Extended fingers together, pointed thrust\n * - PALM_HEEL (장력): Palm-heel strike position with curled fingers\n * - GRAPPLING (잡기): Fingers curved for grabs and control\n * - OPEN (펴기): Neutral open hand position\n *\n * @korean 손자세타입\n */\nexport enum HandPoseType {\n /** 주먹 - Closed fist for punching */\n FIST = \"fist\",\n /** 수도 - Knife-hand strike with rigid edge */\n KNIFE_HAND = \"knife_hand\",\n /** 관수 - Spear-hand thrust with pointed fingers */\n SPEAR_HAND = \"spear_hand\",\n /** 장력 - Palm-heel strike with curled fingers */\n PALM_HEEL = \"palm_heel\",\n /** 잡기 - Grappling hand for grabs */\n GRAPPLING = \"grappling\",\n /** 펴기 - Open hand neutral position */\n OPEN = \"open\",\n /** 휴식 - Relaxed natural hand position for walking/idle */\n RELAXED = \"relaxed\",\n}\n\n/**\n * Finger identification\n *\n * @korean 손가락\n */\nexport enum FingerType {\n /** 엄지 - Thumb */\n THUMB = \"thumb\",\n /** 검지 - Index finger */\n INDEX = \"index\",\n /** 중지 - Middle finger */\n MIDDLE = \"middle\",\n /** 약지 - Ring finger */\n RING = \"ring\",\n /** 새끼 - Pinky finger */\n PINKY = \"pinky\",\n}\n\n/**\n * Finger curl amount (0 = fully extended, 1 = fully curled)\n *\n * Normalized values for finger joint angles:\n * - 0.0: Fully extended (straight)\n * - 0.5: Half curled (slightly bent)\n * - 1.0: Fully curled (tight fist)\n *\n * @korean 손가락구부림량\n */\nexport interface FingerCurl {\n /** Thumb curl amount (0-1) */\n readonly thumb: number;\n /** Index finger curl amount (0-1) */\n readonly index: number;\n /** Middle finger curl amount (0-1) */\n readonly middle: number;\n /** Ring finger curl amount (0-1) */\n readonly ring: number;\n /** Pinky finger curl amount (0-1) */\n readonly pinky: number;\n}\n\n/**\n * Finger spread amount (0 = together, 1 = spread apart)\n *\n * Controls the lateral spacing between fingers.\n *\n * @korean 손가락벌림량\n */\nexport interface FingerSpread {\n /** Spread between thumb and index (0-1) */\n readonly thumbIndex: number;\n /** Spread between index and middle (0-1) */\n readonly indexMiddle: number;\n /** Spread between middle and ring (0-1) */\n readonly middleRing: number;\n /** Spread between ring and pinky (0-1) */\n readonly ringPinky: number;\n}\n\n/**\n * Hand pose definition for martial arts techniques\n *\n * Complete hand configuration including finger positions and wrist rotation\n * for authentic Korean martial arts hand techniques.\n *\n * @korean 손자세정의\n */\nexport interface HandPose {\n /** Pose identifier @korean 자세ID */\n readonly type: HandPoseType;\n /** Korean name for the pose @korean 한글이름 */\n readonly nameKorean: string;\n /** English name for the pose @korean 영어이름 */\n readonly nameEnglish: string;\n /** Romanized Korean name @korean 로마자이름 */\n readonly romanized: string;\n /** Finger curl amounts (0-1 per finger) @korean 손가락구부림 */\n readonly fingerCurl: FingerCurl;\n /** Finger spread amounts (0-1 between fingers) @korean 손가락벌림 */\n readonly fingerSpread: FingerSpread;\n /** Wrist rotation for the technique @korean 손목회전 */\n readonly wristRotation: THREE.Euler;\n /** Description of the technique @korean 설명 */\n readonly description: {\n readonly korean: string;\n readonly english: string;\n };\n /** Which martial art this pose comes from @korean 무술출처 */\n readonly martialArtOrigin:\n | \"taekwondo\"\n | \"hapkido\"\n | \"taekyon\"\n | \"traditional\";\n /** Primary striking surface @korean 타격면 */\n readonly strikingSurface:\n | \"knuckles\"\n | \"palm_heel\"\n | \"knife_edge\"\n | \"fingertips\"\n | \"whole_hand\";\n}\n\n/**\n * Hand animation state\n *\n * Current state of hand animation including pose transition progress.\n *\n * @korean 손애니메이션상태\n */\nexport interface HandAnimationState {\n /** Current hand pose @korean 현재자세 */\n readonly currentPose: HandPoseType;\n /** Target hand pose (during transition) @korean 목표자세 */\n readonly targetPose: HandPoseType | null;\n /** Transition progress (0-1) @korean 전환진행률 */\n readonly transitionProgress: number;\n /** Current finger curl values (interpolated) @korean 현재손가락구부림 */\n readonly currentFingerCurl: FingerCurl;\n /** Current finger spread values (interpolated) @korean 현재손가락벌림 */\n readonly currentFingerSpread: FingerSpread;\n /** Current wrist rotation (interpolated) @korean 현재손목회전 */\n readonly currentWristRotation: THREE.Euler;\n /** Whether hand is highlighted for vital point targeting @korean 급소표시여부 */\n readonly isHighlighted: boolean;\n /** Highlight mode for different striking surfaces @korean 표시모드 */\n readonly highlightMode:\n | \"none\"\n | \"knuckles\"\n | \"palm\"\n | \"knife_edge\"\n | \"fingertips\"\n | null;\n}\n\n/**\n * Hand side identification\n *\n * @korean 손쪽\n */\nexport type HandSide = \"left\" | \"right\";\n\n/**\n * Hand pose configuration for attack techniques\n *\n * Maps attack technique names to appropriate hand poses.\n *\n * @korean 공격기술손자세\n */\nexport interface TechniqueHandPose {\n /** Technique name (e.g., \"jab\", \"cross\", \"knife_hand_strike\") @korean 기술이름 */\n readonly techniqueName: string;\n /** Hand pose for left hand @korean 왼손자세 */\n readonly leftHandPose: HandPoseType;\n /** Hand pose for right hand @korean 오른손자세 */\n readonly rightHandPose: HandPoseType;\n /** Transition duration in seconds @korean 전환시간 */\n readonly transitionDuration: number;\n}\n\n/**\n * Hand level of detail (LOD) settings\n *\n * Performance optimization by adjusting hand detail based on camera distance.\n *\n * @korean 손상세도설정\n */\nexport interface HandLODConfig {\n /**\n * Detail level\n * - high: Full finger geometry (4 bones per finger)\n * - medium: Simplified fingers (3 bones per finger)\n * - low: No finger detail (hand as single unit)\n * @korean 상세도\n */\n readonly detailLevel: \"high\" | \"medium\" | \"low\";\n /**\n * Distance thresholds for LOD switching\n * @korean 거리기준\n */\n readonly distanceThresholds: {\n readonly high: number; // Camera distance for high detail (< 5 units)\n readonly medium: number; // Camera distance for medium detail (< 15 units)\n readonly low: number; // Camera distance for low detail (>= 15 units)\n };\n /** Whether to render individual fingers @korean 손가락렌더링여부 */\n readonly renderFingers: boolean;\n /** Number of segments per finger @korean 손가락세그먼트수 */\n readonly fingerSegments: number;\n}\n\n/**\n * Finger bone segments\n *\n * Anatomically correct finger bone structure:\n * - Metacarpal: Knuckle base (hand to finger connection)\n * - Proximal: First joint (knuckle joint)\n * - Intermediate: Middle joint\n * - Distal: Fingertip\n *\n * Note: Thumb has no intermediate phalanx (2 bones instead of 3)\n *\n * @korean 손가락뼈세그먼트\n */\nexport interface FingerSegments {\n /** Metacarpal bone (knuckle base) @korean 중수골 */\n readonly metacarpal: THREE.Vector3;\n /** Proximal phalanx (first joint) @korean 근위지골 */\n readonly proximal: THREE.Vector3;\n /**\n * Intermediate phalanx (middle joint)\n * Note: Thumb does not have this bone\n * @korean 중위지골\n */\n readonly intermediate: THREE.Vector3 | null;\n /** Distal phalanx (fingertip) @korean 원위지골 */\n readonly distal: THREE.Vector3;\n}\n\n/**\n * Complete hand structure with all finger bones\n *\n * @korean 손뼈구조\n */\nexport interface HandStructure {\n /** Palm base position @korean 손바닥위치 */\n readonly palm: THREE.Vector3;\n /** Wrist position @korean 손목위치 */\n readonly wrist: THREE.Vector3;\n /** Thumb segments (2 bones: no intermediate) @korean 엄지뼈 */\n readonly thumb: FingerSegments;\n /** Index finger segments (3 bones) @korean 검지뼈 */\n readonly index: FingerSegments;\n /** Middle finger segments (3 bones) @korean 중지뼈 */\n readonly middle: FingerSegments;\n /** Ring finger segments (3 bones) @korean 약지뼈 */\n readonly ring: FingerSegments;\n /** Pinky finger segments (3 bones) @korean 새끼뼈 */\n readonly pinky: FingerSegments;\n}\n"],"mappings":";;;;;;;;;;;;;;AA2BA,IAAY,eAAL,yBAAA,cAAA;;CAEL,aAAA,UAAA;;CAEA,aAAA,gBAAA;;CAEA,aAAA,gBAAA;;CAEA,aAAA,eAAA;;CAEA,aAAA,eAAA;;CAEA,aAAA,UAAA;;CAEA,aAAA,aAAA;;AACF,EAAA,CAAA,CAAA;;;;;;AAOA,IAAY,aAAL,yBAAA,YAAA;;CAEL,WAAA,WAAA;;CAEA,WAAA,WAAA;;CAEA,WAAA,YAAA;;CAEA,WAAA,UAAA;;CAEA,WAAA,WAAA;;AACF,EAAA,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"injury.js","names":[],"sources":["../../src/types/injury.ts"],"sourcesContent":["/**\n * Shared Injury Types\n * \n * **Korean**: 공유 부상 타입\n * \n * Common injury types and data structures used across the trauma visualization\n * system. Separated from React components to avoid coupling system logic to UI.\n * \n * @module types/injury\n * @category Types\n * @korean 부상타입\n */\n\nimport { BodyRegion } from \"./common\";\n\n/**\n * Injury type classification\n * \n * **Korean**: 부상 유형 분류\n * \n */\nexport enum InjuryType {\n /** Blunt force trauma */\n BRUISE = \"bruise\",\n /** Sharp weapon/strike */\n CUT = \"cut\",\n /** Deep cut with blood trail */\n LACERATION = \"laceration\",\n /** Bone damage indicator */\n FRACTURE = \"fracture\",\n}\n\n/**\n * Individual injury data for visualization\n * \n * **Korean**: 시각화를 위한 개별 부상 데이터\n * \n * Used by both the injury tracking system and trauma visualization components.\n * \n */\nexport interface Injury {\n /** Unique identifier */\n readonly id: string;\n /** Body region affected */\n readonly region: BodyRegion;\n /** Type of injury */\n readonly type: InjuryType;\n /** Position on body [x, y, z] relative to character center */\n readonly position: [number, number, number];\n /** Severity (0.0 to 1.0) */\n readonly severity: number;\n /** Number of hits to same location (for progressive bruising) */\n readonly hitCount: number;\n /** Timestamp when injury was created */\n readonly timestamp: number;\n /** Optional player ID for multi-player scenarios */\n readonly playerId?: string | number;\n}\n"],"mappings":";;;;;;;AAqBA,IAAY,aAAL,yBAAA,YAAA;;CAEL,WAAA,YAAS;;CAET,WAAA,SAAM;;CAEN,WAAA,gBAAa;;CAEb,WAAA,cAAW;;KACZ"}
1
+ {"version":3,"file":"injury.js","names":[],"sources":["../../src/types/injury.ts"],"sourcesContent":["/**\n * Shared Injury Types\n * \n * **Korean**: 공유 부상 타입\n * \n * Common injury types and data structures used across the trauma visualization\n * system. Separated from React components to avoid coupling system logic to UI.\n * \n * @module types/injury\n * @category Types\n * @korean 부상타입\n */\n\nimport { BodyRegion } from \"./common\";\n\n/**\n * Injury type classification\n * \n * **Korean**: 부상 유형 분류\n * \n */\nexport enum InjuryType {\n /** Blunt force trauma */\n BRUISE = \"bruise\",\n /** Sharp weapon/strike */\n CUT = \"cut\",\n /** Deep cut with blood trail */\n LACERATION = \"laceration\",\n /** Bone damage indicator */\n FRACTURE = \"fracture\",\n}\n\n/**\n * Individual injury data for visualization\n * \n * **Korean**: 시각화를 위한 개별 부상 데이터\n * \n * Used by both the injury tracking system and trauma visualization components.\n * \n */\nexport interface Injury {\n /** Unique identifier */\n readonly id: string;\n /** Body region affected */\n readonly region: BodyRegion;\n /** Type of injury */\n readonly type: InjuryType;\n /** Position on body [x, y, z] relative to character center */\n readonly position: [number, number, number];\n /** Severity (0.0 to 1.0) */\n readonly severity: number;\n /** Number of hits to same location (for progressive bruising) */\n readonly hitCount: number;\n /** Timestamp when injury was created */\n readonly timestamp: number;\n /** Optional player ID for multi-player scenarios */\n readonly playerId?: string | number;\n}\n"],"mappings":";;;;;;;AAqBA,IAAY,aAAL,yBAAA,YAAA;;CAEL,WAAA,YAAA;;CAEA,WAAA,SAAA;;CAEA,WAAA,gBAAA;;CAEA,WAAA,cAAA;;AACF,EAAA,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"muscle.js","names":[],"sources":["../../src/types/muscle.ts"],"sourcesContent":["/**\n * Muscle system type definitions for realistic body tension and physiology\n *\n * Implements dynamic muscle flex and tension visualization during combat techniques.\n * Muscles expand (up to +30%) during technique execution and relax gradually afterward.\n *\n * @module types/muscle\n * @category Combat Systems\n * @korean 근육시스템타입정의\n */\n\nimport type * as THREE from \"three\";\n\n/**\n * Muscle group names for anatomical targeting\n *\n * @korean 근육그룹이름\n */\nexport type MuscleGroupName =\n // Shoulders\n | \"SHOULDER_L\"\n | \"SHOULDER_R\"\n // Arms\n | \"BICEP_L\"\n | \"BICEP_R\"\n | \"TRICEP_L\"\n | \"TRICEP_R\"\n | \"FOREARM_L\"\n | \"FOREARM_R\"\n // Torso front\n | \"PECTORALS\"\n | \"CORE\"\n | \"ABS\"\n | \"OBLIQUES\"\n | \"LOWER_ABS\"\n // Torso back (new - for less boxy appearance)\n | \"LAT_L\"\n | \"LAT_R\"\n | \"TRAPEZIUS\"\n | \"RHOMBOID\"\n | \"ERECTOR_SPINAE_L\"\n | \"ERECTOR_SPINAE_R\"\n // Hips/Pelvis (new - for hip definition)\n | \"HIP_FLEXOR_L\"\n | \"HIP_FLEXOR_R\"\n // Legs\n | \"QUAD_L\"\n | \"QUAD_R\"\n | \"HAMSTRING_L\"\n | \"HAMSTRING_R\"\n | \"CALF_L\"\n | \"CALF_R\"\n | \"GLUTE_L\"\n | \"GLUTE_R\";\n\n/**\n * Muscle group definition with anatomical positioning and flex properties\n *\n * @korean 근육그룹정의\n */\nexport interface MuscleGroup {\n /** Unique muscle group name */\n readonly name: MuscleGroupName;\n\n /** Base scale when relaxed (normal size) */\n readonly baseScale: THREE.Vector3;\n\n /** Maximum scale when fully flexed (+30% size) */\n readonly maxFlexScale: THREE.Vector3;\n\n /** Position relative to character center */\n readonly position: THREE.Vector3;\n\n /** Geometry parameters for creating instances */\n readonly geometryParams: {\n readonly radius: number;\n readonly length: number;\n readonly capSegments: number;\n readonly radialSegments: number;\n };\n\n /** Korean name for bilingual support */\n readonly korean: string;\n\n /** English name for bilingual support */\n readonly english: string;\n}\n\n/**\n * Real-time muscle activation state for a single muscle group\n *\n * Updated at 60fps during combat animations.\n *\n * @korean 근육활성화상태\n */\nexport interface MuscleActivationState {\n /** Muscle group identifier */\n readonly muscleGroup: MuscleGroupName;\n\n /** Current tension level (0.0 = relaxed, 1.0 = maximum flex) */\n tension: number;\n\n /** Target tension level for smooth transitions (mutable for performance) */\n targetTension: number;\n\n /** Whether this muscle is currently shaking due to exhaustion */\n isShaking: boolean;\n}\n\n/**\n * Muscle activation mapping for techniques\n *\n * Maps muscle groups to their target tension levels (0-1) for a specific technique.\n *\n * @example\n * ```typescript\n * const jabActivation: MuscleActivationMap = new Map([\n * [\"SHOULDER_R\", 0.7],\n * [\"BICEP_R\", 1.0], // Maximum flex\n * [\"TRICEP_R\", 0.8],\n * [\"CORE\", 0.5]\n * ]);\n * ```\n *\n * @korean 근육활성화매핑\n */\nexport type MuscleActivationMap = Map<MuscleGroupName, number>;\n\n/**\n * Props for MuscleMesh component rendering individual muscles\n *\n * @korean 근육메시속성\n */\nexport interface MuscleMeshProps {\n /** Muscle group definition with geometry and positioning */\n readonly muscleGroup: MuscleGroup;\n\n /** Current tension level (0.0 to 1.0) */\n readonly tension: number;\n\n /** Whether muscle should shake (exhaustion effect) */\n readonly isShaking: boolean;\n\n /** Base color for muscle rendering */\n readonly color?: number;\n\n /** Metalness for material (default: 0.1) */\n readonly metalness?: number;\n\n /** Roughness for material (default: 0.9) */\n readonly roughness?: number;\n}\n\n/**\n * Configuration for muscle system performance\n *\n * @korean 근육시스템성능설정\n */\nexport interface MuscleSystemConfig {\n /** Target frame time budget in milliseconds (default: 3ms) */\n readonly maxFrameTime: number;\n\n /** Number of muscle groups to render (default: 20) */\n readonly muscleCount: number;\n\n /** Whether to use instancing for optimization (default: false for now) */\n readonly useInstancing: boolean;\n\n /** Relaxation time after technique in seconds (default: 0.3s) */\n readonly relaxationDelay: number;\n\n /** Stamina threshold for exhaustion effects (default: 20%) */\n readonly exhaustionThreshold: number;\n\n /** Shake frequency in Hz when exhausted (default: 20Hz) */\n readonly shakeFrequency: number;\n\n /** Shake amplitude when exhausted (default: 0.02 radians) */\n readonly shakeAmplitude: number;\n\n /** Speed of muscle activation transitions (default: 5.0) */\n readonly activationSpeed: number;\n\n /** Speed of muscle relaxation transitions (default: 3.0) */\n readonly relaxationSpeed: number;\n\n /** Tension threshold for shaking effect (default: 0.3) */\n readonly shakingTensionThreshold: number;\n}\n\n/**\n * Default muscle system configuration\n *\n * @korean 기본근육시스템설정\n */\nexport const DEFAULT_MUSCLE_CONFIG: MuscleSystemConfig = {\n maxFrameTime: 3, // 3ms target\n muscleCount: 20,\n useInstancing: false,\n relaxationDelay: 0.3, // 0.3 seconds\n exhaustionThreshold: 20, // 20% stamina\n shakeFrequency: 20, // 20Hz\n shakeAmplitude: 0.02, // 0.02 radians\n activationSpeed: 5.0, // Fast activation\n relaxationSpeed: 3.0, // Slower relaxation for realism\n shakingTensionThreshold: 0.3, // 30% tension minimum for shaking\n} as const;\n\n/**\n * Performance metrics for muscle system monitoring\n *\n * @korean 근육시스템성능지표\n */\nexport interface MuscleSystemMetrics {\n /** Current frame time in milliseconds */\n readonly frameTime: number;\n\n /** Number of active muscle groups being updated */\n readonly activeMuscles: number;\n\n /** Number of muscles currently shaking */\n readonly shakingMuscles: number;\n\n /** Whether system is within performance budget */\n readonly withinBudget: boolean;\n}\n"],"mappings":";;;;;;AAmMA,IAAa,wBAA4C;CACvD,cAAc;CACd,aAAa;CACb,eAAe;CACf,iBAAiB;CACjB,qBAAqB;CACrB,gBAAgB;CAChB,gBAAgB;CAChB,iBAAiB;CACjB,iBAAiB;CACjB,yBAAyB;CAC1B"}
1
+ {"version":3,"file":"muscle.js","names":[],"sources":["../../src/types/muscle.ts"],"sourcesContent":["/**\n * Muscle system type definitions for realistic body tension and physiology\n *\n * Implements dynamic muscle flex and tension visualization during combat techniques.\n * Muscles expand (up to +30%) during technique execution and relax gradually afterward.\n *\n * @module types/muscle\n * @category Combat Systems\n * @korean 근육시스템타입정의\n */\n\nimport type * as THREE from \"three\";\n\n/**\n * Muscle group names for anatomical targeting\n *\n * @korean 근육그룹이름\n */\nexport type MuscleGroupName =\n // Shoulders\n | \"SHOULDER_L\"\n | \"SHOULDER_R\"\n // Arms\n | \"BICEP_L\"\n | \"BICEP_R\"\n | \"TRICEP_L\"\n | \"TRICEP_R\"\n | \"FOREARM_L\"\n | \"FOREARM_R\"\n // Torso front\n | \"PECTORALS\"\n | \"CORE\"\n | \"ABS\"\n | \"OBLIQUES\"\n | \"LOWER_ABS\"\n // Torso back (new - for less boxy appearance)\n | \"LAT_L\"\n | \"LAT_R\"\n | \"TRAPEZIUS\"\n | \"RHOMBOID\"\n | \"ERECTOR_SPINAE_L\"\n | \"ERECTOR_SPINAE_R\"\n // Hips/Pelvis (new - for hip definition)\n | \"HIP_FLEXOR_L\"\n | \"HIP_FLEXOR_R\"\n // Legs\n | \"QUAD_L\"\n | \"QUAD_R\"\n | \"HAMSTRING_L\"\n | \"HAMSTRING_R\"\n | \"CALF_L\"\n | \"CALF_R\"\n | \"GLUTE_L\"\n | \"GLUTE_R\";\n\n/**\n * Muscle group definition with anatomical positioning and flex properties\n *\n * @korean 근육그룹정의\n */\nexport interface MuscleGroup {\n /** Unique muscle group name */\n readonly name: MuscleGroupName;\n\n /** Base scale when relaxed (normal size) */\n readonly baseScale: THREE.Vector3;\n\n /** Maximum scale when fully flexed (+30% size) */\n readonly maxFlexScale: THREE.Vector3;\n\n /** Position relative to character center */\n readonly position: THREE.Vector3;\n\n /** Geometry parameters for creating instances */\n readonly geometryParams: {\n readonly radius: number;\n readonly length: number;\n readonly capSegments: number;\n readonly radialSegments: number;\n };\n\n /** Korean name for bilingual support */\n readonly korean: string;\n\n /** English name for bilingual support */\n readonly english: string;\n}\n\n/**\n * Real-time muscle activation state for a single muscle group\n *\n * Updated at 60fps during combat animations.\n *\n * @korean 근육활성화상태\n */\nexport interface MuscleActivationState {\n /** Muscle group identifier */\n readonly muscleGroup: MuscleGroupName;\n\n /** Current tension level (0.0 = relaxed, 1.0 = maximum flex) */\n tension: number;\n\n /** Target tension level for smooth transitions (mutable for performance) */\n targetTension: number;\n\n /** Whether this muscle is currently shaking due to exhaustion */\n isShaking: boolean;\n}\n\n/**\n * Muscle activation mapping for techniques\n *\n * Maps muscle groups to their target tension levels (0-1) for a specific technique.\n *\n * @example\n * ```typescript\n * const jabActivation: MuscleActivationMap = new Map([\n * [\"SHOULDER_R\", 0.7],\n * [\"BICEP_R\", 1.0], // Maximum flex\n * [\"TRICEP_R\", 0.8],\n * [\"CORE\", 0.5]\n * ]);\n * ```\n *\n * @korean 근육활성화매핑\n */\nexport type MuscleActivationMap = Map<MuscleGroupName, number>;\n\n/**\n * Props for MuscleMesh component rendering individual muscles\n *\n * @korean 근육메시속성\n */\nexport interface MuscleMeshProps {\n /** Muscle group definition with geometry and positioning */\n readonly muscleGroup: MuscleGroup;\n\n /** Current tension level (0.0 to 1.0) */\n readonly tension: number;\n\n /** Whether muscle should shake (exhaustion effect) */\n readonly isShaking: boolean;\n\n /** Base color for muscle rendering */\n readonly color?: number;\n\n /** Metalness for material (default: 0.1) */\n readonly metalness?: number;\n\n /** Roughness for material (default: 0.9) */\n readonly roughness?: number;\n}\n\n/**\n * Configuration for muscle system performance\n *\n * @korean 근육시스템성능설정\n */\nexport interface MuscleSystemConfig {\n /** Target frame time budget in milliseconds (default: 3ms) */\n readonly maxFrameTime: number;\n\n /** Number of muscle groups to render (default: 20) */\n readonly muscleCount: number;\n\n /** Whether to use instancing for optimization (default: false for now) */\n readonly useInstancing: boolean;\n\n /** Relaxation time after technique in seconds (default: 0.3s) */\n readonly relaxationDelay: number;\n\n /** Stamina threshold for exhaustion effects (default: 20%) */\n readonly exhaustionThreshold: number;\n\n /** Shake frequency in Hz when exhausted (default: 20Hz) */\n readonly shakeFrequency: number;\n\n /** Shake amplitude when exhausted (default: 0.02 radians) */\n readonly shakeAmplitude: number;\n\n /** Speed of muscle activation transitions (default: 5.0) */\n readonly activationSpeed: number;\n\n /** Speed of muscle relaxation transitions (default: 3.0) */\n readonly relaxationSpeed: number;\n\n /** Tension threshold for shaking effect (default: 0.3) */\n readonly shakingTensionThreshold: number;\n}\n\n/**\n * Default muscle system configuration\n *\n * @korean 기본근육시스템설정\n */\nexport const DEFAULT_MUSCLE_CONFIG: MuscleSystemConfig = {\n maxFrameTime: 3, // 3ms target\n muscleCount: 20,\n useInstancing: false,\n relaxationDelay: 0.3, // 0.3 seconds\n exhaustionThreshold: 20, // 20% stamina\n shakeFrequency: 20, // 20Hz\n shakeAmplitude: 0.02, // 0.02 radians\n activationSpeed: 5.0, // Fast activation\n relaxationSpeed: 3.0, // Slower relaxation for realism\n shakingTensionThreshold: 0.3, // 30% tension minimum for shaking\n} as const;\n\n/**\n * Performance metrics for muscle system monitoring\n *\n * @korean 근육시스템성능지표\n */\nexport interface MuscleSystemMetrics {\n /** Current frame time in milliseconds */\n readonly frameTime: number;\n\n /** Number of active muscle groups being updated */\n readonly activeMuscles: number;\n\n /** Number of muscles currently shaking */\n readonly shakingMuscles: number;\n\n /** Whether system is within performance budget */\n readonly withinBudget: boolean;\n}\n"],"mappings":";;;;;;AAmMA,IAAa,wBAA4C;CACvD,cAAc;CACd,aAAa;CACb,eAAe;CACf,iBAAiB;CACjB,qBAAqB;CACrB,gBAAgB;CAChB,gBAAgB;CAChB,iBAAiB;CACjB,iBAAiB;CACjB,yBAAyB;AAC3B"}
@@ -1 +1 @@
1
- {"version":3,"file":"physics.js","names":[],"sources":["../../src/types/physics.ts"],"sourcesContent":["/**\n * Physics and collision detection type definitions for Black Trigram combat system.\n *\n * **Korean**: 물리 및 충돌 타입 정의\n *\n * This module provides type definitions for the collision detection system, including\n * bounding boxes, attack reach calculations, and raycasting results.\n *\n * @module types/physics\n * @category Type Definitions\n * @korean 물리타입\n */\n\nimport type {\n Position,\n TrigramStance,\n VitalPointCategory,\n VitalPointSeverity,\n} from \"./common\";\n\n/**\n * Anatomical regions for collision detection.\n *\n * **Korean**: 해부학적 영역\n *\n * The five main body regions used for bounding box collision detection.\n * Each region contains multiple vital points.\n *\n * @category Collision Types\n * @korean 해부영역\n */\nexport type AnatomicalRegionPhysics =\n | \"head\" // 머리 (Meori)\n | \"neck\" // 목 (Mok)\n | \"torso\" // 몸통 (Momtong)\n | \"arms\" // 팔 (Pal)\n | \"legs\"; // 다리 (Dari)\n\n/**\n * Bounding box shape types for collision detection.\n *\n * **Korean**: 경계 상자 형태\n *\n * @category Collision Types\n * @korean 경계형태\n */\nexport type BoundingBoxType = \"sphere\" | \"box\" | \"capsule\";\n\n/**\n * Body part source for reach calculation.\n *\n * **Korean**: 신체 부위\n *\n * Defines which body part's length is used for reach calculation.\n *\n * @category Combat Types\n * @korean 신체부위\n */\nexport type ReachBodyPart = \"arm\" | \"leg\" | \"torso\";\n\n/**\n * Specific limb types for exposure tracking.\n *\n * **Korean**: 노출된 사지 부위\n *\n * Granular limb identification for counter-attack and breaking techniques.\n * Each limb can be targeted during its extension phase.\n *\n * @category Combat Types\n * @korean 사지부위\n */\nexport type ExposedLimbType =\n | \"left_arm\" // 왼팔 (Oenpal)\n | \"right_arm\" // 오른팔 (Oreunpal)\n | \"left_leg\" // 왼다리 (Oendari)\n | \"right_leg\" // 오른다리 (Oreundari)\n | \"left_ankle\" // 왼발목 (Oenbalmok)\n | \"right_ankle\" // 오른발목 (Oreunbalmok)\n | \"left_knee\" // 왼무릎 (Oenmureup)\n | \"right_knee\" // 오른무릎 (Oreunmureup)\n | \"left_elbow\" // 왼팔꿈치 (Oenpalkkumchi)\n | \"right_elbow\" // 오른팔꿈치 (Oreunpalkkumchi)\n | \"left_wrist\" // 왼손목 (Oensomok)\n | \"right_wrist\"; // 오른손목 (Oreunsomok)\n\n/**\n * Limb exposure window during technique execution.\n *\n * **Korean**: 사지 노출 시간\n *\n * Defines when and how a limb becomes vulnerable during attack execution.\n * Used for counter-attacks, breaking techniques, and defensive opportunities.\n *\n * @category Combat Types\n * @korean 사지노출시간\n */\nexport interface LimbExposureWindow {\n /**\n * Which limb is exposed during the technique.\n * @korean 노출된사지\n */\n readonly exposedLimb: ExposedLimbType;\n\n /**\n * Start time of exposure as fraction of execution time (0.0-1.0).\n * Example: 0.3 means exposure starts at 30% into the animation.\n * @korean 노출시작시간\n */\n readonly startTime: number;\n\n /**\n * Duration of exposure window in milliseconds.\n * This is the vulnerable period where counter-attacks can target the limb.\n * @korean 노출지속시간\n */\n readonly duration: number;\n\n /**\n * Vulnerability multiplier for damage to this limb (1.0-3.0).\n * Higher values indicate greater vulnerability:\n * - 1.0-1.3: Minor exposure (quick jabs)\n * - 1.4-1.8: Moderate exposure (standard strikes)\n * - 1.9-3.0: Critical exposure (overextended kicks, spinning techniques)\n * @korean 취약성배수\n */\n readonly vulnerabilityMultiplier: number;\n\n /**\n * Whether this exposure allows breaking techniques.\n * True for fully extended limbs (kicks, lunging punches).\n * @korean 파쇄기술가능\n */\n readonly allowsBreaking: boolean;\n}\n\n/**\n * Physical reach configuration for techniques.\n *\n * **Korean**: 물리적 도달 설정\n *\n * Defines how a technique's reach is calculated using physical attributes\n * rather than a fixed distance value. The actual reach depends on:\n * - Body part length from archetype physical attributes\n * - Animation extension multiplier from hit timing\n * - Stance modifiers from Eight Trigrams\n *\n * **NEW**: Now includes limb exposure tracking for counter-attack opportunities.\n *\n * Formula: `effectiveReach = (limbLength/100) × extensionMultiplier × stanceModifier`\n *\n * @example\n * ```typescript\n * // Punch technique using arm length with exposure\n * const punchReach: PhysicalReachConfig = {\n * bodyPart: \"arm\",\n * techniqueType: \"punch\",\n * baseExtension: 0.95, // 95% arm extension at peak\n * exposureWindow: {\n * exposedLimb: \"right_arm\",\n * startTime: 0.4,\n * duration: 300,\n * vulnerabilityMultiplier: 1.3,\n * allowsBreaking: false\n * }\n * };\n *\n * // Kick using leg length - high vulnerability\n * const kickReach: PhysicalReachConfig = {\n * bodyPart: \"leg\",\n * techniqueType: \"kick\",\n * baseExtension: 1.1, // 110% leg extension (high reach)\n * exposureWindow: {\n * exposedLimb: \"right_leg\",\n * startTime: 0.5,\n * duration: 400,\n * vulnerabilityMultiplier: 2.2,\n * allowsBreaking: true\n * }\n * };\n * ```\n *\n * @category Combat Types\n * @korean 물리적도달설정\n */\nexport interface PhysicalReachConfig {\n /**\n * Body part used for reach calculation.\n * Determines which physical attribute length is used.\n * @korean 신체부위\n */\n readonly bodyPart: ReachBodyPart;\n\n /**\n * Technique type for classification.\n * @korean 기술유형\n */\n readonly techniqueType: TechniqueType;\n\n /**\n * Base extension multiplier (0.0 - 1.5).\n * - 0.4-0.5: Close range (elbows, knees)\n * - 0.9-1.0: Standard reach (punches)\n * - 1.1-1.5: Extended reach (kicks, spinning techniques)\n * @korean 기본확장배수\n */\n readonly baseExtension: number;\n\n /**\n * Optional limb exposure window for counter-attack opportunities.\n * Defines when and how the attacking limb becomes vulnerable.\n * @korean 사지노출설정\n */\n readonly exposureWindow?: LimbExposureWindow;\n}\n\n/**\n * Runtime validation helper for base extension multiplier.\n *\n * Ensures that the provided baseExtension value respects the documented range\n * of 0.0 to 1.5. This should be used when loading or constructing technique\n * configurations from dynamic sources (e.g. JSON, network, editors).\n *\n * **Korean**: 기본 확장 배수 검증\n *\n * @param baseExtension - The base extension multiplier to validate.\n * @returns `true` if the value is within the inclusive range [0.0, 1.5], otherwise `false`.\n * @category Combat Types\n * @korean 기본확장배수검증\n */\nexport function isValidBaseExtension(baseExtension: number): boolean {\n return baseExtension >= 0.0 && baseExtension <= 1.5;\n}\n\n/**\n * Asserts that a PhysicalReachConfig has a valid baseExtension value.\n *\n * Throws a RangeError if the configuration's baseExtension is outside the\n * allowed range of 0.0 to 1.5. This provides a canonical runtime check that\n * can be used by reach calculators or technique loaders.\n *\n * **Korean**: 물리적 도달 설정 검증\n *\n * @param config - The PhysicalReachConfig instance to validate.\n * @throws RangeError If baseExtension is outside [0.0, 1.5].\n * @category Combat Types\n * @korean 물리적도달설정검증\n */\nexport function assertValidPhysicalReachConfig(\n config: PhysicalReachConfig\n): void {\n if (!isValidBaseExtension(config.baseExtension)) {\n throw new RangeError(\n `Invalid baseExtension ${config.baseExtension}. ` +\n \"Expected a value between 0.0 and 1.5 inclusive.\"\n );\n }\n}\n\n/**\n * Technique types for attack reach calculation.\n *\n * **Korean**: 기술 유형\n *\n * @category Combat Types\n * @korean 기술유형\n */\nexport type TechniqueType =\n | \"punch\" // 주먹 (Jumeok)\n | \"kick\" // 발차기 (Balchagi)\n | \"elbow\" // 팔꿈치 (Palkkumchi)\n | \"knee\" // 무릎 (Mureup)\n | \"pressure_point\"; // 급소 (Geupso)\n\n/**\n * Bounding box definition for an anatomical region.\n *\n * **Korean**: 경계 상자\n *\n * Defines the collision volume for an anatomical region using either a sphere,\n * box, or capsule shape. Used for broad-phase collision detection.\n *\n * @example\n * ```typescript\n * const headBox: BoundingBox = {\n * type: \"sphere\",\n * center: { x: 0, y: 1.7, z: 0 },\n * dimensions: { x: 0.125, y: 0, z: 0 }, // radius only\n * region: \"head\"\n * };\n * ```\n *\n * @category Collision Types\n * @korean 경계상자\n */\nexport interface BoundingBox {\n /** Shape type of the bounding box */\n readonly type: BoundingBoxType;\n\n /** Center position of the bounding box in 3D space */\n readonly center: Position3D;\n\n /** Dimensions: radius for sphere, width/height/depth for box, radius/height for capsule */\n readonly dimensions: Position3D;\n\n /** Anatomical region this bounding box represents */\n readonly region: AnatomicalRegionPhysics;\n}\n\n/**\n * Position in 3D space.\n *\n * **Korean**: 3D 위치\n *\n * Extends the 2D Position type with a z-coordinate for Three.js integration.\n *\n * @category Core Types\n * @korean 3D위치\n */\nexport interface Position3D {\n /** X coordinate in meters */\n readonly x: number;\n\n /** Y coordinate in meters */\n readonly y: number;\n\n /** Z coordinate in meters */\n readonly z: number;\n}\n\n/**\n * Attack reach calculation result.\n *\n * **Korean**: 공격 범위\n *\n * Contains the effective attack range considering technique type and stance modifiers.\n *\n * @example\n * ```typescript\n * const kickReach: AttackReach = {\n * technique: \"kick\",\n * baseReach: 1.0,\n * stance: TrigramStance.LI,\n * stanceModifier: 1.20,\n * effectiveReach: 1.2\n * };\n * ```\n *\n * @category Combat Types\n * @korean 공격범위\n */\nexport interface AttackReach {\n /** Type of technique being used */\n readonly technique: TechniqueType;\n\n /** Base reach in meters without modifiers */\n readonly baseReach: number;\n\n /** Current trigram stance */\n readonly stance: TrigramStance;\n\n /** Stance-specific reach modifier (0.9 - 1.2) */\n readonly stanceModifier: number;\n\n /** Final effective reach: baseReach × stanceModifier */\n readonly effectiveReach: number;\n}\n\n/**\n * Collision detection result.\n *\n * **Korean**: 충돌 결과\n *\n * Contains comprehensive information about a collision, including whether it hit,\n * which region and vital point were struck, distance, and accuracy.\n *\n * @example\n * ```typescript\n * const result: CollisionResult = {\n * hit: true,\n * region: \"head\",\n * vitalPoint: templePoint,\n * distance: 0.8,\n * accuracy: 0.95\n * };\n * ```\n *\n * @category Collision Types\n * @korean 충돌결과\n */\nexport interface CollisionResult {\n /** Whether the attack hit */\n readonly hit: boolean;\n\n /** Anatomical region hit (if any) */\n readonly region?: AnatomicalRegionPhysics;\n\n /** Specific vital point hit (if any) */\n readonly vitalPoint?: CollisionVitalPoint;\n\n /** Actual distance from attacker to target in meters */\n readonly distance: number;\n\n /** Hit accuracy (0-1), based on targeting precision */\n readonly accuracy: number;\n\n /** 3D point of intersection (if hit) */\n readonly hitPoint?: Position3D;\n}\n\n/**\n * Minimal vital point shape for collision results to avoid deep cross-module\n * dependencies. Full vital point data lives in the vitalpoint system.\n */\nexport interface CollisionVitalPoint {\n readonly id: string;\n readonly names: {\n readonly korean: string;\n readonly english: string;\n readonly romanized: string;\n };\n readonly position: Position;\n readonly category: VitalPointCategory;\n readonly severity: VitalPointSeverity;\n}\n\n/**\n * Counter-attack opportunity during opponent's technique execution.\n *\n * **Korean**: 반격 기회\n *\n * Represents a window of opportunity to counter-attack when the opponent\n * has exposed a limb during their technique execution.\n *\n * @example\n * ```typescript\n * const counterOpportunity: CounterOpportunity = {\n * exposedLimb: \"right_leg\",\n * windowStart: 450, // ms into opponent's kick\n * windowDuration: 300, // 300ms counter window\n * vulnerabilityMultiplier: 2.0,\n * allowsBreaking: true,\n * recommendedCounters: [\"ankle_break\", \"knee_strike\", \"leg_sweep\"]\n * };\n * ```\n *\n * @category Combat Types\n * @korean 반격기회\n */\nexport interface CounterOpportunity {\n /**\n * The exposed limb that can be targeted.\n * @korean 노출된사지\n */\n readonly exposedLimb: ExposedLimbType;\n\n /**\n * Start time of counter window in milliseconds (from technique start).\n * @korean 반격시작시간\n */\n readonly windowStart: number;\n\n /**\n * Duration of counter window in milliseconds.\n * @korean 반격지속시간\n */\n readonly windowDuration: number;\n\n /**\n * Vulnerability multiplier for damage during this window.\n * @korean 취약성배수\n */\n readonly vulnerabilityMultiplier: number;\n\n /**\n * Whether limb breaking techniques are effective during this window.\n * @korean 파쇄기술가능\n */\n readonly allowsBreaking: boolean;\n\n /**\n * Recommended counter-technique IDs for this opportunity.\n * @korean 추천반격기술\n */\n readonly recommendedCounters?: readonly string[];\n}\n\n/**\n * Breaking technique target types.\n *\n * **Korean**: 파쇄 기술 목표\n *\n * Specific joint and bone targets for breaking techniques.\n * Used for limb-breaking counter-attacks.\n *\n * @category Combat Types\n * @korean 파쇄목표\n */\nexport type BreakingTarget =\n | \"ankle\" // 발목 (Balmok)\n | \"knee\" // 무릎 (Mureup)\n | \"elbow\" // 팔꿈치 (Palkkumchi)\n | \"wrist\" // 손목 (Sonmok)\n | \"shoulder\" // 어깨 (Eokkae)\n | \"hip\"; // 엉덩이/골반 (Eongdeongi)\n\n/**\n * Breaking technique result.\n *\n * **Korean**: 파쇄 결과\n *\n * Result of a breaking technique attempt, including injury severity\n * and status effects applied to the broken limb.\n *\n * @category Combat Types\n * @korean 파쇄결과\n */\nexport interface BreakingResult {\n /**\n * Whether the breaking technique succeeded.\n * @korean 파쇄성공\n */\n readonly success: boolean;\n\n /**\n * Target limb/joint that was broken.\n * @korean 파쇄목표\n */\n readonly target: BreakingTarget;\n\n /**\n * Severity of the break (fracture, dislocation, etc.).\n * Range: 0.0 (failed) to 1.0 (complete break).\n * @korean 파쇄심각도\n */\n readonly severity: number;\n\n /**\n * Damage dealt to the limb.\n * @korean 피해량\n */\n readonly damage: number;\n\n /**\n * Mobility reduction percentage (0.0-1.0).\n * Affects movement speed and technique execution.\n * @korean 이동력감소\n */\n readonly mobilityReduction: number;\n\n /**\n * IDs of status effects applied (pain, bleeding, disabled_limb, etc.).\n * @korean 상태효과\n */\n readonly statusEffects: readonly string[];\n}\n\n/**\n * Raycast query parameters.\n *\n * **Korean**: 레이캐스트 쿼리\n *\n * Defines the parameters for a raycasting operation from attacker to target.\n *\n * @category Collision Types\n * @korean 레이캐스트쿼리\n */\nexport interface RaycastQuery {\n /** Origin point of the ray (attacker position) */\n readonly origin: Position3D;\n\n /** Direction vector of the ray (normalized) */\n readonly direction: Position3D;\n\n /** Maximum distance to check in meters */\n readonly maxDistance: number;\n\n /** Target anatomical region (optional, for filtering) */\n readonly targetRegion?: AnatomicalRegionPhysics;\n}\n\n/**\n * Base reach values for different technique types.\n *\n * **Korean**: 기본 범위 값\n *\n * @category Combat Constants\n * @korean 기본범위값\n */\nexport const BASE_REACH: Record<TechniqueType, number> = {\n punch: 0.7, // 70cm - Standard punch range\n kick: 1.0, // 100cm - Longer leg reach\n elbow: 0.4, // 40cm - Close-range strike\n knee: 0.4, // 40cm - Close-range strike\n pressure_point: 0.5, // 50cm - Precise targeting\n};\n\n/**\n * Stance reach modifiers for the Eight Trigrams.\n *\n * **Korean**: 팔괘 범위 수정자\n *\n * Each stance affects attack range differently based on its combat philosophy:\n * - Aggressive stances (Fire, Thunder) extend reach\n * - Defensive stances (Mountain) reduce reach\n * - Balanced stances (Heaven, Earth) have minor adjustments\n *\n * @category Combat Constants\n * @korean 팔괘범위수정자\n */\nexport const STANCE_REACH_MODIFIERS: Record<TrigramStance, number> = {\n li: 1.2, // ☲ Fire (리): +20% reach (aggressive)\n jin: 1.15, // ☳ Thunder (진): +15% reach (explosive)\n geon: 1.1, // ☰ Heaven (건): +10% reach (balanced)\n son: 1.05, // ☴ Wind (손): +5% reach (continuous)\n tae: 1.0, // ☱ Lake (태): neutral reach\n gam: 1.0, // ☵ Water (감): neutral reach (adaptive)\n gon: 0.95, // ☷ Earth (곤): -5% reach (grounded)\n gan: 0.9, // ☶ Mountain (간): -10% reach (defensive)\n};\n\n/**\n * Korean terminology for collision detection concepts.\n *\n * **Korean**: 충돌 감지 용어\n *\n * @category Korean Terms\n * @korean 충돌용어\n */\nexport const COLLISION_KOREAN_TERMS = {\n collisionDetection: \"충돌감지\", // Chungdol Gamji\n attackRange: \"타격범위\", // Tagyeok Beomwi\n preciseHit: \"정밀타격\", // Jeongmil Tagyeok\n boundingBox: \"경계상자\", // Gyeonggye Sangja\n raycast: \"광선투사\", // Gwangseon Tusa\n hitAccuracy: \"타격정확도\", // Tagyeok Jeonghwakdo\n effectiveReach: \"유효범위\", // Yuhyo Beomwi\n} as const;\n\n/**\n * Anatomical region dimensions in meters.\n *\n * **Korean**: 해부 영역 치수\n *\n * Standard dimensions for adult human anatomical regions used for bounding box creation.\n *\n * @category Collision Constants\n * @korean 해부영역치수\n */\nexport const ANATOMICAL_DIMENSIONS = {\n head: {\n type: \"sphere\" as const,\n radius: 0.125, // 머리 구 반경 (Meori sphere radius) – 12.5cm radius for head sphere\n center: { x: 0, y: 1.7, z: 0 }, // 머리 중심 높이 (Meori center height) – Average adult head height\n },\n neck: {\n type: \"capsule\" as const,\n radius: 0.075, // 목 캡슐 반경 (Mok capsule radius) – 7.5cm radius for neck cylinder\n height: 0.15, // 목 캡슐 높이 (Mok capsule height) – 15cm height\n center: { x: 0, y: 1.5, z: 0 }, // 목 중심 높이 (Mok center height)\n },\n torso: {\n type: \"box\" as const,\n width: 0.4, // 몸통 상자 가로 (Momtong box width) – 40cm width (shoulder to shoulder)\n height: 0.6, // 몸통 상자 세로 (Momtong box height) – 60cm height (neck to waist)\n depth: 0.25, // 몸통 상자 깊이 (Momtong box depth) – 25cm depth (front to back)\n center: { x: 0, y: 1.1, z: 0 }, // 몸통 중심 높이 (Momtong center height)\n },\n arms: {\n type: \"capsule\" as const,\n radius: 0.05, // 팔 캡슐 반경 (Pal capsule radius) – 5cm radius for arm cylinder\n height: 0.6, // 팔 캡슐 길이 (Pal capsule length) – 60cm length (shoulder to hand)\n center: { x: 0.3, y: 1.1, z: 0 }, // 팔 위치 오프셋 (Pal position offset) – Offset for arm position\n },\n legs: {\n type: \"capsule\" as const,\n radius: 0.06, // 다리 캡슐 반경 (Dari capsule radius) – 6cm radius for leg cylinder\n height: 0.8, // 다리 캡슐 길이 (Dari capsule length) – 80cm length (hip to foot)\n center: { x: 0.15, y: 0.4, z: 0 }, // 다리 위치 오프셋 (Dari position offset) – Offset for leg position\n },\n} as const;\n"],"mappings":";;;;;;;;;;;;;;;AAqOA,SAAgB,qBAAqB,eAAgC;CACnE,OAAO,iBAAiB,KAAO,iBAAiB;;;;;;;;;;;;;;;;AAiBlD,SAAgB,+BACd,QACM;CACN,IAAI,CAAC,qBAAqB,OAAO,cAAc,EAC7C,MAAM,IAAI,WACR,yBAAyB,OAAO,cAAc,mDAE/C;;;;;;;;;;AA8UL,IAAa,aAA4C;CACvD,OAAO;CACP,MAAM;CACN,OAAO;CACP,MAAM;CACN,gBAAgB;CACjB;;;;;;;;;;;;;;AAeD,IAAa,yBAAwD;CACnE,IAAI;CACJ,KAAK;CACL,MAAM;CACN,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACN;;;;;;;;;AAUD,IAAa,yBAAyB;CACpC,oBAAoB;CACpB,aAAa;CACb,YAAY;CACZ,aAAa;CACb,SAAS;CACT,aAAa;CACb,gBAAgB;CACjB;;;;;;;;;;;AAYD,IAAa,wBAAwB;CACnC,MAAM;EACJ,MAAM;EACN,QAAQ;EACR,QAAQ;GAAE,GAAG;GAAG,GAAG;GAAK,GAAG;GAAG;EAC/B;CACD,MAAM;EACJ,MAAM;EACN,QAAQ;EACR,QAAQ;EACR,QAAQ;GAAE,GAAG;GAAG,GAAG;GAAK,GAAG;GAAG;EAC/B;CACD,OAAO;EACL,MAAM;EACN,OAAO;EACP,QAAQ;EACR,OAAO;EACP,QAAQ;GAAE,GAAG;GAAG,GAAG;GAAK,GAAG;GAAG;EAC/B;CACD,MAAM;EACJ,MAAM;EACN,QAAQ;EACR,QAAQ;EACR,QAAQ;GAAE,GAAG;GAAK,GAAG;GAAK,GAAG;GAAG;EACjC;CACD,MAAM;EACJ,MAAM;EACN,QAAQ;EACR,QAAQ;EACR,QAAQ;GAAE,GAAG;GAAM,GAAG;GAAK,GAAG;GAAG;EAClC;CACF"}
1
+ {"version":3,"file":"physics.js","names":[],"sources":["../../src/types/physics.ts"],"sourcesContent":["/**\n * Physics and collision detection type definitions for Black Trigram combat system.\n *\n * **Korean**: 물리 및 충돌 타입 정의\n *\n * This module provides type definitions for the collision detection system, including\n * bounding boxes, attack reach calculations, and raycasting results.\n *\n * @module types/physics\n * @category Type Definitions\n * @korean 물리타입\n */\n\nimport type {\n Position,\n TrigramStance,\n VitalPointCategory,\n VitalPointSeverity,\n} from \"./common\";\n\n/**\n * Anatomical regions for collision detection.\n *\n * **Korean**: 해부학적 영역\n *\n * The five main body regions used for bounding box collision detection.\n * Each region contains multiple vital points.\n *\n * @category Collision Types\n * @korean 해부영역\n */\nexport type AnatomicalRegionPhysics =\n | \"head\" // 머리 (Meori)\n | \"neck\" // 목 (Mok)\n | \"torso\" // 몸통 (Momtong)\n | \"arms\" // 팔 (Pal)\n | \"legs\"; // 다리 (Dari)\n\n/**\n * Bounding box shape types for collision detection.\n *\n * **Korean**: 경계 상자 형태\n *\n * @category Collision Types\n * @korean 경계형태\n */\nexport type BoundingBoxType = \"sphere\" | \"box\" | \"capsule\";\n\n/**\n * Body part source for reach calculation.\n *\n * **Korean**: 신체 부위\n *\n * Defines which body part's length is used for reach calculation.\n *\n * @category Combat Types\n * @korean 신체부위\n */\nexport type ReachBodyPart = \"arm\" | \"leg\" | \"torso\";\n\n/**\n * Specific limb types for exposure tracking.\n *\n * **Korean**: 노출된 사지 부위\n *\n * Granular limb identification for counter-attack and breaking techniques.\n * Each limb can be targeted during its extension phase.\n *\n * @category Combat Types\n * @korean 사지부위\n */\nexport type ExposedLimbType =\n | \"left_arm\" // 왼팔 (Oenpal)\n | \"right_arm\" // 오른팔 (Oreunpal)\n | \"left_leg\" // 왼다리 (Oendari)\n | \"right_leg\" // 오른다리 (Oreundari)\n | \"left_ankle\" // 왼발목 (Oenbalmok)\n | \"right_ankle\" // 오른발목 (Oreunbalmok)\n | \"left_knee\" // 왼무릎 (Oenmureup)\n | \"right_knee\" // 오른무릎 (Oreunmureup)\n | \"left_elbow\" // 왼팔꿈치 (Oenpalkkumchi)\n | \"right_elbow\" // 오른팔꿈치 (Oreunpalkkumchi)\n | \"left_wrist\" // 왼손목 (Oensomok)\n | \"right_wrist\"; // 오른손목 (Oreunsomok)\n\n/**\n * Limb exposure window during technique execution.\n *\n * **Korean**: 사지 노출 시간\n *\n * Defines when and how a limb becomes vulnerable during attack execution.\n * Used for counter-attacks, breaking techniques, and defensive opportunities.\n *\n * @category Combat Types\n * @korean 사지노출시간\n */\nexport interface LimbExposureWindow {\n /**\n * Which limb is exposed during the technique.\n * @korean 노출된사지\n */\n readonly exposedLimb: ExposedLimbType;\n\n /**\n * Start time of exposure as fraction of execution time (0.0-1.0).\n * Example: 0.3 means exposure starts at 30% into the animation.\n * @korean 노출시작시간\n */\n readonly startTime: number;\n\n /**\n * Duration of exposure window in milliseconds.\n * This is the vulnerable period where counter-attacks can target the limb.\n * @korean 노출지속시간\n */\n readonly duration: number;\n\n /**\n * Vulnerability multiplier for damage to this limb (1.0-3.0).\n * Higher values indicate greater vulnerability:\n * - 1.0-1.3: Minor exposure (quick jabs)\n * - 1.4-1.8: Moderate exposure (standard strikes)\n * - 1.9-3.0: Critical exposure (overextended kicks, spinning techniques)\n * @korean 취약성배수\n */\n readonly vulnerabilityMultiplier: number;\n\n /**\n * Whether this exposure allows breaking techniques.\n * True for fully extended limbs (kicks, lunging punches).\n * @korean 파쇄기술가능\n */\n readonly allowsBreaking: boolean;\n}\n\n/**\n * Physical reach configuration for techniques.\n *\n * **Korean**: 물리적 도달 설정\n *\n * Defines how a technique's reach is calculated using physical attributes\n * rather than a fixed distance value. The actual reach depends on:\n * - Body part length from archetype physical attributes\n * - Animation extension multiplier from hit timing\n * - Stance modifiers from Eight Trigrams\n *\n * **NEW**: Now includes limb exposure tracking for counter-attack opportunities.\n *\n * Formula: `effectiveReach = (limbLength/100) × extensionMultiplier × stanceModifier`\n *\n * @example\n * ```typescript\n * // Punch technique using arm length with exposure\n * const punchReach: PhysicalReachConfig = {\n * bodyPart: \"arm\",\n * techniqueType: \"punch\",\n * baseExtension: 0.95, // 95% arm extension at peak\n * exposureWindow: {\n * exposedLimb: \"right_arm\",\n * startTime: 0.4,\n * duration: 300,\n * vulnerabilityMultiplier: 1.3,\n * allowsBreaking: false\n * }\n * };\n *\n * // Kick using leg length - high vulnerability\n * const kickReach: PhysicalReachConfig = {\n * bodyPart: \"leg\",\n * techniqueType: \"kick\",\n * baseExtension: 1.1, // 110% leg extension (high reach)\n * exposureWindow: {\n * exposedLimb: \"right_leg\",\n * startTime: 0.5,\n * duration: 400,\n * vulnerabilityMultiplier: 2.2,\n * allowsBreaking: true\n * }\n * };\n * ```\n *\n * @category Combat Types\n * @korean 물리적도달설정\n */\nexport interface PhysicalReachConfig {\n /**\n * Body part used for reach calculation.\n * Determines which physical attribute length is used.\n * @korean 신체부위\n */\n readonly bodyPart: ReachBodyPart;\n\n /**\n * Technique type for classification.\n * @korean 기술유형\n */\n readonly techniqueType: TechniqueType;\n\n /**\n * Base extension multiplier (0.0 - 1.5).\n * - 0.4-0.5: Close range (elbows, knees)\n * - 0.9-1.0: Standard reach (punches)\n * - 1.1-1.5: Extended reach (kicks, spinning techniques)\n * @korean 기본확장배수\n */\n readonly baseExtension: number;\n\n /**\n * Optional limb exposure window for counter-attack opportunities.\n * Defines when and how the attacking limb becomes vulnerable.\n * @korean 사지노출설정\n */\n readonly exposureWindow?: LimbExposureWindow;\n}\n\n/**\n * Runtime validation helper for base extension multiplier.\n *\n * Ensures that the provided baseExtension value respects the documented range\n * of 0.0 to 1.5. This should be used when loading or constructing technique\n * configurations from dynamic sources (e.g. JSON, network, editors).\n *\n * **Korean**: 기본 확장 배수 검증\n *\n * @param baseExtension - The base extension multiplier to validate.\n * @returns `true` if the value is within the inclusive range [0.0, 1.5], otherwise `false`.\n * @category Combat Types\n * @korean 기본확장배수검증\n */\nexport function isValidBaseExtension(baseExtension: number): boolean {\n return baseExtension >= 0.0 && baseExtension <= 1.5;\n}\n\n/**\n * Asserts that a PhysicalReachConfig has a valid baseExtension value.\n *\n * Throws a RangeError if the configuration's baseExtension is outside the\n * allowed range of 0.0 to 1.5. This provides a canonical runtime check that\n * can be used by reach calculators or technique loaders.\n *\n * **Korean**: 물리적 도달 설정 검증\n *\n * @param config - The PhysicalReachConfig instance to validate.\n * @throws RangeError If baseExtension is outside [0.0, 1.5].\n * @category Combat Types\n * @korean 물리적도달설정검증\n */\nexport function assertValidPhysicalReachConfig(\n config: PhysicalReachConfig\n): void {\n if (!isValidBaseExtension(config.baseExtension)) {\n throw new RangeError(\n `Invalid baseExtension ${config.baseExtension}. ` +\n \"Expected a value between 0.0 and 1.5 inclusive.\"\n );\n }\n}\n\n/**\n * Technique types for attack reach calculation.\n *\n * **Korean**: 기술 유형\n *\n * @category Combat Types\n * @korean 기술유형\n */\nexport type TechniqueType =\n | \"punch\" // 주먹 (Jumeok)\n | \"kick\" // 발차기 (Balchagi)\n | \"elbow\" // 팔꿈치 (Palkkumchi)\n | \"knee\" // 무릎 (Mureup)\n | \"pressure_point\"; // 급소 (Geupso)\n\n/**\n * Bounding box definition for an anatomical region.\n *\n * **Korean**: 경계 상자\n *\n * Defines the collision volume for an anatomical region using either a sphere,\n * box, or capsule shape. Used for broad-phase collision detection.\n *\n * @example\n * ```typescript\n * const headBox: BoundingBox = {\n * type: \"sphere\",\n * center: { x: 0, y: 1.7, z: 0 },\n * dimensions: { x: 0.125, y: 0, z: 0 }, // radius only\n * region: \"head\"\n * };\n * ```\n *\n * @category Collision Types\n * @korean 경계상자\n */\nexport interface BoundingBox {\n /** Shape type of the bounding box */\n readonly type: BoundingBoxType;\n\n /** Center position of the bounding box in 3D space */\n readonly center: Position3D;\n\n /** Dimensions: radius for sphere, width/height/depth for box, radius/height for capsule */\n readonly dimensions: Position3D;\n\n /** Anatomical region this bounding box represents */\n readonly region: AnatomicalRegionPhysics;\n}\n\n/**\n * Position in 3D space.\n *\n * **Korean**: 3D 위치\n *\n * Extends the 2D Position type with a z-coordinate for Three.js integration.\n *\n * @category Core Types\n * @korean 3D위치\n */\nexport interface Position3D {\n /** X coordinate in meters */\n readonly x: number;\n\n /** Y coordinate in meters */\n readonly y: number;\n\n /** Z coordinate in meters */\n readonly z: number;\n}\n\n/**\n * Attack reach calculation result.\n *\n * **Korean**: 공격 범위\n *\n * Contains the effective attack range considering technique type and stance modifiers.\n *\n * @example\n * ```typescript\n * const kickReach: AttackReach = {\n * technique: \"kick\",\n * baseReach: 1.0,\n * stance: TrigramStance.LI,\n * stanceModifier: 1.20,\n * effectiveReach: 1.2\n * };\n * ```\n *\n * @category Combat Types\n * @korean 공격범위\n */\nexport interface AttackReach {\n /** Type of technique being used */\n readonly technique: TechniqueType;\n\n /** Base reach in meters without modifiers */\n readonly baseReach: number;\n\n /** Current trigram stance */\n readonly stance: TrigramStance;\n\n /** Stance-specific reach modifier (0.9 - 1.2) */\n readonly stanceModifier: number;\n\n /** Final effective reach: baseReach × stanceModifier */\n readonly effectiveReach: number;\n}\n\n/**\n * Collision detection result.\n *\n * **Korean**: 충돌 결과\n *\n * Contains comprehensive information about a collision, including whether it hit,\n * which region and vital point were struck, distance, and accuracy.\n *\n * @example\n * ```typescript\n * const result: CollisionResult = {\n * hit: true,\n * region: \"head\",\n * vitalPoint: templePoint,\n * distance: 0.8,\n * accuracy: 0.95\n * };\n * ```\n *\n * @category Collision Types\n * @korean 충돌결과\n */\nexport interface CollisionResult {\n /** Whether the attack hit */\n readonly hit: boolean;\n\n /** Anatomical region hit (if any) */\n readonly region?: AnatomicalRegionPhysics;\n\n /** Specific vital point hit (if any) */\n readonly vitalPoint?: CollisionVitalPoint;\n\n /** Actual distance from attacker to target in meters */\n readonly distance: number;\n\n /** Hit accuracy (0-1), based on targeting precision */\n readonly accuracy: number;\n\n /** 3D point of intersection (if hit) */\n readonly hitPoint?: Position3D;\n}\n\n/**\n * Minimal vital point shape for collision results to avoid deep cross-module\n * dependencies. Full vital point data lives in the vitalpoint system.\n */\nexport interface CollisionVitalPoint {\n readonly id: string;\n readonly names: {\n readonly korean: string;\n readonly english: string;\n readonly romanized: string;\n };\n readonly position: Position;\n readonly category: VitalPointCategory;\n readonly severity: VitalPointSeverity;\n}\n\n/**\n * Counter-attack opportunity during opponent's technique execution.\n *\n * **Korean**: 반격 기회\n *\n * Represents a window of opportunity to counter-attack when the opponent\n * has exposed a limb during their technique execution.\n *\n * @example\n * ```typescript\n * const counterOpportunity: CounterOpportunity = {\n * exposedLimb: \"right_leg\",\n * windowStart: 450, // ms into opponent's kick\n * windowDuration: 300, // 300ms counter window\n * vulnerabilityMultiplier: 2.0,\n * allowsBreaking: true,\n * recommendedCounters: [\"ankle_break\", \"knee_strike\", \"leg_sweep\"]\n * };\n * ```\n *\n * @category Combat Types\n * @korean 반격기회\n */\nexport interface CounterOpportunity {\n /**\n * The exposed limb that can be targeted.\n * @korean 노출된사지\n */\n readonly exposedLimb: ExposedLimbType;\n\n /**\n * Start time of counter window in milliseconds (from technique start).\n * @korean 반격시작시간\n */\n readonly windowStart: number;\n\n /**\n * Duration of counter window in milliseconds.\n * @korean 반격지속시간\n */\n readonly windowDuration: number;\n\n /**\n * Vulnerability multiplier for damage during this window.\n * @korean 취약성배수\n */\n readonly vulnerabilityMultiplier: number;\n\n /**\n * Whether limb breaking techniques are effective during this window.\n * @korean 파쇄기술가능\n */\n readonly allowsBreaking: boolean;\n\n /**\n * Recommended counter-technique IDs for this opportunity.\n * @korean 추천반격기술\n */\n readonly recommendedCounters?: readonly string[];\n}\n\n/**\n * Breaking technique target types.\n *\n * **Korean**: 파쇄 기술 목표\n *\n * Specific joint and bone targets for breaking techniques.\n * Used for limb-breaking counter-attacks.\n *\n * @category Combat Types\n * @korean 파쇄목표\n */\nexport type BreakingTarget =\n | \"ankle\" // 발목 (Balmok)\n | \"knee\" // 무릎 (Mureup)\n | \"elbow\" // 팔꿈치 (Palkkumchi)\n | \"wrist\" // 손목 (Sonmok)\n | \"shoulder\" // 어깨 (Eokkae)\n | \"hip\"; // 엉덩이/골반 (Eongdeongi)\n\n/**\n * Breaking technique result.\n *\n * **Korean**: 파쇄 결과\n *\n * Result of a breaking technique attempt, including injury severity\n * and status effects applied to the broken limb.\n *\n * @category Combat Types\n * @korean 파쇄결과\n */\nexport interface BreakingResult {\n /**\n * Whether the breaking technique succeeded.\n * @korean 파쇄성공\n */\n readonly success: boolean;\n\n /**\n * Target limb/joint that was broken.\n * @korean 파쇄목표\n */\n readonly target: BreakingTarget;\n\n /**\n * Severity of the break (fracture, dislocation, etc.).\n * Range: 0.0 (failed) to 1.0 (complete break).\n * @korean 파쇄심각도\n */\n readonly severity: number;\n\n /**\n * Damage dealt to the limb.\n * @korean 피해량\n */\n readonly damage: number;\n\n /**\n * Mobility reduction percentage (0.0-1.0).\n * Affects movement speed and technique execution.\n * @korean 이동력감소\n */\n readonly mobilityReduction: number;\n\n /**\n * IDs of status effects applied (pain, bleeding, disabled_limb, etc.).\n * @korean 상태효과\n */\n readonly statusEffects: readonly string[];\n}\n\n/**\n * Raycast query parameters.\n *\n * **Korean**: 레이캐스트 쿼리\n *\n * Defines the parameters for a raycasting operation from attacker to target.\n *\n * @category Collision Types\n * @korean 레이캐스트쿼리\n */\nexport interface RaycastQuery {\n /** Origin point of the ray (attacker position) */\n readonly origin: Position3D;\n\n /** Direction vector of the ray (normalized) */\n readonly direction: Position3D;\n\n /** Maximum distance to check in meters */\n readonly maxDistance: number;\n\n /** Target anatomical region (optional, for filtering) */\n readonly targetRegion?: AnatomicalRegionPhysics;\n}\n\n/**\n * Base reach values for different technique types.\n *\n * **Korean**: 기본 범위 값\n *\n * @category Combat Constants\n * @korean 기본범위값\n */\nexport const BASE_REACH: Record<TechniqueType, number> = {\n punch: 0.7, // 70cm - Standard punch range\n kick: 1.0, // 100cm - Longer leg reach\n elbow: 0.4, // 40cm - Close-range strike\n knee: 0.4, // 40cm - Close-range strike\n pressure_point: 0.5, // 50cm - Precise targeting\n};\n\n/**\n * Stance reach modifiers for the Eight Trigrams.\n *\n * **Korean**: 팔괘 범위 수정자\n *\n * Each stance affects attack range differently based on its combat philosophy:\n * - Aggressive stances (Fire, Thunder) extend reach\n * - Defensive stances (Mountain) reduce reach\n * - Balanced stances (Heaven, Earth) have minor adjustments\n *\n * @category Combat Constants\n * @korean 팔괘범위수정자\n */\nexport const STANCE_REACH_MODIFIERS: Record<TrigramStance, number> = {\n li: 1.2, // ☲ Fire (리): +20% reach (aggressive)\n jin: 1.15, // ☳ Thunder (진): +15% reach (explosive)\n geon: 1.1, // ☰ Heaven (건): +10% reach (balanced)\n son: 1.05, // ☴ Wind (손): +5% reach (continuous)\n tae: 1.0, // ☱ Lake (태): neutral reach\n gam: 1.0, // ☵ Water (감): neutral reach (adaptive)\n gon: 0.95, // ☷ Earth (곤): -5% reach (grounded)\n gan: 0.9, // ☶ Mountain (간): -10% reach (defensive)\n};\n\n/**\n * Korean terminology for collision detection concepts.\n *\n * **Korean**: 충돌 감지 용어\n *\n * @category Korean Terms\n * @korean 충돌용어\n */\nexport const COLLISION_KOREAN_TERMS = {\n collisionDetection: \"충돌감지\", // Chungdol Gamji\n attackRange: \"타격범위\", // Tagyeok Beomwi\n preciseHit: \"정밀타격\", // Jeongmil Tagyeok\n boundingBox: \"경계상자\", // Gyeonggye Sangja\n raycast: \"광선투사\", // Gwangseon Tusa\n hitAccuracy: \"타격정확도\", // Tagyeok Jeonghwakdo\n effectiveReach: \"유효범위\", // Yuhyo Beomwi\n} as const;\n\n/**\n * Anatomical region dimensions in meters.\n *\n * **Korean**: 해부 영역 치수\n *\n * Standard dimensions for adult human anatomical regions used for bounding box creation.\n *\n * @category Collision Constants\n * @korean 해부영역치수\n */\nexport const ANATOMICAL_DIMENSIONS = {\n head: {\n type: \"sphere\" as const,\n radius: 0.125, // 머리 구 반경 (Meori sphere radius) – 12.5cm radius for head sphere\n center: { x: 0, y: 1.7, z: 0 }, // 머리 중심 높이 (Meori center height) – Average adult head height\n },\n neck: {\n type: \"capsule\" as const,\n radius: 0.075, // 목 캡슐 반경 (Mok capsule radius) – 7.5cm radius for neck cylinder\n height: 0.15, // 목 캡슐 높이 (Mok capsule height) – 15cm height\n center: { x: 0, y: 1.5, z: 0 }, // 목 중심 높이 (Mok center height)\n },\n torso: {\n type: \"box\" as const,\n width: 0.4, // 몸통 상자 가로 (Momtong box width) – 40cm width (shoulder to shoulder)\n height: 0.6, // 몸통 상자 세로 (Momtong box height) – 60cm height (neck to waist)\n depth: 0.25, // 몸통 상자 깊이 (Momtong box depth) – 25cm depth (front to back)\n center: { x: 0, y: 1.1, z: 0 }, // 몸통 중심 높이 (Momtong center height)\n },\n arms: {\n type: \"capsule\" as const,\n radius: 0.05, // 팔 캡슐 반경 (Pal capsule radius) – 5cm radius for arm cylinder\n height: 0.6, // 팔 캡슐 길이 (Pal capsule length) – 60cm length (shoulder to hand)\n center: { x: 0.3, y: 1.1, z: 0 }, // 팔 위치 오프셋 (Pal position offset) – Offset for arm position\n },\n legs: {\n type: \"capsule\" as const,\n radius: 0.06, // 다리 캡슐 반경 (Dari capsule radius) – 6cm radius for leg cylinder\n height: 0.8, // 다리 캡슐 길이 (Dari capsule length) – 80cm length (hip to foot)\n center: { x: 0.15, y: 0.4, z: 0 }, // 다리 위치 오프셋 (Dari position offset) – Offset for leg position\n },\n} as const;\n"],"mappings":";;;;;;;;;;;;;;;AAqOA,SAAgB,qBAAqB,eAAgC;CACnE,OAAO,iBAAiB,KAAO,iBAAiB;AAClD;;;;;;;;;;;;;;;AAgBA,SAAgB,+BACd,QACM;CACN,IAAI,CAAC,qBAAqB,OAAO,aAAa,GAC5C,MAAM,IAAI,WACR,yBAAyB,OAAO,cAAc,kDAEhD;AAEJ;;;;;;;;;AA4UA,IAAa,aAA4C;CACvD,OAAO;CACP,MAAM;CACN,OAAO;CACP,MAAM;CACN,gBAAgB;AAClB;;;;;;;;;;;;;;AAeA,IAAa,yBAAwD;CACnE,IAAI;CACJ,KAAK;CACL,MAAM;CACN,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;AACP;;;;;;;;;AAUA,IAAa,yBAAyB;CACpC,oBAAoB;CACpB,aAAa;CACb,YAAY;CACZ,aAAa;CACb,SAAS;CACT,aAAa;CACb,gBAAgB;AAClB;;;;;;;;;;;AAYA,IAAa,wBAAwB;CACnC,MAAM;EACJ,MAAM;EACN,QAAQ;EACR,QAAQ;GAAE,GAAG;GAAG,GAAG;GAAK,GAAG;EAAE;CAC/B;CACA,MAAM;EACJ,MAAM;EACN,QAAQ;EACR,QAAQ;EACR,QAAQ;GAAE,GAAG;GAAG,GAAG;GAAK,GAAG;EAAE;CAC/B;CACA,OAAO;EACL,MAAM;EACN,OAAO;EACP,QAAQ;EACR,OAAO;EACP,QAAQ;GAAE,GAAG;GAAG,GAAG;GAAK,GAAG;EAAE;CAC/B;CACA,MAAM;EACJ,MAAM;EACN,QAAQ;EACR,QAAQ;EACR,QAAQ;GAAE,GAAG;GAAK,GAAG;GAAK,GAAG;EAAE;CACjC;CACA,MAAM;EACJ,MAAM;EACN,QAAQ;EACR,QAAQ;EACR,QAAQ;GAAE,GAAG;GAAM,GAAG;GAAK,GAAG;EAAE;CAClC;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"physicsConstants.js","names":[],"sources":["../../src/types/physicsConstants.ts"],"sourcesContent":["/**\n * Shared physics constants for Black Trigram combat system.\n *\n * **Korean**: 물리 상수\n *\n * This module provides shared constants for physics calculations across\n * combat and training systems, ensuring consistency in coordinate transformations\n * and unit conversions.\n *\n * ## Physics-First Architecture\n *\n * The game uses a physics-first coordinate system where:\n * - All internal calculations use meters (m) and meters/second (m/s)\n * - Arena sizes are determined by screen resolution (6m, 8m, 10m, 12m, 14m)\n * - Pixel conversion happens only at render time\n * - The pixels-per-meter ratio varies by device/resolution\n *\n * @module types/physicsConstants\n * @category Constants\n * @korean 물리상수\n */\n\n/**\n * Base stamina regeneration rate (stamina per second).\n *\n * **Korean**: 기본 체력 재생 속도\n *\n * This is the base rate at which stamina regenerates when not affected by\n * combat state penalties, breathing disruption, or other modifiers.\n *\n * - Increased from 3 to 15 stamina/second (5x faster) for fluid combat\n * - Allows players to move around and attack frequently without exhaustion\n * - Subject to penalties from breathing disruption (25%-75% reduction)\n * - Subject to combat state penalties (20%-100% reduction when attacking/stunned)\n *\n * @example\n * ```typescript\n * // Calculate stamina regen with breathing disruption\n * const baseRegen = regenRate * BASE_STAMINA_REGEN_RATE;\n * const modifiedRegen = BreathingDisruptionSystem.calculateStaminaRegen(\n * player,\n * baseRegen\n * );\n * ```\n *\n * @category Combat Constants\n * @korean 기본체력재생속도\n */\nexport const BASE_STAMINA_REGEN_RATE = 15.0 as const;\n\n/**\n * Base movement acceleration rate (m/s²).\n *\n * **Korean**: 기본 이동 가속도\n *\n * This is the base rate at which characters accelerate during movement.\n * Used by both MovementPhysics and SpeedModifierSystem for consistency.\n *\n * - Increased from 12.0 to 30.0 m/s² (2.5x faster) for instant-response combat\n * - Reaches 6 m/s walking speed in 0.2 seconds\n * - Reaches 10 m/s sprint speed in 0.33 seconds\n * - Provides arcade-style responsiveness suitable for Korean martial arts combat\n * - Subject to combat state penalties (20%-100% reduction when attacking/stunned)\n *\n * @example\n * ```typescript\n * // Calculate acceleration with combat state penalty\n * const effectiveAcceleration = BASE_MOVEMENT_ACCELERATION * (1 - statePenalty);\n * const velocityChange = effectiveAcceleration * deltaTime;\n * ```\n *\n * @category Physics Constants\n * @korean 기본이동가속도\n */\nexport const BASE_MOVEMENT_ACCELERATION = 30.0 as const;\n\n/**\n * Reference pixels-per-meter ratio for scale calculations.\n *\n * **Korean**: 참조 미터-픽셀 변환\n *\n * This is the REFERENCE ratio used for calculating scale factors.\n * The actual pixels-per-meter varies by device resolution:\n * - Calculate actual ratio: `arenaWidthPixels / arenaWidthMeters`\n * - Calculate scale: `actualRatio / REFERENCE_PIXELS_PER_METER`\n *\n * **Do NOT use this for direct coordinate conversion.**\n * Use `bounds.width / bounds.worldWidthMeters` instead.\n *\n * @example\n * ```typescript\n * // Calculate actual pixels per meter from arena bounds\n * const actualPixelsPerMeter = bounds.width / bounds.worldWidthMeters;\n *\n * // Calculate scale relative to reference\n * const scale = actualPixelsPerMeter / REFERENCE_PIXELS_PER_METER;\n * ```\n *\n * @category Coordinate Constants\n * @korean 참조픽셀미터비율\n */\nexport const REFERENCE_PIXELS_PER_METER = 100 as const;\n\n/**\n * Legacy conversion factor from meters to pixels.\n *\n * **Korean**: 미터-픽셀 변환 인자 (구형)\n *\n * @deprecated Use `bounds.width / bounds.worldWidthMeters` for dynamic conversion.\n * The actual ratio now varies by screen resolution and arena size; this constant\n * is retained for backward compatibility with existing consumers importing\n * `METERS_TO_PIXELS_SCALE` from `blacktrigram/types` and will be removed in a\n * future major release.\n *\n * @category Coordinate Constants\n * @korean 미터-픽셀변환 (구형)\n */\nexport const METERS_TO_PIXELS_SCALE = REFERENCE_PIXELS_PER_METER;\n\n/**\n * Conversion factor from meters to training scene units.\n *\n * **Korean**: 미터-훈련 단위 변환\n *\n * Training scenes are authored in real-world meters and use a 1:1 conversion\n * ratio. This means 1 meter in the game world equals 1 unit in the training\n * scene coordinate system.\n *\n * **IMPORTANT**: This differs from combat AI which uses dynamic pixels-per-meter.\n * The 3D world uses 1:1 meter scale for consistent physics.\n *\n * @example\n * ```typescript\n * // Convert reach from meters to training units (1:1)\n * const reachInUnits = reachInMeters * METERS_TO_TRAINING_UNITS;\n * ```\n *\n * @category Coordinate Constants\n * @korean 미터훈련비율\n */\nexport const METERS_TO_TRAINING_UNITS = 1.0 as const;\n\n/**\n * Default body radius for hit distance calculation (training dummy).\n *\n * **Korean**: 기본몸체반경 (Default Body Radius)\n *\n * When calculating hit distance, we measure center-to-center, but attacks\n * land on the target's body surface, not their center point. This constant\n * represents the default body radius for entities without physical attributes\n * (like training dummies).\n *\n * For player archetypes, use `calculateBodyRadius(physicalAttributes)` from\n * `utils/skeletonScaling.ts` which calculates based on shoulder width.\n *\n * Based on average human proportions:\n * - Average shoulder width: ~45cm\n * - Body depth ratio: 0.5 × shoulderWidth = 22.5cm\n * - Result: ~0.225m (rounded to 0.23m)\n *\n * @example\n * ```typescript\n * // For training dummy (no archetype):\n * const effectiveDistance = centerToCenter - DEFAULT_BODY_RADIUS_METERS;\n *\n * // For player (use archetype):\n * import { calculateBodyRadius } from '@/utils/skeletonScaling';\n * const radius = calculateBodyRadius(physicalAttributes);\n * const effectiveDistance = centerToCenter - radius;\n * ```\n *\n * @category Physics Constants\n * @korean 기본몸체반경\n */\nexport const DEFAULT_BODY_RADIUS_METERS = 0.23 as const;\n\n/**\n * Backwards-compatible alias for the default body radius.\n *\n * **Korean**: 이전호환몸체반경별칭\n *\n * @deprecated Use `DEFAULT_BODY_RADIUS_METERS` or `calculateBodyRadius()` instead.\n * This alias is retained for backward compatibility with existing consumers\n * importing `BODY_RADIUS_METERS` from `blacktrigram/types` and will be removed\n * in a future major release.\n *\n * @category Physics Constants\n * @korean 몸체반경별칭\n */\nexport const BODY_RADIUS_METERS = DEFAULT_BODY_RADIUS_METERS;\n\n/**\n * Standard arena sizes in meters (4:3 aspect ratio).\n *\n */\nexport const ARENA_SIZE_METERS = {\n /** Small screens (< 768px): 6m × 4.5m */\n SMALL: 6,\n /** Medium screens (768-1199px): 8m × 6m */\n MEDIUM: 8,\n /** Large screens (1200-1919px): 10m × 7.5m */\n LARGE: 10,\n /** XLarge screens (1920-2559px): 12m × 9m */\n XLARGE: 12,\n /** Ultra screens (≥ 2560px): 14m × 10.5m */\n ULTRA: 14,\n} as const;\n\n/**\n * Combat ranges in METERS for physics-first system.\n *\n * **Korean**: 전투범위미터 (Combat Ranges in Meters)\n *\n * These values define combat distance thresholds for AI decision-making\n * and hit detection. Use these instead of pixel-based COMBAT_RANGES.\n *\n */\nexport const COMBAT_RANGES_METERS = {\n /** Melee range: very close, grappling distance (0.5m) */\n MELEE: 0.5,\n /** Close range: punching/elbow distance (0.8m) */\n CLOSE: 0.8,\n /** Medium range: kicking distance (1.2m) */\n MEDIUM: 1.2,\n /** Long range: max attack distance (2.0m) */\n LONG: 2.0,\n /** Maximum range: engagement distance (3.0m) */\n MAX: 3.0,\n} as const;\n\n/**\n * AI movement constants in METERS for physics-first system.\n *\n * **Korean**: AI이동상수미터 (AI Movement Constants in Meters)\n *\n */\nexport const AI_MOVEMENT_METERS = {\n /** Step size for AI movement (0.5m per step) */\n STEP_SIZE: 0.5,\n /** Minimum distance threshold to avoid division by zero */\n MIN_DISTANCE_THRESHOLD: 0.05,\n /** Horizontal arena margin (based on character width ~0.6m) */\n ARENA_MARGIN_X: 0.6,\n /** Vertical arena margin (based on character depth ~1.8m for movement) */\n ARENA_MARGIN_Y: 1.8,\n /** Flanking offset base (0.4m) */\n FLANK_OFFSET_BASE: 0.4,\n /** Flanking offset random range (0.2m) */\n FLANK_OFFSET_RANDOM: 0.2,\n} as const;\n\n/**\n * Player starting positions as PERCENTAGES of arena dimensions.\n *\n * **Korean**: 시작위치비율 (Starting Position Ratios)\n *\n * Use these ratios with arena dimensions to calculate starting positions:\n * - playerStartX = arenaX + (arenaWidth * PLAYER_START_POSITIONS.PLAYER1_X)\n *\n */\nexport const PLAYER_START_POSITIONS = {\n /** Player 1 starts at 25% from left edge */\n PLAYER1_X: 0.25,\n /** Player 2 starts at 75% from left edge */\n PLAYER2_X: 0.75,\n /** Both players start at 50% depth (center vertically) */\n CENTER_Y: 0.5,\n} as const;\n\n/**\n * AI personality optimal ranges in METERS.\n *\n * **Korean**: AI성격최적범위미터 (AI Personality Optimal Ranges in Meters)\n *\n */\nexport const AI_OPTIMAL_RANGE_METERS = {\n /** Musa - Traditional warrior: close quarters */\n MUSA: 0.5,\n /** Amsalja - Shadow assassin: stealth melee */\n AMSALJA: 0.4,\n /** Hacker - Cyber warrior: mid-range analysis */\n HACKER: 1.2,\n /** Jeongbo Yowon - Intelligence operative: tactical mid-range */\n JEONGBO_YOWON: 0.8,\n /** Jojik Pokryeokbae - Organized crime: brutal close combat */\n JOJIK: 0.6,\n} as const;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgDA,IAAa,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;AA0BvC,IAAa,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;AA2B1C,IAAa,6BAA6B;;;;;;;;;;;;;;;AAgB1C,IAAa,yBAAA;;;;;;;;;;;;;;;;;;;;;;AAuBb,IAAa,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCxC,IAAa,6BAA6B;;;;;;;;;;;;;;AAe1C,IAAa,qBAAqB;;;;;AAMlC,IAAa,oBAAoB;;CAE/B,OAAO;;CAEP,QAAQ;;CAER,OAAO;;CAEP,QAAQ;;CAER,OAAO;CACR;;;;;;;;;;AAWD,IAAa,uBAAuB;;CAElC,OAAO;;CAEP,OAAO;;CAEP,QAAQ;;CAER,MAAM;;CAEN,KAAK;CACN;;;;;;;AAQD,IAAa,qBAAqB;;CAEhC,WAAW;;CAEX,wBAAwB;;CAExB,gBAAgB;;CAEhB,gBAAgB;;CAEhB,mBAAmB;;CAEnB,qBAAqB;CACtB;;;;;;;;;;AAWD,IAAa,yBAAyB;;CAEpC,WAAW;;CAEX,WAAW;;CAEX,UAAU;CACX;;;;;;;AAQD,IAAa,0BAA0B;;CAErC,MAAM;;CAEN,SAAS;;CAET,QAAQ;;CAER,eAAe;;CAEf,OAAO;CACR"}
1
+ {"version":3,"file":"physicsConstants.js","names":[],"sources":["../../src/types/physicsConstants.ts"],"sourcesContent":["/**\n * Shared physics constants for Black Trigram combat system.\n *\n * **Korean**: 물리 상수\n *\n * This module provides shared constants for physics calculations across\n * combat and training systems, ensuring consistency in coordinate transformations\n * and unit conversions.\n *\n * ## Physics-First Architecture\n *\n * The game uses a physics-first coordinate system where:\n * - All internal calculations use meters (m) and meters/second (m/s)\n * - Arena sizes are determined by screen resolution (6m, 8m, 10m, 12m, 14m)\n * - Pixel conversion happens only at render time\n * - The pixels-per-meter ratio varies by device/resolution\n *\n * @module types/physicsConstants\n * @category Constants\n * @korean 물리상수\n */\n\n/**\n * Base stamina regeneration rate (stamina per second).\n *\n * **Korean**: 기본 체력 재생 속도\n *\n * This is the base rate at which stamina regenerates when not affected by\n * combat state penalties, breathing disruption, or other modifiers.\n *\n * - Increased from 3 to 15 stamina/second (5x faster) for fluid combat\n * - Allows players to move around and attack frequently without exhaustion\n * - Subject to penalties from breathing disruption (25%-75% reduction)\n * - Subject to combat state penalties (20%-100% reduction when attacking/stunned)\n *\n * @example\n * ```typescript\n * // Calculate stamina regen with breathing disruption\n * const baseRegen = regenRate * BASE_STAMINA_REGEN_RATE;\n * const modifiedRegen = BreathingDisruptionSystem.calculateStaminaRegen(\n * player,\n * baseRegen\n * );\n * ```\n *\n * @category Combat Constants\n * @korean 기본체력재생속도\n */\nexport const BASE_STAMINA_REGEN_RATE = 15.0 as const;\n\n/**\n * Base movement acceleration rate (m/s²).\n *\n * **Korean**: 기본 이동 가속도\n *\n * This is the base rate at which characters accelerate during movement.\n * Used by both MovementPhysics and SpeedModifierSystem for consistency.\n *\n * - Increased from 12.0 to 30.0 m/s² (2.5x faster) for instant-response combat\n * - Reaches 6 m/s walking speed in 0.2 seconds\n * - Reaches 10 m/s sprint speed in 0.33 seconds\n * - Provides arcade-style responsiveness suitable for Korean martial arts combat\n * - Subject to combat state penalties (20%-100% reduction when attacking/stunned)\n *\n * @example\n * ```typescript\n * // Calculate acceleration with combat state penalty\n * const effectiveAcceleration = BASE_MOVEMENT_ACCELERATION * (1 - statePenalty);\n * const velocityChange = effectiveAcceleration * deltaTime;\n * ```\n *\n * @category Physics Constants\n * @korean 기본이동가속도\n */\nexport const BASE_MOVEMENT_ACCELERATION = 30.0 as const;\n\n/**\n * Reference pixels-per-meter ratio for scale calculations.\n *\n * **Korean**: 참조 미터-픽셀 변환\n *\n * This is the REFERENCE ratio used for calculating scale factors.\n * The actual pixels-per-meter varies by device resolution:\n * - Calculate actual ratio: `arenaWidthPixels / arenaWidthMeters`\n * - Calculate scale: `actualRatio / REFERENCE_PIXELS_PER_METER`\n *\n * **Do NOT use this for direct coordinate conversion.**\n * Use `bounds.width / bounds.worldWidthMeters` instead.\n *\n * @example\n * ```typescript\n * // Calculate actual pixels per meter from arena bounds\n * const actualPixelsPerMeter = bounds.width / bounds.worldWidthMeters;\n *\n * // Calculate scale relative to reference\n * const scale = actualPixelsPerMeter / REFERENCE_PIXELS_PER_METER;\n * ```\n *\n * @category Coordinate Constants\n * @korean 참조픽셀미터비율\n */\nexport const REFERENCE_PIXELS_PER_METER = 100 as const;\n\n/**\n * Legacy conversion factor from meters to pixels.\n *\n * **Korean**: 미터-픽셀 변환 인자 (구형)\n *\n * @deprecated Use `bounds.width / bounds.worldWidthMeters` for dynamic conversion.\n * The actual ratio now varies by screen resolution and arena size; this constant\n * is retained for backward compatibility with existing consumers importing\n * `METERS_TO_PIXELS_SCALE` from `blacktrigram/types` and will be removed in a\n * future major release.\n *\n * @category Coordinate Constants\n * @korean 미터-픽셀변환 (구형)\n */\nexport const METERS_TO_PIXELS_SCALE = REFERENCE_PIXELS_PER_METER;\n\n/**\n * Conversion factor from meters to training scene units.\n *\n * **Korean**: 미터-훈련 단위 변환\n *\n * Training scenes are authored in real-world meters and use a 1:1 conversion\n * ratio. This means 1 meter in the game world equals 1 unit in the training\n * scene coordinate system.\n *\n * **IMPORTANT**: This differs from combat AI which uses dynamic pixels-per-meter.\n * The 3D world uses 1:1 meter scale for consistent physics.\n *\n * @example\n * ```typescript\n * // Convert reach from meters to training units (1:1)\n * const reachInUnits = reachInMeters * METERS_TO_TRAINING_UNITS;\n * ```\n *\n * @category Coordinate Constants\n * @korean 미터훈련비율\n */\nexport const METERS_TO_TRAINING_UNITS = 1.0 as const;\n\n/**\n * Default body radius for hit distance calculation (training dummy).\n *\n * **Korean**: 기본몸체반경 (Default Body Radius)\n *\n * When calculating hit distance, we measure center-to-center, but attacks\n * land on the target's body surface, not their center point. This constant\n * represents the default body radius for entities without physical attributes\n * (like training dummies).\n *\n * For player archetypes, use `calculateBodyRadius(physicalAttributes)` from\n * `utils/skeletonScaling.ts` which calculates based on shoulder width.\n *\n * Based on average human proportions:\n * - Average shoulder width: ~45cm\n * - Body depth ratio: 0.5 × shoulderWidth = 22.5cm\n * - Result: ~0.225m (rounded to 0.23m)\n *\n * @example\n * ```typescript\n * // For training dummy (no archetype):\n * const effectiveDistance = centerToCenter - DEFAULT_BODY_RADIUS_METERS;\n *\n * // For player (use archetype):\n * import { calculateBodyRadius } from '@/utils/skeletonScaling';\n * const radius = calculateBodyRadius(physicalAttributes);\n * const effectiveDistance = centerToCenter - radius;\n * ```\n *\n * @category Physics Constants\n * @korean 기본몸체반경\n */\nexport const DEFAULT_BODY_RADIUS_METERS = 0.23 as const;\n\n/**\n * Backwards-compatible alias for the default body radius.\n *\n * **Korean**: 이전호환몸체반경별칭\n *\n * @deprecated Use `DEFAULT_BODY_RADIUS_METERS` or `calculateBodyRadius()` instead.\n * This alias is retained for backward compatibility with existing consumers\n * importing `BODY_RADIUS_METERS` from `blacktrigram/types` and will be removed\n * in a future major release.\n *\n * @category Physics Constants\n * @korean 몸체반경별칭\n */\nexport const BODY_RADIUS_METERS = DEFAULT_BODY_RADIUS_METERS;\n\n/**\n * Standard arena sizes in meters (4:3 aspect ratio).\n *\n */\nexport const ARENA_SIZE_METERS = {\n /** Small screens (< 768px): 6m × 4.5m */\n SMALL: 6,\n /** Medium screens (768-1199px): 8m × 6m */\n MEDIUM: 8,\n /** Large screens (1200-1919px): 10m × 7.5m */\n LARGE: 10,\n /** XLarge screens (1920-2559px): 12m × 9m */\n XLARGE: 12,\n /** Ultra screens (≥ 2560px): 14m × 10.5m */\n ULTRA: 14,\n} as const;\n\n/**\n * Combat ranges in METERS for physics-first system.\n *\n * **Korean**: 전투범위미터 (Combat Ranges in Meters)\n *\n * These values define combat distance thresholds for AI decision-making\n * and hit detection. Use these instead of pixel-based COMBAT_RANGES.\n *\n */\nexport const COMBAT_RANGES_METERS = {\n /** Melee range: very close, grappling distance (0.5m) */\n MELEE: 0.5,\n /** Close range: punching/elbow distance (0.8m) */\n CLOSE: 0.8,\n /** Medium range: kicking distance (1.2m) */\n MEDIUM: 1.2,\n /** Long range: max attack distance (2.0m) */\n LONG: 2.0,\n /** Maximum range: engagement distance (3.0m) */\n MAX: 3.0,\n} as const;\n\n/**\n * AI movement constants in METERS for physics-first system.\n *\n * **Korean**: AI이동상수미터 (AI Movement Constants in Meters)\n *\n */\nexport const AI_MOVEMENT_METERS = {\n /** Step size for AI movement (0.5m per step) */\n STEP_SIZE: 0.5,\n /** Minimum distance threshold to avoid division by zero */\n MIN_DISTANCE_THRESHOLD: 0.05,\n /** Horizontal arena margin (based on character width ~0.6m) */\n ARENA_MARGIN_X: 0.6,\n /** Vertical arena margin (based on character depth ~1.8m for movement) */\n ARENA_MARGIN_Y: 1.8,\n /** Flanking offset base (0.4m) */\n FLANK_OFFSET_BASE: 0.4,\n /** Flanking offset random range (0.2m) */\n FLANK_OFFSET_RANDOM: 0.2,\n} as const;\n\n/**\n * Player starting positions as PERCENTAGES of arena dimensions.\n *\n * **Korean**: 시작위치비율 (Starting Position Ratios)\n *\n * Use these ratios with arena dimensions to calculate starting positions:\n * - playerStartX = arenaX + (arenaWidth * PLAYER_START_POSITIONS.PLAYER1_X)\n *\n */\nexport const PLAYER_START_POSITIONS = {\n /** Player 1 starts at 25% from left edge */\n PLAYER1_X: 0.25,\n /** Player 2 starts at 75% from left edge */\n PLAYER2_X: 0.75,\n /** Both players start at 50% depth (center vertically) */\n CENTER_Y: 0.5,\n} as const;\n\n/**\n * AI personality optimal ranges in METERS.\n *\n * **Korean**: AI성격최적범위미터 (AI Personality Optimal Ranges in Meters)\n *\n */\nexport const AI_OPTIMAL_RANGE_METERS = {\n /** Musa - Traditional warrior: close quarters */\n MUSA: 0.5,\n /** Amsalja - Shadow assassin: stealth melee */\n AMSALJA: 0.4,\n /** Hacker - Cyber warrior: mid-range analysis */\n HACKER: 1.2,\n /** Jeongbo Yowon - Intelligence operative: tactical mid-range */\n JEONGBO_YOWON: 0.8,\n /** Jojik Pokryeokbae - Organized crime: brutal close combat */\n JOJIK: 0.6,\n} as const;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgDA,IAAa,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;AA0BvC,IAAa,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;AA2B1C,IAAa,6BAA6B;;;;;;;;;;;;;;;AAgB1C,IAAa,yBAAA;;;;;;;;;;;;;;;;;;;;;;AAuBb,IAAa,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCxC,IAAa,6BAA6B;;;;;;;;;;;;;;AAe1C,IAAa,qBAAqB;;;;;AAMlC,IAAa,oBAAoB;;CAE/B,OAAO;;CAEP,QAAQ;;CAER,OAAO;;CAEP,QAAQ;;CAER,OAAO;AACT;;;;;;;;;;AAWA,IAAa,uBAAuB;;CAElC,OAAO;;CAEP,OAAO;;CAEP,QAAQ;;CAER,MAAM;;CAEN,KAAK;AACP;;;;;;;AAQA,IAAa,qBAAqB;;CAEhC,WAAW;;CAEX,wBAAwB;;CAExB,gBAAgB;;CAEhB,gBAAgB;;CAEhB,mBAAmB;;CAEnB,qBAAqB;AACvB;;;;;;;;;;AAWA,IAAa,yBAAyB;;CAEpC,WAAW;;CAEX,WAAW;;CAEX,UAAU;AACZ;;;;;;;AAQA,IAAa,0BAA0B;;CAErC,MAAM;;CAEN,SAAS;;CAET,QAAQ;;CAER,eAAe;;CAEf,OAAO;AACT"}
@@ -26,7 +26,7 @@ export type BalanceState = "READY" | "SHAKEN" | "VULNERABLE" | "HELPLESS";
26
26
  * @category Animation
27
27
  * @korean 애니메이션상태
28
28
  */
29
- export type PlayerAnimation = "idle" | "attack" | "defend" | "hit" | "stance_change" | "technique_execute" | "walk" | "run" | "block" | "counter" | "death" | "fall_forward" | "fall_backward" | "fall_side_left" | "fall_side_right" | "step_forward" | "step_back" | "step_left" | "step_right" | "step_forward_left" | "step_forward_right" | "step_back_left" | "step_back_right" | "stance_geon" | "stance_tae" | "stance_li" | "stance_jin" | "stance_son" | "stance_gam" | "stance_gan" | "stance_gon";
29
+ export type PlayerAnimation = "idle" | "attack" | "defend" | "hit" | "stance_change" | "stance_side_switch" | "technique_execute" | "walk" | "run" | "block" | "counter" | "death" | "fall_forward" | "fall_backward" | "fall_side_left" | "fall_side_right" | "step_forward" | "step_back" | "step_left" | "step_right" | "step_forward_left" | "step_forward_right" | "step_back_left" | "step_back_right" | "stance_geon" | "stance_tae" | "stance_li" | "stance_jin" | "stance_son" | "stance_gam" | "stance_gan" | "stance_gon";
30
30
  /**
31
31
  * Unified props for Player3D visual component.
32
32
  *
@@ -1 +1 @@
1
- {"version":3,"file":"player-visual.d.ts","sourceRoot":"","sources":["../../src/types/player-visual.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEpE;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,YAAY,GAAG,UAAU,CAAC;AAE1E;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GACvB,MAAM,GACN,QAAQ,GACR,QAAQ,GACR,KAAK,GACL,eAAe,GACf,mBAAmB,GACnB,MAAM,GACN,KAAK,GACL,OAAO,GACP,SAAS,GACT,OAAO,GAEP,cAAc,GACd,eAAe,GACf,gBAAgB,GAChB,iBAAiB,GACjB,cAAc,GACd,WAAW,GACX,WAAW,GACX,YAAY,GACZ,mBAAmB,GACnB,oBAAoB,GACpB,gBAAgB,GAChB,iBAAiB,GAEjB,aAAa,GACb,YAAY,GACZ,WAAW,GACX,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,YAAY,CAAC;AAEjB;;;;;;;;GAQG;AACH,MAAM,WAAW,oBAAoB;IACnC,sDAAsD;IACtD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,uEAAuE;IACvE,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;IACpC,mDAAmD;IACnD,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACvC,6CAA6C;IAC7C,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,8CAA8C;IAC9C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,qDAAqD;IACrD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,yCAAyC;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,gDAAgD;IAChD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qDAAqD;IACrD,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,6CAA6C;IAC7C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,2CAA2C;IAC3C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,uDAAuD;IACvD,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,2CAA2C;IAC3C,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,+CAA+C;IAC/C,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,8CAA8C;IAC9C,QAAQ,CAAC,gBAAgB,EAAE,eAAe,CAAC;IAC3C,wDAAwD;IACxD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,CAAC,EAAE;QACd,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,6DAA6D;IAC7D,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,6DAA6D;IAC7D,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,gDAAgD;IAChD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACnC,+CAA+C;IAC/C,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,uDAAuD;IACvD,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IACvC,0DAA0D;IAC1D,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1C,6CAA6C;IAC7C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IAC7C,uCAAuC;IACvC,QAAQ,CAAC,YAAY,CAAC,EAAE,iBAAiB,CAAC;IAC1C,wDAAwD;IACxD,QAAQ,CAAC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAC3C,mDAAmD;IACnD,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IACrC,sDAAsD;IACtD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACrD,uEAAuE;IACvE,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IACjC,8DAA8D;IAC9D,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;CAChE;AAED;;;;;GAKG;AACH,MAAM,WAAW,0BAA0B;IACzC,8CAA8C;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,kCAAkC;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,yCAAyC;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,mCAAmC;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,iCAAiC;IACjC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,6CAA6C;IAC7C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,oCAAoC;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,oCAAoC;IACpC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,2CAA2C;IAC3C,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,wCAAwC;IACxC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,0DAA0D;IAC1D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,kDAAkD;IAClD,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B"}
1
+ {"version":3,"file":"player-visual.d.ts","sourceRoot":"","sources":["../../src/types/player-visual.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEpE;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,YAAY,GAAG,UAAU,CAAC;AAE1E;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GACvB,MAAM,GACN,QAAQ,GACR,QAAQ,GACR,KAAK,GACL,eAAe,GACf,oBAAoB,GACpB,mBAAmB,GACnB,MAAM,GACN,KAAK,GACL,OAAO,GACP,SAAS,GACT,OAAO,GAEP,cAAc,GACd,eAAe,GACf,gBAAgB,GAChB,iBAAiB,GACjB,cAAc,GACd,WAAW,GACX,WAAW,GACX,YAAY,GACZ,mBAAmB,GACnB,oBAAoB,GACpB,gBAAgB,GAChB,iBAAiB,GAEjB,aAAa,GACb,YAAY,GACZ,WAAW,GACX,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,YAAY,CAAC;AAEjB;;;;;;;;GAQG;AACH,MAAM,WAAW,oBAAoB;IACnC,sDAAsD;IACtD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,uEAAuE;IACvE,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;IACpC,mDAAmD;IACnD,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACvC,6CAA6C;IAC7C,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,8CAA8C;IAC9C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,qDAAqD;IACrD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,yCAAyC;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,gDAAgD;IAChD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qDAAqD;IACrD,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,6CAA6C;IAC7C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,2CAA2C;IAC3C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,uDAAuD;IACvD,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,2CAA2C;IAC3C,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,+CAA+C;IAC/C,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,8CAA8C;IAC9C,QAAQ,CAAC,gBAAgB,EAAE,eAAe,CAAC;IAC3C,wDAAwD;IACxD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,CAAC,EAAE;QACd,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,6DAA6D;IAC7D,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,6DAA6D;IAC7D,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,gDAAgD;IAChD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACnC,+CAA+C;IAC/C,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,uDAAuD;IACvD,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IACvC,0DAA0D;IAC1D,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1C,6CAA6C;IAC7C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IAC7C,uCAAuC;IACvC,QAAQ,CAAC,YAAY,CAAC,EAAE,iBAAiB,CAAC;IAC1C,wDAAwD;IACxD,QAAQ,CAAC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAC3C,mDAAmD;IACnD,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IACrC,sDAAsD;IACtD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACrD,uEAAuE;IACvE,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IACjC,8DAA8D;IAC9D,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;CAChE;AAED;;;;;GAKG;AACH,MAAM,WAAW,0BAA0B;IACzC,8CAA8C;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,kCAAkC;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,yCAAyC;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,mCAAmC;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,iCAAiC;IACjC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,6CAA6C;IAC7C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,oCAAoC;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,oCAAoC;IACpC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,2CAA2C;IAC3C,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,wCAAwC;IACxC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,0DAA0D;IAC1D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,kDAAkD;IAClD,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B"}