blacktrigram 0.7.10 → 0.7.12

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 (431) hide show
  1. package/lib/App2.js +2 -3
  2. package/lib/App2.js.map +1 -1
  3. package/lib/assets/index.css +94 -94
  4. package/lib/components/index.d.ts +9 -0
  5. package/lib/components/index.d.ts.map +1 -1
  6. package/lib/components/index.js +8 -3
  7. package/lib/components/index.js.map +1 -1
  8. package/lib/components/screens/combat/CombatScreen3D.js +1 -9
  9. package/lib/components/screens/combat/CombatScreen3D.js.map +1 -1
  10. package/lib/components/screens/combat/components/controls/PauseMenu.js +1 -1
  11. package/lib/components/screens/combat/components/effects/BloodDecals3D.js +0 -1
  12. package/lib/components/screens/combat/components/effects/BloodDecals3D.js.map +1 -1
  13. package/lib/components/screens/combat/components/effects/BloodLossOverlayHtml.js +0 -1
  14. package/lib/components/screens/combat/components/effects/BloodLossOverlayHtml.js.map +1 -1
  15. package/lib/components/screens/combat/components/effects/BloodParticles3D.js +0 -1
  16. package/lib/components/screens/combat/components/effects/BloodParticles3D.js.map +1 -1
  17. package/lib/components/screens/combat/components/effects/PainVignette.js +0 -1
  18. package/lib/components/screens/combat/components/effects/PainVignette.js.map +1 -1
  19. package/lib/components/screens/combat/components/effects/TraumaOverlay3D.js +0 -1
  20. package/lib/components/screens/combat/components/effects/TraumaOverlay3D.js.map +1 -1
  21. package/lib/components/screens/combat/components/hud/DifficultyIndicator.js +0 -1
  22. package/lib/components/screens/combat/components/hud/DifficultyIndicator.js.map +1 -1
  23. package/lib/components/screens/combat/components/hud/MobileControlsWrapper.js +0 -1
  24. package/lib/components/screens/combat/components/hud/MobileControlsWrapper.js.map +1 -1
  25. package/lib/components/screens/combat/hooks/useAICombat.js +0 -3
  26. package/lib/components/screens/combat/hooks/useAICombat.js.map +1 -1
  27. package/lib/components/screens/combat/hooks/useCombatActions.js +2 -7
  28. package/lib/components/screens/combat/hooks/useCombatActions.js.map +1 -1
  29. package/lib/components/screens/combat/hooks/useCombatAttackMovement.js +0 -1
  30. package/lib/components/screens/combat/hooks/useCombatAttackMovement.js.map +1 -1
  31. package/lib/components/screens/controls/ControlsScreen3D.js +0 -3
  32. package/lib/components/screens/controls/ControlsScreen3D.js.map +1 -1
  33. package/lib/components/screens/controls/components/ControlBindingsOverlayHtml.js +0 -1
  34. package/lib/components/screens/controls/components/ControlBindingsOverlayHtml.js.map +1 -1
  35. package/lib/components/screens/controls/components/GamepadVisualization3D.js +0 -1
  36. package/lib/components/screens/controls/components/GamepadVisualization3D.js.map +1 -1
  37. package/lib/components/screens/controls/components/InteractiveControlDemoOverlayHtml.js +0 -1
  38. package/lib/components/screens/controls/components/InteractiveControlDemoOverlayHtml.js.map +1 -1
  39. package/lib/components/screens/controls/components/Key3D.js +0 -1
  40. package/lib/components/screens/controls/components/Key3D.js.map +1 -1
  41. package/lib/components/screens/endscreen/components/DefeatAnimation3D.js +0 -1
  42. package/lib/components/screens/endscreen/components/DefeatAnimation3D.js.map +1 -1
  43. package/lib/components/screens/endscreen/components/MatchStatisticsDisplayOverlayHtml.js +0 -1
  44. package/lib/components/screens/endscreen/components/MatchStatisticsDisplayOverlayHtml.js.map +1 -1
  45. package/lib/components/screens/endscreen/components/PerformanceBreakdownOverlayHtml.js +0 -1
  46. package/lib/components/screens/endscreen/components/PerformanceBreakdownOverlayHtml.js.map +1 -1
  47. package/lib/components/screens/endscreen/components/VictoryAnimation3D.js +0 -1
  48. package/lib/components/screens/endscreen/components/VictoryAnimation3D.js.map +1 -1
  49. package/lib/components/screens/intro/IntroScreen3D.js +1 -2
  50. package/lib/components/screens/intro/IntroScreen3D.js.map +1 -1
  51. package/lib/components/screens/intro/components/AbilityListOverlayHtml.js +0 -1
  52. package/lib/components/screens/intro/components/AbilityListOverlayHtml.js.map +1 -1
  53. package/lib/components/screens/intro/components/ArchetypeCardGridOverlayHtml.js +0 -1
  54. package/lib/components/screens/intro/components/ArchetypeCardGridOverlayHtml.js.map +1 -1
  55. package/lib/components/screens/intro/components/MenuButtonsOverlayHtml.js +0 -1
  56. package/lib/components/screens/intro/components/MenuButtonsOverlayHtml.js.map +1 -1
  57. package/lib/components/screens/intro/components/MenuSectionOverlayHtml.js +0 -1
  58. package/lib/components/screens/intro/components/MenuSectionOverlayHtml.js.map +1 -1
  59. package/lib/components/screens/intro/components/StatBarOverlayHtml.js +0 -1
  60. package/lib/components/screens/intro/components/StatBarOverlayHtml.js.map +1 -1
  61. package/lib/components/screens/philosophy/PhilosophyScreen3D.js +0 -2
  62. package/lib/components/screens/philosophy/PhilosophyScreen3D.js.map +1 -1
  63. package/lib/components/screens/training/TrainingScreen3D.js +1 -8
  64. package/lib/components/screens/training/TrainingScreen3D.js.map +1 -1
  65. package/lib/components/screens/training/components/AnatomyControlsOverlayHtml.js +0 -1
  66. package/lib/components/screens/training/components/AnatomyControlsOverlayHtml.js.map +1 -1
  67. package/lib/components/screens/training/components/AnatomyOverlay3D.js +0 -1
  68. package/lib/components/screens/training/components/AnatomyOverlay3D.js.map +1 -1
  69. package/lib/components/screens/training/components/FootPlacementMarkers3D.js +0 -1
  70. package/lib/components/screens/training/components/FootPlacementMarkers3D.js.map +1 -1
  71. package/lib/components/screens/training/components/FootworkDrillsOverlayHtml.js +0 -1
  72. package/lib/components/screens/training/components/FootworkDrillsOverlayHtml.js.map +1 -1
  73. package/lib/components/screens/training/components/HitFeedbackEffect3D.js +0 -1
  74. package/lib/components/screens/training/components/HitFeedbackEffect3D.js.map +1 -1
  75. package/lib/components/screens/training/components/TrainingControlsOverlayHtml.js +0 -1
  76. package/lib/components/screens/training/components/TrainingControlsOverlayHtml.js.map +1 -1
  77. package/lib/components/screens/training/components/TrainingDummy3D.js +0 -1
  78. package/lib/components/screens/training/components/TrainingDummy3D.js.map +1 -1
  79. package/lib/components/screens/training/components/TrainingFeedbackOverlayHtml.js +0 -1
  80. package/lib/components/screens/training/components/TrainingFeedbackOverlayHtml.js.map +1 -1
  81. package/lib/components/screens/training/components/TrainingModeSelectorOverlayHtml.js +0 -1
  82. package/lib/components/screens/training/components/TrainingModeSelectorOverlayHtml.js.map +1 -1
  83. package/lib/components/screens/training/components/TrainingStatsOverlayHtml.js +0 -1
  84. package/lib/components/screens/training/components/TrainingStatsOverlayHtml.js.map +1 -1
  85. package/lib/components/screens/training/components/VitalPointMarker3D.js +0 -1
  86. package/lib/components/screens/training/components/VitalPointMarker3D.js.map +1 -1
  87. package/lib/components/screens/training/components/VitalPointTrainingOverlayHtml.js +0 -1
  88. package/lib/components/screens/training/components/VitalPointTrainingOverlayHtml.js.map +1 -1
  89. package/lib/components/screens/training/hooks/useAttackMovement.js +0 -1
  90. package/lib/components/screens/training/hooks/useAttackMovement.js.map +1 -1
  91. package/lib/components/screens/training/hooks/useTrainingActions.js +1 -3
  92. package/lib/components/screens/training/hooks/useTrainingActions.js.map +1 -1
  93. package/lib/components/shared/base/BaseButton.js +0 -1
  94. package/lib/components/shared/base/BaseButton.js.map +1 -1
  95. package/lib/components/shared/base/BaseText.js +0 -1
  96. package/lib/components/shared/base/BaseText.js.map +1 -1
  97. package/lib/components/shared/base/useKoreanTheme.js +0 -1
  98. package/lib/components/shared/base/useKoreanTheme.js.map +1 -1
  99. package/lib/components/shared/debug/PerformanceDebugOverlayHtml.js +0 -2
  100. package/lib/components/shared/debug/PerformanceDebugOverlayHtml.js.map +1 -1
  101. package/lib/components/shared/mobile/ActionButtons.js +1 -2
  102. package/lib/components/shared/mobile/ActionButtons.js.map +1 -1
  103. package/lib/components/shared/mobile/GestureRecognizerPure.js +0 -1
  104. package/lib/components/shared/mobile/GestureRecognizerPure.js.map +1 -1
  105. package/lib/components/shared/mobile/HapticController.js +1 -1
  106. package/lib/components/shared/mobile/MobileControlsPure.js +0 -1
  107. package/lib/components/shared/mobile/MobileControlsPure.js.map +1 -1
  108. package/lib/components/shared/mobile/StanceWheelPure.js +1 -2
  109. package/lib/components/shared/mobile/StanceWheelPure.js.map +1 -1
  110. package/lib/components/shared/mobile/VirtualDPad.js +1 -2
  111. package/lib/components/shared/mobile/VirtualDPad.js.map +1 -1
  112. package/lib/components/shared/three/anatomy/BoneAttachedMuscles.js +1 -2
  113. package/lib/components/shared/three/anatomy/BoneAttachedMuscles.js.map +1 -1
  114. package/lib/components/shared/three/anatomy/BoneRenderer.js +0 -1
  115. package/lib/components/shared/three/anatomy/BoneRenderer.js.map +1 -1
  116. package/lib/components/shared/three/anatomy/Face3D.js +0 -1
  117. package/lib/components/shared/three/anatomy/Face3D.js.map +1 -1
  118. package/lib/components/shared/three/anatomy/Foot3D.js +0 -1
  119. package/lib/components/shared/three/anatomy/Foot3D.js.map +1 -1
  120. package/lib/components/shared/three/anatomy/Hand3D.js +0 -1
  121. package/lib/components/shared/three/anatomy/Hand3D.js.map +1 -1
  122. package/lib/components/shared/three/effects/ActionFeedback.js +0 -1
  123. package/lib/components/shared/three/effects/ActionFeedback.js.map +1 -1
  124. package/lib/components/shared/three/effects/DamageNumbers.js +0 -1
  125. package/lib/components/shared/three/effects/DamageNumbers.js.map +1 -1
  126. package/lib/components/shared/three/effects/HitEffects3D.js +1 -2
  127. package/lib/components/shared/three/effects/HitEffects3D.js.map +1 -1
  128. package/lib/components/shared/three/effects/PlayerStateIndicators.js +0 -1
  129. package/lib/components/shared/three/effects/PlayerStateIndicators.js.map +1 -1
  130. package/lib/components/shared/three/effects/StanceSymbol3D.js +0 -1
  131. package/lib/components/shared/three/effects/StanceSymbol3D.js.map +1 -1
  132. package/lib/components/shared/three/effects/StanceTransitionEffect.js +0 -1
  133. package/lib/components/shared/three/effects/StanceTransitionEffect.js.map +1 -1
  134. package/lib/components/shared/three/effects/VitalPointMarkers3D.js +0 -1
  135. package/lib/components/shared/three/effects/VitalPointMarkers3D.js.map +1 -1
  136. package/lib/components/shared/three/indicators/GuardIndicator.js +0 -2
  137. package/lib/components/shared/three/indicators/GuardIndicator.js.map +1 -1
  138. package/lib/components/shared/three/indicators/StanceChangeIndicator.js +0 -1
  139. package/lib/components/shared/three/indicators/StanceChangeIndicator.js.map +1 -1
  140. package/lib/components/shared/three/models/SkeletalPlayer3D.js +1 -3
  141. package/lib/components/shared/three/models/SkeletalPlayer3D.js.map +1 -1
  142. package/lib/components/shared/three/optimization/AdaptiveQuality.js +1 -1
  143. package/lib/components/shared/three/scene/BackgroundScene3D.js +0 -1
  144. package/lib/components/shared/three/scene/BackgroundScene3D.js.map +1 -1
  145. package/lib/components/shared/three/scene/CombatArena3D.js +0 -1
  146. package/lib/components/shared/three/scene/CombatArena3D.js.map +1 -1
  147. package/lib/components/shared/three/scene/KoreanSignage3D.js +0 -1
  148. package/lib/components/shared/three/scene/KoreanSignage3D.js.map +1 -1
  149. package/lib/components/shared/three/ui/ArchetypeCard.js +0 -1
  150. package/lib/components/shared/three/ui/ArchetypeCard.js.map +1 -1
  151. package/lib/components/shared/three/ui/BodyPartHealthDisplay.js +5 -6
  152. package/lib/components/shared/three/ui/BodyPartHealthDisplay.js.map +1 -1
  153. package/lib/components/shared/three/ui/BreathingIndicator2.js +3 -4
  154. package/lib/components/shared/three/ui/BreathingIndicator2.js.map +1 -1
  155. package/lib/components/shared/three/ui/CombatReadinessBar.js +0 -1
  156. package/lib/components/shared/three/ui/CombatReadinessBar.js.map +1 -1
  157. package/lib/components/shared/three/ui/ComboCounter.js +0 -1
  158. package/lib/components/shared/three/ui/ComboCounter.js.map +1 -1
  159. package/lib/components/shared/three/ui/HealthBar.js +0 -1
  160. package/lib/components/shared/three/ui/HealthBar.js.map +1 -1
  161. package/lib/components/shared/three/ui/KoreanButton.js +0 -1
  162. package/lib/components/shared/three/ui/KoreanButton.js.map +1 -1
  163. package/lib/components/shared/three/ui/KoreanPanel.js +0 -1
  164. package/lib/components/shared/three/ui/KoreanPanel.js.map +1 -1
  165. package/lib/components/shared/three/ui/KoreanText.js +0 -1
  166. package/lib/components/shared/three/ui/KoreanText.js.map +1 -1
  167. package/lib/components/shared/three/ui/MenuList.js +0 -1
  168. package/lib/components/shared/three/ui/MenuList.js.map +1 -1
  169. package/lib/components/shared/three/ui/ProgressBar.js +0 -1
  170. package/lib/components/shared/three/ui/ProgressBar.js.map +1 -1
  171. package/lib/components/shared/three/ui/SpeedIndicatorHUD.js +0 -1
  172. package/lib/components/shared/three/ui/SpeedIndicatorHUD.js.map +1 -1
  173. package/lib/components/shared/three/ui/StaminaBar.js +0 -1
  174. package/lib/components/shared/three/ui/StaminaBar.js.map +1 -1
  175. package/lib/components/shared/three/ui/TechniqueCard.d.ts.map +1 -1
  176. package/lib/components/shared/three/ui/TechniqueCard.js +27 -33
  177. package/lib/components/shared/three/ui/TechniqueCard.js.map +1 -1
  178. package/lib/components/shared/three/ui/VitalPointOverlayControlsHtml.d.ts.map +1 -1
  179. package/lib/components/shared/three/ui/VitalPointOverlayControlsHtml.js +57 -60
  180. package/lib/components/shared/three/ui/VitalPointOverlayControlsHtml.js.map +1 -1
  181. package/lib/components/shared/ui/BaseHUDContainer.js +0 -1
  182. package/lib/components/shared/ui/BaseHUDContainer.js.map +1 -1
  183. package/lib/components/shared/ui/CombatTimer.js +0 -1
  184. package/lib/components/shared/ui/CombatTimer.js.map +1 -1
  185. package/lib/components/shared/ui/ErrorModal.js +0 -2
  186. package/lib/components/shared/ui/ErrorModal.js.map +1 -1
  187. package/lib/components/shared/ui/SplashScreen.js +10 -11
  188. package/lib/components/shared/ui/SplashScreen.js.map +1 -1
  189. package/lib/components/shared/ui/VitalPointOverlayControlsPure.d.ts.map +1 -1
  190. package/lib/components/shared/ui/VitalPointOverlayControlsPure.js +57 -63
  191. package/lib/components/shared/ui/VitalPointOverlayControlsPure.js.map +1 -1
  192. package/lib/components/shared/ui/VolumeControl.js +7 -8
  193. package/lib/components/shared/ui/VolumeControl.js.map +1 -1
  194. package/lib/components/shared/ui/shared/ConfirmDialog.js +0 -2
  195. package/lib/components/shared/ui/shared/ConfirmDialog.js.map +1 -1
  196. package/lib/components/ui/combat/BalanceIndicatorOverlayHtml.js +0 -1
  197. package/lib/components/ui/combat/BalanceIndicatorOverlayHtml.js.map +1 -1
  198. package/lib/data/archetypeClothing.js +0 -1
  199. package/lib/data/archetypeClothing.js.map +1 -1
  200. package/lib/data/archetypePhysicalAttributes.js +0 -1
  201. package/lib/data/archetypePhysicalAttributes.js.map +1 -1
  202. package/lib/data/techniqueMappings.js +1 -1
  203. package/lib/data/techniques.js +0 -1
  204. package/lib/data/techniques.js.map +1 -1
  205. package/lib/hooks/index.js +1 -1
  206. package/lib/hooks/useHandPoseTransitions.js +0 -1
  207. package/lib/hooks/useHandPoseTransitions.js.map +1 -1
  208. package/lib/hooks/useMuscleActivation.js +1 -2
  209. package/lib/hooks/useMuscleActivation.js.map +1 -1
  210. package/lib/hooks/usePlayerAnimation.js +0 -1
  211. package/lib/hooks/usePlayerAnimation.js.map +1 -1
  212. package/lib/hooks/useSkeletalAnimation.js +0 -1
  213. package/lib/hooks/useSkeletalAnimation.js.map +1 -1
  214. package/lib/index.js +27 -1
  215. package/lib/systems/CombatSystem.js +1 -6
  216. package/lib/systems/CombatSystem.js.map +1 -1
  217. package/lib/systems/TrigramSystem.js +0 -1
  218. package/lib/systems/TrigramSystem.js.map +1 -1
  219. package/lib/systems/ai/AIPersonality.js +0 -1
  220. package/lib/systems/ai/AIPersonality.js.map +1 -1
  221. package/lib/systems/ai/ArchetypeEnforcer.js +0 -1
  222. package/lib/systems/ai/ArchetypeEnforcer.js.map +1 -1
  223. package/lib/systems/ai/ComboSystem.js +0 -2
  224. package/lib/systems/ai/ComboSystem.js.map +1 -1
  225. package/lib/systems/ai/DecisionTree.js +0 -1
  226. package/lib/systems/ai/DecisionTree.js.map +1 -1
  227. package/lib/systems/ai/TrainingAI.js +0 -1
  228. package/lib/systems/ai/TrainingAI.js.map +1 -1
  229. package/lib/systems/animation/builders/AnimationBuilder.js +0 -1
  230. package/lib/systems/animation/builders/AnimationBuilder.js.map +1 -1
  231. package/lib/systems/animation/builders/HandPoses.js +1 -1
  232. package/lib/systems/animation/builders/KoreanGuardPositions.js +157 -238
  233. package/lib/systems/animation/builders/KoreanGuardPositions.js.map +1 -1
  234. package/lib/systems/animation/builders/SkeletonRig.js +1 -1
  235. package/lib/systems/animation/catalogs/AttackAnimations.js +1 -1
  236. package/lib/systems/animation/catalogs/BasicAnimations.js +1 -1
  237. package/lib/systems/animation/catalogs/ComboAnimations.js +1 -1
  238. package/lib/systems/animation/catalogs/DarkOpsAnimations.js +1 -1
  239. package/lib/systems/animation/catalogs/DefensiveAnimations.js +1 -1
  240. package/lib/systems/animation/catalogs/ElbowKneeAnimations.js +1 -1
  241. package/lib/systems/animation/catalogs/FootworkSkeletalAnimations.js +1 -1
  242. package/lib/systems/animation/catalogs/GanStanceAnimations.js +1 -1
  243. package/lib/systems/animation/catalogs/GeonStanceAnimations.js +1 -1
  244. package/lib/systems/animation/catalogs/GrapplingAnimations.js +1 -1
  245. package/lib/systems/animation/catalogs/KickAnimations.js +1 -1
  246. package/lib/systems/animation/catalogs/LiStanceAnimations.js +0 -1
  247. package/lib/systems/animation/catalogs/LiStanceAnimations.js.map +1 -1
  248. package/lib/systems/animation/catalogs/MovementAnimations.js +1 -1
  249. package/lib/systems/animation/catalogs/PunchAnimations.js +1 -1
  250. package/lib/systems/animation/catalogs/RecoveryAnimations.js +1 -1
  251. package/lib/systems/animation/catalogs/StanceAnimations.js +1 -1
  252. package/lib/systems/animation/catalogs/StanceAttackAnimations.js +1 -1
  253. package/lib/systems/animation/catalogs/StanceIdleAnimations.js +1 -1
  254. package/lib/systems/animation/catalogs/StanceLocomotionAnimations.js +1 -1
  255. package/lib/systems/animation/catalogs/StepSkeletalAnimations.js +1 -1
  256. package/lib/systems/animation/catalogs/TaeStanceAnimations.js +1 -1
  257. package/lib/systems/animation/core/AnimationHitTiming.js +1 -2
  258. package/lib/systems/animation/core/AnimationHitTiming.js.map +1 -1
  259. package/lib/systems/animation/core/AnimationOptimizations.js +1 -1
  260. package/lib/systems/animation/core/AnimationPriority.js +1 -1
  261. package/lib/systems/animation/core/AnimationRegistry.js +0 -2
  262. package/lib/systems/animation/core/AnimationRegistry.js.map +1 -1
  263. package/lib/systems/animation/core/AnimationTransitions.js +1 -1
  264. package/lib/systems/animation/core/TechniqueAnimationMapper.js +1 -2
  265. package/lib/systems/animation/core/TechniqueAnimationMapper.js.map +1 -1
  266. package/lib/systems/animation/core/TechniqueAnimationMapping.js +0 -1
  267. package/lib/systems/animation/core/TechniqueAnimationMapping.js.map +1 -1
  268. package/lib/systems/animation/systems/AdvancedJointMovements.js +1 -1
  269. package/lib/systems/animation/systems/BodyFacingSystem.js +1 -1
  270. package/lib/systems/animation/systems/MuscleActivation.js +1 -1
  271. package/lib/systems/bodypart/BodyPartDamageIntegration.js +177 -2
  272. package/lib/systems/bodypart/BodyPartDamageIntegration.js.map +1 -1
  273. package/lib/systems/bodypart/BodyPartHealthSystem.js +0 -1
  274. package/lib/systems/bodypart/BodyPartHealthSystem.js.map +1 -1
  275. package/lib/systems/bodypart/BodyPartPositionMapping.js +50 -1
  276. package/lib/systems/bodypart/BodyPartPositionMapping.js.map +1 -1
  277. package/lib/systems/bodypart/CombatInjuryIntegration.js +15 -2
  278. package/lib/systems/bodypart/CombatInjuryIntegration.js.map +1 -1
  279. package/lib/systems/bodypart/InjuryIntegration.js +46 -0
  280. package/lib/systems/bodypart/InjuryIntegration.js.map +1 -0
  281. package/lib/systems/bodypart/InjuryTracker.js +27 -2
  282. package/lib/systems/bodypart/InjuryTracker.js.map +1 -1
  283. package/lib/systems/breathing/BreathingDisruptionSystem.js +0 -1
  284. package/lib/systems/breathing/BreathingDisruptionSystem.js.map +1 -1
  285. package/lib/systems/breathing/feedback.js +96 -3
  286. package/lib/systems/breathing/feedback.js.map +1 -1
  287. package/lib/systems/breathing/integration.js +38 -2
  288. package/lib/systems/breathing/integration.js.map +1 -1
  289. package/lib/systems/combat/BalanceSystem.js +0 -2
  290. package/lib/systems/combat/BalanceSystem.js.map +1 -1
  291. package/lib/systems/combat/ConsciousnessSystem.js +0 -2
  292. package/lib/systems/combat/ConsciousnessSystem.js.map +1 -1
  293. package/lib/systems/combat/GrappleSystem.js +0 -1
  294. package/lib/systems/combat/GrappleSystem.js.map +1 -1
  295. package/lib/systems/combat/PainResponseSystem.js +0 -1
  296. package/lib/systems/combat/PainResponseSystem.js.map +1 -1
  297. package/lib/systems/combat/painConsciousnessUtils.js +0 -1
  298. package/lib/systems/combat/painConsciousnessUtils.js.map +1 -1
  299. package/lib/systems/index.d.ts +3 -0
  300. package/lib/systems/index.d.ts.map +1 -1
  301. package/lib/systems/index.js +69 -5
  302. package/lib/systems/index.js.map +1 -1
  303. package/lib/systems/movement/InjuryMovementModifier.js +32 -4
  304. package/lib/systems/movement/InjuryMovementModifier.js.map +1 -1
  305. package/lib/systems/movement/integration.js +103 -0
  306. package/lib/systems/movement/integration.js.map +1 -0
  307. package/lib/systems/physics/AttackMovementPhysics.js +0 -1
  308. package/lib/systems/physics/AttackMovementPhysics.js.map +1 -1
  309. package/lib/systems/physics/MovementPhysics.js +1 -0
  310. package/lib/systems/physics/MovementPhysics.js.map +1 -1
  311. package/lib/systems/physics/PhysicalReachCalculator.js +1 -2
  312. package/lib/systems/physics/PhysicalReachCalculator.js.map +1 -1
  313. package/lib/systems/physics/SpeedModifierSystem.js +1 -0
  314. package/lib/systems/physics/SpeedModifierSystem.js.map +1 -1
  315. package/lib/systems/trigram/KoreanTechniques.js +0 -1
  316. package/lib/systems/trigram/KoreanTechniques.js.map +1 -1
  317. package/lib/systems/trigram/techniques/DarkOpsTechniques.js +0 -1
  318. package/lib/systems/trigram/techniques/DarkOpsTechniques.js.map +1 -1
  319. package/lib/systems/trigram/techniques/GamTechniques.js +0 -1
  320. package/lib/systems/trigram/techniques/GamTechniques.js.map +1 -1
  321. package/lib/systems/trigram/techniques/GanTechniques.js +0 -1
  322. package/lib/systems/trigram/techniques/GanTechniques.js.map +1 -1
  323. package/lib/systems/trigram/techniques/GeonTechniques.js +0 -1
  324. package/lib/systems/trigram/techniques/GeonTechniques.js.map +1 -1
  325. package/lib/systems/trigram/techniques/GonTechniques.js +0 -1
  326. package/lib/systems/trigram/techniques/GonTechniques.js.map +1 -1
  327. package/lib/systems/trigram/techniques/JinTechniques.js +0 -1
  328. package/lib/systems/trigram/techniques/JinTechniques.js.map +1 -1
  329. package/lib/systems/trigram/techniques/LiTechniques.js +0 -1
  330. package/lib/systems/trigram/techniques/LiTechniques.js.map +1 -1
  331. package/lib/systems/trigram/techniques/SonTechniques.js +0 -1
  332. package/lib/systems/trigram/techniques/SonTechniques.js.map +1 -1
  333. package/lib/systems/trigram/techniques/TaeTechniques.js +0 -1
  334. package/lib/systems/trigram/techniques/TaeTechniques.js.map +1 -1
  335. package/lib/systems/trigram/types.js +0 -1
  336. package/lib/systems/trigram/types.js.map +1 -1
  337. package/lib/systems/types.js +0 -1
  338. package/lib/systems/types.js.map +1 -1
  339. package/lib/systems/vitalpoint/DamageCalculator.js +0 -1
  340. package/lib/systems/vitalpoint/DamageCalculator.js.map +1 -1
  341. package/lib/systems/vitalpoint/KoreanAnatomy.js +0 -1
  342. package/lib/systems/vitalpoint/KoreanAnatomy.js.map +1 -1
  343. package/lib/systems/vitalpoint/VitalPointsData.js +0 -1
  344. package/lib/systems/vitalpoint/VitalPointsData.js.map +1 -1
  345. package/lib/types/AccessibilityTypes.js +28 -1
  346. package/lib/types/AccessibilityTypes.js.map +1 -1
  347. package/lib/types/PhysicsTypes.js +208 -2
  348. package/lib/types/PhysicsTypes.js.map +1 -1
  349. package/lib/types/facial.js +93 -4
  350. package/lib/types/facial.js.map +1 -1
  351. package/lib/types/index.d.ts +8 -0
  352. package/lib/types/index.d.ts.map +1 -1
  353. package/lib/types/index.js +42 -0
  354. package/lib/types/index.js.map +1 -1
  355. package/lib/types/physicsConstants.js +180 -1
  356. package/lib/types/physicsConstants.js.map +1 -1
  357. package/lib/utils/accessibility.js +0 -2
  358. package/lib/utils/accessibility.js.map +1 -1
  359. package/lib/utils/htmlOverlayHelpers.js +0 -1
  360. package/lib/utils/htmlOverlayHelpers.js.map +1 -1
  361. package/lib/utils/inputSystem.js +1 -2
  362. package/lib/utils/inputSystem.js.map +1 -1
  363. package/lib/utils/koreanThemeHelpers.js +0 -1
  364. package/lib/utils/koreanThemeHelpers.js.map +1 -1
  365. package/lib/utils/mobileUIUtils.js +0 -1
  366. package/lib/utils/mobileUIUtils.js.map +1 -1
  367. package/lib/utils/playerUtils.js +0 -2
  368. package/lib/utils/playerUtils.js.map +1 -1
  369. package/lib/utils/skeletonScaling.js +0 -1
  370. package/lib/utils/skeletonScaling.js.map +1 -1
  371. package/lib/utils/stanceHelpers.js +0 -1
  372. package/lib/utils/stanceHelpers.js.map +1 -1
  373. package/lib/utils/visualEffects.js +0 -1
  374. package/lib/utils/visualEffects.js.map +1 -1
  375. package/package.json +24 -11
  376. package/lib/components/screens/combat/components/hud/index.js +0 -4
  377. package/lib/components/screens/combat/components/index.js +0 -23
  378. package/lib/components/screens/combat/helpers/index.js +0 -2
  379. package/lib/components/screens/combat/index.js +0 -25
  380. package/lib/components/screens/endscreen/components/index.js +0 -8
  381. package/lib/components/screens/endscreen/index.js +0 -10
  382. package/lib/components/screens/training/components/DamageNumber3D.js +0 -6
  383. package/lib/components/screens/training/components/TrainingAICharacter3D.js +0 -6
  384. package/lib/components/screens/training/components/TrainingArena3D.js +0 -5
  385. package/lib/components/screens/training/components/TrainingHitEffects3D.js +0 -6
  386. package/lib/components/screens/training/components/hud/index.js +0 -4
  387. package/lib/components/screens/training/components/index.js +0 -19
  388. package/lib/components/screens/training/index.js +0 -16
  389. package/lib/components/shared/base/AccessibilityProvider.js +0 -71
  390. package/lib/components/shared/base/AccessibilityProvider.js.map +0 -1
  391. package/lib/components/shared/base/index.js +0 -6
  392. package/lib/components/shared/mobile/index.js +0 -7
  393. package/lib/components/shared/three/index.js +0 -9
  394. package/lib/components/shared/three/optimization/InstancedGeometry.js +0 -3
  395. package/lib/components/shared/three/optimization/LODSystem.js +0 -3
  396. package/lib/components/shared/three/optimization/index.js +0 -3
  397. package/lib/systems/ai/index.js +0 -7
  398. package/lib/systems/animation/builders/AnimationFactoryPresets.js +0 -234
  399. package/lib/systems/animation/builders/AnimationFactoryPresets.js.map +0 -1
  400. package/lib/systems/animation/builders/index.js +0 -13
  401. package/lib/systems/animation/catalogs/GamStanceAnimations.js +0 -9
  402. package/lib/systems/animation/catalogs/GamStanceAnimations.js.map +0 -1
  403. package/lib/systems/animation/catalogs/GonGuardPoses.js +0 -6
  404. package/lib/systems/animation/catalogs/GonGuardPoses.js.map +0 -1
  405. package/lib/systems/animation/catalogs/GonStanceAnimations.js +0 -9
  406. package/lib/systems/animation/catalogs/GonStanceAnimations.js.map +0 -1
  407. package/lib/systems/animation/catalogs/GonTechniqueAnimations.js +0 -13
  408. package/lib/systems/animation/catalogs/GonTechniqueAnimations.js.map +0 -1
  409. package/lib/systems/animation/catalogs/StepAnimations.js +0 -73
  410. package/lib/systems/animation/catalogs/StepAnimations.js.map +0 -1
  411. package/lib/systems/animation/catalogs/index.js +0 -36
  412. package/lib/systems/animation/core/TrigramAnimationMapping.js +0 -6
  413. package/lib/systems/animation/core/TrigramStanceTransitions.js +0 -8
  414. package/lib/systems/animation/core/TrigramStanceTransitions.js.map +0 -1
  415. package/lib/systems/animation/core/index.js +0 -16
  416. package/lib/systems/animation/index.js +0 -63
  417. package/lib/systems/animation/systems/HeadMovements.js +0 -2
  418. package/lib/systems/animation/systems/RecoveryVisualization.js +0 -1
  419. package/lib/systems/animation/systems/index.js +0 -7
  420. package/lib/systems/animation/utils/AnimationMirror.js +0 -30
  421. package/lib/systems/animation/utils/AnimationMirror.js.map +0 -1
  422. package/lib/systems/bodypart/index.js +0 -8
  423. package/lib/systems/breathing/index.js +0 -3
  424. package/lib/systems/combat/index.js +0 -10
  425. package/lib/systems/physics/index.js +0 -7
  426. package/lib/systems/trigram/index.js +0 -17
  427. package/lib/systems/vitalpoint/index.js +0 -5
  428. package/lib/utils/EventManager.js +0 -1
  429. package/lib/utils/eventConstants.js +0 -3
  430. package/lib/utils/eventConstants.js.map +0 -1
  431. package/lib/utils/performance/index.js +0 -3
package/lib/App2.js CHANGED
@@ -3,12 +3,11 @@ import { GameMode, PlayerArchetype } from "./types/common.js";
3
3
  import { createPlayerFromArchetype } from "./utils/playerUtils.js";
4
4
  import { clearPlatformCache, detectPlatform } from "./utils/deviceDetection.js";
5
5
  import CombatScreen3D from "./components/screens/combat/CombatScreen3D.js";
6
- /* empty css */
7
- import ControlsScreen3D from "./components/screens/controls/ControlsScreen3D.js";
8
6
  import { EndScreen3D } from "./components/screens/endscreen/EndScreen3D.js";
9
- import "./components/screens/endscreen/index.js";
7
+ import ControlsScreen3D from "./components/screens/controls/ControlsScreen3D.js";
10
8
  import IntroScreen3D from "./components/screens/intro/IntroScreen3D.js";
11
9
  import PhilosophyScreen3D from "./components/screens/philosophy/PhilosophyScreen3D.js";
10
+ /* empty css */
12
11
  import { PerformanceDebugOverlayHtml } from "./components/shared/debug/PerformanceDebugOverlayHtml.js";
13
12
  import ErrorModal from "./components/shared/ui/ErrorModal.js";
14
13
  import { LoadingState } from "./components/shared/ui/LoadingState.js";
package/lib/App2.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"App2.js","names":[],"sources":["../src/App.tsx"],"sourcesContent":["import {\n lazy,\n Suspense,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport \"./App.css\";\n// Main application component - manages game state and screen navigation\nimport { useAudio } from \"./audio/AudioProvider\";\nimport { CombatScreen3D as CombatScreen } from \"./components/screens/combat/CombatScreen3D\";\nimport { ControlsScreen3D as ControlsScreen } from \"./components/screens/controls/ControlsScreen3D\";\nimport { EndScreen3D } from \"./components/screens/endscreen\";\nimport { IntroScreen3D as IntroScreen } from \"./components/screens/intro/IntroScreen3D\";\nimport { PhilosophyScreen3D as PhilosophyScreen } from \"./components/screens/philosophy/PhilosophyScreen3D\";\nimport { PerformanceDebugOverlayHtml } from \"./components/shared/debug/PerformanceDebugOverlayHtml\";\nimport { ErrorModal } from \"./components/shared/ui/ErrorModal\";\nimport { LoadingState } from \"./components/shared/ui/LoadingState\";\nimport { SplashScreen } from \"./components/shared/ui/SplashScreen\";\nimport { PlayerState } from \"./systems\";\nimport { MatchStatistics } from \"./systems/combat\";\nimport { GameMode, PlayerArchetype } from \"./types/common\";\nimport { clearPlatformCache, detectPlatform } from \"./utils/deviceDetection\";\nimport { createPlayerFromArchetype } from \"./utils/playerUtils\";\n\n// Lazy load heavy screens\nconst TrainingScreen = lazy(() =>\n import(\"./components/screens/training/TrainingScreen3D\").then((m) => ({\n default: m.TrainingScreen3D,\n })),\n);\n\n// 150ms delay to allow WebGL context cleanup between full-screen 3D scene transitions\nconst SCREEN_TRANSITION_DELAY_MS = 150;\n// 100ms delay for lighter menu/UI transitions where WebGL teardown/re-init cost is lower\nconst MENU_TRANSITION_DELAY_MS = 100;\n\nfunction App() {\n const [gameMode, setGameMode] = useState<GameMode | null>(null);\n const [selectedArchetype, setSelectedArchetype] = useState<PlayerArchetype>(\n PlayerArchetype.MUSA,\n );\n const [isGameActive, setIsGameActive] = useState(false);\n const [gameWinner, setGameWinner] = useState<PlayerState | null>(null);\n const [matchStats, setMatchStats] = useState<MatchStatistics | null>(null);\n const [appReady, setAppReady] = useState(false);\n const [showSplash, setShowSplash] = useState(true);\n const [showAudioError, setShowAudioError] = useState(false);\n // Performance debug overlay toggle (P key in dev mode)\n const [showPerformanceDebug, setShowPerformanceDebug] = useState(false);\n // Transition state to allow WebGL cleanup between screens\n const [isTransitioning, setIsTransitioning] = useState(false);\n const pendingModeRef = useRef<{\n mode: GameMode;\n archetype?: PlayerArchetype;\n } | null>(null);\n\n // Combat players state - managed here so updates persist\n const [combatPlayers, setCombatPlayers] = useState<PlayerState[]>([]);\n\n const audio = useAudio();\n\n // Add responsive screen size detection with proper device detection\n // Uses user-agent detection first for high-res mobile devices\n const [screenSize, setScreenSize] = useState(() => {\n const platform = detectPlatform();\n return {\n width: window.innerWidth,\n height: window.innerHeight,\n isMobile: platform.isMobile,\n isTablet: platform.isTablet,\n isDesktop: platform.isDesktop,\n };\n });\n\n useEffect(() => {\n // Define handlers outside async function for proper cleanup\n const handleGlobalError = (e: ErrorEvent) => {\n console.error(\"Global error:\", e.error);\n };\n\n const handleUnhandledRejection = (e: PromiseRejectionEvent) => {\n console.error(\"Unhandled promise rejection:\", e.reason);\n if (\n e.reason?.message?.includes(\"Failed to load\") ||\n e.reason?.message?.includes(\"no supported source\")\n ) {\n e.preventDefault();\n }\n };\n\n const initializeApp = async () => {\n try {\n window.focus();\n\n window.addEventListener(\"error\", handleGlobalError);\n window.addEventListener(\"unhandledrejection\", handleUnhandledRejection);\n\n // PHASE 2: Performance optimization initialization\n console.log(\"🔧 Initializing animation performance optimizations...\");\n\n // 1. Prewarm object pools for animation optimization\n // This eliminates GC pressure from ~1,344 allocations per frame\n const { ThreeObjectPools } = await import(\"./utils/threeObjectPool\");\n ThreeObjectPools.prewarmAll();\n const poolStatus = ThreeObjectPools.getStatus();\n console.log(\" ✓ Object pools prewarmed:\", poolStatus);\n\n // 2. Precompute all animations for 90%+ cache hit rate\n const { precomputeAnimation } =\n await import(\"./systems/animation/core/AnimationOptimizations\");\n const { ALL_ANIMATIONS } =\n await import(\"./systems/animation/core/AnimationRegistry\");\n\n let precomputedCount = 0;\n ALL_ANIMATIONS.forEach((animation) => {\n // Precompute at 60fps for smooth playback\n // Use animation.name as the unique identifier\n precomputeAnimation(animation.name, animation, 60);\n precomputedCount++;\n });\n console.log(` ✓ Precomputed ${precomputedCount} animations at 60fps`);\n\n console.log(\n \"✅ Animation optimizations ready (expect <5ms frame time, 90%+ cache hit)\",\n );\n\n setAppReady(true);\n console.log(\"🎯 Black Trigram app initialized\");\n } catch (error) {\n console.error(\"Failed to initialize app:\", error);\n setAppReady(true);\n }\n };\n\n initializeApp();\n\n // Cleanup global event handlers to prevent memory leaks\n return () => {\n window.removeEventListener(\"error\", handleGlobalError);\n window.removeEventListener(\n \"unhandledrejection\",\n handleUnhandledRejection,\n );\n };\n }, []);\n\n // Shared audio initialization logic for splash and retry\n const initializeAudioWithRetry = useCallback(async () => {\n if (!appReady) {\n console.warn(\"App not ready yet, please wait...\");\n return false;\n }\n try {\n await audio.initializeAudio();\n console.log(\"🎵 Audio initialized\");\n return true;\n } catch (error) {\n console.error(\"Failed to initialize audio:\", error);\n return false;\n }\n }, [audio, appReady]);\n\n // Handle splash screen start - initialize audio on user gesture\n const handleSplashStart = useCallback(async () => {\n setShowAudioError(false);\n const success = await initializeAudioWithRetry();\n if (success) {\n setShowSplash(false);\n } else {\n setShowAudioError(true);\n }\n }, [initializeAudioWithRetry]);\n\n const handleAudioErrorRetry = useCallback(async () => {\n setShowAudioError(false);\n const success = await initializeAudioWithRetry();\n if (success) {\n setShowSplash(false);\n } else {\n setShowAudioError(true);\n }\n }, [initializeAudioWithRetry]);\n\n const handleAudioErrorContinue = useCallback(() => {\n // Continue without sound\n setShowAudioError(false);\n setShowSplash(false);\n console.log(\"Continuing without audio (silent mode)\");\n }, []);\n\n // ✅ SIMPLIFIED: Handle game mode selection directly\n const handleGameStart = useCallback(\n (mode: GameMode, archetype?: PlayerArchetype) => {\n console.log(\"🎮 Starting game mode:\", mode, \"with archetype:\", archetype);\n\n // Store pending mode and start transition to allow WebGL cleanup\n pendingModeRef.current = { mode, archetype };\n setIsTransitioning(true);\n\n // Clear current mode first (unmounts Canvas)\n setGameMode(null);\n setIsGameActive(false);\n\n // After brief delay, mount new screen\n // Increased delay to allow proper WebGL context cleanup\n setTimeout(() => {\n const pending = pendingModeRef.current;\n if (!pending) return;\n\n // ✅ NEW: Handle controls and philosophy as separate modes\n if (\n pending.mode === GameMode.CONTROLS ||\n pending.mode === GameMode.PHILOSOPHY\n ) {\n setGameMode(pending.mode);\n setIsGameActive(false); // These are not game modes, just screens\n } else {\n setGameMode(pending.mode);\n setIsGameActive(true);\n }\n\n setGameWinner(null);\n setMatchStats(null);\n if (pending.archetype) {\n setSelectedArchetype(pending.archetype);\n }\n\n setIsTransitioning(false);\n pendingModeRef.current = null;\n }, SCREEN_TRANSITION_DELAY_MS); // Delay for WebGL cleanup\n },\n [],\n );\n\n const handleGameEnd = useCallback(\n (winner: number) => {\n setIsGameActive(false);\n setGameWinner(createPlayerFromArchetype(selectedArchetype, winner));\n // Reset combat players for next match\n setCombatPlayers([]);\n\n setMatchStats({\n totalDamageDealt: 150,\n totalDamageTaken: 100,\n criticalHits: 3,\n vitalPointHits: 2,\n techniquesUsed: 8,\n perfectStrikes: 1,\n consecutiveWins: 1,\n matchDuration: 120,\n totalMatches: 1,\n maxRounds: 3,\n winner: winner,\n totalRounds: 2,\n currentRound: 2,\n timeRemaining: 0,\n combatEvents: [],\n finalScore: {\n player1: winner === 0 ? 2 : 0,\n player2: winner === 1 ? 2 : 0,\n },\n roundsWon: {\n player1: winner === 0 ? 2 : 0,\n player2: winner === 1 ? 2 : 0,\n },\n player1: {\n wins: winner === 0 ? 1 : 0,\n losses: winner === 0 ? 0 : 1,\n hitsTaken: 5,\n hitsLanded: 8,\n totalDamageDealt: winner === 0 ? 150 : 100,\n totalDamageReceived: winner === 0 ? 100 : 150,\n techniques: [\"천둥벽력\", \"유수연타\"],\n perfectStrikes: winner === 0 ? 1 : 0,\n vitalPointHits: winner === 0 ? 2 : 1,\n consecutiveWins: winner === 0 ? 1 : 0,\n matchDuration: 120,\n },\n player2: {\n wins: winner === 1 ? 1 : 0,\n losses: winner === 1 ? 0 : 1,\n hitsTaken: 8,\n hitsLanded: 5,\n totalDamageDealt: winner === 1 ? 150 : 100,\n totalDamageReceived: winner === 1 ? 100 : 150,\n techniques: [\"화염지창\", \"벽력일섬\"],\n perfectStrikes: winner === 1 ? 1 : 0,\n vitalPointHits: winner === 1 ? 2 : 1,\n consecutiveWins: winner === 1 ? 1 : 0,\n matchDuration: 120,\n },\n });\n },\n [selectedArchetype],\n );\n\n const handleReturnToMenu = useCallback(() => {\n // Use same transition logic for return to menu\n setIsTransitioning(true);\n setGameMode(null);\n setIsGameActive(false);\n setGameWinner(null);\n setMatchStats(null);\n // Reset combat players so they reinitialize next combat\n setCombatPlayers([]);\n setTimeout(() => setIsTransitioning(false), MENU_TRANSITION_DELAY_MS);\n }, []);\n\n const handleRematch = useCallback(() => {\n // Restart combat with same settings\n if (!gameMode) {\n console.error(\n \"Cannot rematch: gameMode is not set. This should not happen - EndScreen only renders when gameMode is set.\",\n { gameMode, isGameActive, gameWinner, matchStats }\n );\n return;\n }\n \n setIsTransitioning(true);\n setGameWinner(null);\n setMatchStats(null);\n // Reset combat players so they reinitialize for rematch\n setCombatPlayers([]);\n \n setTimeout(() => {\n setIsGameActive(true);\n setIsTransitioning(false);\n }, SCREEN_TRANSITION_DELAY_MS);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- isGameActive, gameWinner, matchStats only used in error logging, not function logic\n }, [gameMode]);\n\n const handleViewTraining = useCallback(() => {\n // Navigate to training mode\n setIsTransitioning(true);\n setGameWinner(null);\n setMatchStats(null);\n setCombatPlayers([]);\n \n setTimeout(() => {\n setGameMode(GameMode.TRAINING);\n setIsGameActive(true);\n setIsTransitioning(false);\n }, SCREEN_TRANSITION_DELAY_MS);\n }, []);\n\n const renderCurrentScreen = () => {\n // Show loading during screen transitions\n if (isTransitioning) {\n return (\n <LoadingState\n progress={undefined}\n message=\"전환 중... | Transitioning...\"\n stage=\"assets\"\n />\n );\n }\n\n if (gameWinner && matchStats) {\n // ✅ NEW: Use EndScreen3D component\n return (\n <EndScreen3D\n winner={gameWinner}\n matchStats={matchStats}\n onReturnToMenu={handleReturnToMenu}\n onRematch={handleRematch}\n onViewReplay={handleViewTraining}\n width={screenSize.width}\n height={screenSize.height}\n />\n );\n }\n\n // ✅ NEW: Handle standalone screens first\n if (gameMode === GameMode.CONTROLS) {\n return (\n <ControlsScreen\n onReturnToMenu={handleReturnToMenu}\n width={screenSize.width}\n height={screenSize.height}\n />\n );\n }\n\n if (gameMode === GameMode.PHILOSOPHY) {\n return (\n <PhilosophyScreen\n onReturnToMenu={handleReturnToMenu}\n width={screenSize.width}\n height={screenSize.height}\n />\n );\n }\n\n // ✅ SIMPLIFIED: Only active game modes use isGameActive\n if (isGameActive && gameMode) {\n switch (gameMode) {\n case GameMode.TRAINING:\n return (\n <Suspense\n fallback={\n <LoadingState\n progress={undefined}\n message=\"훈련장 로딩 중... | Loading Training...\"\n stage=\"assets\"\n />\n }\n >\n <TrainingScreen\n onPlayerUpdate={(updates) => {\n console.log(\"Training player updated:\", updates);\n }}\n onReturnToMenu={handleReturnToMenu}\n width={screenSize.width}\n height={screenSize.height}\n initialArchetype={selectedArchetype}\n />\n </Suspense>\n );\n case GameMode.VERSUS:\n case GameMode.PRACTICE:\n // Initialize players if not already set\n if (combatPlayers.length === 0) {\n const player1 = createPlayerFromArchetype(selectedArchetype, 0);\n const player2 = createPlayerFromArchetype(\n PlayerArchetype.AMSALJA,\n 1,\n );\n // Use setTimeout to defer state update and avoid render-during-render\n setTimeout(() => setCombatPlayers([player1, player2]), 0);\n // Return loading state while players initialize\n return (\n <LoadingState\n progress={undefined}\n message=\"전투 준비 중... | Preparing Combat...\"\n stage=\"assets\"\n />\n );\n }\n\n return (\n <CombatScreen\n players={combatPlayers}\n currentRound={1}\n timeRemaining={180}\n isPaused={false}\n onPlayerUpdate={(playerIndex, updates) => {\n // Actually update the player state so damage persists!\n setCombatPlayers((prevPlayers) => {\n const newPlayers = [...prevPlayers];\n if (newPlayers[playerIndex]) {\n newPlayers[playerIndex] = {\n ...newPlayers[playerIndex],\n ...updates,\n };\n }\n return newPlayers;\n });\n }}\n onReturnToMenu={handleReturnToMenu}\n onGameEnd={handleGameEnd}\n gameMode={gameMode}\n width={screenSize.width}\n height={screenSize.height}\n />\n );\n default:\n return (\n <IntroScreen\n onMenuSelect={handleGameStart}\n onArchetypeSelect={setSelectedArchetype}\n selectedArchetype={selectedArchetype}\n width={screenSize.width}\n height={screenSize.height}\n />\n );\n }\n }\n\n // ✅ SIMPLIFIED: Default to intro screen\n return (\n <IntroScreen\n onMenuSelect={handleGameStart}\n onArchetypeSelect={setSelectedArchetype}\n selectedArchetype={selectedArchetype}\n width={screenSize.width}\n height={screenSize.height}\n />\n );\n };\n\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n containerRef.current?.focus();\n }, [appReady]);\n\n useEffect(() => {\n const handleResize = () => {\n // Clear cached platform info to get fresh detection on resize\n clearPlatformCache();\n const platform = detectPlatform();\n setScreenSize({\n width: platform.screenWidth,\n height: platform.screenHeight,\n isMobile: platform.isMobile,\n isTablet: platform.isTablet,\n isDesktop: platform.isDesktop,\n });\n };\n\n window.addEventListener(\"resize\", handleResize);\n return () => window.removeEventListener(\"resize\", handleResize);\n }, []);\n\n // F9 key toggle for performance debug overlay (dev mode only)\n // Note: P key is reserved for Philosophy screen\n useEffect(() => {\n if (!import.meta.env.DEV) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"F9\") {\n e.preventDefault();\n setShowPerformanceDebug((prev) => !prev);\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, []);\n\n if (!appReady) {\n return (\n <div className=\"app loading\" data-testid=\"app-container\">\n <LoadingState\n progress={undefined}\n message=\"앱 초기화 중 | Initializing app...\"\n stage=\"initialization\"\n />\n </div>\n );\n }\n\n // Show splash screen first to get user gesture for audio\n if (showSplash) {\n return (\n <div className=\"app\" data-testid=\"app-container\">\n <SplashScreen\n onStart={handleSplashStart}\n width={screenSize.width}\n height={screenSize.height}\n />\n {showAudioError && (\n <ErrorModal\n message=\"오디오 초기화에 실패했습니다. 재시도하거나 소리 없이 계속할 수 있습니다. | Audio initialization failed. You can retry or continue without sound.\"\n onRetry={handleAudioErrorRetry}\n onContinue={handleAudioErrorContinue}\n />\n )}\n </div>\n );\n }\n\n return (\n <div\n className=\"app\"\n tabIndex={0}\n ref={containerRef}\n style={{\n outline: \"none\",\n width: \"100vw\",\n height: \"100vh\",\n overflow: \"hidden\",\n }}\n data-testid=\"app-container\"\n >\n {/* All screens now use Three.js or pure React/HTML */}\n {renderCurrentScreen()}\n\n {/* Performance debug overlay (dev mode only, toggle with P key) */}\n {showPerformanceDebug && <PerformanceDebugOverlayHtml />}\n </div>\n );\n}\n\nexport default App;\n"],"mappings":"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"}
1
+ {"version":3,"file":"App2.js","names":[],"sources":["../src/App.tsx"],"sourcesContent":["import {\n lazy,\n Suspense,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport \"./App.css\";\n// Main application component - manages game state and screen navigation\nimport { useAudio } from \"./audio/AudioProvider\";\nimport { CombatScreen3D as CombatScreen } from \"./components/screens/combat/CombatScreen3D\";\nimport { ControlsScreen3D as ControlsScreen } from \"./components/screens/controls/ControlsScreen3D\";\nimport { EndScreen3D } from \"./components/screens/endscreen\";\nimport { IntroScreen3D as IntroScreen } from \"./components/screens/intro/IntroScreen3D\";\nimport { PhilosophyScreen3D as PhilosophyScreen } from \"./components/screens/philosophy/PhilosophyScreen3D\";\nimport { PerformanceDebugOverlayHtml } from \"./components/shared/debug/PerformanceDebugOverlayHtml\";\nimport { ErrorModal } from \"./components/shared/ui/ErrorModal\";\nimport { LoadingState } from \"./components/shared/ui/LoadingState\";\nimport { SplashScreen } from \"./components/shared/ui/SplashScreen\";\nimport { PlayerState } from \"./systems\";\nimport { MatchStatistics } from \"./systems/combat\";\nimport { GameMode, PlayerArchetype } from \"./types/common\";\nimport { clearPlatformCache, detectPlatform } from \"./utils/deviceDetection\";\nimport { createPlayerFromArchetype } from \"./utils/playerUtils\";\n\n// Lazy load heavy screens\nconst TrainingScreen = lazy(() =>\n import(\"./components/screens/training/TrainingScreen3D\").then((m) => ({\n default: m.TrainingScreen3D,\n })),\n);\n\n// 150ms delay to allow WebGL context cleanup between full-screen 3D scene transitions\nconst SCREEN_TRANSITION_DELAY_MS = 150;\n// 100ms delay for lighter menu/UI transitions where WebGL teardown/re-init cost is lower\nconst MENU_TRANSITION_DELAY_MS = 100;\n\nfunction App() {\n const [gameMode, setGameMode] = useState<GameMode | null>(null);\n const [selectedArchetype, setSelectedArchetype] = useState<PlayerArchetype>(\n PlayerArchetype.MUSA,\n );\n const [isGameActive, setIsGameActive] = useState(false);\n const [gameWinner, setGameWinner] = useState<PlayerState | null>(null);\n const [matchStats, setMatchStats] = useState<MatchStatistics | null>(null);\n const [appReady, setAppReady] = useState(false);\n const [showSplash, setShowSplash] = useState(true);\n const [showAudioError, setShowAudioError] = useState(false);\n // Performance debug overlay toggle (P key in dev mode)\n const [showPerformanceDebug, setShowPerformanceDebug] = useState(false);\n // Transition state to allow WebGL cleanup between screens\n const [isTransitioning, setIsTransitioning] = useState(false);\n const pendingModeRef = useRef<{\n mode: GameMode;\n archetype?: PlayerArchetype;\n } | null>(null);\n\n // Combat players state - managed here so updates persist\n const [combatPlayers, setCombatPlayers] = useState<PlayerState[]>([]);\n\n const audio = useAudio();\n\n // Add responsive screen size detection with proper device detection\n // Uses user-agent detection first for high-res mobile devices\n const [screenSize, setScreenSize] = useState(() => {\n const platform = detectPlatform();\n return {\n width: window.innerWidth,\n height: window.innerHeight,\n isMobile: platform.isMobile,\n isTablet: platform.isTablet,\n isDesktop: platform.isDesktop,\n };\n });\n\n useEffect(() => {\n // Define handlers outside async function for proper cleanup\n const handleGlobalError = (e: ErrorEvent) => {\n console.error(\"Global error:\", e.error);\n };\n\n const handleUnhandledRejection = (e: PromiseRejectionEvent) => {\n console.error(\"Unhandled promise rejection:\", e.reason);\n if (\n e.reason?.message?.includes(\"Failed to load\") ||\n e.reason?.message?.includes(\"no supported source\")\n ) {\n e.preventDefault();\n }\n };\n\n const initializeApp = async () => {\n try {\n window.focus();\n\n window.addEventListener(\"error\", handleGlobalError);\n window.addEventListener(\"unhandledrejection\", handleUnhandledRejection);\n\n // PHASE 2: Performance optimization initialization\n console.log(\"🔧 Initializing animation performance optimizations...\");\n\n // 1. Prewarm object pools for animation optimization\n // This eliminates GC pressure from ~1,344 allocations per frame\n const { ThreeObjectPools } = await import(\"./utils/threeObjectPool\");\n ThreeObjectPools.prewarmAll();\n const poolStatus = ThreeObjectPools.getStatus();\n console.log(\" ✓ Object pools prewarmed:\", poolStatus);\n\n // 2. Precompute all animations for 90%+ cache hit rate\n const { precomputeAnimation } =\n await import(\"./systems/animation/core/AnimationOptimizations\");\n const { ALL_ANIMATIONS } =\n await import(\"./systems/animation/core/AnimationRegistry\");\n\n let precomputedCount = 0;\n ALL_ANIMATIONS.forEach((animation) => {\n // Precompute at 60fps for smooth playback\n // Use animation.name as the unique identifier\n precomputeAnimation(animation.name, animation, 60);\n precomputedCount++;\n });\n console.log(` ✓ Precomputed ${precomputedCount} animations at 60fps`);\n\n console.log(\n \"✅ Animation optimizations ready (expect <5ms frame time, 90%+ cache hit)\",\n );\n\n setAppReady(true);\n console.log(\"🎯 Black Trigram app initialized\");\n } catch (error) {\n console.error(\"Failed to initialize app:\", error);\n setAppReady(true);\n }\n };\n\n initializeApp();\n\n // Cleanup global event handlers to prevent memory leaks\n return () => {\n window.removeEventListener(\"error\", handleGlobalError);\n window.removeEventListener(\n \"unhandledrejection\",\n handleUnhandledRejection,\n );\n };\n }, []);\n\n // Shared audio initialization logic for splash and retry\n const initializeAudioWithRetry = useCallback(async () => {\n if (!appReady) {\n console.warn(\"App not ready yet, please wait...\");\n return false;\n }\n try {\n await audio.initializeAudio();\n console.log(\"🎵 Audio initialized\");\n return true;\n } catch (error) {\n console.error(\"Failed to initialize audio:\", error);\n return false;\n }\n }, [audio, appReady]);\n\n // Handle splash screen start - initialize audio on user gesture\n const handleSplashStart = useCallback(async () => {\n setShowAudioError(false);\n const success = await initializeAudioWithRetry();\n if (success) {\n setShowSplash(false);\n } else {\n setShowAudioError(true);\n }\n }, [initializeAudioWithRetry]);\n\n const handleAudioErrorRetry = useCallback(async () => {\n setShowAudioError(false);\n const success = await initializeAudioWithRetry();\n if (success) {\n setShowSplash(false);\n } else {\n setShowAudioError(true);\n }\n }, [initializeAudioWithRetry]);\n\n const handleAudioErrorContinue = useCallback(() => {\n // Continue without sound\n setShowAudioError(false);\n setShowSplash(false);\n console.log(\"Continuing without audio (silent mode)\");\n }, []);\n\n // ✅ SIMPLIFIED: Handle game mode selection directly\n const handleGameStart = useCallback(\n (mode: GameMode, archetype?: PlayerArchetype) => {\n console.log(\"🎮 Starting game mode:\", mode, \"with archetype:\", archetype);\n\n // Store pending mode and start transition to allow WebGL cleanup\n pendingModeRef.current = { mode, archetype };\n setIsTransitioning(true);\n\n // Clear current mode first (unmounts Canvas)\n setGameMode(null);\n setIsGameActive(false);\n\n // After brief delay, mount new screen\n // Increased delay to allow proper WebGL context cleanup\n setTimeout(() => {\n const pending = pendingModeRef.current;\n if (!pending) return;\n\n // ✅ NEW: Handle controls and philosophy as separate modes\n if (\n pending.mode === GameMode.CONTROLS ||\n pending.mode === GameMode.PHILOSOPHY\n ) {\n setGameMode(pending.mode);\n setIsGameActive(false); // These are not game modes, just screens\n } else {\n setGameMode(pending.mode);\n setIsGameActive(true);\n }\n\n setGameWinner(null);\n setMatchStats(null);\n if (pending.archetype) {\n setSelectedArchetype(pending.archetype);\n }\n\n setIsTransitioning(false);\n pendingModeRef.current = null;\n }, SCREEN_TRANSITION_DELAY_MS); // Delay for WebGL cleanup\n },\n [],\n );\n\n const handleGameEnd = useCallback(\n (winner: number) => {\n setIsGameActive(false);\n setGameWinner(createPlayerFromArchetype(selectedArchetype, winner));\n // Reset combat players for next match\n setCombatPlayers([]);\n\n setMatchStats({\n totalDamageDealt: 150,\n totalDamageTaken: 100,\n criticalHits: 3,\n vitalPointHits: 2,\n techniquesUsed: 8,\n perfectStrikes: 1,\n consecutiveWins: 1,\n matchDuration: 120,\n totalMatches: 1,\n maxRounds: 3,\n winner: winner,\n totalRounds: 2,\n currentRound: 2,\n timeRemaining: 0,\n combatEvents: [],\n finalScore: {\n player1: winner === 0 ? 2 : 0,\n player2: winner === 1 ? 2 : 0,\n },\n roundsWon: {\n player1: winner === 0 ? 2 : 0,\n player2: winner === 1 ? 2 : 0,\n },\n player1: {\n wins: winner === 0 ? 1 : 0,\n losses: winner === 0 ? 0 : 1,\n hitsTaken: 5,\n hitsLanded: 8,\n totalDamageDealt: winner === 0 ? 150 : 100,\n totalDamageReceived: winner === 0 ? 100 : 150,\n techniques: [\"천둥벽력\", \"유수연타\"],\n perfectStrikes: winner === 0 ? 1 : 0,\n vitalPointHits: winner === 0 ? 2 : 1,\n consecutiveWins: winner === 0 ? 1 : 0,\n matchDuration: 120,\n },\n player2: {\n wins: winner === 1 ? 1 : 0,\n losses: winner === 1 ? 0 : 1,\n hitsTaken: 8,\n hitsLanded: 5,\n totalDamageDealt: winner === 1 ? 150 : 100,\n totalDamageReceived: winner === 1 ? 100 : 150,\n techniques: [\"화염지창\", \"벽력일섬\"],\n perfectStrikes: winner === 1 ? 1 : 0,\n vitalPointHits: winner === 1 ? 2 : 1,\n consecutiveWins: winner === 1 ? 1 : 0,\n matchDuration: 120,\n },\n });\n },\n [selectedArchetype],\n );\n\n const handleReturnToMenu = useCallback(() => {\n // Use same transition logic for return to menu\n setIsTransitioning(true);\n setGameMode(null);\n setIsGameActive(false);\n setGameWinner(null);\n setMatchStats(null);\n // Reset combat players so they reinitialize next combat\n setCombatPlayers([]);\n setTimeout(() => setIsTransitioning(false), MENU_TRANSITION_DELAY_MS);\n }, []);\n\n const handleRematch = useCallback(() => {\n // Restart combat with same settings\n if (!gameMode) {\n console.error(\n \"Cannot rematch: gameMode is not set. This should not happen - EndScreen only renders when gameMode is set.\",\n { gameMode, isGameActive, gameWinner, matchStats }\n );\n return;\n }\n \n setIsTransitioning(true);\n setGameWinner(null);\n setMatchStats(null);\n // Reset combat players so they reinitialize for rematch\n setCombatPlayers([]);\n \n setTimeout(() => {\n setIsGameActive(true);\n setIsTransitioning(false);\n }, SCREEN_TRANSITION_DELAY_MS);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- isGameActive, gameWinner, matchStats only used in error logging, not function logic\n }, [gameMode]);\n\n const handleViewTraining = useCallback(() => {\n // Navigate to training mode\n setIsTransitioning(true);\n setGameWinner(null);\n setMatchStats(null);\n setCombatPlayers([]);\n \n setTimeout(() => {\n setGameMode(GameMode.TRAINING);\n setIsGameActive(true);\n setIsTransitioning(false);\n }, SCREEN_TRANSITION_DELAY_MS);\n }, []);\n\n const renderCurrentScreen = () => {\n // Show loading during screen transitions\n if (isTransitioning) {\n return (\n <LoadingState\n progress={undefined}\n message=\"전환 중... | Transitioning...\"\n stage=\"assets\"\n />\n );\n }\n\n if (gameWinner && matchStats) {\n // ✅ NEW: Use EndScreen3D component\n return (\n <EndScreen3D\n winner={gameWinner}\n matchStats={matchStats}\n onReturnToMenu={handleReturnToMenu}\n onRematch={handleRematch}\n onViewReplay={handleViewTraining}\n width={screenSize.width}\n height={screenSize.height}\n />\n );\n }\n\n // ✅ NEW: Handle standalone screens first\n if (gameMode === GameMode.CONTROLS) {\n return (\n <ControlsScreen\n onReturnToMenu={handleReturnToMenu}\n width={screenSize.width}\n height={screenSize.height}\n />\n );\n }\n\n if (gameMode === GameMode.PHILOSOPHY) {\n return (\n <PhilosophyScreen\n onReturnToMenu={handleReturnToMenu}\n width={screenSize.width}\n height={screenSize.height}\n />\n );\n }\n\n // ✅ SIMPLIFIED: Only active game modes use isGameActive\n if (isGameActive && gameMode) {\n switch (gameMode) {\n case GameMode.TRAINING:\n return (\n <Suspense\n fallback={\n <LoadingState\n progress={undefined}\n message=\"훈련장 로딩 중... | Loading Training...\"\n stage=\"assets\"\n />\n }\n >\n <TrainingScreen\n onPlayerUpdate={(updates) => {\n console.log(\"Training player updated:\", updates);\n }}\n onReturnToMenu={handleReturnToMenu}\n width={screenSize.width}\n height={screenSize.height}\n initialArchetype={selectedArchetype}\n />\n </Suspense>\n );\n case GameMode.VERSUS:\n case GameMode.PRACTICE:\n // Initialize players if not already set\n if (combatPlayers.length === 0) {\n const player1 = createPlayerFromArchetype(selectedArchetype, 0);\n const player2 = createPlayerFromArchetype(\n PlayerArchetype.AMSALJA,\n 1,\n );\n // Use setTimeout to defer state update and avoid render-during-render\n setTimeout(() => setCombatPlayers([player1, player2]), 0);\n // Return loading state while players initialize\n return (\n <LoadingState\n progress={undefined}\n message=\"전투 준비 중... | Preparing Combat...\"\n stage=\"assets\"\n />\n );\n }\n\n return (\n <CombatScreen\n players={combatPlayers}\n currentRound={1}\n timeRemaining={180}\n isPaused={false}\n onPlayerUpdate={(playerIndex, updates) => {\n // Actually update the player state so damage persists!\n setCombatPlayers((prevPlayers) => {\n const newPlayers = [...prevPlayers];\n if (newPlayers[playerIndex]) {\n newPlayers[playerIndex] = {\n ...newPlayers[playerIndex],\n ...updates,\n };\n }\n return newPlayers;\n });\n }}\n onReturnToMenu={handleReturnToMenu}\n onGameEnd={handleGameEnd}\n gameMode={gameMode}\n width={screenSize.width}\n height={screenSize.height}\n />\n );\n default:\n return (\n <IntroScreen\n onMenuSelect={handleGameStart}\n onArchetypeSelect={setSelectedArchetype}\n selectedArchetype={selectedArchetype}\n width={screenSize.width}\n height={screenSize.height}\n />\n );\n }\n }\n\n // ✅ SIMPLIFIED: Default to intro screen\n return (\n <IntroScreen\n onMenuSelect={handleGameStart}\n onArchetypeSelect={setSelectedArchetype}\n selectedArchetype={selectedArchetype}\n width={screenSize.width}\n height={screenSize.height}\n />\n );\n };\n\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n containerRef.current?.focus();\n }, [appReady]);\n\n useEffect(() => {\n const handleResize = () => {\n // Clear cached platform info to get fresh detection on resize\n clearPlatformCache();\n const platform = detectPlatform();\n setScreenSize({\n width: platform.screenWidth,\n height: platform.screenHeight,\n isMobile: platform.isMobile,\n isTablet: platform.isTablet,\n isDesktop: platform.isDesktop,\n });\n };\n\n window.addEventListener(\"resize\", handleResize);\n return () => window.removeEventListener(\"resize\", handleResize);\n }, []);\n\n // F9 key toggle for performance debug overlay (dev mode only)\n // Note: P key is reserved for Philosophy screen\n useEffect(() => {\n if (!import.meta.env.DEV) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"F9\") {\n e.preventDefault();\n setShowPerformanceDebug((prev) => !prev);\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, []);\n\n if (!appReady) {\n return (\n <div className=\"app loading\" data-testid=\"app-container\">\n <LoadingState\n progress={undefined}\n message=\"앱 초기화 중 | Initializing app...\"\n stage=\"initialization\"\n />\n </div>\n );\n }\n\n // Show splash screen first to get user gesture for audio\n if (showSplash) {\n return (\n <div className=\"app\" data-testid=\"app-container\">\n <SplashScreen\n onStart={handleSplashStart}\n width={screenSize.width}\n height={screenSize.height}\n />\n {showAudioError && (\n <ErrorModal\n message=\"오디오 초기화에 실패했습니다. 재시도하거나 소리 없이 계속할 수 있습니다. | Audio initialization failed. You can retry or continue without sound.\"\n onRetry={handleAudioErrorRetry}\n onContinue={handleAudioErrorContinue}\n />\n )}\n </div>\n );\n }\n\n return (\n <div\n className=\"app\"\n tabIndex={0}\n ref={containerRef}\n style={{\n outline: \"none\",\n width: \"100vw\",\n height: \"100vh\",\n overflow: \"hidden\",\n }}\n data-testid=\"app-container\"\n >\n {/* All screens now use Three.js or pure React/HTML */}\n {renderCurrentScreen()}\n\n {/* Performance debug overlay (dev mode only, toggle with P key) */}\n {showPerformanceDebug && <PerformanceDebugOverlayHtml />}\n </div>\n );\n}\n\nexport default App;\n"],"mappings":"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"}
@@ -13,10 +13,10 @@ body {
13
13
  font-family: var(--font-korean);
14
14
  background: linear-gradient(
15
15
  135deg,
16
- var(--korean-bg-dark) 0%,
17
- var(--korean-bg-medium) 100%
16
+ var(--color-bg-dark) 0%,
17
+ var(--color-bg-medium) 100%
18
18
  );
19
- color: var(--korean-text-primary);
19
+ color: var(--color-text-primary);
20
20
  overflow: hidden;
21
21
  user-select: none;
22
22
  }
@@ -28,15 +28,15 @@ body {
28
28
  align-items: center;
29
29
  background: radial-gradient(
30
30
  ellipse at center,
31
- var(--korean-bg-medium) 0%,
32
- var(--korean-bg-dark) 100%
31
+ var(--color-bg-medium) 0%,
32
+ var(--color-bg-dark) 100%
33
33
  );
34
34
  }
35
35
  /* Korean Text Enhancement */
36
36
  .korean-text {
37
37
  font-family: var(--font-korean);
38
38
  font-weight: 400;
39
- text-shadow: 0 0 8px var(--korean-glow);
39
+ text-shadow: 0 0 8px var(--color-korean-east);
40
40
  letter-spacing: 0.02em;
41
41
  }
42
42
  .korean-title {
@@ -45,42 +45,42 @@ body {
45
45
  font-size: 3rem;
46
46
  background: linear-gradient(
47
47
  45deg,
48
- var(--korean-primary),
49
- var(--korean-accent)
48
+ var(--color-accent-cyan),
49
+ var(--color-warning)
50
50
  );
51
51
  -webkit-background-clip: text;
52
52
  -webkit-text-fill-color: transparent;
53
53
  background-clip: text;
54
- text-shadow: 0 0 20px var(--korean-primary);
54
+ text-shadow: 0 0 20px var(--color-accent-cyan);
55
55
  }
56
56
  .cyber-text {
57
57
  font-family: var(--font-cyber);
58
- color: var(--korean-primary);
58
+ color: var(--color-accent-cyan);
59
59
  text-transform: uppercase;
60
60
  letter-spacing: 0.1em;
61
61
  text-shadow: 0 0 10px currentColor;
62
62
  }
63
63
  /* Cyberpunk UI Elements */
64
64
  .cyberpunk-border {
65
- border: 2px solid var(--korean-primary);
65
+ border: 2px solid var(--color-accent-cyan);
66
66
  border-image: linear-gradient(
67
67
  45deg,
68
- var(--korean-primary),
69
- var(--korean-accent),
70
- var(--korean-primary)
68
+ var(--color-accent-cyan),
69
+ var(--color-warning),
70
+ var(--color-accent-cyan)
71
71
  )
72
72
  1;
73
- box-shadow: 0 0 10px var(--korean-primary),
74
- inset 0 0 10px rgba(0, 212, 255, 0.1);
73
+ box-shadow: 0 0 10px var(--color-accent-cyan),
74
+ inset 0 0 10px color-mix(in srgb, var(--color-accent-cyan) 10%, transparent);
75
75
  }
76
76
  .cyberpunk-button {
77
77
  background: linear-gradient(
78
78
  135deg,
79
- rgba(0, 212, 255, 0.1),
80
- rgba(255, 183, 0, 0.1)
79
+ color-mix(in srgb, var(--color-accent-cyan) 10%, transparent),
80
+ color-mix(in srgb, var(--color-warning) 10%, transparent)
81
81
  );
82
- border: 1px solid var(--korean-primary);
83
- color: var(--korean-text-primary);
82
+ border: 1px solid var(--color-accent-cyan);
83
+ color: var(--color-text-primary);
84
84
  padding: 0.8rem 1.5rem;
85
85
  cursor: pointer;
86
86
  transition: all 0.3s ease;
@@ -92,10 +92,10 @@ body {
92
92
  .cyberpunk-button:hover {
93
93
  background: linear-gradient(
94
94
  135deg,
95
- rgba(0, 212, 255, 0.2),
96
- rgba(255, 183, 0, 0.2)
95
+ color-mix(in srgb, var(--color-accent-cyan) 20%, transparent),
96
+ color-mix(in srgb, var(--color-warning) 20%, transparent)
97
97
  );
98
- box-shadow: 0 0 20px var(--korean-primary);
98
+ box-shadow: 0 0 20px var(--color-accent-cyan);
99
99
  transform: translateY(-2px);
100
100
  }
101
101
  .cyberpunk-button:before {
@@ -108,7 +108,7 @@ body {
108
108
  background: linear-gradient(
109
109
  90deg,
110
110
  transparent,
111
- rgba(255, 255, 255, 0.2),
111
+ color-mix(in srgb, var(--color-text-primary) 20%, transparent),
112
112
  transparent
113
113
  );
114
114
  transition: left 0.5s;
@@ -124,15 +124,15 @@ body {
124
124
  right: 0;
125
125
  background: linear-gradient(
126
126
  180deg,
127
- rgba(10, 10, 15, 0.9) 0%,
127
+ color-mix(in srgb, var(--color-bg-dark) 90%, transparent) 0%,
128
128
  transparent 100%
129
129
  );
130
130
  padding: 1rem;
131
- border-bottom: 1px solid var(--korean-primary);
131
+ border-bottom: 1px solid var(--color-accent-cyan);
132
132
  }
133
133
  .health-bar {
134
- background: var(--korean-bg-dark);
135
- border: 1px solid var(--korean-primary);
134
+ background: var(--color-bg-dark);
135
+ border: 1px solid var(--color-accent-cyan);
136
136
  height: 8px;
137
137
  border-radius: 4px;
138
138
  overflow: hidden;
@@ -141,9 +141,9 @@ body {
141
141
  .health-bar-fill {
142
142
  background: linear-gradient(
143
143
  90deg,
144
- var(--korean-danger) 0%,
145
- var(--korean-accent) 50%,
146
- var(--korean-glow) 100%
144
+ var(--color-danger) 0%,
145
+ var(--color-warning) 50%,
146
+ var(--color-korean-east) 100%
147
147
  );
148
148
  height: 100%;
149
149
  transition: width 0.3s ease;
@@ -153,10 +153,10 @@ body {
153
153
  @keyframes korean-glow {
154
154
  0%,
155
155
  100% {
156
- text-shadow: 0 0 5px var(--korean-glow);
156
+ text-shadow: 0 0 5px var(--color-korean-east);
157
157
  }
158
158
  50% {
159
- text-shadow: 0 0 20px var(--korean-glow);
159
+ text-shadow: 0 0 20px var(--color-korean-east);
160
160
  }
161
161
  }
162
162
  .animate-glow {
@@ -164,13 +164,13 @@ body {
164
164
  }
165
165
  @keyframes combat-flash {
166
166
  0% {
167
- background-color: rgba(255, 51, 102, 0.1);
167
+ background-color: color-mix(in srgb, var(--color-danger) 10%, transparent);
168
168
  }
169
169
  50% {
170
- background-color: rgba(255, 51, 102, 0.3);
170
+ background-color: color-mix(in srgb, var(--color-danger) 30%, transparent);
171
171
  }
172
172
  100% {
173
- background-color: rgba(255, 51, 102, 0.1);
173
+ background-color: color-mix(in srgb, var(--color-danger) 10%, transparent);
174
174
  }
175
175
  }
176
176
  .combat-flash {
@@ -232,8 +232,8 @@ body {
232
232
  }
233
233
  /* Loading and Error States */
234
234
  .loading-spinner {
235
- border: 2px solid var(--korean-bg-medium);
236
- border-top: 2px solid var(--korean-primary);
235
+ border: 2px solid var(--color-bg-medium);
236
+ border-top: 2px solid var(--color-accent-cyan);
237
237
  border-radius: 50%;
238
238
  width: 40px;
239
239
  height: 40px;
@@ -249,9 +249,9 @@ body {
249
249
  }
250
250
  }
251
251
  .error-message {
252
- color: var(--korean-danger);
253
- background: rgba(255, 51, 102, 0.1);
254
- border: 1px solid var(--korean-danger);
252
+ color: var(--color-danger);
253
+ background: color-mix(in srgb, var(--color-danger) 10%, transparent);
254
+ border: 1px solid var(--color-danger);
255
255
  padding: 1rem;
256
256
  border-radius: 4px;
257
257
  margin: 1rem 0;
@@ -368,8 +368,8 @@ body {
368
368
  bottom: 0;
369
369
  background: radial-gradient(
370
370
  circle at center,
371
- rgba(139, 0, 0, 0.1) 0%,
372
- rgba(0, 0, 0, 1) 70%
371
+ color-mix(in srgb, var(--color-korean-south) 10%, transparent) 0%,
372
+ var(--color-primary-black) 70%
373
373
  );
374
374
  pointer-events: none;
375
375
  z-index: -1;
@@ -444,12 +444,12 @@ body {
444
444
  }
445
445
  .app-header {
446
446
  padding: 1rem 2rem;
447
- background: rgba(0, 10, 18, 0.9);
448
- border-bottom: 2px solid #ffd700;
447
+ background: color-mix(in srgb, var(--color-bg-dark) 90%, transparent);
448
+ border-bottom: 2px solid var(--color-primary-gold);
449
449
  display: flex;
450
450
  justify-content: space-between;
451
451
  align-items: center;
452
- box-shadow: 0 2px 10px rgba(255, 215, 0, 0.3);
452
+ box-shadow: 0 2px 10px color-mix(in srgb, var(--color-primary-gold) 30%, transparent);
453
453
  }
454
454
  .app-title {
455
455
  margin: 0;
@@ -460,14 +460,14 @@ body {
460
460
  .korean-title {
461
461
  font-size: 1.8rem;
462
462
  font-weight: bold;
463
- color: #ffd700;
464
- text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.8);
463
+ color: var(--color-primary-gold);
464
+ text-shadow: 2px 2px 4px color-mix(in srgb, var(--color-primary-black) 80%, transparent);
465
465
  }
466
466
  .english-title {
467
467
  font-size: 1rem;
468
- color: #87ceeb;
468
+ color: var(--color-info);
469
469
  font-style: italic;
470
- text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.6);
470
+ text-shadow: 1px 1px 2px color-mix(in srgb, var(--color-primary-black) 60%, transparent);
471
471
  }
472
472
  .app-status {
473
473
  display: flex;
@@ -483,14 +483,14 @@ body {
483
483
  font-weight: bold;
484
484
  }
485
485
  .phase-indicator {
486
- background: rgba(255, 215, 0, 0.2);
487
- color: #ffd700;
488
- border: 1px solid #ffd700;
486
+ background: color-mix(in srgb, var(--color-primary-gold) 20%, transparent);
487
+ color: var(--color-primary-gold);
488
+ border: 1px solid var(--color-primary-gold);
489
489
  }
490
490
  .time-indicator {
491
- background: rgba(135, 206, 235, 0.2);
492
- color: #87ceeb;
493
- border: 1px solid #87ceeb;
491
+ background: color-mix(in srgb, var(--color-info) 20%, transparent);
492
+ color: var(--color-info);
493
+ border: 1px solid var(--color-info);
494
494
  }
495
495
  .app-main {
496
496
  flex: 1;
@@ -500,7 +500,7 @@ body {
500
500
  overflow: hidden;
501
501
  }
502
502
  .app-debug {
503
- background: rgba(0, 0, 0, 0.8);
503
+ background: color-mix(in srgb, var(--color-primary-black) 80%, transparent);
504
504
  color: #00ff00;
505
505
  font-family: "Courier New", monospace;
506
506
  font-size: 0.8rem;
@@ -510,7 +510,7 @@ body {
510
510
  .app-debug summary {
511
511
  padding: 0.5rem;
512
512
  cursor: pointer;
513
- background: rgba(0, 255, 0, 0.1);
513
+ background: color-mix(in srgb, var(--color-success) 10%, transparent);
514
514
  border-bottom: 1px solid #00ff00;
515
515
  }
516
516
  .app-debug pre {
@@ -550,12 +550,12 @@ body {
550
550
  bottom: 0;
551
551
  background-image: radial-gradient(
552
552
  circle at 20% 20%,
553
- rgba(255, 215, 0, 0.05) 0%,
553
+ color-mix(in srgb, var(--color-primary-gold) 5%, transparent) 0%,
554
554
  transparent 50%
555
555
  ),
556
556
  radial-gradient(
557
557
  circle at 80% 80%,
558
- rgba(135, 206, 235, 0.05) 0%,
558
+ color-mix(in srgb, var(--color-info) 5%, transparent) 0%,
559
559
  transparent 50%
560
560
  );
561
561
  pointer-events: none;
@@ -580,7 +580,7 @@ body {
580
580
  font-weight: 700;
581
581
  color: #ffd700;
582
582
  margin-bottom: 1rem;
583
- text-shadow: 0 0 20px rgba(255, 215, 0, 0.5);
583
+ text-shadow: 0 0 20px color-mix(in srgb, var(--color-primary-gold) 50%, transparent);
584
584
  }
585
585
  .english-subtitle {
586
586
  font-size: 1.2rem;
@@ -644,7 +644,7 @@ body {
644
644
  left: 50%;
645
645
  transform: translate(-50%, -50%);
646
646
  text-align: center;
647
- color: var(--primary-cyan);
647
+ color: var(--color-primary-cyan);
648
648
  }
649
649
  .error-screen {
650
650
  position: absolute;
@@ -655,7 +655,7 @@ body {
655
655
  color: #ff4136;
656
656
  padding: 2rem;
657
657
  border: 1px solid #ff4136;
658
- background: rgba(255, 65, 54, 0.1);
658
+ background: color-mix(in srgb, var(--color-danger) 10%, transparent);
659
659
  }
660
660
  /* Fix UI overlay positioning to not interfere with canvas visibility */
661
661
  .test-overlay {
@@ -823,14 +823,14 @@ body {
823
823
  /* Timer Flash - Final seconds warning */
824
824
  @keyframes timerFlash {
825
825
  0%, 100% {
826
- color: #ff4444;
827
- text-shadow: 0 0 10px rgba(255, 68, 68, 0.8),
828
- 0 0 20px rgba(255, 68, 68, 0.5);
826
+ color: var(--color-korean-south);
827
+ text-shadow: 0 0 10px color-mix(in srgb, var(--color-korean-south) 80%, transparent),
828
+ 0 0 20px color-mix(in srgb, var(--color-korean-south) 50%, transparent);
829
829
  }
830
830
  50% {
831
- color: #ffaa00;
832
- text-shadow: 0 0 15px rgba(255, 170, 0, 1),
833
- 0 0 30px rgba(255, 170, 0, 0.7);
831
+ color: var(--color-korean-center);
832
+ text-shadow: 0 0 15px var(--color-korean-center),
833
+ 0 0 30px color-mix(in srgb, var(--color-korean-center) 70%, transparent);
834
834
  }
835
835
  }
836
836
 
@@ -1006,9 +1006,9 @@ body {
1006
1006
  .training-button {
1007
1007
  width: 100%;
1008
1008
  height: 40px;
1009
- border: 2px solid rgba(255, 255, 255, 0.8);
1009
+ border: 2px solid color-mix(in srgb, var(--color-text-primary) 80%, transparent);
1010
1010
  border-radius: 8px;
1011
- color: #ffffff;
1011
+ color: var(--color-text-primary);
1012
1012
  font-weight: bold;
1013
1013
  cursor: pointer;
1014
1014
  display: flex;
@@ -1019,11 +1019,11 @@ body {
1019
1019
  }
1020
1020
 
1021
1021
  .training-button-start {
1022
- background: #00ff88;
1022
+ background: var(--color-success);
1023
1023
  }
1024
1024
 
1025
1025
  .training-button-stop {
1026
- background: #ff4444;
1026
+ background: var(--color-korean-south);
1027
1027
  }
1028
1028
 
1029
1029
  .training-button:hover {
@@ -1033,52 +1033,52 @@ body {
1033
1033
 
1034
1034
  /* Training Mode Selector */
1035
1035
  .mode-button {
1036
- background: rgba(45, 45, 45, 0.5);
1037
- border: 2px solid rgba(0, 255, 255, 0.4);
1036
+ background: color-mix(in srgb, var(--color-bg-light) 50%, transparent);
1037
+ border: 2px solid color-mix(in srgb, var(--color-primary-cyan) 40%, transparent);
1038
1038
  border-radius: 8px;
1039
1039
  padding: 10px;
1040
1040
  cursor: pointer;
1041
1041
  text-align: left;
1042
- color: #ffffff;
1042
+ color: var(--color-text-primary);
1043
1043
  transition: all 0.2s ease;
1044
1044
  }
1045
1045
 
1046
1046
  .mode-button.selected {
1047
- background: rgba(0, 255, 255, 0.25);
1048
- border-color: #00ffff;
1049
- box-shadow: 0 0 12px rgba(0, 255, 255, 0.5);
1047
+ background: color-mix(in srgb, var(--color-primary-cyan) 25%, transparent);
1048
+ border-color: var(--color-primary-cyan);
1049
+ box-shadow: 0 0 12px color-mix(in srgb, var(--color-primary-cyan) 50%, transparent);
1050
1050
  }
1051
1051
 
1052
1052
  .mode-button:not(.selected):hover {
1053
- background: rgba(64, 64, 64, 0.7);
1054
- border-color: #00ffff;
1053
+ background: color-mix(in srgb, var(--color-gray-300) 70%, transparent);
1054
+ border-color: var(--color-primary-cyan);
1055
1055
  transform: scale(1.02);
1056
1056
  }
1057
1057
 
1058
1058
  .mode-button:focus-visible {
1059
- outline: 2px solid #00ffff;
1059
+ outline: 2px solid var(--color-primary-cyan);
1060
1060
  outline-offset: 2px;
1061
- box-shadow: 0 0 12px rgba(0, 255, 255, 0.8);
1061
+ box-shadow: 0 0 12px color-mix(in srgb, var(--color-primary-cyan) 80%, transparent);
1062
1062
  }
1063
1063
 
1064
1064
  /* Vital Point Button */
1065
1065
  .vital-point-button {
1066
- background: rgba(45, 45, 45, 0.5);
1067
- border: 2px solid rgba(255, 170, 0, 0.5);
1066
+ background: color-mix(in srgb, var(--color-bg-light) 50%, transparent);
1067
+ border: 2px solid color-mix(in srgb, var(--color-korean-center) 50%, transparent);
1068
1068
  border-radius: 8px;
1069
1069
  padding: 8px;
1070
1070
  cursor: pointer;
1071
1071
  text-align: left;
1072
- color: #ffffff;
1072
+ color: var(--color-text-primary);
1073
1073
  transition: all 0.2s ease;
1074
1074
  }
1075
1075
 
1076
1076
  .vital-point-button.selected {
1077
- background: rgba(255, 170, 0, 0.3);
1077
+ background: color-mix(in srgb, var(--color-korean-center) 30%, transparent);
1078
1078
  }
1079
1079
 
1080
1080
  .vital-point-button:not(.selected):hover {
1081
- background: rgba(64, 64, 64, 0.7);
1081
+ background: color-mix(in srgb, var(--color-gray-300) 70%, transparent);
1082
1082
  }
1083
1083
 
1084
1084
  /* Training Feedback Animation - Fast and snappy */
@@ -1097,12 +1097,12 @@ body {
1097
1097
  }
1098
1098
 
1099
1099
  .training-feedback {
1100
- background: rgba(0, 0, 0, 0.9);
1101
- border: 3px solid #ffd700;
1100
+ background: color-mix(in srgb, var(--color-primary-black) 90%, transparent);
1101
+ border: 3px solid var(--color-primary-gold);
1102
1102
  border-radius: 16px;
1103
- color: #ffd700;
1103
+ color: var(--color-primary-gold);
1104
1104
  text-align: center;
1105
- box-shadow: 0 0 30px rgba(255, 215, 0, 0.5);
1105
+ box-shadow: 0 0 30px color-mix(in srgb, var(--color-primary-gold) 50%, transparent);
1106
1106
  animation: feedbackPulse 0.4s ease-out;
1107
1107
  min-width: 200px;
1108
1108
  }
@@ -1133,7 +1133,7 @@ body {
1133
1133
  width: 12px;
1134
1134
  height: 12px;
1135
1135
  border-radius: 50%;
1136
- background: #00ff88;
1136
+ background: var(--color-success);
1137
1137
  }
1138
1138
 
1139
1139
  .status-indicator.active {
@@ -1141,6 +1141,6 @@ body {
1141
1141
  }
1142
1142
 
1143
1143
  .status-indicator.inactive {
1144
- background: #888888;
1144
+ background: var(--color-gray-500);
1145
1145
  }
1146
1146
  /*$vite$:1*/
@@ -1,5 +1,14 @@
1
1
  export * from "./screens/combat";
2
2
  export { TrainingScreen3D } from "./screens/training";
3
+ export type { TrainingScreen3DProps } from "./screens/training";
4
+ export { EndScreen3D } from "./screens/endscreen";
5
+ export type { EndScreen3DProps } from "./screens/endscreen";
6
+ export { ControlsScreen3D } from "./screens/controls/ControlsScreen3D";
7
+ export type { ControlsScreen3DProps } from "./screens/controls/ControlsScreen3D";
8
+ export { IntroScreen3D } from "./screens/intro/IntroScreen3D";
9
+ export type { IntroScreen3DProps } from "./screens/intro/IntroScreen3D";
10
+ export { PhilosophyScreen3D } from "./screens/philosophy/PhilosophyScreen3D";
11
+ export type { PhilosophyScreen3DProps } from "./screens/philosophy/PhilosophyScreen3D";
3
12
  export { ArchetypeCard, KoreanButton, KoreanPanel, KoreanText as KoreanText3D, MenuList, ProgressBar, } from "./shared/three";
4
13
  export type { ArchetypeCardProps, KoreanButtonProps, KoreanPanelProps, KoreanTextProps, MenuItem, MenuListProps, ProgressBarProps, ProgressBarType, } from "./shared/three";
5
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EACL,aAAa,EACb,YAAY,EACZ,WAAW,EACX,UAAU,IAAI,YAAY,EAC1B,QAAQ,EACR,WAAW,GACZ,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,QAAQ,EACR,aAAa,EACb,gBAAgB,EAChB,eAAe,GAChB,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,YAAY,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,YAAY,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,YAAY,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAGvF,OAAO,EACL,aAAa,EACb,YAAY,EACZ,WAAW,EACX,UAAU,IAAI,YAAY,EAC1B,QAAQ,EACR,WAAW,GACZ,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,QAAQ,EACR,aAAa,EACb,gBAAgB,EAChB,eAAe,GAChB,MAAM,gBAAgB,CAAC"}