blacktrigram 0.7.39 → 0.7.41

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 (354) 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.js.map +1 -1
  14. package/lib/components/screens/combat/components/controls/CombatButtons.js.map +1 -1
  15. package/lib/components/screens/combat/components/controls/CombatControlsPanel.js.map +1 -1
  16. package/lib/components/screens/combat/components/controls/ControlsGuide.js.map +1 -1
  17. package/lib/components/screens/combat/components/controls/KeyboardHints.js.map +1 -1
  18. package/lib/components/screens/combat/components/controls/PauseMenu.js.map +1 -1
  19. package/lib/components/screens/combat/components/controls/PauseMenuButton.js.map +1 -1
  20. package/lib/components/screens/combat/components/controls/QuickSettings.js.map +1 -1
  21. package/lib/components/screens/combat/components/effects/BloodDecals3D.js.map +1 -1
  22. package/lib/components/screens/combat/components/effects/BloodLossOverlayHtml.js.map +1 -1
  23. package/lib/components/screens/combat/components/effects/BloodParticles3D.js.map +1 -1
  24. package/lib/components/screens/combat/components/effects/BloodViscosity3D.js.map +1 -1
  25. package/lib/components/screens/combat/components/effects/CombatParticleEffects3D.js.map +1 -1
  26. package/lib/components/screens/combat/components/effects/ConsciousnessBlur.js.map +1 -1
  27. package/lib/components/screens/combat/components/effects/InternalDamage3D.js.map +1 -1
  28. package/lib/components/screens/combat/components/effects/PainVignette.js.map +1 -1
  29. package/lib/components/screens/combat/components/effects/ParticleAudio3D.js.map +1 -1
  30. package/lib/components/screens/combat/components/effects/TraumaOverlay3D.js.map +1 -1
  31. package/lib/components/screens/combat/components/feedback/MatchCountdown.js.map +1 -1
  32. package/lib/components/screens/combat/components/feedback/RoundAnnouncementOverlayHtml.js.map +1 -1
  33. package/lib/components/screens/combat/components/feedback/RoundDisplayStatus.js.map +1 -1
  34. package/lib/components/screens/combat/components/feedback/RoundStartAnnouncementOverlayHtml.js.map +1 -1
  35. package/lib/components/screens/combat/components/hud/CombatBottomHUD.js.map +1 -1
  36. package/lib/components/screens/combat/components/hud/CombatLeftHUD.js.map +1 -1
  37. package/lib/components/screens/combat/components/hud/CombatPortraitStatusStrip.js.map +1 -1
  38. package/lib/components/screens/combat/components/hud/CombatRightHUD.js.map +1 -1
  39. package/lib/components/screens/combat/components/hud/CombatTopHUD.js.map +1 -1
  40. package/lib/components/screens/combat/components/hud/DifficultyIndicator.js.map +1 -1
  41. package/lib/components/screens/combat/components/hud/FPSMonitor.js.map +1 -1
  42. package/lib/components/screens/combat/components/hud/MobileControlsWrapper.js.map +1 -1
  43. package/lib/components/screens/combat/components/hud/PlayerStateOverlayHtml.js.map +1 -1
  44. package/lib/components/screens/combat/components/indicators/BalanceIndicator.js.map +1 -1
  45. package/lib/components/screens/combat/components/indicators/InputBufferDisplay.js.map +1 -1
  46. package/lib/components/screens/combat/components/indicators/StaminaWarning.js.map +1 -1
  47. package/lib/components/screens/combat/components/indicators/TechniqueNameDisplay.js.map +1 -1
  48. package/lib/components/screens/combat/helpers/AnimationUpdater.js.map +1 -1
  49. package/lib/components/screens/combat/helpers/combatHelpers.js.map +1 -1
  50. package/lib/components/screens/combat/hooks/useAICombat.js.map +1 -1
  51. package/lib/components/screens/combat/hooks/useCombatActions.js.map +1 -1
  52. package/lib/components/screens/combat/hooks/useCombatAttackMovement.js.map +1 -1
  53. package/lib/components/screens/combat/hooks/useCombatAudio.js.map +1 -1
  54. package/lib/components/screens/combat/hooks/useCombatLayout.js.map +1 -1
  55. package/lib/components/screens/combat/hooks/useCombatState.js.map +1 -1
  56. package/lib/components/screens/controls/ControlsScreen3D.js.map +1 -1
  57. package/lib/components/screens/controls/components/ControlBindingsOverlayHtml.js.map +1 -1
  58. package/lib/components/screens/controls/components/ControlCategoryTabsOverlayHtml.js.map +1 -1
  59. package/lib/components/screens/controls/components/GamepadVisualization3D.js.map +1 -1
  60. package/lib/components/screens/controls/components/InteractiveControlDemoOverlayHtml.js.map +1 -1
  61. package/lib/components/screens/controls/components/Key3D.js.map +1 -1
  62. package/lib/components/screens/controls/components/VisualKeyboard3D.js.map +1 -1
  63. package/lib/components/screens/controls/constants/ControlsConstants.js.map +1 -1
  64. package/lib/components/screens/controls/hooks/useControlsState.js.map +1 -1
  65. package/lib/components/screens/endscreen/EndScreen3D.js.map +1 -1
  66. package/lib/components/screens/endscreen/components/DefeatAnimation3D.js.map +1 -1
  67. package/lib/components/screens/endscreen/components/MatchStatisticsDisplayOverlayHtml.js.map +1 -1
  68. package/lib/components/screens/endscreen/components/NavigationButtonsOverlayHtml.js.map +1 -1
  69. package/lib/components/screens/endscreen/components/PerformanceBreakdownOverlayHtml.js.map +1 -1
  70. package/lib/components/screens/endscreen/components/PerformanceRatingOverlayHtml.js.map +1 -1
  71. package/lib/components/screens/endscreen/components/VictoryAnimation3D.js.map +1 -1
  72. package/lib/components/screens/endscreen/components/WinnerDisplayOverlayHtml.js.map +1 -1
  73. package/lib/components/screens/intro/IntroScreen3D.js +1 -1
  74. package/lib/components/screens/intro/IntroScreen3D.js.map +1 -1
  75. package/lib/components/screens/intro/components/AbilityListOverlayHtml.js.map +1 -1
  76. package/lib/components/screens/intro/components/ArchetypeCardGridOverlayHtml.js.map +1 -1
  77. package/lib/components/screens/intro/components/ArchetypeCardOverlayHtml.js.map +1 -1
  78. package/lib/components/screens/intro/components/ArchetypeDisplayOverlayHtml.js.map +1 -1
  79. package/lib/components/screens/intro/components/EnhancedArchetypeDisplayOverlayHtml.js.map +1 -1
  80. package/lib/components/screens/intro/components/MenuButtonsOverlayHtml.js.map +1 -1
  81. package/lib/components/screens/intro/components/MenuSectionOverlayHtml.js.map +1 -1
  82. package/lib/components/screens/intro/components/StatBarOverlayHtml.js.map +1 -1
  83. package/lib/components/screens/philosophy/PhilosophyScreen3D.js.map +1 -1
  84. package/lib/components/screens/training/TrainingScreen3D.js.map +1 -1
  85. package/lib/components/screens/training/components/AnatomyControlsOverlayHtml.js.map +1 -1
  86. package/lib/components/screens/training/components/AnatomyOverlay3D.js.map +1 -1
  87. package/lib/components/screens/training/components/FootPlacementMarkers3D.js.map +1 -1
  88. package/lib/components/screens/training/components/FootworkDrillsOverlayHtml.js.map +1 -1
  89. package/lib/components/screens/training/components/HitFeedbackEffect3D.js.map +1 -1
  90. package/lib/components/screens/training/components/TrainingButtonsOverlayHtml.js.map +1 -1
  91. package/lib/components/screens/training/components/TrainingControlsOverlayHtml.js.map +1 -1
  92. package/lib/components/screens/training/components/TrainingDummy3D.js.map +1 -1
  93. package/lib/components/screens/training/components/TrainingFeedbackOverlayHtml.js.map +1 -1
  94. package/lib/components/screens/training/components/TrainingModeSelectorOverlayHtml.js.map +1 -1
  95. package/lib/components/screens/training/components/TrainingStatsOverlayHtml.js.map +1 -1
  96. package/lib/components/screens/training/components/VitalPointMarker3D.js.map +1 -1
  97. package/lib/components/screens/training/components/VitalPointTrainingOverlayHtml.js.map +1 -1
  98. package/lib/components/screens/training/components/hud/TrainingBottomHUD.js.map +1 -1
  99. package/lib/components/screens/training/components/hud/TrainingLeftHUD.js.map +1 -1
  100. package/lib/components/screens/training/components/hud/TrainingRightHUD.js.map +1 -1
  101. package/lib/components/screens/training/components/hud/TrainingTopHUD.js.map +1 -1
  102. package/lib/components/screens/training/hooks/useAttackMovement.js.map +1 -1
  103. package/lib/components/screens/training/hooks/useTrainingActions.js.map +1 -1
  104. package/lib/components/screens/training/hooks/useTrainingLayout.js.map +1 -1
  105. package/lib/components/screens/training/hooks/useTrainingState.js.map +1 -1
  106. package/lib/components/shared/base/BaseButton.js.map +1 -1
  107. package/lib/components/shared/base/BaseButtonOverlayHtml.js.map +1 -1
  108. package/lib/components/shared/base/BasePanel.js.map +1 -1
  109. package/lib/components/shared/base/BaseText.js.map +1 -1
  110. package/lib/components/shared/base/useKoreanTheme.js.map +1 -1
  111. package/lib/components/shared/debug/PerformanceDebugOverlayHtml.js.map +1 -1
  112. package/lib/components/shared/mobile/ActionButtons.js.map +1 -1
  113. package/lib/components/shared/mobile/GestureRecognizerPure.js.map +1 -1
  114. package/lib/components/shared/mobile/HapticController.js.map +1 -1
  115. package/lib/components/shared/mobile/MobileControlsPure.js.map +1 -1
  116. package/lib/components/shared/mobile/StanceWheelPure.js.map +1 -1
  117. package/lib/components/shared/mobile/TouchOptimizer.js.map +1 -1
  118. package/lib/components/shared/mobile/VirtualDPad.js.map +1 -1
  119. package/lib/components/shared/three/anatomy/BodySurface.js.map +1 -1
  120. package/lib/components/shared/three/anatomy/BoneAttachedMuscles.js.map +1 -1
  121. package/lib/components/shared/three/anatomy/BoneClothing.js.map +1 -1
  122. package/lib/components/shared/three/anatomy/BoneRenderer.js.map +1 -1
  123. package/lib/components/shared/three/anatomy/Face3D.js.map +1 -1
  124. package/lib/components/shared/three/anatomy/Foot3D.js.map +1 -1
  125. package/lib/components/shared/three/anatomy/Hand3D.js.map +1 -1
  126. package/lib/components/shared/three/effects/ActionFeedback.js.map +1 -1
  127. package/lib/components/shared/three/effects/DamageNumbers.js.map +1 -1
  128. package/lib/components/shared/three/effects/HitEffects3D.js.map +1 -1
  129. package/lib/components/shared/three/effects/PlayerStateIndicators.js.map +1 -1
  130. package/lib/components/shared/three/effects/StanceSymbol3D.js.map +1 -1
  131. package/lib/components/shared/three/effects/StanceTransitionEffect.js.map +1 -1
  132. package/lib/components/shared/three/effects/VitalPointMarkers3D.js.map +1 -1
  133. package/lib/components/shared/three/indicators/ElementalColorSystem.js.map +1 -1
  134. package/lib/components/shared/three/indicators/GuardIndicator.js.map +1 -1
  135. package/lib/components/shared/three/indicators/HapticFeedback.js.map +1 -1
  136. package/lib/components/shared/three/indicators/StanceChangeIndicator.js.map +1 -1
  137. package/lib/components/shared/three/models/Player3DWithTransitions.js.map +1 -1
  138. package/lib/components/shared/three/models/SkeletalPlayer3D.js.map +1 -1
  139. package/lib/components/shared/three/optimization/AdaptiveQuality.js.map +1 -1
  140. package/lib/components/shared/three/scene/AtmosphericParticles3D.js.map +1 -1
  141. package/lib/components/shared/three/scene/BackgroundScene3D.js.map +1 -1
  142. package/lib/components/shared/three/scene/CombatArena3D.js.map +1 -1
  143. package/lib/components/shared/three/scene/KoreanSignage3D.js.map +1 -1
  144. package/lib/components/shared/three/ui/ArchetypeCard.js.map +1 -1
  145. package/lib/components/shared/three/ui/BodyPartHealthDisplay.js.map +1 -1
  146. package/lib/components/shared/three/ui/BreathingIndicator2.js.map +1 -1
  147. package/lib/components/shared/three/ui/CombatReadinessBar.js.map +1 -1
  148. package/lib/components/shared/three/ui/ComboCounter.js.map +1 -1
  149. package/lib/components/shared/three/ui/HealthBar.js.map +1 -1
  150. package/lib/components/shared/three/ui/KoreanButton.js.map +1 -1
  151. package/lib/components/shared/three/ui/KoreanPanel.js.map +1 -1
  152. package/lib/components/shared/three/ui/KoreanText.js.map +1 -1
  153. package/lib/components/shared/three/ui/MenuList.js.map +1 -1
  154. package/lib/components/shared/three/ui/PlayerHUD.js.map +1 -1
  155. package/lib/components/shared/three/ui/ProgressBar.js.map +1 -1
  156. package/lib/components/shared/three/ui/SpeedIndicatorHUD.js.map +1 -1
  157. package/lib/components/shared/three/ui/StaminaBar.js.map +1 -1
  158. package/lib/components/shared/three/ui/TechniqueBar.js.map +1 -1
  159. package/lib/components/shared/three/ui/TechniqueCard.js.map +1 -1
  160. package/lib/components/shared/three/ui/VitalPointOverlayControlsHtml.js.map +1 -1
  161. package/lib/components/shared/ui/BackButton.js.map +1 -1
  162. package/lib/components/shared/ui/BaseHUDContainer.js.map +1 -1
  163. package/lib/components/shared/ui/CombatTimer.js.map +1 -1
  164. package/lib/components/shared/ui/ErrorModal.js.map +1 -1
  165. package/lib/components/shared/ui/LoadingState.js.map +1 -1
  166. package/lib/components/shared/ui/SplashScreen.js +2 -2
  167. package/lib/components/shared/ui/SplashScreen.js.map +1 -1
  168. package/lib/components/shared/ui/VitalPointOverlayControlsPure.js.map +1 -1
  169. package/lib/components/shared/ui/VolumeControl.js.map +1 -1
  170. package/lib/components/shared/ui/shared/ConfirmDialog.js.map +1 -1
  171. package/lib/components/ui/combat/BalanceIndicatorOverlayHtml.js.map +1 -1
  172. package/lib/constants/bodyDimensions.js.map +1 -1
  173. package/lib/constants/bodyRenderingConstants.js.map +1 -1
  174. package/lib/data/archetypeClothing.js.map +1 -1
  175. package/lib/data/archetypePhysicalAttributes.js.map +1 -1
  176. package/lib/data/techniqueMappings.js.map +1 -1
  177. package/lib/data/techniques.js.map +1 -1
  178. package/lib/hooks/useActionFeedback.js.map +1 -1
  179. package/lib/hooks/useBalanceAnimations.js.map +1 -1
  180. package/lib/hooks/useCombatTimer.js.map +1 -1
  181. package/lib/hooks/useDebounce.js.map +1 -1
  182. package/lib/hooks/useHUDLayout.js.map +1 -1
  183. package/lib/hooks/useHandPoseTransitions.js.map +1 -1
  184. package/lib/hooks/useKeyboardControls.js.map +1 -1
  185. package/lib/hooks/useMatchCountdown.js.map +1 -1
  186. package/lib/hooks/useMuscleActivation.js.map +1 -1
  187. package/lib/hooks/usePauseMenu.js.map +1 -1
  188. package/lib/hooks/usePlayerAnimation.js.map +1 -1
  189. package/lib/hooks/useResponsiveLayout.js.map +1 -1
  190. package/lib/hooks/useRoundTransition.js.map +1 -1
  191. package/lib/hooks/useSkeletalAnimation.js.map +1 -1
  192. package/lib/hooks/useTechniqueSelection.js.map +1 -1
  193. package/lib/hooks/useThrottle.js.map +1 -1
  194. package/lib/hooks/useTouchControls.js.map +1 -1
  195. package/lib/hooks/useWebGLContextLossHandler.js.map +1 -1
  196. package/lib/hooks/useWindowSize.js.map +1 -1
  197. package/lib/systems/CombatSystem.js.map +1 -1
  198. package/lib/systems/EffectCalculator.js.map +1 -1
  199. package/lib/systems/LayoutSystem.js.map +1 -1
  200. package/lib/systems/PlayerEffectManager.js.map +1 -1
  201. package/lib/systems/ResponsiveScaling.js.map +1 -1
  202. package/lib/systems/TrigramSystem.js.map +1 -1
  203. package/lib/systems/VitalPointSystem.js.map +1 -1
  204. package/lib/systems/ai/AIPersonality.js.map +1 -1
  205. package/lib/systems/ai/AdaptiveDifficulty.js.map +1 -1
  206. package/lib/systems/ai/ArchetypeEnforcer.js.map +1 -1
  207. package/lib/systems/ai/ComboSystem.js.map +1 -1
  208. package/lib/systems/ai/DecisionTree.js.map +1 -1
  209. package/lib/systems/ai/TrainingAI.js.map +1 -1
  210. package/lib/systems/ai/types.js.map +1 -1
  211. package/lib/systems/animation/builders/AnimationBuilder.js.map +1 -1
  212. package/lib/systems/animation/builders/HandPoseApplicator.js.map +1 -1
  213. package/lib/systems/animation/builders/HandPoses.js.map +1 -1
  214. package/lib/systems/animation/builders/KeyframeConfig.js.map +1 -1
  215. package/lib/systems/animation/builders/KeyframeInterpolation.js +3 -90
  216. package/lib/systems/animation/builders/KeyframeInterpolation.js.map +1 -1
  217. package/lib/systems/animation/builders/KickPhaseApplicator.js.map +1 -1
  218. package/lib/systems/animation/builders/KoreanGuardPositions.js.map +1 -1
  219. package/lib/systems/animation/builders/MartialArtsAnimationBuilder.js.map +1 -1
  220. package/lib/systems/animation/builders/MartialArtsConstants.js.map +1 -1
  221. package/lib/systems/animation/builders/MartialPoseApplicator.js.map +1 -1
  222. package/lib/systems/animation/builders/PunchPhaseApplicator.js.map +1 -1
  223. package/lib/systems/animation/builders/SkeletonRig.js.map +1 -1
  224. package/lib/systems/animation/builders/TrigramGuardApplicator.js.map +1 -1
  225. package/lib/systems/animation/catalogs/DefensiveAnimations.js.map +1 -1
  226. package/lib/systems/animation/catalogs/FootworkSkeletalAnimations.js.map +1 -1
  227. package/lib/systems/animation/catalogs/RecoveryAnimations.js.map +1 -1
  228. package/lib/systems/animation/catalogs/StanceAnimations.js.map +1 -1
  229. package/lib/systems/animation/catalogs/StanceAttackAnimations.js.map +1 -1
  230. package/lib/systems/animation/catalogs/StanceGuardPoses.js.map +1 -1
  231. package/lib/systems/animation/catalogs/StanceIdleAnimations.js.map +1 -1
  232. package/lib/systems/animation/catalogs/StanceLocomotionAnimations.js.map +1 -1
  233. package/lib/systems/animation/catalogs/StepSkeletalAnimations.js.map +1 -1
  234. package/lib/systems/animation/core/AnimationHitTiming.js.map +1 -1
  235. package/lib/systems/animation/core/AnimationOptimizations.js.map +1 -1
  236. package/lib/systems/animation/core/AnimationPriority.js.map +1 -1
  237. package/lib/systems/animation/core/AnimationRegistry.js.map +1 -1
  238. package/lib/systems/animation/core/AnimationStateMachine.js.map +1 -1
  239. package/lib/systems/animation/core/AnimationTransitions.js.map +1 -1
  240. package/lib/systems/animation/core/LateralityTransform.js.map +1 -1
  241. package/lib/systems/animation/core/RecoveryPhaseEnhancer.js.map +1 -1
  242. package/lib/systems/animation/core/TechniqueAnimationMapper.js.map +1 -1
  243. package/lib/systems/animation/core/TechniqueAnimationMapping.js.map +1 -1
  244. package/lib/systems/animation/core/types.js.map +1 -1
  245. package/lib/systems/animation/systems/AdvancedJointMovements.js.map +1 -1
  246. package/lib/systems/animation/systems/BodyFacingSystem.js.map +1 -1
  247. package/lib/systems/animation/systems/FacialExpressions.js.map +1 -1
  248. package/lib/systems/animation/systems/FallAnimations.js.map +1 -1
  249. package/lib/systems/animation/systems/MuscleActivation.js.map +1 -1
  250. package/lib/systems/bodypart/BodyPartDamageIntegration.js.map +1 -1
  251. package/lib/systems/bodypart/BodyPartHealthSystem.js.map +1 -1
  252. package/lib/systems/bodypart/BodyPartPositionMapping.js.map +1 -1
  253. package/lib/systems/bodypart/CombatInjuryIntegration.js.map +1 -1
  254. package/lib/systems/bodypart/InjuryIntegration.js.map +1 -1
  255. package/lib/systems/bodypart/InjuryTracker.js.map +1 -1
  256. package/lib/systems/bodypart/MovementPenaltySystem.js.map +1 -1
  257. package/lib/systems/bodypart/PlayerInjuryTrackingManager.js.map +1 -1
  258. package/lib/systems/bodypart/types.js.map +1 -1
  259. package/lib/systems/breathing/BreathingDisruptionSystem.js.map +1 -1
  260. package/lib/systems/breathing/feedback.js.map +1 -1
  261. package/lib/systems/breathing/integration.js.map +1 -1
  262. package/lib/systems/combat/BalanceSystem.js.map +1 -1
  263. package/lib/systems/combat/BreakingStatusEffects.js.map +1 -1
  264. package/lib/systems/combat/CombatStateSystem.js.map +1 -1
  265. package/lib/systems/combat/ConsciousnessSystem.js.map +1 -1
  266. package/lib/systems/combat/FallIntegration.js.map +1 -1
  267. package/lib/systems/combat/GrappleSystem.js.map +1 -1
  268. package/lib/systems/combat/LimbExposureSystem.js.map +1 -1
  269. package/lib/systems/combat/PainResponseSystem.js.map +1 -1
  270. package/lib/systems/combat/TrainingCombatSystem.js.map +1 -1
  271. package/lib/systems/combat/painConsciousnessUtils.js.map +1 -1
  272. package/lib/systems/combat/typeGuards.js.map +1 -1
  273. package/lib/systems/effects.js.map +1 -1
  274. package/lib/systems/game.js.map +1 -1
  275. package/lib/systems/movement/InjuryMovementModifier.js.map +1 -1
  276. package/lib/systems/movement/helpers/AccelerationUpdater.js.map +1 -1
  277. package/lib/systems/movement/helpers/accelerationUtils.js.map +1 -1
  278. package/lib/systems/movement/integration.js.map +1 -1
  279. package/lib/systems/physics/AttackMovementPhysics.js.map +1 -1
  280. package/lib/systems/physics/CollisionDetection.js.map +1 -1
  281. package/lib/systems/physics/CoordinateMapper.js.map +1 -1
  282. package/lib/systems/physics/KnockbackPhysics.js.map +1 -1
  283. package/lib/systems/physics/MovementPhysics.js.map +1 -1
  284. package/lib/systems/physics/PhysicalReachCalculator.js.map +1 -1
  285. package/lib/systems/physics/SpeedModifierSystem.js.map +1 -1
  286. package/lib/systems/trigram/KoreanCulture.js.map +1 -1
  287. package/lib/systems/trigram/KoreanTechniques.js.map +1 -1
  288. package/lib/systems/trigram/StanceManager.js.map +1 -1
  289. package/lib/systems/trigram/TransitionCalculator.js.map +1 -1
  290. package/lib/systems/trigram/TrigramCalculator.js.map +1 -1
  291. package/lib/systems/trigram/techniques/DarkOpsTechniques.js.map +1 -1
  292. package/lib/systems/trigram/techniques/GamTechniques.js.map +1 -1
  293. package/lib/systems/trigram/techniques/GanTechniques.js.map +1 -1
  294. package/lib/systems/trigram/techniques/GonTechniques.js.map +1 -1
  295. package/lib/systems/trigram/techniques/SonTechniques.js.map +1 -1
  296. package/lib/systems/trigram/techniques/TechniqueConfig.js.map +1 -1
  297. package/lib/systems/trigram/techniques/index.js.map +1 -1
  298. package/lib/systems/trigram/types/GonTechniqueExtensions.js.map +1 -1
  299. package/lib/systems/trigram/types.js.map +1 -1
  300. package/lib/systems/types.js.map +1 -1
  301. package/lib/systems/vitalpoint/DamageCalculator.js.map +1 -1
  302. package/lib/systems/vitalpoint/HitDetection.js.map +1 -1
  303. package/lib/systems/vitalpoint/KoreanAnatomy.js.map +1 -1
  304. package/lib/systems/vitalpoint/KoreanVitalPoints.js.map +1 -1
  305. package/lib/systems/vitalpoint/MeridianVitalPointMapping.js.map +1 -1
  306. package/lib/types/AccessibilityTypes.js.map +1 -1
  307. package/lib/types/PhysicsTypes.js.map +1 -1
  308. package/lib/types/common.js.map +1 -1
  309. package/lib/types/constants/colors.js.map +1 -1
  310. package/lib/types/constants/designSystem.js.map +1 -1
  311. package/lib/types/constants/layout.js.map +1 -1
  312. package/lib/types/constants/performance.js.map +1 -1
  313. package/lib/types/constants/typography.js.map +1 -1
  314. package/lib/types/facial.js.map +1 -1
  315. package/lib/types/hand-animation.js.map +1 -1
  316. package/lib/types/injury.js.map +1 -1
  317. package/lib/types/physics.js.map +1 -1
  318. package/lib/types/skeletal.js.map +1 -1
  319. package/lib/types/techniqueId.js.map +1 -1
  320. package/lib/utils/accessibility.js.map +1 -1
  321. package/lib/utils/arenaWorldDimensions.js.map +1 -1
  322. package/lib/utils/assetConfig.js.map +1 -1
  323. package/lib/utils/characterScaling.js.map +1 -1
  324. package/lib/utils/colorHelpers.js.map +1 -1
  325. package/lib/utils/colorUtils.js.map +1 -1
  326. package/lib/utils/combatReadiness.js.map +1 -1
  327. package/lib/utils/controlMapping.js.map +1 -1
  328. package/lib/utils/deviceDetection.js.map +1 -1
  329. package/lib/utils/effectUtils.js.map +1 -1
  330. package/lib/utils/fabricTextures.js.map +1 -1
  331. package/lib/utils/hapticFeedback.js.map +1 -1
  332. package/lib/utils/haptics.js.map +1 -1
  333. package/lib/utils/htmlOverlayHelpers.js.map +1 -1
  334. package/lib/utils/inputSystem.js.map +1 -1
  335. package/lib/utils/koreanThemeHelpers.js.map +1 -1
  336. package/lib/utils/math.js.map +1 -1
  337. package/lib/utils/mobileLayoutHelpers.js.map +1 -1
  338. package/lib/utils/mobileUIUtils.js.map +1 -1
  339. package/lib/utils/performance/PerformanceMonitor.js.map +1 -1
  340. package/lib/utils/performance/PerformanceOverlay3D.js.map +1 -1
  341. package/lib/utils/performance/usePerformanceMonitor.js.map +1 -1
  342. package/lib/utils/performanceOptimization.js.map +1 -1
  343. package/lib/utils/player3DHelpers.js.map +1 -1
  344. package/lib/utils/playerUtils.js.map +1 -1
  345. package/lib/utils/responsiveLayout.js.map +1 -1
  346. package/lib/utils/responsiveLayoutHelpers.js.map +1 -1
  347. package/lib/utils/responsiveOrientationConstants.js.map +1 -1
  348. package/lib/utils/safeAreaUtils.js.map +1 -1
  349. package/lib/utils/sharedPhysicsConfig.js.map +1 -1
  350. package/lib/utils/skeletonScaling.js.map +1 -1
  351. package/lib/utils/stanceHelpers.js.map +1 -1
  352. package/lib/utils/threeObjectPool.js.map +1 -1
  353. package/lib/utils/visualEffects.js.map +1 -1
  354. package/package.json +8 -8
@@ -1 +1 @@
1
- {"version":3,"file":"StanceGuardPoses.js","names":[],"sources":["../../../../src/systems/animation/catalogs/StanceGuardPoses.ts"],"sourcesContent":["/**\n * Fighting Stance Guard Poses for Eight Trigram System\n *\n * Defines default guard positions for all 8 trigram stances (팔괘).\n * Each guard pose includes arm positions, torso rotation, weight distribution,\n * and breathing animation parameters for authentic Korean martial arts stance representation.\n *\n * Based on COMBAT_ARCHITECTURE.md and game-design.md specifications:\n * - ☰ 건 (Geon/Heaven): High guard with strong forward presence\n * - ☱ 태 (Tae/Lake): Fluid mid-guard with adaptive positioning\n * - ☲ 리 (Li/Fire): Aggressive forward guard\n * - ☳ 진 (Jin/Thunder): Explosive ready stance\n * - ☴ 손 (Son/Wind): Continuous motion guard\n * - ☵ 감 (Gam/Water): Flowing defensive guard\n * - ☶ 간 (Gan/Mountain): Solid defensive posture\n * - ☷ 곤 (Gon/Earth): Grounded low guard\n *\n * @module systems/animation/StanceGuardPoses\n * @category Animation\n * @korean 자세방어포즈\n */\n\nimport { TrigramStance } from \"@/types/common\";\nimport type {\n StanceGuardAnimationConfig,\n StanceGuardPose,\n} from \"@/types/skeletal\";\nimport { mirrorGuardPose } from \"@/types/skeletal\";\nimport * as THREE from \"three\";\nimport type { StanceLaterality } from \"../../trigram/types\";\n\n/**\n * ☰ 건 (Geon) - Heaven: Taekwondo Power Striking Stance\n *\n * **Korean Name**: 건괘 - 하늘 (Geon-gwae - Haneul)\n * **Martial Art**: Taekwondo (태권도) Ap Seogi (앞서기) - Forward Walking Stance\n * **Philosophy**: Direct yang force, overwhelming power, heaven's authority descending\n *\n * **Authentic Taekwondo Ap Seogi Characteristics**:\n * - 앞서기 (Ap Seogi): Classic forward stance for aggressive advance\n * - Front leg bent ~70°, back leg extended ~160° for explosive forward power\n * - 70/30 weight distribution forward for constant pressure\n * - High chamber position (높은 준비) ready for 돌려차기 (Dollyo Chagi - roundhouse kick)\n * - Hands at chin level in Juchum Seogi guard (주춤서기 방어)\n * - Tight elbows protect floating ribs (늑골 보호)\n *\n * **Biomechanical Analysis**:\n * - Front knee over toes creates spring-loaded power platform\n * - Back leg straight provides driving force for forward strikes\n * - Shoulder alignment allows maximum power transfer to fists\n * - Hip rotation ~30° creates torque for bone-breaking punches (골절타격)\n *\n * **Combat Applications**:\n * - 정권지르기 (Jeongwon Jireugi): Straight punch to solar plexus\n * - 앞차기 (Ap Chagi): Front snap kick to abdomen/chin\n * - 돌려차기 (Dollyo Chagi): Roundhouse kick from high chamber\n * - Direct frontal bone-breaking strikes (+10% damage to skeletal targets)\n * - High mobility (+15% movement speed for aggressive advance)\n *\n * @korean 건괘방어포즈\n */\nexport const GEON_HIGH_GUARD_POSE: StanceGuardPose = {\n leftArm: {\n // Lead arm (왼팔) - Jab position with tight defense\n shoulder: new THREE.Euler(-0.9, 0.3, 0.6), // Shoulder raised to chin level, slight forward\n elbow: new THREE.Euler(0, 0, -2.3), // TIGHT elbow ~135° protects ribs (늑골 방어)\n wrist: new THREE.Euler(0.2, 0.15, 0), // Fist at chin height (턱높이), vertical fist\n },\n rightArm: {\n // Rear power hand (오른팔) - Chambered for devastating strike\n shoulder: new THREE.Euler(-1.0, -0.2, -0.5), // Rear hand protecting jaw line\n elbow: new THREE.Euler(0, 0, 2.4), // VERY TIGHT elbow ~130° maximum rib protection\n wrist: new THREE.Euler(0.3, -0.1, 0), // Rear fist at cheekbone (광대뼈)\n },\n torso: new THREE.Euler(0.12, -0.35, 0.05), // Forward lean 12° + 20° rotation for bladed profile\n\n // Ap Seogi (앞서기) - Forward Walking Stance\n // Authentic Taekwondo power stance: 70° front knee, 160° back leg\n leftLeg: {\n // Back leg (뒷다리) - Extended for driving power\n hip: new THREE.Euler(-0.15, 0.2, 0.08), // Back hip extended, slight external rotation\n knee: new THREE.Euler(0.35, 0, 0), // 160° extension = 0.35 rad flexion (약간 굽힘)\n ankle: new THREE.Euler(-0.08, 0.05, 0), // Heel firmly planted (발뒤꿈치 고정)\n },\n rightLeg: {\n // Front leg (앞다리) - Bent for spring-loaded power\n hip: new THREE.Euler(0.55, -0.18, -0.05), // Front hip flexed 70° forward\n knee: new THREE.Euler(1.22, 0, 0), // 70° flexion = 1.22 rad (깊은 굽힘)\n ankle: new THREE.Euler(-0.12, -0.05, 0), // Dorsiflexion for stable power base\n },\n pelvis: new THREE.Euler(0.18, -0.45, 0.03), // Forward tilt 18° + 25° rotation toward opponent\n stanceWidth: 0.55, // 1.3x shoulder width (~55cm) for stable power base\n stanceDepth: 0.65, // Deep forward/back split for maximum reach\n pelvisHeight: -0.14, // Lowered center of gravity (hipHeight ~0.86m)\n\n weight: \"forward\", // 70/30 weight distribution (70% front)\n breathingRange: {\n min: 0.98, // Deep chest expansion (가슴 확장) for power generation\n max: 1.025, // Explosive exhale (내쉬기) with strike\n },\n};\n\n/**\n * ☱ 태 (Tae) - Lake: Hapkido Fluid Grappling Stance\n *\n * **Korean Name**: 태괘 - 호수 (Tae-gwae - Hosu)\n * **Martial Art**: Hapkido (합기도) Beom Seogi (범서기) - Tiger Stance / Cat Stance\n * **Philosophy**: Yin softness, adaptive water, circular redirection, lake's receptive surface\n *\n * **Authentic Hapkido Beom Seogi Characteristics**:\n * - 범서기 (Beom Seogi): Cat stance with 90% weight on back leg\n * - Front leg light (170° nearly straight) ready to sweep or evade\n * - Back leg deeply bent (120°) like coiled spring for explosive throws\n * - 팔목잡기 (Palmok Japgi): Wrist grab readiness with open palms\n * - Lead hand extended for 원형막기 (Wonhyeong Makgi - circular block)\n * - Rear hand chambered at solar plexus for 관절기 (Gwanjeolgi - joint locks)\n *\n * **Biomechanical Analysis**:\n * - Back-weighted allows front leg to lift instantly for sweeps (발걸기)\n * - Open palms enable rapid grip transitions for joint manipulation\n * - Low center of gravity provides stability for throws (던지기)\n * - Hip mobility allows 360° rotation for redirection techniques\n *\n * **Combat Applications**:\n * - 손목꺾기 (Sonmok-kkeokgi): Wrist twist throw (Kote Gaeshi)\n * - 팔굽관절기 (Palgup Gwanjeolgi): Elbow joint lock\n * - 발등걸기 (Baldeung Geolgi): Foot sweep with ankle hook\n * - Joint locks and circular throws (+15% throw range)\n * - Small circle joint manipulation (+10% joint lock damage)\n *\n * @korean 태괘방어포즈\n */\nexport const TAE_FLUID_GUARD_POSE: StanceGuardPose = {\n leftArm: {\n // Lead hand (왼손) - Extended for circular deflection and wrist grabs\n shoulder: new THREE.Euler(-0.65, 0.5, 0.4), // Lead arm extended mid-level, palm open\n elbow: new THREE.Euler(0, 0, -1.9), // Soft elbow ~110° for circular redirection\n wrist: new THREE.Euler(-0.15, 0.35, 0.25), // Open palm (손바닥) facing opponent, relaxed\n },\n rightArm: {\n // Rear hand (오른손) - Chambered at solar plexus for joint attacks\n shoulder: new THREE.Euler(-0.8, -0.15, -0.3), // Rear hand mid-level ready to shoot forward\n elbow: new THREE.Euler(0, 0, 2.1), // Chambered elbow ~120° at ribs\n wrist: new THREE.Euler(0.1, -0.25, 0.15), // Open palm ready for 관절기 (joint lock)\n },\n torso: new THREE.Euler(0.08, -0.55, 0.08), // Slight forward lean + strong bladed profile (~35°)\n\n // Beom Seogi (범서기) - Cat/Tiger Stance\n // Authentic Hapkido cat stance: 170° front leg (light), 120° back knee (loaded)\n leftLeg: {\n // Front leg (앞다리) - Light, ready to lift for sweep\n hip: new THREE.Euler(0.12, 0.25, 0.05), // Front hip slightly flexed, externally rotated\n knee: new THREE.Euler(0.18, 0, 0), // Nearly straight 170° = 0.18 rad (가볍게)\n ankle: new THREE.Euler(-0.06, 0.08, 0), // Ball of foot touching (발볼 접촉)\n },\n rightLeg: {\n // Back leg (뒷다리) - Deeply bent, bearing all weight\n hip: new THREE.Euler(-0.22, -0.3, 0.05), // Back hip flexed and loaded\n knee: new THREE.Euler(1.05, 0, 0), // Deep bend 120° = 1.05 rad (깊은 굽힘)\n ankle: new THREE.Euler(-0.18, 0.02, 0), // Deep dorsiflexion, weight on back leg\n },\n pelvis: new THREE.Euler(0.08, -0.65, 0.04), // Slight forward tilt + strong rotation (40°)\n stanceWidth: 0.38, // Narrow 0.9x shoulder width for mobility (~38cm)\n stanceDepth: 0.42, // Moderate depth for balance and quick shifts\n pelvisHeight: -0.11, // Medium-low for stability (hipHeight ~0.89m)\n\n weight: \"back\", // 90/10 weight distribution (90% back leg)\n breathingRange: {\n min: 0.975, // Deep, smooth inhale (들이마시기)\n max: 1.025, // Flowing exhale for circular technique (내쉬기)\n },\n};\n\n/**\n * ☲ 리 (Li) - Fire: Kuk Sool Won Precision Strike Stance\n *\n * **Korean Name**: 리괘 - 불 (Li-gwae - Bul)\n * **Martial Art**: Kuk Sool Won (국술원) / Taekwondo Gyeorugi Junbi (겨루기 준비) - Fighting Ready Stance\n * **Philosophy**: Yang penetration, laser focus, burning precision, fire's consuming accuracy\n *\n * **Authentic Gyeorugi Junbi Characteristics**:\n * - 겨루기 준비 (Gyeorugi Junbi): Olympic sparring ready position\n * - Balanced 50/50 weight distribution for rapid direction changes\n * - Both knees bent ~135° for explosive spring in any direction\n * - 피카부 가드 (Peekaboo Guard): High tight hands protecting face\n * - Elbows flared wide like wings (날개) for maximum head protection\n * - Fists literally glued to temples/cheekbones (관자놀이)\n *\n * **Biomechanical Analysis**:\n * - Square stance allows equal power generation both sides\n * - High guard creates narrow target profile (minimal exposure)\n * - Deep knee bend provides explosive movement in 8 directions\n * - Tight fists to temples allow instant peek-and-strike\n *\n * **Combat Applications**:\n * - 혈도공격 (Hyeoldo Gonggyeok): Precise vital point strikes\n * - 급소타격 (Geupso Tagyeok): Pressure point penetration\n * - 관자놀이 타격 (Gwanjari Tagyeok): Temple strike from peek\n * - Precision nerve strikes (+15% critical hit chance)\n * - Vital point targeting accuracy (+10% vital point damage)\n *\n * @korean 리괘방어포즈\n */\nexport const LI_FIRE_GUARD_POSE: StanceGuardPose = {\n leftArm: {\n // Left fist (왼주먹) - Peekaboo high guard glued to left temple\n shoulder: new THREE.Euler(-1.65, 0.25, 1.0), // VERY HIGH shoulder, elbow flared wide\n elbow: new THREE.Euler(0, 0, -2.5), // MAXIMUM flexion ~145° (극한 굽힘) - fist to temple\n wrist: new THREE.Euler(0.45, 0.2, 0.05), // Vertical fist pressed to left temple (관자놀이)\n },\n rightArm: {\n // Right fist (오른주먹) - Mirror peekaboo protecting right temple\n shoulder: new THREE.Euler(-1.65, -0.25, -1.0), // VERY HIGH shoulder, elbow flared wide\n elbow: new THREE.Euler(0, 0, 2.5), // MAXIMUM flexion ~145° (극한 굽힘) - fist to temple\n wrist: new THREE.Euler(0.45, -0.2, -0.05), // Vertical fist pressed to right temple (관자놀이)\n },\n torso: new THREE.Euler(0.18, 0, 0), // Forward lean 18°, SQUARE facing (정면) - no rotation\n\n // Gyeorugi Junbi (겨루기 준비) - Fighting Ready Stance\n // Authentic Taekwondo sparring stance: 135° both knees, 50/50 weight, square\n leftLeg: {\n // Left leg (왼다리) - Balanced, ready to kick or pivot\n hip: new THREE.Euler(0.22, 0.32, 0.18), // Hip flexed and externally rotated\n knee: new THREE.Euler(0.79, 0, 0), // 135° flexion = 0.79 rad (중간 굽힘)\n ankle: new THREE.Euler(-0.14, 0.12, 0), // Slight toe-out for stability\n },\n rightLeg: {\n // Right leg (오른다리) - Mirror balance, equal spring potential\n hip: new THREE.Euler(0.22, -0.32, -0.18), // Mirror external rotation\n knee: new THREE.Euler(0.79, 0, 0), // 135° flexion = 0.79 rad (중간 굽힘)\n ankle: new THREE.Euler(-0.14, -0.12, 0), // Slight toe-out for stability\n },\n pelvis: new THREE.Euler(0.12, 0, 0), // Forward tilt 12°, PERFECTLY SQUARE (완전 정면)\n stanceWidth: 0.48, // 1.1x shoulder width for balanced mobility (~48cm)\n stanceDepth: 0.28, // Slight stagger for forward/backward mobility\n pelvisHeight: -0.13, // Medium-low for explosive power (hipHeight ~0.87m)\n\n weight: \"neutral\", // Perfect 50/50 balance\n breathingRange: {\n min: 0.99, // Shallow, controlled breathing (얕은 호흡)\n max: 1.01, // Minimal movement - precision focus (정밀 집중)\n },\n};\n\n/**\n * ☳ 진 (Jin) - Thunder: Taekwondo Explosive Power Stance\n *\n * **Korean Name**: 진괘 - 천둥 (Jin-gwae - Cheondeung)\n * **Martial Art**: Taekwondo (태권도) Juchum Seogi (주춤서기) - Horse Riding Stance\n * **Philosophy**: Extreme yang, shocking power, thunder's instant discharge, explosive release\n *\n * **Authentic Juchum Seogi Characteristics**:\n * - 주춤서기 (Juchum Seogi): Classic horse stance - VERY WIDE and VERY LOW\n * - 2.0x shoulder width stance (~80-90cm) with parallel feet\n * - Both knees bent to 90° (수평 허벅지) - thighs parallel to ground\n * - 50/50 perfect weight distribution for explosive power either direction\n * - Arms chambered low (낮은 준비) - coiled spring ready to explode\n * - Lead arm extended but tight, rear fist at ribs ready to thunder strike\n *\n * **Biomechanical Analysis**:\n * - Ultra-wide stance creates maximum stability platform\n * - 90° knee bend stores enormous elastic energy in quadriceps\n * - Low center of gravity allows explosive upward/lateral movement\n * - Parallel feet enable instant pivot and rotation\n *\n * **Combat Applications**:\n * - 뇌성타격 (Noeseong Tagyeok): Thunder strike to nerve clusters\n * - 신경충격파 (Singyeong Chunggyeokpa): Shocking nerve disruption\n * - 폭발적 주먹지르기 (Pokbaljeok Jumeok Jireugi): Explosive power punch\n * - Nerve strike warfare (+15% shock damage on nerve points)\n * - Stunning power (-30 consciousness on head impacts)\n *\n * @korean 진괘방어포즈\n */\nexport const JIN_THUNDER_GUARD_POSE: StanceGuardPose = {\n leftArm: {\n // Lead arm (왼팔) - Extended but chambered, ready to strike\n shoulder: new THREE.Euler(-0.55, 0.25, 0.65), // Lead shoulder raised, tight to body\n elbow: new THREE.Euler(0, 0, -2.3), // TIGHT elbow ~135° guarding left ribs\n wrist: new THREE.Euler(0.35, 0.12, 0), // Chambered fist at mid-level (중단)\n },\n rightArm: {\n // Rear power fist (오른주먹) - Chambered at ribs for devastating strike\n shoulder: new THREE.Euler(-0.65, -0.18, -0.4), // Rear shoulder coiled at ribs\n elbow: new THREE.Euler(0, 0, 2.45), // VERY TIGHT ~140° maximum chamber (극한 준비)\n wrist: new THREE.Euler(0.4, -0.08, 0), // Rear fist touching ribs (갈비뼈) - explosive potential\n },\n torso: new THREE.Euler(-0.05, -0.38, 0.06), // Slight back lean (coiled) + rotation\n\n // Juchum Seogi (주춤서기) - Horse Riding Stance\n // Authentic Taekwondo horse stance: 90° both knees, 50/50 weight, VERY WIDE\n leftLeg: {\n // Left leg (왼다리) - Wide spread, deep bend, explosive coil\n hip: new THREE.Euler(0.32, 0.52, 0.35), // Wide external rotation, abducted\n knee: new THREE.Euler(1.57, 0, 0), // FULL 90° bend = 1.57 rad (π/2) - thigh horizontal\n ankle: new THREE.Euler(-0.28, 0.22, 0), // Deep dorsiflexion, toes out for stability\n },\n rightLeg: {\n // Right leg (오른다리) - Mirror wide horse stance\n hip: new THREE.Euler(0.32, -0.52, -0.35), // Mirror external rotation\n knee: new THREE.Euler(1.57, 0, 0), // FULL 90° bend = 1.57 rad - thigh horizontal\n ankle: new THREE.Euler(-0.28, -0.22, 0), // Deep dorsiflexion, toes out\n },\n pelvis: new THREE.Euler(0.08, 0, 0), // Minimal forward tilt, SQUARE facing (정면)\n stanceWidth: 0.95, // VERY WIDE 2.2x shoulder width (~95cm) for maximum power\n stanceDepth: 0, // Zero - perfectly parallel feet (평행 발)\n pelvisHeight: -0.28, // VERY LOW - deep squat (hipHeight ~0.72m)\n\n weight: \"neutral\", // Perfect 50/50 balance\n breathingRange: {\n min: 0.96, // Deep inhale (깊은 들이마시기) - charging power\n max: 1.045, // Explosive exhale (폭발적 내쉬기) - thunder discharge\n },\n};\n\n/**\n * ☴ 손 (Son) - Wind: Taekyon Continuous Flow Stance\n *\n * **Korean Name**: 손괘 - 바람 (Son-gwae - Baram)\n * **Martial Art**: Taekyon (택견) Hakdari Seogi (학다리서기) - Crane Stance\n * **Philosophy**: Gentle yin, persistent wind, flowing rhythm, continuous pressure\n *\n * **Authentic Hakdari Seogi Characteristics**:\n * - 학다리서기 (Hakdari Seogi): Traditional Korean crane stance - ONE LEG RAISED\n * - Standing leg nearly straight (170°) with perfect balance\n * - Raised leg bent deeply (knee at waist level, 45° thigh angle)\n * - 100% weight on standing leg - ready to kick with raised leg instantly\n * - Arms in flowing 품밟기 (Pumbalbgi) motion - continuous circular movement\n * - Lead knife hand extended for 손날막기 (Sonnal Makgi - knife hand block)\n *\n * **Biomechanical Analysis**:\n * - Single leg stance enables instant kick without telegraphing\n * - High knee chamber provides explosive kick power\n * - Flowing arm position creates deceptive continuous motion\n * - Perfect balance allows rapid direction changes\n *\n * **Combat Applications**:\n * - 연속발차기 (Yeonsok Balchagi): Continuous kicking combinations\n * - 품밟기 리듬 (Pumbalbgi Rhythm): Rhythmic pressure sequences\n * - 발걸이 (Balgeori): Sweeping techniques from raised leg\n * - Continuous pressure strikes (+10% chaining speed)\n * - Lateral movement advantage (+10% lateral mobility)\n *\n * @korean 손괘방어포즈\n */\nexport const SON_WIND_GUARD_POSE: StanceGuardPose = {\n leftArm: {\n // Lead knife hand (왼손날) - Extended in flowing circular motion\n shoulder: new THREE.Euler(-0.68, 0.48, 0.35), // Lead shoulder mid-level, flowing\n elbow: new THREE.Euler(0, 0, -1.85), // Soft elbow ~105° for circular flow\n wrist: new THREE.Euler(-0.08, 0.32, 0.25), // Knife hand (손날) extended, palm vertical\n },\n rightArm: {\n // Rear guard hand (오른손) - Protecting center, ready to flow\n shoulder: new THREE.Euler(-0.95, -0.18, -0.45), // Rear hand at solar plexus level\n elbow: new THREE.Euler(0, 0, 2.15), // Chambered elbow ~125° guarding ribs\n wrist: new THREE.Euler(0.18, -0.22, 0.08), // Open palm ready for circular deflection\n },\n torso: new THREE.Euler(0.06, -0.52, 0.12), // Slight forward + strong bladed rotation (30°)\n\n // Hakdari Seogi (학다리서기) - Crane Stance\n // Authentic Taekyon crane stance: 170° standing leg, 45° raised thigh, 100% weight\n leftLeg: {\n // Raised leg (든 다리) - LEFT knee at waist level, ready to kick\n hip: new THREE.Euler(1.3, 0.35, 0.25), // Thigh raised to 45° (high chamber)\n knee: new THREE.Euler(2.1, 0, 0), // Knee deeply bent ~120° flexion (발 접힘)\n ankle: new THREE.Euler(-0.45, 0.28, 0), // Foot hanging naturally, toes pointed down\n },\n rightLeg: {\n // Standing leg (딛는 다리) - RIGHT leg bearing all weight\n hip: new THREE.Euler(0.08, -0.18, 0), // Standing hip nearly straight, slight stability bend\n knee: new THREE.Euler(0.18, 0, 0), // Nearly straight 170° = 0.18 rad (거의 곧게)\n ankle: new THREE.Euler(-0.09, 0, 0), // Foot flat, stable base (평평한 발바닥)\n },\n pelvis: new THREE.Euler(0.04, -0.58, 0.08), // Minimal tilt, strong rotation toward standing leg\n stanceWidth: 0, // Zero - single leg stance (한 발 서기)\n stanceDepth: 0.18, // Standing leg slightly forward for balance\n pelvisHeight: -0.06, // Higher position for mobility (hipHeight ~0.94m)\n\n weight: \"neutral\", // 100% on standing leg (technically neutral in definition)\n breathingRange: {\n min: 0.985, // Rhythmic breathing (리듬 호흡) - flowing cycles\n max: 1.018, // Sustained inhale/exhale for continuous motion\n },\n};\n\n/**\n * ☵ 감 (Gam) - Water: Hapkido Defensive Counter Stance\n *\n * **Korean Name**: 감괘 - 물 (Gam-gwae - Mul)\n * **Martial Art**: Hapkido (합기도) Dwitbal Seogi (뒷발서기) - Back Weighted Stance\n * **Philosophy**: Yin reception, adaptive flow, water's yielding redirection, counter force\n *\n * **Authentic Dwitbal Seogi Characteristics**:\n * - 뒷발서기 (Dwitbal Seogi): Defensive back stance with 70% weight on rear leg\n * - Front leg extended nearly straight (160°) for defensive distance\n * - Back leg deeply bent (100°) coiled for explosive counter\n * - Both palms open (손바닥) mid-level for 막기 (Makgi - blocking/deflection)\n * - Tight elbows protect ribs while ready to redirect force\n * - Bladed profile (칼날 자세) minimizes target area\n *\n * **Biomechanical Analysis**:\n * - Back-weighted provides safety distance from opponent\n * - Extended front leg acts as range-finder and tripwire\n * - Deep rear leg stores elastic energy for counter explosion\n * - Open palms enable instant grip and redirection\n *\n * **Combat Applications**:\n * - 막고반격 (Makgo Bangyeok): Block-and-counter sequences\n * - 원형막기 (Wonhyeong Makgi): Circular deflection techniques\n * - 흘려치기 (Heullyeo Chigi): Flow-redirect strikes\n * - Adaptive counters (+10% counter speed)\n * - Rib damage amplification (+15 bleed on rib shots from counters)\n *\n * @korean 감괘방어포즈\n */\nexport const GAM_WATER_GUARD_POSE: StanceGuardPose = {\n leftArm: {\n // Lead deflection hand (왼손) - Open palm mid-level for circular blocks\n shoulder: new THREE.Euler(-0.75, 0.32, 0.42), // Lead shoulder chest-high, ready to redirect\n elbow: new THREE.Euler(0, 0, -2.05), // Tight elbow ~115° guarding left ribs\n wrist: new THREE.Euler(-0.12, 0.35, 0.32), // Open palm (손바닥) vertical, fingers relaxed\n },\n rightArm: {\n // Rear counter hand (오른손) - Open palm ready for grab or strike\n shoulder: new THREE.Euler(-0.78, -0.28, -0.38), // Rear shoulder mirror position\n elbow: new THREE.Euler(0, 0, 2.08), // Tight elbow ~118° guarding right ribs\n wrist: new THREE.Euler(-0.09, -0.32, -0.28), // Open palm ready for counter technique\n },\n torso: new THREE.Euler(0.09, -0.42, 0.11), // Slight forward lean + bladed rotation (24°)\n\n // Dwitbal Seogi (뒷발서기) - Back Weighted Stance\n // Authentic Hapkido defensive stance: 160° front leg, 100° back knee, 30/70 weight\n leftLeg: {\n // Front leg (앞다리) - Extended, light contact for range and sensing\n hip: new THREE.Euler(0.16, 0.22, 0.04), // Front hip slightly flexed\n knee: new THREE.Euler(0.35, 0, 0), // Nearly straight 160° = 0.35 rad (거의 곧게)\n ankle: new THREE.Euler(-0.07, 0.03, 0), // Light toe contact, ready to lift\n },\n rightLeg: {\n // Back leg (뒷다리) - Deeply bent, bearing most weight, coiled spring\n hip: new THREE.Euler(-0.28, -0.25, 0.03), // Back hip flexed and loaded\n knee: new THREE.Euler(1.4, 0, 0), // Deep bend 100° = 1.4 rad (깊은 굽힘)\n ankle: new THREE.Euler(-0.22, 0.02, 0), // Rooted dorsiflexion for stability\n },\n pelvis: new THREE.Euler(0.06, -0.45, 0.06), // Slight forward tilt + rotation for defense\n stanceWidth: 0.52, // 1.2x shoulder width for stable base (~52cm)\n stanceDepth: 0.48, // Moderate front/back separation for mobility\n pelvisHeight: -0.13, // Medium-low for balance (hipHeight ~0.87m)\n\n weight: \"back\", // 70/30 weight distribution (70% back)\n breathingRange: {\n min: 0.975, // Deep, flowing inhale (흐르는 들이마시기)\n max: 1.028, // Full exhale for explosive counter (반격 내쉬기)\n },\n};\n\n/**\n * ☶ 간 (Gan) - Mountain: Taekwondo Immovable Defense Stance\n *\n * **Korean Name**: 간괘 - 산 (Gan-gwae - San)\n * **Martial Art**: Taekwondo (태권도) Moa Seogi (모아서기) - Closed Feet Stance\n * **Philosophy**: Mountain's stillness, immovable yang, absolute defense, rooted earth\n *\n * **Authentic Moa Seogi Characteristics**:\n * - 모아서기 (Moa Seogi): Feet together or nearly touching - NARROW stance\n * - 0.6x shoulder width (~24cm) for mountain-solid rooting\n * - Both knees bent ~145° as shock absorbers (충격 흡수)\n * - 50/50 perfect weight distribution for balanced defense\n * - 상단막기 (Sangdan Makgi): High X-block with forearms crossed\n * - Fists at opposite shoulders creating impenetrable face shield\n *\n * **Biomechanical Analysis**:\n * - Narrow stance creates ultra-stable base (low moment arm)\n * - Knees bent absorb impact force like suspension system\n * - Crossed forearms provide maximum frontal protection\n * - Square facing presents minimal target profile\n *\n * **Combat Applications**:\n * - 산막기 (San Makgi): Mountain block - immovable defense\n * - 가위막기 (Gawi Makgi): Scissor block with crossed arms\n * - 반격준비 (Bangyeok Junbi): Counter-strike preparation from solid base\n * - Impenetrable blocking (+15% block strength)\n * - Instant counter strikes (+10% counter-strike speed)\n *\n * @korean 간괘방어포즈\n */\nexport const GAN_MOUNTAIN_GUARD_POSE: StanceGuardPose = {\n leftArm: {\n // Left forearm (왼팔뚝) - Crossed in front of face for X-block\n shoulder: new THREE.Euler(-1.85, 0.12, 1.05), // Very high shoulder, arm crossed\n elbow: new THREE.Euler(0, 0, -2.5), // MAXIMUM flexion ~145° (극한 굽힘)\n wrist: new THREE.Euler(0.52, 0.42, 0.35), // Left fist at RIGHT shoulder (교차)\n },\n rightArm: {\n // Right forearm (오른팔뚝) - Crossed over left creating X-shield\n shoulder: new THREE.Euler(-1.85, -0.12, -1.05), // Mirror high position\n elbow: new THREE.Euler(0, 0, 2.5), // MAXIMUM flexion ~145° (극한 굽힘)\n wrist: new THREE.Euler(0.52, -0.42, -0.35), // Right fist at LEFT shoulder (교차)\n },\n torso: new THREE.Euler(0.16, 0, 0), // Forward lean 16° chin down, SQUARE facing (정면)\n\n // Moa Seogi (모아서기) - Closed Feet Stance\n // Authentic Taekwondo mountain stance: 145° both knees, 50/50 weight, feet together\n leftLeg: {\n // Left leg (왼다리) - Feet nearly touching, shock absorber position\n hip: new THREE.Euler(0.12, 0.09, 0.02), // Minimal hip flexion, feet close\n knee: new THREE.Euler(0.61, 0, 0), // Moderate bend 145° = 0.61 rad (중간 굽힘)\n ankle: new THREE.Euler(-0.11, 0.02, 0), // Flat planted, weight distributed\n },\n rightLeg: {\n // Right leg (오른다리) - Mirror stability, mountain rooted\n hip: new THREE.Euler(0.12, -0.09, -0.02), // Mirror minimal flexion\n knee: new THREE.Euler(0.61, 0, 0), // Moderate bend 145° = 0.61 rad (중간 굽힘)\n ankle: new THREE.Euler(-0.11, -0.02, 0), // Flat planted firmly\n },\n pelvis: new THREE.Euler(0.11, 0, 0), // Slight forward tilt, NO rotation - square (정면)\n stanceWidth: 0.12, // VERY NARROW 0.3x shoulder width - feet nearly together (~12cm)\n stanceDepth: 0, // Zero - perfectly parallel, mountain solid (평행)\n pelvisHeight: -0.07, // Slightly lowered for shock absorption (hipHeight ~0.93m)\n\n weight: \"neutral\", // Perfect 50/50 mountain balance\n breathingRange: {\n min: 0.992, // Minimal chest movement (최소 움직임)\n max: 1.008, // Steady, controlled breathing (안정된 호흡)\n },\n};\n\n/**\n * ☷ 곤 (Gon) - Earth: Ssireum Grappling Ground Stance\n *\n * **Korean Name**: 곤괘 - 땅 (Gon-gwae - Ttang)\n * **Martial Art**: Ssireum (씨름) / Yusul (유술) Deep Squat Grappling Stance\n * **Philosophy**: Ultimate yin, earth's receptive power, grounding force, takedown dominance\n *\n * **Authentic Ssireum Deep Stance Characteristics**:\n * - 씨름 자세 (Ssireum Jase): Traditional Korean wrestling deep squat\n * - ULTRA WIDE stance 2.8x shoulder width (~1.1m+) for maximum stability\n * - Both knees bent to ~80° (극한 굽힘) - DEEP sumo-like squat\n * - 50/50 weight distribution with VERY LOW center of gravity\n * - Arms low ready for 샅바잡기 (Satbajapgi - belt/thigh grabs)\n * - Hands at hip level for 허리후리기 (Heori Hurigi - hip throw preparation)\n *\n * **Biomechanical Analysis**:\n * - Ultra-wide stance lowers center of gravity below opponent's\n * - Deep squat provides explosive upward throwing power\n * - Low hand position enables immediate grip on legs/hips\n * - Forward torso lean establishes grappling pressure\n *\n * **Combat Applications**:\n * - 다리후리기 (Dari Hurigi): Leg sweep and trip techniques\n * - 허리후리기 (Heori Hurigi): Hip throw from deep position\n * - 배지기 (Baejigi): Belly-to-belly suplex throws\n * - Ground clinches and throws (+20% ground control)\n * - Takedown damage amplification (+20 bleed on successful throws)\n *\n * @korean 곤괘방어포즈\n */\nexport const GON_EARTH_GUARD_POSE: StanceGuardPose = {\n leftArm: {\n // Left grappling hand (왼손) - Low position for belt/thigh grabs\n shoulder: new THREE.Euler(-0.38, 0.32, 0.55), // Shoulder lowered, arm extended down\n elbow: new THREE.Euler(0, 0, -2.05), // Tight elbow ~115° protecting ribs\n wrist: new THREE.Euler(-0.08, 0.22, 0.35), // Open palm (손바닥) ready for 샅바 (Satba grab)\n },\n rightArm: {\n // Right grappling hand (오른손) - Mirror low position for underhooks\n shoulder: new THREE.Euler(-0.38, -0.32, -0.55), // Mirror low shoulder position\n elbow: new THREE.Euler(0, 0, 2.05), // Tight elbow ~115° protecting ribs\n wrist: new THREE.Euler(-0.08, -0.22, -0.35), // Open palm ready for belt/thigh control\n },\n torso: new THREE.Euler(0.32, 0, 0), // Forward lean 32° - grappling pressure (그래플링 압박)\n\n // Ssireum Deep Squat (씨름 쪼그리기) - Ultra-Wide Sumo Position\n // Authentic Korean wrestling stance: ~80° both knees, 50/50 weight, ULTRA WIDE\n leftLeg: {\n // Left leg (왼다리) - Ultra-wide spread, maximum squat depth\n hip: new THREE.Euler(0.15, 0.58, 0.45), // Wide external rotation and abduction\n knee: new THREE.Euler(1.48, 0, 0), // EXTREME bend ~80° = 1.48 rad (극한 쪼그림)\n ankle: new THREE.Euler(-0.32, 0.25, 0), // Deep dorsiflexion, toes out wide\n },\n rightLeg: {\n // Right leg (오른다리) - Mirror ultra-wide sumo squat\n hip: new THREE.Euler(0.15, -0.58, -0.45), // Mirror external rotation and abduction\n knee: new THREE.Euler(1.48, 0, 0), // EXTREME bend ~80° = 1.48 rad (극한 쪼그림)\n ankle: new THREE.Euler(-0.32, -0.25, 0), // Deep dorsiflexion, toes out wide\n },\n pelvis: new THREE.Euler(0.22, 0, 0), // Forward tilt 22°, SQUARE facing (정면)\n stanceWidth: 1.35, // ULTRA WIDE 3.0x+ shoulder width - sumo squat (~135cm+)\n stanceDepth: 0, // Zero - perfectly parallel feet for maximum stability (평행)\n pelvisHeight: -0.48, // EXTREMELY LOW - deep squat (hipHeight ~0.52m)\n\n weight: \"neutral\", // Perfect 50/50 sumo balance\n breathingRange: {\n min: 0.965, // Deep diaphragm breathing (깊은 복식호흡)\n max: 1.042, // Explosive power exhale for throws (던지기 내쉬기)\n },\n};\n\n/**\n * Stance Guard Animation Configurations\n *\n * Record mapping each trigram stance to its complete guard animation config.\n * Includes 4-6 frame breathing animation at 60fps for realistic idle behavior.\n *\n * Using Record instead of Map for better performance with small static dataset.\n *\n * Integration:\n * - Links to AnimationStateMachine for stance-specific idle states\n * - Used by SkeletalPlayer3D for rendering guard positions\n * - Integrates with StanceManager for trigram system\n *\n * @korean 자세방어애니메이션설정맵\n */\nexport const STANCE_GUARD_CONFIGS: Record<\n TrigramStance,\n StanceGuardAnimationConfig\n> = {\n [TrigramStance.GEON]: {\n stance: TrigramStance.GEON,\n koreanName: \"건\",\n englishName: \"Heaven\",\n guardPose: GEON_HIGH_GUARD_POSE,\n breathingFrames: 6,\n fps: 60,\n loop: true,\n priority: 0,\n },\n [TrigramStance.TAE]: {\n stance: TrigramStance.TAE,\n koreanName: \"태\",\n englishName: \"Lake\",\n guardPose: TAE_FLUID_GUARD_POSE,\n breathingFrames: 6,\n fps: 60,\n loop: true,\n priority: 0,\n },\n [TrigramStance.LI]: {\n stance: TrigramStance.LI,\n koreanName: \"리\",\n englishName: \"Fire\",\n guardPose: LI_FIRE_GUARD_POSE,\n breathingFrames: 4,\n fps: 60,\n loop: true,\n priority: 0,\n },\n [TrigramStance.JIN]: {\n stance: TrigramStance.JIN,\n koreanName: \"진\",\n englishName: \"Thunder\",\n guardPose: JIN_THUNDER_GUARD_POSE,\n breathingFrames: 5,\n fps: 60,\n loop: true,\n priority: 0,\n },\n [TrigramStance.SON]: {\n stance: TrigramStance.SON,\n koreanName: \"손\",\n englishName: \"Wind\",\n guardPose: SON_WIND_GUARD_POSE,\n breathingFrames: 6,\n fps: 60,\n loop: true,\n priority: 0,\n },\n [TrigramStance.GAM]: {\n stance: TrigramStance.GAM,\n koreanName: \"감\",\n englishName: \"Water\",\n guardPose: GAM_WATER_GUARD_POSE,\n breathingFrames: 6,\n fps: 60,\n loop: true,\n priority: 0,\n },\n [TrigramStance.GAN]: {\n stance: TrigramStance.GAN,\n koreanName: \"간\",\n englishName: \"Mountain\",\n guardPose: GAN_MOUNTAIN_GUARD_POSE,\n breathingFrames: 4,\n fps: 60,\n loop: true,\n priority: 0,\n },\n [TrigramStance.GON]: {\n stance: TrigramStance.GON,\n koreanName: \"곤\",\n englishName: \"Earth\",\n guardPose: GON_EARTH_GUARD_POSE,\n breathingFrames: 5,\n fps: 60,\n loop: true,\n priority: 0,\n },\n} as const;\n\n/**\n * Get guard pose for a specific trigram stance with laterality support\n *\n * **Korean**: 자세 방어 포즈 가져오기\n *\n * Returns the appropriate guard pose for the given stance and laterality.\n * Right laterality returns the base pose; left laterality returns a mirrored version.\n * This supports authentic Korean martial arts stance differentiation:\n * - 오른발서기 (Oreun Bal Seogi): Right foot forward - base pose\n * - 왼발서기 (Oenbal Seogi): Left foot forward - mirrored pose\n *\n * @param stance - Trigram stance identifier (e.g., \"geon\", \"tae\")\n * @param laterality - Stance side: \"left\" or \"right\" (defaults to \"right\")\n * @returns Guard pose configuration or undefined if not found\n *\n * @example\n * ```typescript\n * // Get right Heaven stance (default)\n * const rightGeon = getGuardPoseForStance(\"geon\", \"right\");\n *\n * // Get left Heaven stance (mirrored)\n * const leftGeon = getGuardPoseForStance(\"geon\", \"left\");\n * // leftGeon now has left foot forward, left hand lead\n * ```\n *\n * @korean 자세방어포즈가져오기\n */\nexport function getGuardPoseForStance(\n stance: TrigramStance,\n laterality: StanceLaterality = \"right\",\n): StanceGuardPose | undefined {\n const config = STANCE_GUARD_CONFIGS[stance];\n if (!config?.guardPose) {\n return undefined;\n }\n\n // Right laterality returns base pose\n if (laterality === \"right\") {\n return config.guardPose;\n }\n\n // Left laterality returns mirrored pose\n return mirrorGuardPose(config.guardPose);\n}\n\n/**\n * Get guard animation config for a specific trigram stance\n *\n * @param stance - Trigram stance identifier\n * @returns Complete guard animation configuration or undefined if not found\n *\n * @korean 자세방어애니메이션설정가져오기\n */\nexport function getGuardConfigForStance(\n stance: TrigramStance,\n): StanceGuardAnimationConfig | undefined {\n return STANCE_GUARD_CONFIGS[stance];\n}\n\n/**\n * Get all 16 stance guard poses (8 stances × 2 laterality options)\n *\n * **Korean**: 모든 자세 방어 포즈\n *\n * Returns a map of all possible stance+laterality combinations with their guard poses.\n * This represents the complete set of 16 distinct guard configurations in Black Trigram.\n *\n * The result is cached for performance - subsequent calls return the same Map instance.\n *\n * Format: `\"stance_laterality\"` → `StanceGuardPose`\n * - Example keys: \"geon_left\", \"geon_right\", \"tae_left\", \"tae_right\", etc.\n *\n * @returns Map of all 16 stance guard pose configurations\n *\n * @korean 모든자세방어포즈\n */\nlet cachedAllPoses: Map<string, StanceGuardPose> | null = null;\n\nexport function getAllStanceGuardPoses(): Map<string, StanceGuardPose> {\n // Return cached result if available for performance\n if (cachedAllPoses) {\n return cachedAllPoses;\n }\n\n const allPoses = new Map<string, StanceGuardPose>();\n\n // For each trigram stance\n Object.values(TrigramStance).forEach((stance) => {\n // Add right laterality (base pose)\n const rightPose = getGuardPoseForStance(stance, \"right\");\n if (rightPose) {\n allPoses.set(`${stance}_right`, rightPose);\n }\n\n // Add left laterality (mirrored pose)\n const leftPose = getGuardPoseForStance(stance, \"left\");\n if (leftPose) {\n allPoses.set(`${stance}_left`, leftPose);\n }\n });\n\n // Cache the result\n cachedAllPoses = allPoses;\n return allPoses;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"StanceGuardPoses.js","names":[],"sources":["../../../../src/systems/animation/catalogs/StanceGuardPoses.ts"],"sourcesContent":["/**\n * Fighting Stance Guard Poses for Eight Trigram System\n *\n * Defines default guard positions for all 8 trigram stances (팔괘).\n * Each guard pose includes arm positions, torso rotation, weight distribution,\n * and breathing animation parameters for authentic Korean martial arts stance representation.\n *\n * Based on COMBAT_ARCHITECTURE.md and game-design.md specifications:\n * - ☰ 건 (Geon/Heaven): High guard with strong forward presence\n * - ☱ 태 (Tae/Lake): Fluid mid-guard with adaptive positioning\n * - ☲ 리 (Li/Fire): Aggressive forward guard\n * - ☳ 진 (Jin/Thunder): Explosive ready stance\n * - ☴ 손 (Son/Wind): Continuous motion guard\n * - ☵ 감 (Gam/Water): Flowing defensive guard\n * - ☶ 간 (Gan/Mountain): Solid defensive posture\n * - ☷ 곤 (Gon/Earth): Grounded low guard\n *\n * @module systems/animation/StanceGuardPoses\n * @category Animation\n * @korean 자세방어포즈\n */\n\nimport { TrigramStance } from \"@/types/common\";\nimport type {\n StanceGuardAnimationConfig,\n StanceGuardPose,\n} from \"@/types/skeletal\";\nimport { mirrorGuardPose } from \"@/types/skeletal\";\nimport * as THREE from \"three\";\nimport type { StanceLaterality } from \"../../trigram/types\";\n\n/**\n * ☰ 건 (Geon) - Heaven: Taekwondo Power Striking Stance\n *\n * **Korean Name**: 건괘 - 하늘 (Geon-gwae - Haneul)\n * **Martial Art**: Taekwondo (태권도) Ap Seogi (앞서기) - Forward Walking Stance\n * **Philosophy**: Direct yang force, overwhelming power, heaven's authority descending\n *\n * **Authentic Taekwondo Ap Seogi Characteristics**:\n * - 앞서기 (Ap Seogi): Classic forward stance for aggressive advance\n * - Front leg bent ~70°, back leg extended ~160° for explosive forward power\n * - 70/30 weight distribution forward for constant pressure\n * - High chamber position (높은 준비) ready for 돌려차기 (Dollyo Chagi - roundhouse kick)\n * - Hands at chin level in Juchum Seogi guard (주춤서기 방어)\n * - Tight elbows protect floating ribs (늑골 보호)\n *\n * **Biomechanical Analysis**:\n * - Front knee over toes creates spring-loaded power platform\n * - Back leg straight provides driving force for forward strikes\n * - Shoulder alignment allows maximum power transfer to fists\n * - Hip rotation ~30° creates torque for bone-breaking punches (골절타격)\n *\n * **Combat Applications**:\n * - 정권지르기 (Jeongwon Jireugi): Straight punch to solar plexus\n * - 앞차기 (Ap Chagi): Front snap kick to abdomen/chin\n * - 돌려차기 (Dollyo Chagi): Roundhouse kick from high chamber\n * - Direct frontal bone-breaking strikes (+10% damage to skeletal targets)\n * - High mobility (+15% movement speed for aggressive advance)\n *\n * @korean 건괘방어포즈\n */\nexport const GEON_HIGH_GUARD_POSE: StanceGuardPose = {\n leftArm: {\n // Lead arm (왼팔) - Jab position with tight defense\n shoulder: new THREE.Euler(-0.9, 0.3, 0.6), // Shoulder raised to chin level, slight forward\n elbow: new THREE.Euler(0, 0, -2.3), // TIGHT elbow ~135° protects ribs (늑골 방어)\n wrist: new THREE.Euler(0.2, 0.15, 0), // Fist at chin height (턱높이), vertical fist\n },\n rightArm: {\n // Rear power hand (오른팔) - Chambered for devastating strike\n shoulder: new THREE.Euler(-1.0, -0.2, -0.5), // Rear hand protecting jaw line\n elbow: new THREE.Euler(0, 0, 2.4), // VERY TIGHT elbow ~130° maximum rib protection\n wrist: new THREE.Euler(0.3, -0.1, 0), // Rear fist at cheekbone (광대뼈)\n },\n torso: new THREE.Euler(0.12, -0.35, 0.05), // Forward lean 12° + 20° rotation for bladed profile\n\n // Ap Seogi (앞서기) - Forward Walking Stance\n // Authentic Taekwondo power stance: 70° front knee, 160° back leg\n leftLeg: {\n // Back leg (뒷다리) - Extended for driving power\n hip: new THREE.Euler(-0.15, 0.2, 0.08), // Back hip extended, slight external rotation\n knee: new THREE.Euler(0.35, 0, 0), // 160° extension = 0.35 rad flexion (약간 굽힘)\n ankle: new THREE.Euler(-0.08, 0.05, 0), // Heel firmly planted (발뒤꿈치 고정)\n },\n rightLeg: {\n // Front leg (앞다리) - Bent for spring-loaded power\n hip: new THREE.Euler(0.55, -0.18, -0.05), // Front hip flexed 70° forward\n knee: new THREE.Euler(1.22, 0, 0), // 70° flexion = 1.22 rad (깊은 굽힘)\n ankle: new THREE.Euler(-0.12, -0.05, 0), // Dorsiflexion for stable power base\n },\n pelvis: new THREE.Euler(0.18, -0.45, 0.03), // Forward tilt 18° + 25° rotation toward opponent\n stanceWidth: 0.55, // 1.3x shoulder width (~55cm) for stable power base\n stanceDepth: 0.65, // Deep forward/back split for maximum reach\n pelvisHeight: -0.14, // Lowered center of gravity (hipHeight ~0.86m)\n\n weight: \"forward\", // 70/30 weight distribution (70% front)\n breathingRange: {\n min: 0.98, // Deep chest expansion (가슴 확장) for power generation\n max: 1.025, // Explosive exhale (내쉬기) with strike\n },\n};\n\n/**\n * ☱ 태 (Tae) - Lake: Hapkido Fluid Grappling Stance\n *\n * **Korean Name**: 태괘 - 호수 (Tae-gwae - Hosu)\n * **Martial Art**: Hapkido (합기도) Beom Seogi (범서기) - Tiger Stance / Cat Stance\n * **Philosophy**: Yin softness, adaptive water, circular redirection, lake's receptive surface\n *\n * **Authentic Hapkido Beom Seogi Characteristics**:\n * - 범서기 (Beom Seogi): Cat stance with 90% weight on back leg\n * - Front leg light (170° nearly straight) ready to sweep or evade\n * - Back leg deeply bent (120°) like coiled spring for explosive throws\n * - 팔목잡기 (Palmok Japgi): Wrist grab readiness with open palms\n * - Lead hand extended for 원형막기 (Wonhyeong Makgi - circular block)\n * - Rear hand chambered at solar plexus for 관절기 (Gwanjeolgi - joint locks)\n *\n * **Biomechanical Analysis**:\n * - Back-weighted allows front leg to lift instantly for sweeps (발걸기)\n * - Open palms enable rapid grip transitions for joint manipulation\n * - Low center of gravity provides stability for throws (던지기)\n * - Hip mobility allows 360° rotation for redirection techniques\n *\n * **Combat Applications**:\n * - 손목꺾기 (Sonmok-kkeokgi): Wrist twist throw (Kote Gaeshi)\n * - 팔굽관절기 (Palgup Gwanjeolgi): Elbow joint lock\n * - 발등걸기 (Baldeung Geolgi): Foot sweep with ankle hook\n * - Joint locks and circular throws (+15% throw range)\n * - Small circle joint manipulation (+10% joint lock damage)\n *\n * @korean 태괘방어포즈\n */\nexport const TAE_FLUID_GUARD_POSE: StanceGuardPose = {\n leftArm: {\n // Lead hand (왼손) - Extended for circular deflection and wrist grabs\n shoulder: new THREE.Euler(-0.65, 0.5, 0.4), // Lead arm extended mid-level, palm open\n elbow: new THREE.Euler(0, 0, -1.9), // Soft elbow ~110° for circular redirection\n wrist: new THREE.Euler(-0.15, 0.35, 0.25), // Open palm (손바닥) facing opponent, relaxed\n },\n rightArm: {\n // Rear hand (오른손) - Chambered at solar plexus for joint attacks\n shoulder: new THREE.Euler(-0.8, -0.15, -0.3), // Rear hand mid-level ready to shoot forward\n elbow: new THREE.Euler(0, 0, 2.1), // Chambered elbow ~120° at ribs\n wrist: new THREE.Euler(0.1, -0.25, 0.15), // Open palm ready for 관절기 (joint lock)\n },\n torso: new THREE.Euler(0.08, -0.55, 0.08), // Slight forward lean + strong bladed profile (~35°)\n\n // Beom Seogi (범서기) - Cat/Tiger Stance\n // Authentic Hapkido cat stance: 170° front leg (light), 120° back knee (loaded)\n leftLeg: {\n // Front leg (앞다리) - Light, ready to lift for sweep\n hip: new THREE.Euler(0.12, 0.25, 0.05), // Front hip slightly flexed, externally rotated\n knee: new THREE.Euler(0.18, 0, 0), // Nearly straight 170° = 0.18 rad (가볍게)\n ankle: new THREE.Euler(-0.06, 0.08, 0), // Ball of foot touching (발볼 접촉)\n },\n rightLeg: {\n // Back leg (뒷다리) - Deeply bent, bearing all weight\n hip: new THREE.Euler(-0.22, -0.3, 0.05), // Back hip flexed and loaded\n knee: new THREE.Euler(1.05, 0, 0), // Deep bend 120° = 1.05 rad (깊은 굽힘)\n ankle: new THREE.Euler(-0.18, 0.02, 0), // Deep dorsiflexion, weight on back leg\n },\n pelvis: new THREE.Euler(0.08, -0.65, 0.04), // Slight forward tilt + strong rotation (40°)\n stanceWidth: 0.38, // Narrow 0.9x shoulder width for mobility (~38cm)\n stanceDepth: 0.42, // Moderate depth for balance and quick shifts\n pelvisHeight: -0.11, // Medium-low for stability (hipHeight ~0.89m)\n\n weight: \"back\", // 90/10 weight distribution (90% back leg)\n breathingRange: {\n min: 0.975, // Deep, smooth inhale (들이마시기)\n max: 1.025, // Flowing exhale for circular technique (내쉬기)\n },\n};\n\n/**\n * ☲ 리 (Li) - Fire: Kuk Sool Won Precision Strike Stance\n *\n * **Korean Name**: 리괘 - 불 (Li-gwae - Bul)\n * **Martial Art**: Kuk Sool Won (국술원) / Taekwondo Gyeorugi Junbi (겨루기 준비) - Fighting Ready Stance\n * **Philosophy**: Yang penetration, laser focus, burning precision, fire's consuming accuracy\n *\n * **Authentic Gyeorugi Junbi Characteristics**:\n * - 겨루기 준비 (Gyeorugi Junbi): Olympic sparring ready position\n * - Balanced 50/50 weight distribution for rapid direction changes\n * - Both knees bent ~135° for explosive spring in any direction\n * - 피카부 가드 (Peekaboo Guard): High tight hands protecting face\n * - Elbows flared wide like wings (날개) for maximum head protection\n * - Fists literally glued to temples/cheekbones (관자놀이)\n *\n * **Biomechanical Analysis**:\n * - Square stance allows equal power generation both sides\n * - High guard creates narrow target profile (minimal exposure)\n * - Deep knee bend provides explosive movement in 8 directions\n * - Tight fists to temples allow instant peek-and-strike\n *\n * **Combat Applications**:\n * - 혈도공격 (Hyeoldo Gonggyeok): Precise vital point strikes\n * - 급소타격 (Geupso Tagyeok): Pressure point penetration\n * - 관자놀이 타격 (Gwanjari Tagyeok): Temple strike from peek\n * - Precision nerve strikes (+15% critical hit chance)\n * - Vital point targeting accuracy (+10% vital point damage)\n *\n * @korean 리괘방어포즈\n */\nexport const LI_FIRE_GUARD_POSE: StanceGuardPose = {\n leftArm: {\n // Left fist (왼주먹) - Peekaboo high guard glued to left temple\n shoulder: new THREE.Euler(-1.65, 0.25, 1.0), // VERY HIGH shoulder, elbow flared wide\n elbow: new THREE.Euler(0, 0, -2.5), // MAXIMUM flexion ~145° (극한 굽힘) - fist to temple\n wrist: new THREE.Euler(0.45, 0.2, 0.05), // Vertical fist pressed to left temple (관자놀이)\n },\n rightArm: {\n // Right fist (오른주먹) - Mirror peekaboo protecting right temple\n shoulder: new THREE.Euler(-1.65, -0.25, -1.0), // VERY HIGH shoulder, elbow flared wide\n elbow: new THREE.Euler(0, 0, 2.5), // MAXIMUM flexion ~145° (극한 굽힘) - fist to temple\n wrist: new THREE.Euler(0.45, -0.2, -0.05), // Vertical fist pressed to right temple (관자놀이)\n },\n torso: new THREE.Euler(0.18, 0, 0), // Forward lean 18°, SQUARE facing (정면) - no rotation\n\n // Gyeorugi Junbi (겨루기 준비) - Fighting Ready Stance\n // Authentic Taekwondo sparring stance: 135° both knees, 50/50 weight, square\n leftLeg: {\n // Left leg (왼다리) - Balanced, ready to kick or pivot\n hip: new THREE.Euler(0.22, 0.32, 0.18), // Hip flexed and externally rotated\n knee: new THREE.Euler(0.79, 0, 0), // 135° flexion = 0.79 rad (중간 굽힘)\n ankle: new THREE.Euler(-0.14, 0.12, 0), // Slight toe-out for stability\n },\n rightLeg: {\n // Right leg (오른다리) - Mirror balance, equal spring potential\n hip: new THREE.Euler(0.22, -0.32, -0.18), // Mirror external rotation\n knee: new THREE.Euler(0.79, 0, 0), // 135° flexion = 0.79 rad (중간 굽힘)\n ankle: new THREE.Euler(-0.14, -0.12, 0), // Slight toe-out for stability\n },\n pelvis: new THREE.Euler(0.12, 0, 0), // Forward tilt 12°, PERFECTLY SQUARE (완전 정면)\n stanceWidth: 0.48, // 1.1x shoulder width for balanced mobility (~48cm)\n stanceDepth: 0.28, // Slight stagger for forward/backward mobility\n pelvisHeight: -0.13, // Medium-low for explosive power (hipHeight ~0.87m)\n\n weight: \"neutral\", // Perfect 50/50 balance\n breathingRange: {\n min: 0.99, // Shallow, controlled breathing (얕은 호흡)\n max: 1.01, // Minimal movement - precision focus (정밀 집중)\n },\n};\n\n/**\n * ☳ 진 (Jin) - Thunder: Taekwondo Explosive Power Stance\n *\n * **Korean Name**: 진괘 - 천둥 (Jin-gwae - Cheondeung)\n * **Martial Art**: Taekwondo (태권도) Juchum Seogi (주춤서기) - Horse Riding Stance\n * **Philosophy**: Extreme yang, shocking power, thunder's instant discharge, explosive release\n *\n * **Authentic Juchum Seogi Characteristics**:\n * - 주춤서기 (Juchum Seogi): Classic horse stance - VERY WIDE and VERY LOW\n * - 2.0x shoulder width stance (~80-90cm) with parallel feet\n * - Both knees bent to 90° (수평 허벅지) - thighs parallel to ground\n * - 50/50 perfect weight distribution for explosive power either direction\n * - Arms chambered low (낮은 준비) - coiled spring ready to explode\n * - Lead arm extended but tight, rear fist at ribs ready to thunder strike\n *\n * **Biomechanical Analysis**:\n * - Ultra-wide stance creates maximum stability platform\n * - 90° knee bend stores enormous elastic energy in quadriceps\n * - Low center of gravity allows explosive upward/lateral movement\n * - Parallel feet enable instant pivot and rotation\n *\n * **Combat Applications**:\n * - 뇌성타격 (Noeseong Tagyeok): Thunder strike to nerve clusters\n * - 신경충격파 (Singyeong Chunggyeokpa): Shocking nerve disruption\n * - 폭발적 주먹지르기 (Pokbaljeok Jumeok Jireugi): Explosive power punch\n * - Nerve strike warfare (+15% shock damage on nerve points)\n * - Stunning power (-30 consciousness on head impacts)\n *\n * @korean 진괘방어포즈\n */\nexport const JIN_THUNDER_GUARD_POSE: StanceGuardPose = {\n leftArm: {\n // Lead arm (왼팔) - Extended but chambered, ready to strike\n shoulder: new THREE.Euler(-0.55, 0.25, 0.65), // Lead shoulder raised, tight to body\n elbow: new THREE.Euler(0, 0, -2.3), // TIGHT elbow ~135° guarding left ribs\n wrist: new THREE.Euler(0.35, 0.12, 0), // Chambered fist at mid-level (중단)\n },\n rightArm: {\n // Rear power fist (오른주먹) - Chambered at ribs for devastating strike\n shoulder: new THREE.Euler(-0.65, -0.18, -0.4), // Rear shoulder coiled at ribs\n elbow: new THREE.Euler(0, 0, 2.45), // VERY TIGHT ~140° maximum chamber (극한 준비)\n wrist: new THREE.Euler(0.4, -0.08, 0), // Rear fist touching ribs (갈비뼈) - explosive potential\n },\n torso: new THREE.Euler(-0.05, -0.38, 0.06), // Slight back lean (coiled) + rotation\n\n // Juchum Seogi (주춤서기) - Horse Riding Stance\n // Authentic Taekwondo horse stance: 90° both knees, 50/50 weight, VERY WIDE\n leftLeg: {\n // Left leg (왼다리) - Wide spread, deep bend, explosive coil\n hip: new THREE.Euler(0.32, 0.52, 0.35), // Wide external rotation, abducted\n knee: new THREE.Euler(1.57, 0, 0), // FULL 90° bend = 1.57 rad (π/2) - thigh horizontal\n ankle: new THREE.Euler(-0.28, 0.22, 0), // Deep dorsiflexion, toes out for stability\n },\n rightLeg: {\n // Right leg (오른다리) - Mirror wide horse stance\n hip: new THREE.Euler(0.32, -0.52, -0.35), // Mirror external rotation\n knee: new THREE.Euler(1.57, 0, 0), // FULL 90° bend = 1.57 rad - thigh horizontal\n ankle: new THREE.Euler(-0.28, -0.22, 0), // Deep dorsiflexion, toes out\n },\n pelvis: new THREE.Euler(0.08, 0, 0), // Minimal forward tilt, SQUARE facing (정면)\n stanceWidth: 0.95, // VERY WIDE 2.2x shoulder width (~95cm) for maximum power\n stanceDepth: 0, // Zero - perfectly parallel feet (평행 발)\n pelvisHeight: -0.28, // VERY LOW - deep squat (hipHeight ~0.72m)\n\n weight: \"neutral\", // Perfect 50/50 balance\n breathingRange: {\n min: 0.96, // Deep inhale (깊은 들이마시기) - charging power\n max: 1.045, // Explosive exhale (폭발적 내쉬기) - thunder discharge\n },\n};\n\n/**\n * ☴ 손 (Son) - Wind: Taekyon Continuous Flow Stance\n *\n * **Korean Name**: 손괘 - 바람 (Son-gwae - Baram)\n * **Martial Art**: Taekyon (택견) Hakdari Seogi (학다리서기) - Crane Stance\n * **Philosophy**: Gentle yin, persistent wind, flowing rhythm, continuous pressure\n *\n * **Authentic Hakdari Seogi Characteristics**:\n * - 학다리서기 (Hakdari Seogi): Traditional Korean crane stance - ONE LEG RAISED\n * - Standing leg nearly straight (170°) with perfect balance\n * - Raised leg bent deeply (knee at waist level, 45° thigh angle)\n * - 100% weight on standing leg - ready to kick with raised leg instantly\n * - Arms in flowing 품밟기 (Pumbalbgi) motion - continuous circular movement\n * - Lead knife hand extended for 손날막기 (Sonnal Makgi - knife hand block)\n *\n * **Biomechanical Analysis**:\n * - Single leg stance enables instant kick without telegraphing\n * - High knee chamber provides explosive kick power\n * - Flowing arm position creates deceptive continuous motion\n * - Perfect balance allows rapid direction changes\n *\n * **Combat Applications**:\n * - 연속발차기 (Yeonsok Balchagi): Continuous kicking combinations\n * - 품밟기 리듬 (Pumbalbgi Rhythm): Rhythmic pressure sequences\n * - 발걸이 (Balgeori): Sweeping techniques from raised leg\n * - Continuous pressure strikes (+10% chaining speed)\n * - Lateral movement advantage (+10% lateral mobility)\n *\n * @korean 손괘방어포즈\n */\nexport const SON_WIND_GUARD_POSE: StanceGuardPose = {\n leftArm: {\n // Lead knife hand (왼손날) - Extended in flowing circular motion\n shoulder: new THREE.Euler(-0.68, 0.48, 0.35), // Lead shoulder mid-level, flowing\n elbow: new THREE.Euler(0, 0, -1.85), // Soft elbow ~105° for circular flow\n wrist: new THREE.Euler(-0.08, 0.32, 0.25), // Knife hand (손날) extended, palm vertical\n },\n rightArm: {\n // Rear guard hand (오른손) - Protecting center, ready to flow\n shoulder: new THREE.Euler(-0.95, -0.18, -0.45), // Rear hand at solar plexus level\n elbow: new THREE.Euler(0, 0, 2.15), // Chambered elbow ~125° guarding ribs\n wrist: new THREE.Euler(0.18, -0.22, 0.08), // Open palm ready for circular deflection\n },\n torso: new THREE.Euler(0.06, -0.52, 0.12), // Slight forward + strong bladed rotation (30°)\n\n // Hakdari Seogi (학다리서기) - Crane Stance\n // Authentic Taekyon crane stance: 170° standing leg, 45° raised thigh, 100% weight\n leftLeg: {\n // Raised leg (든 다리) - LEFT knee at waist level, ready to kick\n hip: new THREE.Euler(1.3, 0.35, 0.25), // Thigh raised to 45° (high chamber)\n knee: new THREE.Euler(2.1, 0, 0), // Knee deeply bent ~120° flexion (발 접힘)\n ankle: new THREE.Euler(-0.45, 0.28, 0), // Foot hanging naturally, toes pointed down\n },\n rightLeg: {\n // Standing leg (딛는 다리) - RIGHT leg bearing all weight\n hip: new THREE.Euler(0.08, -0.18, 0), // Standing hip nearly straight, slight stability bend\n knee: new THREE.Euler(0.18, 0, 0), // Nearly straight 170° = 0.18 rad (거의 곧게)\n ankle: new THREE.Euler(-0.09, 0, 0), // Foot flat, stable base (평평한 발바닥)\n },\n pelvis: new THREE.Euler(0.04, -0.58, 0.08), // Minimal tilt, strong rotation toward standing leg\n stanceWidth: 0, // Zero - single leg stance (한 발 서기)\n stanceDepth: 0.18, // Standing leg slightly forward for balance\n pelvisHeight: -0.06, // Higher position for mobility (hipHeight ~0.94m)\n\n weight: \"neutral\", // 100% on standing leg (technically neutral in definition)\n breathingRange: {\n min: 0.985, // Rhythmic breathing (리듬 호흡) - flowing cycles\n max: 1.018, // Sustained inhale/exhale for continuous motion\n },\n};\n\n/**\n * ☵ 감 (Gam) - Water: Hapkido Defensive Counter Stance\n *\n * **Korean Name**: 감괘 - 물 (Gam-gwae - Mul)\n * **Martial Art**: Hapkido (합기도) Dwitbal Seogi (뒷발서기) - Back Weighted Stance\n * **Philosophy**: Yin reception, adaptive flow, water's yielding redirection, counter force\n *\n * **Authentic Dwitbal Seogi Characteristics**:\n * - 뒷발서기 (Dwitbal Seogi): Defensive back stance with 70% weight on rear leg\n * - Front leg extended nearly straight (160°) for defensive distance\n * - Back leg deeply bent (100°) coiled for explosive counter\n * - Both palms open (손바닥) mid-level for 막기 (Makgi - blocking/deflection)\n * - Tight elbows protect ribs while ready to redirect force\n * - Bladed profile (칼날 자세) minimizes target area\n *\n * **Biomechanical Analysis**:\n * - Back-weighted provides safety distance from opponent\n * - Extended front leg acts as range-finder and tripwire\n * - Deep rear leg stores elastic energy for counter explosion\n * - Open palms enable instant grip and redirection\n *\n * **Combat Applications**:\n * - 막고반격 (Makgo Bangyeok): Block-and-counter sequences\n * - 원형막기 (Wonhyeong Makgi): Circular deflection techniques\n * - 흘려치기 (Heullyeo Chigi): Flow-redirect strikes\n * - Adaptive counters (+10% counter speed)\n * - Rib damage amplification (+15 bleed on rib shots from counters)\n *\n * @korean 감괘방어포즈\n */\nexport const GAM_WATER_GUARD_POSE: StanceGuardPose = {\n leftArm: {\n // Lead deflection hand (왼손) - Open palm mid-level for circular blocks\n shoulder: new THREE.Euler(-0.75, 0.32, 0.42), // Lead shoulder chest-high, ready to redirect\n elbow: new THREE.Euler(0, 0, -2.05), // Tight elbow ~115° guarding left ribs\n wrist: new THREE.Euler(-0.12, 0.35, 0.32), // Open palm (손바닥) vertical, fingers relaxed\n },\n rightArm: {\n // Rear counter hand (오른손) - Open palm ready for grab or strike\n shoulder: new THREE.Euler(-0.78, -0.28, -0.38), // Rear shoulder mirror position\n elbow: new THREE.Euler(0, 0, 2.08), // Tight elbow ~118° guarding right ribs\n wrist: new THREE.Euler(-0.09, -0.32, -0.28), // Open palm ready for counter technique\n },\n torso: new THREE.Euler(0.09, -0.42, 0.11), // Slight forward lean + bladed rotation (24°)\n\n // Dwitbal Seogi (뒷발서기) - Back Weighted Stance\n // Authentic Hapkido defensive stance: 160° front leg, 100° back knee, 30/70 weight\n leftLeg: {\n // Front leg (앞다리) - Extended, light contact for range and sensing\n hip: new THREE.Euler(0.16, 0.22, 0.04), // Front hip slightly flexed\n knee: new THREE.Euler(0.35, 0, 0), // Nearly straight 160° = 0.35 rad (거의 곧게)\n ankle: new THREE.Euler(-0.07, 0.03, 0), // Light toe contact, ready to lift\n },\n rightLeg: {\n // Back leg (뒷다리) - Deeply bent, bearing most weight, coiled spring\n hip: new THREE.Euler(-0.28, -0.25, 0.03), // Back hip flexed and loaded\n knee: new THREE.Euler(1.4, 0, 0), // Deep bend 100° = 1.4 rad (깊은 굽힘)\n ankle: new THREE.Euler(-0.22, 0.02, 0), // Rooted dorsiflexion for stability\n },\n pelvis: new THREE.Euler(0.06, -0.45, 0.06), // Slight forward tilt + rotation for defense\n stanceWidth: 0.52, // 1.2x shoulder width for stable base (~52cm)\n stanceDepth: 0.48, // Moderate front/back separation for mobility\n pelvisHeight: -0.13, // Medium-low for balance (hipHeight ~0.87m)\n\n weight: \"back\", // 70/30 weight distribution (70% back)\n breathingRange: {\n min: 0.975, // Deep, flowing inhale (흐르는 들이마시기)\n max: 1.028, // Full exhale for explosive counter (반격 내쉬기)\n },\n};\n\n/**\n * ☶ 간 (Gan) - Mountain: Taekwondo Immovable Defense Stance\n *\n * **Korean Name**: 간괘 - 산 (Gan-gwae - San)\n * **Martial Art**: Taekwondo (태권도) Moa Seogi (모아서기) - Closed Feet Stance\n * **Philosophy**: Mountain's stillness, immovable yang, absolute defense, rooted earth\n *\n * **Authentic Moa Seogi Characteristics**:\n * - 모아서기 (Moa Seogi): Feet together or nearly touching - NARROW stance\n * - 0.6x shoulder width (~24cm) for mountain-solid rooting\n * - Both knees bent ~145° as shock absorbers (충격 흡수)\n * - 50/50 perfect weight distribution for balanced defense\n * - 상단막기 (Sangdan Makgi): High X-block with forearms crossed\n * - Fists at opposite shoulders creating impenetrable face shield\n *\n * **Biomechanical Analysis**:\n * - Narrow stance creates ultra-stable base (low moment arm)\n * - Knees bent absorb impact force like suspension system\n * - Crossed forearms provide maximum frontal protection\n * - Square facing presents minimal target profile\n *\n * **Combat Applications**:\n * - 산막기 (San Makgi): Mountain block - immovable defense\n * - 가위막기 (Gawi Makgi): Scissor block with crossed arms\n * - 반격준비 (Bangyeok Junbi): Counter-strike preparation from solid base\n * - Impenetrable blocking (+15% block strength)\n * - Instant counter strikes (+10% counter-strike speed)\n *\n * @korean 간괘방어포즈\n */\nexport const GAN_MOUNTAIN_GUARD_POSE: StanceGuardPose = {\n leftArm: {\n // Left forearm (왼팔뚝) - Crossed in front of face for X-block\n shoulder: new THREE.Euler(-1.85, 0.12, 1.05), // Very high shoulder, arm crossed\n elbow: new THREE.Euler(0, 0, -2.5), // MAXIMUM flexion ~145° (극한 굽힘)\n wrist: new THREE.Euler(0.52, 0.42, 0.35), // Left fist at RIGHT shoulder (교차)\n },\n rightArm: {\n // Right forearm (오른팔뚝) - Crossed over left creating X-shield\n shoulder: new THREE.Euler(-1.85, -0.12, -1.05), // Mirror high position\n elbow: new THREE.Euler(0, 0, 2.5), // MAXIMUM flexion ~145° (극한 굽힘)\n wrist: new THREE.Euler(0.52, -0.42, -0.35), // Right fist at LEFT shoulder (교차)\n },\n torso: new THREE.Euler(0.16, 0, 0), // Forward lean 16° chin down, SQUARE facing (정면)\n\n // Moa Seogi (모아서기) - Closed Feet Stance\n // Authentic Taekwondo mountain stance: 145° both knees, 50/50 weight, feet together\n leftLeg: {\n // Left leg (왼다리) - Feet nearly touching, shock absorber position\n hip: new THREE.Euler(0.12, 0.09, 0.02), // Minimal hip flexion, feet close\n knee: new THREE.Euler(0.61, 0, 0), // Moderate bend 145° = 0.61 rad (중간 굽힘)\n ankle: new THREE.Euler(-0.11, 0.02, 0), // Flat planted, weight distributed\n },\n rightLeg: {\n // Right leg (오른다리) - Mirror stability, mountain rooted\n hip: new THREE.Euler(0.12, -0.09, -0.02), // Mirror minimal flexion\n knee: new THREE.Euler(0.61, 0, 0), // Moderate bend 145° = 0.61 rad (중간 굽힘)\n ankle: new THREE.Euler(-0.11, -0.02, 0), // Flat planted firmly\n },\n pelvis: new THREE.Euler(0.11, 0, 0), // Slight forward tilt, NO rotation - square (정면)\n stanceWidth: 0.12, // VERY NARROW 0.3x shoulder width - feet nearly together (~12cm)\n stanceDepth: 0, // Zero - perfectly parallel, mountain solid (평행)\n pelvisHeight: -0.07, // Slightly lowered for shock absorption (hipHeight ~0.93m)\n\n weight: \"neutral\", // Perfect 50/50 mountain balance\n breathingRange: {\n min: 0.992, // Minimal chest movement (최소 움직임)\n max: 1.008, // Steady, controlled breathing (안정된 호흡)\n },\n};\n\n/**\n * ☷ 곤 (Gon) - Earth: Ssireum Grappling Ground Stance\n *\n * **Korean Name**: 곤괘 - 땅 (Gon-gwae - Ttang)\n * **Martial Art**: Ssireum (씨름) / Yusul (유술) Deep Squat Grappling Stance\n * **Philosophy**: Ultimate yin, earth's receptive power, grounding force, takedown dominance\n *\n * **Authentic Ssireum Deep Stance Characteristics**:\n * - 씨름 자세 (Ssireum Jase): Traditional Korean wrestling deep squat\n * - ULTRA WIDE stance 2.8x shoulder width (~1.1m+) for maximum stability\n * - Both knees bent to ~80° (극한 굽힘) - DEEP sumo-like squat\n * - 50/50 weight distribution with VERY LOW center of gravity\n * - Arms low ready for 샅바잡기 (Satbajapgi - belt/thigh grabs)\n * - Hands at hip level for 허리후리기 (Heori Hurigi - hip throw preparation)\n *\n * **Biomechanical Analysis**:\n * - Ultra-wide stance lowers center of gravity below opponent's\n * - Deep squat provides explosive upward throwing power\n * - Low hand position enables immediate grip on legs/hips\n * - Forward torso lean establishes grappling pressure\n *\n * **Combat Applications**:\n * - 다리후리기 (Dari Hurigi): Leg sweep and trip techniques\n * - 허리후리기 (Heori Hurigi): Hip throw from deep position\n * - 배지기 (Baejigi): Belly-to-belly suplex throws\n * - Ground clinches and throws (+20% ground control)\n * - Takedown damage amplification (+20 bleed on successful throws)\n *\n * @korean 곤괘방어포즈\n */\nexport const GON_EARTH_GUARD_POSE: StanceGuardPose = {\n leftArm: {\n // Left grappling hand (왼손) - Low position for belt/thigh grabs\n shoulder: new THREE.Euler(-0.38, 0.32, 0.55), // Shoulder lowered, arm extended down\n elbow: new THREE.Euler(0, 0, -2.05), // Tight elbow ~115° protecting ribs\n wrist: new THREE.Euler(-0.08, 0.22, 0.35), // Open palm (손바닥) ready for 샅바 (Satba grab)\n },\n rightArm: {\n // Right grappling hand (오른손) - Mirror low position for underhooks\n shoulder: new THREE.Euler(-0.38, -0.32, -0.55), // Mirror low shoulder position\n elbow: new THREE.Euler(0, 0, 2.05), // Tight elbow ~115° protecting ribs\n wrist: new THREE.Euler(-0.08, -0.22, -0.35), // Open palm ready for belt/thigh control\n },\n torso: new THREE.Euler(0.32, 0, 0), // Forward lean 32° - grappling pressure (그래플링 압박)\n\n // Ssireum Deep Squat (씨름 쪼그리기) - Ultra-Wide Sumo Position\n // Authentic Korean wrestling stance: ~80° both knees, 50/50 weight, ULTRA WIDE\n leftLeg: {\n // Left leg (왼다리) - Ultra-wide spread, maximum squat depth\n hip: new THREE.Euler(0.15, 0.58, 0.45), // Wide external rotation and abduction\n knee: new THREE.Euler(1.48, 0, 0), // EXTREME bend ~80° = 1.48 rad (극한 쪼그림)\n ankle: new THREE.Euler(-0.32, 0.25, 0), // Deep dorsiflexion, toes out wide\n },\n rightLeg: {\n // Right leg (오른다리) - Mirror ultra-wide sumo squat\n hip: new THREE.Euler(0.15, -0.58, -0.45), // Mirror external rotation and abduction\n knee: new THREE.Euler(1.48, 0, 0), // EXTREME bend ~80° = 1.48 rad (극한 쪼그림)\n ankle: new THREE.Euler(-0.32, -0.25, 0), // Deep dorsiflexion, toes out wide\n },\n pelvis: new THREE.Euler(0.22, 0, 0), // Forward tilt 22°, SQUARE facing (정면)\n stanceWidth: 1.35, // ULTRA WIDE 3.0x+ shoulder width - sumo squat (~135cm+)\n stanceDepth: 0, // Zero - perfectly parallel feet for maximum stability (평행)\n pelvisHeight: -0.48, // EXTREMELY LOW - deep squat (hipHeight ~0.52m)\n\n weight: \"neutral\", // Perfect 50/50 sumo balance\n breathingRange: {\n min: 0.965, // Deep diaphragm breathing (깊은 복식호흡)\n max: 1.042, // Explosive power exhale for throws (던지기 내쉬기)\n },\n};\n\n/**\n * Stance Guard Animation Configurations\n *\n * Record mapping each trigram stance to its complete guard animation config.\n * Includes 4-6 frame breathing animation at 60fps for realistic idle behavior.\n *\n * Using Record instead of Map for better performance with small static dataset.\n *\n * Integration:\n * - Links to AnimationStateMachine for stance-specific idle states\n * - Used by SkeletalPlayer3D for rendering guard positions\n * - Integrates with StanceManager for trigram system\n *\n * @korean 자세방어애니메이션설정맵\n */\nexport const STANCE_GUARD_CONFIGS: Record<\n TrigramStance,\n StanceGuardAnimationConfig\n> = {\n [TrigramStance.GEON]: {\n stance: TrigramStance.GEON,\n koreanName: \"건\",\n englishName: \"Heaven\",\n guardPose: GEON_HIGH_GUARD_POSE,\n breathingFrames: 6,\n fps: 60,\n loop: true,\n priority: 0,\n },\n [TrigramStance.TAE]: {\n stance: TrigramStance.TAE,\n koreanName: \"태\",\n englishName: \"Lake\",\n guardPose: TAE_FLUID_GUARD_POSE,\n breathingFrames: 6,\n fps: 60,\n loop: true,\n priority: 0,\n },\n [TrigramStance.LI]: {\n stance: TrigramStance.LI,\n koreanName: \"리\",\n englishName: \"Fire\",\n guardPose: LI_FIRE_GUARD_POSE,\n breathingFrames: 4,\n fps: 60,\n loop: true,\n priority: 0,\n },\n [TrigramStance.JIN]: {\n stance: TrigramStance.JIN,\n koreanName: \"진\",\n englishName: \"Thunder\",\n guardPose: JIN_THUNDER_GUARD_POSE,\n breathingFrames: 5,\n fps: 60,\n loop: true,\n priority: 0,\n },\n [TrigramStance.SON]: {\n stance: TrigramStance.SON,\n koreanName: \"손\",\n englishName: \"Wind\",\n guardPose: SON_WIND_GUARD_POSE,\n breathingFrames: 6,\n fps: 60,\n loop: true,\n priority: 0,\n },\n [TrigramStance.GAM]: {\n stance: TrigramStance.GAM,\n koreanName: \"감\",\n englishName: \"Water\",\n guardPose: GAM_WATER_GUARD_POSE,\n breathingFrames: 6,\n fps: 60,\n loop: true,\n priority: 0,\n },\n [TrigramStance.GAN]: {\n stance: TrigramStance.GAN,\n koreanName: \"간\",\n englishName: \"Mountain\",\n guardPose: GAN_MOUNTAIN_GUARD_POSE,\n breathingFrames: 4,\n fps: 60,\n loop: true,\n priority: 0,\n },\n [TrigramStance.GON]: {\n stance: TrigramStance.GON,\n koreanName: \"곤\",\n englishName: \"Earth\",\n guardPose: GON_EARTH_GUARD_POSE,\n breathingFrames: 5,\n fps: 60,\n loop: true,\n priority: 0,\n },\n} as const;\n\n/**\n * Get guard pose for a specific trigram stance with laterality support\n *\n * **Korean**: 자세 방어 포즈 가져오기\n *\n * Returns the appropriate guard pose for the given stance and laterality.\n * Right laterality returns the base pose; left laterality returns a mirrored version.\n * This supports authentic Korean martial arts stance differentiation:\n * - 오른발서기 (Oreun Bal Seogi): Right foot forward - base pose\n * - 왼발서기 (Oenbal Seogi): Left foot forward - mirrored pose\n *\n * @param stance - Trigram stance identifier (e.g., \"geon\", \"tae\")\n * @param laterality - Stance side: \"left\" or \"right\" (defaults to \"right\")\n * @returns Guard pose configuration or undefined if not found\n *\n * @example\n * ```typescript\n * // Get right Heaven stance (default)\n * const rightGeon = getGuardPoseForStance(\"geon\", \"right\");\n *\n * // Get left Heaven stance (mirrored)\n * const leftGeon = getGuardPoseForStance(\"geon\", \"left\");\n * // leftGeon now has left foot forward, left hand lead\n * ```\n *\n * @korean 자세방어포즈가져오기\n */\nexport function getGuardPoseForStance(\n stance: TrigramStance,\n laterality: StanceLaterality = \"right\",\n): StanceGuardPose | undefined {\n const config = STANCE_GUARD_CONFIGS[stance];\n if (!config?.guardPose) {\n return undefined;\n }\n\n // Right laterality returns base pose\n if (laterality === \"right\") {\n return config.guardPose;\n }\n\n // Left laterality returns mirrored pose\n return mirrorGuardPose(config.guardPose);\n}\n\n/**\n * Get guard animation config for a specific trigram stance\n *\n * @param stance - Trigram stance identifier\n * @returns Complete guard animation configuration or undefined if not found\n *\n * @korean 자세방어애니메이션설정가져오기\n */\nexport function getGuardConfigForStance(\n stance: TrigramStance,\n): StanceGuardAnimationConfig | undefined {\n return STANCE_GUARD_CONFIGS[stance];\n}\n\n/**\n * Get all 16 stance guard poses (8 stances × 2 laterality options)\n *\n * **Korean**: 모든 자세 방어 포즈\n *\n * Returns a map of all possible stance+laterality combinations with their guard poses.\n * This represents the complete set of 16 distinct guard configurations in Black Trigram.\n *\n * The result is cached for performance - subsequent calls return the same Map instance.\n *\n * Format: `\"stance_laterality\"` → `StanceGuardPose`\n * - Example keys: \"geon_left\", \"geon_right\", \"tae_left\", \"tae_right\", etc.\n *\n * @returns Map of all 16 stance guard pose configurations\n *\n * @korean 모든자세방어포즈\n */\nlet cachedAllPoses: Map<string, StanceGuardPose> | null = null;\n\nexport function getAllStanceGuardPoses(): Map<string, StanceGuardPose> {\n // Return cached result if available for performance\n if (cachedAllPoses) {\n return cachedAllPoses;\n }\n\n const allPoses = new Map<string, StanceGuardPose>();\n\n // For each trigram stance\n Object.values(TrigramStance).forEach((stance) => {\n // Add right laterality (base pose)\n const rightPose = getGuardPoseForStance(stance, \"right\");\n if (rightPose) {\n allPoses.set(`${stance}_right`, rightPose);\n }\n\n // Add left laterality (mirrored pose)\n const leftPose = getGuardPoseForStance(stance, \"left\");\n if (leftPose) {\n allPoses.set(`${stance}_left`, leftPose);\n }\n });\n\n // Cache the result\n cachedAllPoses = allPoses;\n return allPoses;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"StanceIdleAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/StanceIdleAnimations.ts"],"sourcesContent":["/**\n * Trigram Stance Idle Animations - Enhanced Breathing & Weight Shift System\n *\n * Defines complete idle animations for all 8 trigram stances (팔괘) with:\n * - Multi-keyframe breathing cycles (4-6 frames per stance)\n * - Subtle weight shifts for natural movement\n * - Stance-specific rhythms reflecting martial philosophy\n * - Proper guard positions from StanceGuardPoses\n *\n * Each trigram idle is the starting point for all techniques in that stance.\n * The breathing and weight shifts reflect the elemental nature:\n * - ☰ 건 (Heaven): Powerful, expansive chest breathing\n * - ☱ 태 (Lake): Fluid, rippling breath flow\n * - ☲ 리 (Fire): Sharp, controlled precision breathing\n * - ☳ 진 (Thunder): Deep coiled power breathing\n * - ☴ 손 (Wind): Rhythmic continuous flow\n * - ☵ 감 (Water): Deep flowing diaphragm breathing\n * - ☶ 간 (Mountain): Minimal steady breathing\n * - ☷ 곤 (Earth): Deep grounded diaphragm breathing\n *\n * @module systems/animation/catalogs/StanceIdleAnimations\n * @category Animation System\n * @korean 팔괘자세대기애니메이션\n */\n\nimport { TrigramStance } from \"@/types/common\";\nimport type { SkeletalAnimation, StanceGuardPose } from \"@/types/skeletal\";\nimport { BoneName } from \"@/types/skeletal\";\nimport type { KeyframeConfig } from \"../builders/KeyframeConfig\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\nimport {\n GAM_WATER_GUARD_POSE,\n GAN_MOUNTAIN_GUARD_POSE,\n GEON_HIGH_GUARD_POSE,\n GON_EARTH_GUARD_POSE,\n JIN_THUNDER_GUARD_POSE,\n LI_FIRE_GUARD_POSE,\n SON_WIND_GUARD_POSE,\n STANCE_GUARD_CONFIGS,\n TAE_FLUID_GUARD_POSE,\n} from \"./StanceGuardPoses\";\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ANIMATION TIMING CONSTANTS (애니메이션 타이밍 상수)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Breathing cycle durations per stance (in seconds)\n * Each stance has characteristic breathing rhythm\n *\n * @korean 호흡주기지속시간\n */\nconst BREATHING_DURATIONS = {\n GEON: 2.4, // Powerful slow breathing\n TAE: 2.8, // Fluid flowing breath\n LI: 1.8, // Sharp controlled breathing\n JIN: 2.2, // Explosive ready breath\n SON: 2.0, // Rhythmic continuous flow\n GAM: 3.0, // Deep flowing breath\n GAN: 2.6, // Steady controlled breath\n GON: 2.6, // Grounded diaphragm breath\n} as const;\n\n/**\n * Weight shift amplitudes per stance (percentage of base)\n * Reflects stability vs. mobility of each stance\n * RESTORED to original values for better visual feedback and natural movement\n *\n * @korean 체중이동진폭\n */\nconst WEIGHT_SHIFT_AMPLITUDES = {\n GEON: 0.04, // Visible forward rocking - mobile power stance (파워 흔들림)\n TAE: 0.05, // Fluid flowing shifts clearly visible (유동적 흐름)\n LI: 0.02, // Small but visible - precision stance (정밀 제어)\n JIN: 0.06, // Large coiled spring bounce (폭발적 준비)\n SON: 0.045, // Rhythmic lateral shifts (연속 흐름)\n GAM: 0.055, // Flowing water adaptation (물 흐름)\n GAN: 0.015, // Minimal - mountain solid (산악 안정)\n GON: 0.03, // Grounded but visible shifts (대지 흔들림)\n} as const;\n\n// ═══════════════════════════════════════════════════════════════════════════\n// BREATHING ANIMATION HELPERS (호흡 애니메이션 헬퍼)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Calculates breathing scale at a given phase\n *\n * @param phase - Breathing phase (0-1, where 0.5 is peak inhale)\n * @param min - Minimum scale (exhale)\n * @param max - Maximum scale (inhale peak)\n * @returns Scale factor for chest/torso\n */\nfunction calculateBreathingScale(\n phase: number,\n min: number,\n max: number,\n): number {\n // Use cosine-based wave for natural breathing rhythm\n // Phase 0 = peak inhale, 0.5 = peak exhale\n const breathPhase = Math.cos(phase * Math.PI * 2);\n const amplitude = (max - min) / 2;\n const center = (max + min) / 2;\n return center + breathPhase * amplitude;\n}\n\n/**\n * Calculates torso expansion for breathing effect\n *\n * @param breathingScale - Current breathing scale (0.96-1.04)\n * @returns Torso rotation adjustment for breathing\n */\nfunction calculateTorsoBreathingOffset(breathingScale: number): number {\n // Chest expands forward more visibly on inhale\n // Multiplier 1.5 for clearly visible breathing (가슴 확장 시각화)\n return (breathingScale - 1) * 1.5;\n}\n\n/**\n * Calculates subtle knee bounce offset at a given phase\n *\n * DESIGN: Idle animations should have visible knee bounce for natural movement feel\n * - no pelvis position movement which creates a \"walking in place\" appearance.\n *\n * @param phase - Breathing/bounce phase (0-1)\n * @param amplitude - Maximum bounce amount (knee bend adjustment)\n * @returns Knee rotation adjustment for natural bounce\n */\nfunction calculateKneeBounce(phase: number, amplitude: number): number {\n // Visible knee flex synchronized with breathing for natural alive feel\n // Two bounces per breath cycle (one per inhale/exhale)\n // 호흡과 동기화된 무릎 굽힘으로 자연스러운 움직임\n const bouncePhase = Math.sin(phase * Math.PI * 4);\n return bouncePhase * amplitude * 0.5;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// GUARD POSE APPLICATION HELPERS (방어자세적용헬퍼)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Applies a complete guard pose to a KeyframeConfig with breathing and knee bounce\n *\n * DESIGN: Idle animations should only have:\n * - Chest breathing (torso expansion)\n * - Subtle knee bounce (slight knee flex variation)\n * NO pelvis X/Z position movement (causes \"walking in place\" appearance)\n *\n * @param kf - KeyframeConfig to apply pose to\n * @param pose - Guard pose to apply\n * @param breathingOffset - Torso breathing offset\n * @param kneeBounce - Subtle knee flex adjustment for bounce effect\n */\nfunction applyGuardPoseToKeyframe(\n kf: KeyframeConfig,\n pose: StanceGuardPose,\n breathingOffset: number,\n kneeBounce: number = 0,\n): void {\n // === ARM POSITIONS (팔 위치) ===\n // IMPORTANT: Use SHOULDER_L/R, ELBOW_L/R, WRIST_L/R bone names\n // NOT UPPER_ARM, FOREARM, HAND - those are different bones in the hierarchy!\n\n // Left arm - shoulder controls arm lift/rotation\n kf.rotate(\n BoneName.SHOULDER_L,\n pose.leftArm.shoulder.x,\n pose.leftArm.shoulder.y,\n pose.leftArm.shoulder.z,\n );\n // Elbow controls forearm bend\n kf.rotate(\n BoneName.ELBOW_L,\n pose.leftArm.elbow.x,\n pose.leftArm.elbow.y,\n pose.leftArm.elbow.z,\n );\n // Wrist controls hand rotation\n kf.rotate(\n BoneName.WRIST_L,\n pose.leftArm.wrist.x,\n pose.leftArm.wrist.y,\n pose.leftArm.wrist.z,\n );\n\n // Right arm - mirror bone hierarchy\n kf.rotate(\n BoneName.SHOULDER_R,\n pose.rightArm.shoulder.x,\n pose.rightArm.shoulder.y,\n pose.rightArm.shoulder.z,\n );\n kf.rotate(\n BoneName.ELBOW_R,\n pose.rightArm.elbow.x,\n pose.rightArm.elbow.y,\n pose.rightArm.elbow.z,\n );\n kf.rotate(\n BoneName.WRIST_R,\n pose.rightArm.wrist.x,\n pose.rightArm.wrist.y,\n pose.rightArm.wrist.z,\n );\n\n // === TORSO (몸통) - Full spine chain for proper rotation ===\n // SPINE_LOWER: Base torso twist (inherits from pelvis)\n kf.rotate(\n BoneName.SPINE_LOWER,\n pose.torso.x * 0.3,\n pose.torso.y * 0.4,\n pose.torso.z * 0.3,\n );\n // SPINE_MIDDLE: Mid-torso twist\n kf.rotate(\n BoneName.SPINE_MIDDLE,\n pose.torso.x * 0.3,\n pose.torso.y * 0.3,\n pose.torso.z * 0.3,\n );\n // SPINE_UPPER: Upper chest with breathing - gets most of the rotation\n kf.rotate(\n BoneName.SPINE_UPPER,\n pose.torso.x * 0.4 + breathingOffset,\n pose.torso.y * 0.3,\n pose.torso.z * 0.4,\n );\n\n // === LEG POSITIONS (다리 위치) ===\n // IMPORTANT: Use HIP_L/R for hip rotation, not THIGH!\n // HIP bone controls the leg's root rotation\n\n // Left leg - HIP controls leg lift/rotation at socket\n kf.rotate(\n BoneName.HIP_L,\n pose.leftLeg.hip.x,\n pose.leftLeg.hip.y,\n pose.leftLeg.hip.z,\n );\n // KNEE controls lower leg bend (primarily X axis flex)\n // Add subtle knee bounce for natural idle movement\n kf.rotate(\n BoneName.KNEE_L,\n pose.leftLeg.knee.x + kneeBounce,\n pose.leftLeg.knee.y,\n pose.leftLeg.knee.z,\n );\n // FOOT controls ankle rotation\n kf.rotate(\n BoneName.FOOT_L,\n pose.leftLeg.ankle.x,\n pose.leftLeg.ankle.y,\n pose.leftLeg.ankle.z,\n );\n\n // Right leg - mirror bone hierarchy\n kf.rotate(\n BoneName.HIP_R,\n pose.rightLeg.hip.x,\n pose.rightLeg.hip.y,\n pose.rightLeg.hip.z,\n );\n kf.rotate(\n BoneName.KNEE_R,\n pose.rightLeg.knee.x + kneeBounce,\n pose.rightLeg.knee.y,\n pose.rightLeg.knee.z,\n );\n kf.rotate(\n BoneName.FOOT_R,\n pose.rightLeg.ankle.x,\n pose.rightLeg.ankle.y,\n pose.rightLeg.ankle.z,\n );\n\n // === PELVIS (골반) - Root of entire body ===\n // Controls overall body rotation and position\n kf.rotate(BoneName.PELVIS, pose.pelvis.x, pose.pelvis.y, pose.pelvis.z);\n // Pelvis position: ONLY stance height drop (Y)\n // NO X/Z offset - this prevents \"walking in place\" appearance\n const pelvisHeight = pose.pelvisHeight ?? 0;\n kf.position(BoneName.PELVIS, 0, pelvisHeight, 0);\n\n // === FOOT POSITIONING (발 위치) ===\n // Position feet for stance width and depth\n const stanceDepth = pose.stanceDepth ?? 0;\n // Left foot: negative X (left side), negative Z (front for forward stances)\n kf.position(BoneName.FOOT_L, -pose.stanceWidth / 2, 0, -stanceDepth / 2);\n // Right foot: positive X (right side), positive Z (back for forward stances)\n kf.position(BoneName.FOOT_R, pose.stanceWidth / 2, 0, stanceDepth / 2);\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☰ GEON HEAVEN IDLE (건 하늘 대기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Creates Geon idle animation with breathing and subtle knee bounce\n * NO pelvis position movement - only breathing and knee flex\n */\nfunction createGeonIdleAnimation(): SkeletalAnimation {\n const pose = GEON_HIGH_GUARD_POSE;\n const { min, max } = pose.breathingRange;\n const duration = BREATHING_DURATIONS.GEON;\n const amplitude = WEIGHT_SHIFT_AMPLITUDES.GEON;\n const frames = STANCE_GUARD_CONFIGS.geon.breathingFrames;\n\n const builder = MartialArtsAnimationBuilder.create(\n \"stance_geon\",\n \"건 대기\",\n ).asIdle(duration, true);\n\n // Generate keyframes with breathing and subtle knee bounce\n for (let i = 0; i <= frames; i++) {\n const phase = i / frames;\n const frameTime = phase * duration;\n const breathingScale = calculateBreathingScale(phase, min, max);\n const breathingOffset = calculateTorsoBreathingOffset(breathingScale);\n const kneeBounce = calculateKneeBounce(phase, amplitude);\n\n const kf = builder.at(frameTime);\n applyGuardPoseToKeyframe(kf, pose, breathingOffset, kneeBounce);\n kf.done<MartialArtsAnimationBuilder>();\n }\n\n return builder.build();\n}\n\n/**\n * ☰ 건 (Geon) Heaven Idle Animation\n *\n * Powerful high guard stance with expansive chest breathing.\n * Boxing-style guard protecting chin and temples.\n *\n * **Breathing**: Slow powerful expansion (2.4s cycle)\n * **Weight**: Subtle forward shift for aggression\n * **Philosophy**: Heaven's creative force, direct power\n *\n * @korean 건하늘대기애니메이션\n */\nexport const GEON_IDLE_ANIMATION: SkeletalAnimation = createGeonIdleAnimation();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☱ TAE LAKE IDLE (태 연못 대기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Creates Tae idle animation with breathing and subtle knee bounce\n * NO pelvis position movement - only breathing and knee flex\n */\nfunction createTaeIdleAnimation(): SkeletalAnimation {\n const pose = TAE_FLUID_GUARD_POSE;\n const { min, max } = pose.breathingRange;\n const duration = BREATHING_DURATIONS.TAE;\n const amplitude = WEIGHT_SHIFT_AMPLITUDES.TAE;\n const frames = STANCE_GUARD_CONFIGS.tae.breathingFrames;\n\n const builder = MartialArtsAnimationBuilder.create(\n \"stance_tae\",\n \"태 대기\",\n ).asIdle(duration, true);\n\n for (let i = 0; i <= frames; i++) {\n const phase = i / frames;\n const frameTime = phase * duration;\n const breathingScale = calculateBreathingScale(phase, min, max);\n const breathingOffset = calculateTorsoBreathingOffset(breathingScale);\n const kneeBounce = calculateKneeBounce(phase, amplitude);\n\n const kf = builder.at(frameTime);\n applyGuardPoseToKeyframe(kf, pose, breathingOffset, kneeBounce);\n kf.done<MartialArtsAnimationBuilder>();\n }\n\n return builder.build();\n}\n\n/**\n * ☱ 태 (Tae) Lake Idle Animation\n *\n * Fluid mid-guard stance with flowing breath rhythm.\n * Lead hand ready for parrying, rear protects chin.\n *\n * **Breathing**: Flowing waves (2.8s cycle)\n * **Weight**: Circular flowing shifts\n * **Philosophy**: Lake's adaptability, fluid technique\n *\n * @korean 태연못대기애니메이션\n */\nexport const TAE_IDLE_ANIMATION: SkeletalAnimation = createTaeIdleAnimation();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☲ LI FIRE IDLE (리 불 대기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Creates Li idle animation with breathing and subtle knee bounce\n * NO pelvis position movement - only breathing and knee flex\n */\nfunction createLiIdleAnimation(): SkeletalAnimation {\n const pose = LI_FIRE_GUARD_POSE;\n const { min, max } = pose.breathingRange;\n const duration = BREATHING_DURATIONS.LI;\n const amplitude = WEIGHT_SHIFT_AMPLITUDES.LI;\n const frames = STANCE_GUARD_CONFIGS.li.breathingFrames;\n\n const builder = MartialArtsAnimationBuilder.create(\n \"stance_li\",\n \"리 대기\",\n ).asIdle(duration, true);\n\n for (let i = 0; i <= frames; i++) {\n const phase = i / frames;\n const frameTime = phase * duration;\n const breathingScale = calculateBreathingScale(phase, min, max);\n const breathingOffset = calculateTorsoBreathingOffset(breathingScale);\n const kneeBounce = calculateKneeBounce(phase, amplitude);\n\n const kf = builder.at(frameTime);\n applyGuardPoseToKeyframe(kf, pose, breathingOffset, kneeBounce);\n kf.done<MartialArtsAnimationBuilder>();\n }\n\n return builder.build();\n}\n\n/**\n * ☲ 리 (Li) Fire Idle Animation\n *\n * Aggressive peekaboo guard with sharp controlled breathing.\n * Both hands high protecting face for precision striking.\n *\n * **Breathing**: Sharp controlled (1.8s cycle)\n * **Weight**: Minimal movement for precision\n * **Philosophy**: Fire's precision, vital point targeting\n *\n * @korean 리불대기애니메이션\n */\nexport const LI_IDLE_ANIMATION: SkeletalAnimation = createLiIdleAnimation();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☳ JIN THUNDER IDLE (진 천둥 대기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Creates Jin idle animation with breathing and subtle knee bounce\n * NO pelvis position movement - only breathing and knee flex\n */\nfunction createJinIdleAnimation(): SkeletalAnimation {\n const pose = JIN_THUNDER_GUARD_POSE;\n const { min, max } = pose.breathingRange;\n const duration = BREATHING_DURATIONS.JIN;\n const amplitude = WEIGHT_SHIFT_AMPLITUDES.JIN;\n const frames = STANCE_GUARD_CONFIGS.jin.breathingFrames;\n\n const builder = MartialArtsAnimationBuilder.create(\n \"stance_jin\",\n \"진 대기\",\n ).asIdle(duration, true);\n\n for (let i = 0; i <= frames; i++) {\n const phase = i / frames;\n const frameTime = phase * duration;\n const breathingScale = calculateBreathingScale(phase, min, max);\n const breathingOffset = calculateTorsoBreathingOffset(breathingScale);\n // Jin uses slightly larger bounce (coiled spring ready)\n const kneeBounce = calculateKneeBounce(phase, amplitude);\n\n const kf = builder.at(frameTime);\n applyGuardPoseToKeyframe(kf, pose, breathingOffset, kneeBounce);\n kf.done<MartialArtsAnimationBuilder>();\n }\n\n return builder.build();\n}\n\n/**\n * ☳ 진 (Jin) Thunder Idle Animation\n *\n * Chambered explosive stance with deep power breathing.\n * Fists at ribs, coiled spring ready for explosive release.\n *\n * **Breathing**: Deep coiled power (2.2s cycle)\n * **Weight**: Back-loaded with subtle forward pulse\n * **Philosophy**: Thunder's explosive force, shocking power\n *\n * @korean 진천둥대기애니메이션\n */\nexport const JIN_IDLE_ANIMATION: SkeletalAnimation = createJinIdleAnimation();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☴ SON WIND IDLE (손 바람 대기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Creates Son idle animation with breathing and subtle knee bounce\n * NO pelvis position movement - only breathing and knee flex\n */\nfunction createSonIdleAnimation(): SkeletalAnimation {\n const pose = SON_WIND_GUARD_POSE;\n const { min, max } = pose.breathingRange;\n const duration = BREATHING_DURATIONS.SON;\n const amplitude = WEIGHT_SHIFT_AMPLITUDES.SON;\n const frames = STANCE_GUARD_CONFIGS.son.breathingFrames;\n\n const builder = MartialArtsAnimationBuilder.create(\n \"stance_son\",\n \"손 대기\",\n ).asIdle(duration, true);\n\n for (let i = 0; i <= frames; i++) {\n const phase = i / frames;\n const frameTime = phase * duration;\n const breathingScale = calculateBreathingScale(phase, min, max);\n const breathingOffset = calculateTorsoBreathingOffset(breathingScale);\n const kneeBounce = calculateKneeBounce(phase, amplitude);\n\n const kf = builder.at(frameTime);\n applyGuardPoseToKeyframe(kf, pose, breathingOffset, kneeBounce);\n kf.done<MartialArtsAnimationBuilder>();\n }\n\n return builder.build();\n}\n\n/**\n * ☴ 손 (Son) Wind Idle Animation\n *\n * Staggered flowing guard with rhythmic continuous breathing.\n * Lead hand extended, rear at chin for combo readiness.\n *\n * **Breathing**: Rhythmic flowing (2.0s cycle)\n * **Weight**: Lateral rhythmic shifts for mobility\n * **Philosophy**: Wind's continuous pressure, flowing attack\n *\n * @korean 손바람대기애니메이션\n */\nexport const SON_IDLE_ANIMATION: SkeletalAnimation = createSonIdleAnimation();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☵ GAM WATER IDLE (감 물 대기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Creates Gam idle animation with breathing and subtle knee bounce\n * NO pelvis position movement - only breathing and knee flex\n */\nfunction createGamIdleAnimation(): SkeletalAnimation {\n const pose = GAM_WATER_GUARD_POSE;\n const { min, max } = pose.breathingRange;\n const duration = BREATHING_DURATIONS.GAM;\n const amplitude = WEIGHT_SHIFT_AMPLITUDES.GAM;\n const frames = STANCE_GUARD_CONFIGS.gam.breathingFrames;\n\n const builder = MartialArtsAnimationBuilder.create(\n \"stance_gam\",\n \"감 대기\",\n ).asIdle(duration, true);\n\n for (let i = 0; i <= frames; i++) {\n const phase = i / frames;\n const frameTime = phase * duration;\n const breathingScale = calculateBreathingScale(phase, min, max);\n const breathingOffset = calculateTorsoBreathingOffset(breathingScale);\n const kneeBounce = calculateKneeBounce(phase, amplitude);\n\n const kf = builder.at(frameTime);\n applyGuardPoseToKeyframe(kf, pose, breathingOffset, kneeBounce);\n kf.done<MartialArtsAnimationBuilder>();\n }\n\n return builder.build();\n}\n\n/**\n * ☵ 감 (Gam) Water Idle Animation\n *\n * Mid-level parrying guard with deep flowing breathing.\n * Hands ready at solar plexus for redirecting and countering.\n *\n * **Breathing**: Deep flowing diaphragm (3.0s cycle)\n * **Weight**: Circular flowing adaptation\n * **Philosophy**: Water's adaptation, flow-into-counter\n *\n * @korean 감물대기애니메이션\n */\nexport const GAM_IDLE_ANIMATION: SkeletalAnimation = createGamIdleAnimation();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☶ GAN MOUNTAIN IDLE (간 산 대기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Creates Gan idle animation with breathing and subtle knee bounce\n * NO pelvis position movement - only breathing and knee flex\n */\nfunction createGanIdleAnimation(): SkeletalAnimation {\n const pose = GAN_MOUNTAIN_GUARD_POSE;\n const { min, max } = pose.breathingRange;\n const duration = BREATHING_DURATIONS.GAN;\n const amplitude = WEIGHT_SHIFT_AMPLITUDES.GAN;\n const frames = STANCE_GUARD_CONFIGS.gan.breathingFrames;\n\n const builder = MartialArtsAnimationBuilder.create(\n \"stance_gan\",\n \"간 대기\",\n ).asIdle(duration, true);\n\n for (let i = 0; i <= frames; i++) {\n const phase = i / frames;\n const frameTime = phase * duration;\n const breathingScale = calculateBreathingScale(phase, min, max);\n const breathingOffset = calculateTorsoBreathingOffset(breathingScale);\n // Gan uses minimal bounce (mountain stability)\n const kneeBounce = calculateKneeBounce(phase, amplitude);\n\n const kf = builder.at(frameTime);\n applyGuardPoseToKeyframe(kf, pose, breathingOffset, kneeBounce);\n kf.done<MartialArtsAnimationBuilder>();\n }\n\n return builder.build();\n}\n\n/**\n * ☶ 간 (Gan) Mountain Idle Animation\n *\n * High cover defensive guard with steady controlled breathing.\n * Forearms crossed protecting face, immovable stance.\n *\n * **Breathing**: Steady minimal (2.6s cycle)\n * **Weight**: Minimal - mountain solid\n * **Philosophy**: Mountain's immovability, defensive mastery\n *\n * @korean 간산대기애니메이션\n */\nexport const GAN_IDLE_ANIMATION: SkeletalAnimation = createGanIdleAnimation();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☷ GON EARTH IDLE (곤 땅 대기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Creates Gon idle animation with breathing and subtle knee bounce\n * NO pelvis position movement - only breathing and knee flex\n */\nfunction createGonIdleAnimation(): SkeletalAnimation {\n const pose = GON_EARTH_GUARD_POSE;\n const { min, max } = pose.breathingRange;\n const duration = BREATHING_DURATIONS.GON;\n const amplitude = WEIGHT_SHIFT_AMPLITUDES.GON;\n const frames = STANCE_GUARD_CONFIGS.gon.breathingFrames;\n\n const builder = MartialArtsAnimationBuilder.create(\n \"stance_gon\",\n \"곤 대기\",\n ).asIdle(duration, true);\n\n for (let i = 0; i <= frames; i++) {\n const phase = i / frames;\n const frameTime = phase * duration;\n const breathingScale = calculateBreathingScale(phase, min, max);\n const breathingOffset = calculateTorsoBreathingOffset(breathingScale);\n // Gon uses grounded knee bounce (wrestling ready)\n const kneeBounce = calculateKneeBounce(phase, amplitude);\n\n const kf = builder.at(frameTime);\n applyGuardPoseToKeyframe(kf, pose, breathingOffset, kneeBounce);\n kf.done<MartialArtsAnimationBuilder>();\n }\n\n return builder.build();\n}\n\n/**\n * ☷ 곤 (Gon) Earth Idle Animation\n *\n * Low underhook wrestling guard with grounded breathing.\n * Hands at hip level, elbows protecting ribs for ground control.\n *\n * **Breathing**: Deep diaphragm (2.6s cycle)\n * **Weight**: Grounded subtle shifts\n * **Philosophy**: Earth's stability, grounding and takedowns\n *\n * @korean 곤땅대기애니메이션\n */\nexport const GON_IDLE_ANIMATION: SkeletalAnimation = createGonIdleAnimation();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// TRIGRAM IDLE ANIMATION MAP (팔괘대기애니메이션맵)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Map of all 8 trigram stance idle animations\n *\n * Use this map for efficient lookup of stance-specific idle animations.\n * Each animation includes proper guard position, breathing, and weight shifts.\n *\n * @korean 팔괘대기애니메이션맵\n */\nexport const TRIGRAM_IDLE_ANIMATIONS: ReadonlyMap<\n TrigramStance,\n SkeletalAnimation\n> = new Map([\n [TrigramStance.GEON, GEON_IDLE_ANIMATION],\n [TrigramStance.TAE, TAE_IDLE_ANIMATION],\n [TrigramStance.LI, LI_IDLE_ANIMATION],\n [TrigramStance.JIN, JIN_IDLE_ANIMATION],\n [TrigramStance.SON, SON_IDLE_ANIMATION],\n [TrigramStance.GAM, GAM_IDLE_ANIMATION],\n [TrigramStance.GAN, GAN_IDLE_ANIMATION],\n [TrigramStance.GON, GON_IDLE_ANIMATION],\n]);\n\n/**\n * Map of all 8 trigram stance idle animations by string name\n *\n * This map provides string-keyed access to idle animations for registry integration.\n * Animation names match the pattern \"stance_X\" used in useSkeletalAnimation.\n *\n * @korean 팔괘대기애니메이션문자열맵\n */\nexport const TRIGRAM_IDLE_ANIMATIONS_BY_NAME: ReadonlyMap<\n string,\n SkeletalAnimation\n> = new Map([\n [\"stance_geon\", GEON_IDLE_ANIMATION],\n [\"stance_tae\", TAE_IDLE_ANIMATION],\n [\"stance_li\", LI_IDLE_ANIMATION],\n [\"stance_jin\", JIN_IDLE_ANIMATION],\n [\"stance_son\", SON_IDLE_ANIMATION],\n [\"stance_gam\", GAM_IDLE_ANIMATION],\n [\"stance_gan\", GAN_IDLE_ANIMATION],\n [\"stance_gon\", GON_IDLE_ANIMATION],\n]);\n\n/**\n * Get idle animation for a specific trigram stance\n *\n * @param stance - Trigram stance identifier\n * @returns Stance-specific idle animation with breathing and weight shifts\n *\n * @example\n * ```typescript\n * const geonIdle = getTrigramIdleAnimation(TrigramStance.GEON);\n * // Returns GEON_IDLE_ANIMATION with high guard, forward breathing\n *\n * const gamIdle = getTrigramIdleAnimation(TrigramStance.GAM);\n * // Returns GAM_IDLE_ANIMATION with flowing parry guard\n * ```\n *\n * @korean 팔괘대기애니메이션가져오기\n */\nexport function getTrigramIdleAnimation(\n stance: TrigramStance,\n): SkeletalAnimation | undefined {\n return TRIGRAM_IDLE_ANIMATIONS.get(stance);\n}\n\n/**\n * Get idle animation by stance name string\n *\n * Convenient accessor for string-based stance lookups.\n *\n * @param stanceName - Stance name (e.g., \"geon\", \"tae\", \"li\")\n * @returns Stance-specific idle animation or undefined\n *\n * @korean 문자열로대기애니메이션가져오기\n */\nexport function getTrigramIdleByName(\n stanceName: string,\n): SkeletalAnimation | undefined {\n const normalizedName = stanceName.toLowerCase();\n\n for (const [stance, animation] of TRIGRAM_IDLE_ANIMATIONS) {\n if (stance === normalizedName) {\n return animation;\n }\n }\n\n return undefined;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ANIMATION COLLECTION (애니메이션모음)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Array of all trigram idle animations for iteration\n *\n * @korean 모든팔괘대기애니메이션\n */\nexport const ALL_TRIGRAM_IDLE_ANIMATIONS: readonly SkeletalAnimation[] = [\n GEON_IDLE_ANIMATION,\n TAE_IDLE_ANIMATION,\n LI_IDLE_ANIMATION,\n JIN_IDLE_ANIMATION,\n SON_IDLE_ANIMATION,\n GAM_IDLE_ANIMATION,\n GAN_IDLE_ANIMATION,\n GON_IDLE_ANIMATION,\n];\n\n/**\n * Idle animation metadata for debugging and introspection\n *\n * @korean 대기애니메이션메타데이터\n */\nexport const TRIGRAM_IDLE_METADATA = {\n GEON: {\n name: \"stance_geon\",\n korean: \"건 대기\",\n english: \"Heaven Idle\",\n breathingDuration: BREATHING_DURATIONS.GEON,\n weightShiftType: \"forward\" as const,\n philosophy: \"Creative force, direct power\",\n },\n TAE: {\n name: \"stance_tae\",\n korean: \"태 대기\",\n english: \"Lake Idle\",\n breathingDuration: BREATHING_DURATIONS.TAE,\n weightShiftType: \"circular\" as const,\n philosophy: \"Adaptability, fluid technique\",\n },\n LI: {\n name: \"stance_li\",\n korean: \"리 대기\",\n english: \"Fire Idle\",\n breathingDuration: BREATHING_DURATIONS.LI,\n weightShiftType: \"lateral\" as const,\n philosophy: \"Precision, vital point targeting\",\n },\n JIN: {\n name: \"stance_jin\",\n korean: \"진 대기\",\n english: \"Thunder Idle\",\n breathingDuration: BREATHING_DURATIONS.JIN,\n weightShiftType: \"forward\" as const,\n philosophy: \"Explosive force, shocking power\",\n },\n SON: {\n name: \"stance_son\",\n korean: \"손 대기\",\n english: \"Wind Idle\",\n breathingDuration: BREATHING_DURATIONS.SON,\n weightShiftType: \"lateral\" as const,\n philosophy: \"Continuous pressure, flowing attack\",\n },\n GAM: {\n name: \"stance_gam\",\n korean: \"감 대기\",\n english: \"Water Idle\",\n breathingDuration: BREATHING_DURATIONS.GAM,\n weightShiftType: \"circular\" as const,\n philosophy: \"Adaptation, flow-into-counter\",\n },\n GAN: {\n name: \"stance_gan\",\n korean: \"간 대기\",\n english: \"Mountain Idle\",\n breathingDuration: BREATHING_DURATIONS.GAN,\n weightShiftType: \"lateral\" as const,\n philosophy: \"Immovability, defensive mastery\",\n },\n GON: {\n name: \"stance_gon\",\n korean: \"곤 대기\",\n english: \"Earth Idle\",\n breathingDuration: BREATHING_DURATIONS.GON,\n weightShiftType: \"forward\" as const,\n philosophy: \"Stability, grounding and takedowns\",\n },\n} as const;\n"],"mappings":"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"}
1
+ {"version":3,"file":"StanceIdleAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/StanceIdleAnimations.ts"],"sourcesContent":["/**\n * Trigram Stance Idle Animations - Enhanced Breathing & Weight Shift System\n *\n * Defines complete idle animations for all 8 trigram stances (팔괘) with:\n * - Multi-keyframe breathing cycles (4-6 frames per stance)\n * - Subtle weight shifts for natural movement\n * - Stance-specific rhythms reflecting martial philosophy\n * - Proper guard positions from StanceGuardPoses\n *\n * Each trigram idle is the starting point for all techniques in that stance.\n * The breathing and weight shifts reflect the elemental nature:\n * - ☰ 건 (Heaven): Powerful, expansive chest breathing\n * - ☱ 태 (Lake): Fluid, rippling breath flow\n * - ☲ 리 (Fire): Sharp, controlled precision breathing\n * - ☳ 진 (Thunder): Deep coiled power breathing\n * - ☴ 손 (Wind): Rhythmic continuous flow\n * - ☵ 감 (Water): Deep flowing diaphragm breathing\n * - ☶ 간 (Mountain): Minimal steady breathing\n * - ☷ 곤 (Earth): Deep grounded diaphragm breathing\n *\n * @module systems/animation/catalogs/StanceIdleAnimations\n * @category Animation System\n * @korean 팔괘자세대기애니메이션\n */\n\nimport { TrigramStance } from \"@/types/common\";\nimport type { SkeletalAnimation, StanceGuardPose } from \"@/types/skeletal\";\nimport { BoneName } from \"@/types/skeletal\";\nimport type { KeyframeConfig } from \"../builders/KeyframeConfig\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\nimport {\n GAM_WATER_GUARD_POSE,\n GAN_MOUNTAIN_GUARD_POSE,\n GEON_HIGH_GUARD_POSE,\n GON_EARTH_GUARD_POSE,\n JIN_THUNDER_GUARD_POSE,\n LI_FIRE_GUARD_POSE,\n SON_WIND_GUARD_POSE,\n STANCE_GUARD_CONFIGS,\n TAE_FLUID_GUARD_POSE,\n} from \"./StanceGuardPoses\";\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ANIMATION TIMING CONSTANTS (애니메이션 타이밍 상수)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Breathing cycle durations per stance (in seconds)\n * Each stance has characteristic breathing rhythm\n *\n * @korean 호흡주기지속시간\n */\nconst BREATHING_DURATIONS = {\n GEON: 2.4, // Powerful slow breathing\n TAE: 2.8, // Fluid flowing breath\n LI: 1.8, // Sharp controlled breathing\n JIN: 2.2, // Explosive ready breath\n SON: 2.0, // Rhythmic continuous flow\n GAM: 3.0, // Deep flowing breath\n GAN: 2.6, // Steady controlled breath\n GON: 2.6, // Grounded diaphragm breath\n} as const;\n\n/**\n * Weight shift amplitudes per stance (percentage of base)\n * Reflects stability vs. mobility of each stance\n * RESTORED to original values for better visual feedback and natural movement\n *\n * @korean 체중이동진폭\n */\nconst WEIGHT_SHIFT_AMPLITUDES = {\n GEON: 0.04, // Visible forward rocking - mobile power stance (파워 흔들림)\n TAE: 0.05, // Fluid flowing shifts clearly visible (유동적 흐름)\n LI: 0.02, // Small but visible - precision stance (정밀 제어)\n JIN: 0.06, // Large coiled spring bounce (폭발적 준비)\n SON: 0.045, // Rhythmic lateral shifts (연속 흐름)\n GAM: 0.055, // Flowing water adaptation (물 흐름)\n GAN: 0.015, // Minimal - mountain solid (산악 안정)\n GON: 0.03, // Grounded but visible shifts (대지 흔들림)\n} as const;\n\n// ═══════════════════════════════════════════════════════════════════════════\n// BREATHING ANIMATION HELPERS (호흡 애니메이션 헬퍼)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Calculates breathing scale at a given phase\n *\n * @param phase - Breathing phase (0-1, where 0.5 is peak inhale)\n * @param min - Minimum scale (exhale)\n * @param max - Maximum scale (inhale peak)\n * @returns Scale factor for chest/torso\n */\nfunction calculateBreathingScale(\n phase: number,\n min: number,\n max: number,\n): number {\n // Use cosine-based wave for natural breathing rhythm\n // Phase 0 = peak inhale, 0.5 = peak exhale\n const breathPhase = Math.cos(phase * Math.PI * 2);\n const amplitude = (max - min) / 2;\n const center = (max + min) / 2;\n return center + breathPhase * amplitude;\n}\n\n/**\n * Calculates torso expansion for breathing effect\n *\n * @param breathingScale - Current breathing scale (0.96-1.04)\n * @returns Torso rotation adjustment for breathing\n */\nfunction calculateTorsoBreathingOffset(breathingScale: number): number {\n // Chest expands forward more visibly on inhale\n // Multiplier 1.5 for clearly visible breathing (가슴 확장 시각화)\n return (breathingScale - 1) * 1.5;\n}\n\n/**\n * Calculates subtle knee bounce offset at a given phase\n *\n * DESIGN: Idle animations should have visible knee bounce for natural movement feel\n * - no pelvis position movement which creates a \"walking in place\" appearance.\n *\n * @param phase - Breathing/bounce phase (0-1)\n * @param amplitude - Maximum bounce amount (knee bend adjustment)\n * @returns Knee rotation adjustment for natural bounce\n */\nfunction calculateKneeBounce(phase: number, amplitude: number): number {\n // Visible knee flex synchronized with breathing for natural alive feel\n // Two bounces per breath cycle (one per inhale/exhale)\n // 호흡과 동기화된 무릎 굽힘으로 자연스러운 움직임\n const bouncePhase = Math.sin(phase * Math.PI * 4);\n return bouncePhase * amplitude * 0.5;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// GUARD POSE APPLICATION HELPERS (방어자세적용헬퍼)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Applies a complete guard pose to a KeyframeConfig with breathing and knee bounce\n *\n * DESIGN: Idle animations should only have:\n * - Chest breathing (torso expansion)\n * - Subtle knee bounce (slight knee flex variation)\n * NO pelvis X/Z position movement (causes \"walking in place\" appearance)\n *\n * @param kf - KeyframeConfig to apply pose to\n * @param pose - Guard pose to apply\n * @param breathingOffset - Torso breathing offset\n * @param kneeBounce - Subtle knee flex adjustment for bounce effect\n */\nfunction applyGuardPoseToKeyframe(\n kf: KeyframeConfig,\n pose: StanceGuardPose,\n breathingOffset: number,\n kneeBounce: number = 0,\n): void {\n // === ARM POSITIONS (팔 위치) ===\n // IMPORTANT: Use SHOULDER_L/R, ELBOW_L/R, WRIST_L/R bone names\n // NOT UPPER_ARM, FOREARM, HAND - those are different bones in the hierarchy!\n\n // Left arm - shoulder controls arm lift/rotation\n kf.rotate(\n BoneName.SHOULDER_L,\n pose.leftArm.shoulder.x,\n pose.leftArm.shoulder.y,\n pose.leftArm.shoulder.z,\n );\n // Elbow controls forearm bend\n kf.rotate(\n BoneName.ELBOW_L,\n pose.leftArm.elbow.x,\n pose.leftArm.elbow.y,\n pose.leftArm.elbow.z,\n );\n // Wrist controls hand rotation\n kf.rotate(\n BoneName.WRIST_L,\n pose.leftArm.wrist.x,\n pose.leftArm.wrist.y,\n pose.leftArm.wrist.z,\n );\n\n // Right arm - mirror bone hierarchy\n kf.rotate(\n BoneName.SHOULDER_R,\n pose.rightArm.shoulder.x,\n pose.rightArm.shoulder.y,\n pose.rightArm.shoulder.z,\n );\n kf.rotate(\n BoneName.ELBOW_R,\n pose.rightArm.elbow.x,\n pose.rightArm.elbow.y,\n pose.rightArm.elbow.z,\n );\n kf.rotate(\n BoneName.WRIST_R,\n pose.rightArm.wrist.x,\n pose.rightArm.wrist.y,\n pose.rightArm.wrist.z,\n );\n\n // === TORSO (몸통) - Full spine chain for proper rotation ===\n // SPINE_LOWER: Base torso twist (inherits from pelvis)\n kf.rotate(\n BoneName.SPINE_LOWER,\n pose.torso.x * 0.3,\n pose.torso.y * 0.4,\n pose.torso.z * 0.3,\n );\n // SPINE_MIDDLE: Mid-torso twist\n kf.rotate(\n BoneName.SPINE_MIDDLE,\n pose.torso.x * 0.3,\n pose.torso.y * 0.3,\n pose.torso.z * 0.3,\n );\n // SPINE_UPPER: Upper chest with breathing - gets most of the rotation\n kf.rotate(\n BoneName.SPINE_UPPER,\n pose.torso.x * 0.4 + breathingOffset,\n pose.torso.y * 0.3,\n pose.torso.z * 0.4,\n );\n\n // === LEG POSITIONS (다리 위치) ===\n // IMPORTANT: Use HIP_L/R for hip rotation, not THIGH!\n // HIP bone controls the leg's root rotation\n\n // Left leg - HIP controls leg lift/rotation at socket\n kf.rotate(\n BoneName.HIP_L,\n pose.leftLeg.hip.x,\n pose.leftLeg.hip.y,\n pose.leftLeg.hip.z,\n );\n // KNEE controls lower leg bend (primarily X axis flex)\n // Add subtle knee bounce for natural idle movement\n kf.rotate(\n BoneName.KNEE_L,\n pose.leftLeg.knee.x + kneeBounce,\n pose.leftLeg.knee.y,\n pose.leftLeg.knee.z,\n );\n // FOOT controls ankle rotation\n kf.rotate(\n BoneName.FOOT_L,\n pose.leftLeg.ankle.x,\n pose.leftLeg.ankle.y,\n pose.leftLeg.ankle.z,\n );\n\n // Right leg - mirror bone hierarchy\n kf.rotate(\n BoneName.HIP_R,\n pose.rightLeg.hip.x,\n pose.rightLeg.hip.y,\n pose.rightLeg.hip.z,\n );\n kf.rotate(\n BoneName.KNEE_R,\n pose.rightLeg.knee.x + kneeBounce,\n pose.rightLeg.knee.y,\n pose.rightLeg.knee.z,\n );\n kf.rotate(\n BoneName.FOOT_R,\n pose.rightLeg.ankle.x,\n pose.rightLeg.ankle.y,\n pose.rightLeg.ankle.z,\n );\n\n // === PELVIS (골반) - Root of entire body ===\n // Controls overall body rotation and position\n kf.rotate(BoneName.PELVIS, pose.pelvis.x, pose.pelvis.y, pose.pelvis.z);\n // Pelvis position: ONLY stance height drop (Y)\n // NO X/Z offset - this prevents \"walking in place\" appearance\n const pelvisHeight = pose.pelvisHeight ?? 0;\n kf.position(BoneName.PELVIS, 0, pelvisHeight, 0);\n\n // === FOOT POSITIONING (발 위치) ===\n // Position feet for stance width and depth\n const stanceDepth = pose.stanceDepth ?? 0;\n // Left foot: negative X (left side), negative Z (front for forward stances)\n kf.position(BoneName.FOOT_L, -pose.stanceWidth / 2, 0, -stanceDepth / 2);\n // Right foot: positive X (right side), positive Z (back for forward stances)\n kf.position(BoneName.FOOT_R, pose.stanceWidth / 2, 0, stanceDepth / 2);\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☰ GEON HEAVEN IDLE (건 하늘 대기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Creates Geon idle animation with breathing and subtle knee bounce\n * NO pelvis position movement - only breathing and knee flex\n */\nfunction createGeonIdleAnimation(): SkeletalAnimation {\n const pose = GEON_HIGH_GUARD_POSE;\n const { min, max } = pose.breathingRange;\n const duration = BREATHING_DURATIONS.GEON;\n const amplitude = WEIGHT_SHIFT_AMPLITUDES.GEON;\n const frames = STANCE_GUARD_CONFIGS.geon.breathingFrames;\n\n const builder = MartialArtsAnimationBuilder.create(\n \"stance_geon\",\n \"건 대기\",\n ).asIdle(duration, true);\n\n // Generate keyframes with breathing and subtle knee bounce\n for (let i = 0; i <= frames; i++) {\n const phase = i / frames;\n const frameTime = phase * duration;\n const breathingScale = calculateBreathingScale(phase, min, max);\n const breathingOffset = calculateTorsoBreathingOffset(breathingScale);\n const kneeBounce = calculateKneeBounce(phase, amplitude);\n\n const kf = builder.at(frameTime);\n applyGuardPoseToKeyframe(kf, pose, breathingOffset, kneeBounce);\n kf.done<MartialArtsAnimationBuilder>();\n }\n\n return builder.build();\n}\n\n/**\n * ☰ 건 (Geon) Heaven Idle Animation\n *\n * Powerful high guard stance with expansive chest breathing.\n * Boxing-style guard protecting chin and temples.\n *\n * **Breathing**: Slow powerful expansion (2.4s cycle)\n * **Weight**: Subtle forward shift for aggression\n * **Philosophy**: Heaven's creative force, direct power\n *\n * @korean 건하늘대기애니메이션\n */\nexport const GEON_IDLE_ANIMATION: SkeletalAnimation = createGeonIdleAnimation();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☱ TAE LAKE IDLE (태 연못 대기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Creates Tae idle animation with breathing and subtle knee bounce\n * NO pelvis position movement - only breathing and knee flex\n */\nfunction createTaeIdleAnimation(): SkeletalAnimation {\n const pose = TAE_FLUID_GUARD_POSE;\n const { min, max } = pose.breathingRange;\n const duration = BREATHING_DURATIONS.TAE;\n const amplitude = WEIGHT_SHIFT_AMPLITUDES.TAE;\n const frames = STANCE_GUARD_CONFIGS.tae.breathingFrames;\n\n const builder = MartialArtsAnimationBuilder.create(\n \"stance_tae\",\n \"태 대기\",\n ).asIdle(duration, true);\n\n for (let i = 0; i <= frames; i++) {\n const phase = i / frames;\n const frameTime = phase * duration;\n const breathingScale = calculateBreathingScale(phase, min, max);\n const breathingOffset = calculateTorsoBreathingOffset(breathingScale);\n const kneeBounce = calculateKneeBounce(phase, amplitude);\n\n const kf = builder.at(frameTime);\n applyGuardPoseToKeyframe(kf, pose, breathingOffset, kneeBounce);\n kf.done<MartialArtsAnimationBuilder>();\n }\n\n return builder.build();\n}\n\n/**\n * ☱ 태 (Tae) Lake Idle Animation\n *\n * Fluid mid-guard stance with flowing breath rhythm.\n * Lead hand ready for parrying, rear protects chin.\n *\n * **Breathing**: Flowing waves (2.8s cycle)\n * **Weight**: Circular flowing shifts\n * **Philosophy**: Lake's adaptability, fluid technique\n *\n * @korean 태연못대기애니메이션\n */\nexport const TAE_IDLE_ANIMATION: SkeletalAnimation = createTaeIdleAnimation();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☲ LI FIRE IDLE (리 불 대기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Creates Li idle animation with breathing and subtle knee bounce\n * NO pelvis position movement - only breathing and knee flex\n */\nfunction createLiIdleAnimation(): SkeletalAnimation {\n const pose = LI_FIRE_GUARD_POSE;\n const { min, max } = pose.breathingRange;\n const duration = BREATHING_DURATIONS.LI;\n const amplitude = WEIGHT_SHIFT_AMPLITUDES.LI;\n const frames = STANCE_GUARD_CONFIGS.li.breathingFrames;\n\n const builder = MartialArtsAnimationBuilder.create(\n \"stance_li\",\n \"리 대기\",\n ).asIdle(duration, true);\n\n for (let i = 0; i <= frames; i++) {\n const phase = i / frames;\n const frameTime = phase * duration;\n const breathingScale = calculateBreathingScale(phase, min, max);\n const breathingOffset = calculateTorsoBreathingOffset(breathingScale);\n const kneeBounce = calculateKneeBounce(phase, amplitude);\n\n const kf = builder.at(frameTime);\n applyGuardPoseToKeyframe(kf, pose, breathingOffset, kneeBounce);\n kf.done<MartialArtsAnimationBuilder>();\n }\n\n return builder.build();\n}\n\n/**\n * ☲ 리 (Li) Fire Idle Animation\n *\n * Aggressive peekaboo guard with sharp controlled breathing.\n * Both hands high protecting face for precision striking.\n *\n * **Breathing**: Sharp controlled (1.8s cycle)\n * **Weight**: Minimal movement for precision\n * **Philosophy**: Fire's precision, vital point targeting\n *\n * @korean 리불대기애니메이션\n */\nexport const LI_IDLE_ANIMATION: SkeletalAnimation = createLiIdleAnimation();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☳ JIN THUNDER IDLE (진 천둥 대기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Creates Jin idle animation with breathing and subtle knee bounce\n * NO pelvis position movement - only breathing and knee flex\n */\nfunction createJinIdleAnimation(): SkeletalAnimation {\n const pose = JIN_THUNDER_GUARD_POSE;\n const { min, max } = pose.breathingRange;\n const duration = BREATHING_DURATIONS.JIN;\n const amplitude = WEIGHT_SHIFT_AMPLITUDES.JIN;\n const frames = STANCE_GUARD_CONFIGS.jin.breathingFrames;\n\n const builder = MartialArtsAnimationBuilder.create(\n \"stance_jin\",\n \"진 대기\",\n ).asIdle(duration, true);\n\n for (let i = 0; i <= frames; i++) {\n const phase = i / frames;\n const frameTime = phase * duration;\n const breathingScale = calculateBreathingScale(phase, min, max);\n const breathingOffset = calculateTorsoBreathingOffset(breathingScale);\n // Jin uses slightly larger bounce (coiled spring ready)\n const kneeBounce = calculateKneeBounce(phase, amplitude);\n\n const kf = builder.at(frameTime);\n applyGuardPoseToKeyframe(kf, pose, breathingOffset, kneeBounce);\n kf.done<MartialArtsAnimationBuilder>();\n }\n\n return builder.build();\n}\n\n/**\n * ☳ 진 (Jin) Thunder Idle Animation\n *\n * Chambered explosive stance with deep power breathing.\n * Fists at ribs, coiled spring ready for explosive release.\n *\n * **Breathing**: Deep coiled power (2.2s cycle)\n * **Weight**: Back-loaded with subtle forward pulse\n * **Philosophy**: Thunder's explosive force, shocking power\n *\n * @korean 진천둥대기애니메이션\n */\nexport const JIN_IDLE_ANIMATION: SkeletalAnimation = createJinIdleAnimation();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☴ SON WIND IDLE (손 바람 대기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Creates Son idle animation with breathing and subtle knee bounce\n * NO pelvis position movement - only breathing and knee flex\n */\nfunction createSonIdleAnimation(): SkeletalAnimation {\n const pose = SON_WIND_GUARD_POSE;\n const { min, max } = pose.breathingRange;\n const duration = BREATHING_DURATIONS.SON;\n const amplitude = WEIGHT_SHIFT_AMPLITUDES.SON;\n const frames = STANCE_GUARD_CONFIGS.son.breathingFrames;\n\n const builder = MartialArtsAnimationBuilder.create(\n \"stance_son\",\n \"손 대기\",\n ).asIdle(duration, true);\n\n for (let i = 0; i <= frames; i++) {\n const phase = i / frames;\n const frameTime = phase * duration;\n const breathingScale = calculateBreathingScale(phase, min, max);\n const breathingOffset = calculateTorsoBreathingOffset(breathingScale);\n const kneeBounce = calculateKneeBounce(phase, amplitude);\n\n const kf = builder.at(frameTime);\n applyGuardPoseToKeyframe(kf, pose, breathingOffset, kneeBounce);\n kf.done<MartialArtsAnimationBuilder>();\n }\n\n return builder.build();\n}\n\n/**\n * ☴ 손 (Son) Wind Idle Animation\n *\n * Staggered flowing guard with rhythmic continuous breathing.\n * Lead hand extended, rear at chin for combo readiness.\n *\n * **Breathing**: Rhythmic flowing (2.0s cycle)\n * **Weight**: Lateral rhythmic shifts for mobility\n * **Philosophy**: Wind's continuous pressure, flowing attack\n *\n * @korean 손바람대기애니메이션\n */\nexport const SON_IDLE_ANIMATION: SkeletalAnimation = createSonIdleAnimation();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☵ GAM WATER IDLE (감 물 대기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Creates Gam idle animation with breathing and subtle knee bounce\n * NO pelvis position movement - only breathing and knee flex\n */\nfunction createGamIdleAnimation(): SkeletalAnimation {\n const pose = GAM_WATER_GUARD_POSE;\n const { min, max } = pose.breathingRange;\n const duration = BREATHING_DURATIONS.GAM;\n const amplitude = WEIGHT_SHIFT_AMPLITUDES.GAM;\n const frames = STANCE_GUARD_CONFIGS.gam.breathingFrames;\n\n const builder = MartialArtsAnimationBuilder.create(\n \"stance_gam\",\n \"감 대기\",\n ).asIdle(duration, true);\n\n for (let i = 0; i <= frames; i++) {\n const phase = i / frames;\n const frameTime = phase * duration;\n const breathingScale = calculateBreathingScale(phase, min, max);\n const breathingOffset = calculateTorsoBreathingOffset(breathingScale);\n const kneeBounce = calculateKneeBounce(phase, amplitude);\n\n const kf = builder.at(frameTime);\n applyGuardPoseToKeyframe(kf, pose, breathingOffset, kneeBounce);\n kf.done<MartialArtsAnimationBuilder>();\n }\n\n return builder.build();\n}\n\n/**\n * ☵ 감 (Gam) Water Idle Animation\n *\n * Mid-level parrying guard with deep flowing breathing.\n * Hands ready at solar plexus for redirecting and countering.\n *\n * **Breathing**: Deep flowing diaphragm (3.0s cycle)\n * **Weight**: Circular flowing adaptation\n * **Philosophy**: Water's adaptation, flow-into-counter\n *\n * @korean 감물대기애니메이션\n */\nexport const GAM_IDLE_ANIMATION: SkeletalAnimation = createGamIdleAnimation();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☶ GAN MOUNTAIN IDLE (간 산 대기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Creates Gan idle animation with breathing and subtle knee bounce\n * NO pelvis position movement - only breathing and knee flex\n */\nfunction createGanIdleAnimation(): SkeletalAnimation {\n const pose = GAN_MOUNTAIN_GUARD_POSE;\n const { min, max } = pose.breathingRange;\n const duration = BREATHING_DURATIONS.GAN;\n const amplitude = WEIGHT_SHIFT_AMPLITUDES.GAN;\n const frames = STANCE_GUARD_CONFIGS.gan.breathingFrames;\n\n const builder = MartialArtsAnimationBuilder.create(\n \"stance_gan\",\n \"간 대기\",\n ).asIdle(duration, true);\n\n for (let i = 0; i <= frames; i++) {\n const phase = i / frames;\n const frameTime = phase * duration;\n const breathingScale = calculateBreathingScale(phase, min, max);\n const breathingOffset = calculateTorsoBreathingOffset(breathingScale);\n // Gan uses minimal bounce (mountain stability)\n const kneeBounce = calculateKneeBounce(phase, amplitude);\n\n const kf = builder.at(frameTime);\n applyGuardPoseToKeyframe(kf, pose, breathingOffset, kneeBounce);\n kf.done<MartialArtsAnimationBuilder>();\n }\n\n return builder.build();\n}\n\n/**\n * ☶ 간 (Gan) Mountain Idle Animation\n *\n * High cover defensive guard with steady controlled breathing.\n * Forearms crossed protecting face, immovable stance.\n *\n * **Breathing**: Steady minimal (2.6s cycle)\n * **Weight**: Minimal - mountain solid\n * **Philosophy**: Mountain's immovability, defensive mastery\n *\n * @korean 간산대기애니메이션\n */\nexport const GAN_IDLE_ANIMATION: SkeletalAnimation = createGanIdleAnimation();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☷ GON EARTH IDLE (곤 땅 대기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Creates Gon idle animation with breathing and subtle knee bounce\n * NO pelvis position movement - only breathing and knee flex\n */\nfunction createGonIdleAnimation(): SkeletalAnimation {\n const pose = GON_EARTH_GUARD_POSE;\n const { min, max } = pose.breathingRange;\n const duration = BREATHING_DURATIONS.GON;\n const amplitude = WEIGHT_SHIFT_AMPLITUDES.GON;\n const frames = STANCE_GUARD_CONFIGS.gon.breathingFrames;\n\n const builder = MartialArtsAnimationBuilder.create(\n \"stance_gon\",\n \"곤 대기\",\n ).asIdle(duration, true);\n\n for (let i = 0; i <= frames; i++) {\n const phase = i / frames;\n const frameTime = phase * duration;\n const breathingScale = calculateBreathingScale(phase, min, max);\n const breathingOffset = calculateTorsoBreathingOffset(breathingScale);\n // Gon uses grounded knee bounce (wrestling ready)\n const kneeBounce = calculateKneeBounce(phase, amplitude);\n\n const kf = builder.at(frameTime);\n applyGuardPoseToKeyframe(kf, pose, breathingOffset, kneeBounce);\n kf.done<MartialArtsAnimationBuilder>();\n }\n\n return builder.build();\n}\n\n/**\n * ☷ 곤 (Gon) Earth Idle Animation\n *\n * Low underhook wrestling guard with grounded breathing.\n * Hands at hip level, elbows protecting ribs for ground control.\n *\n * **Breathing**: Deep diaphragm (2.6s cycle)\n * **Weight**: Grounded subtle shifts\n * **Philosophy**: Earth's stability, grounding and takedowns\n *\n * @korean 곤땅대기애니메이션\n */\nexport const GON_IDLE_ANIMATION: SkeletalAnimation = createGonIdleAnimation();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// TRIGRAM IDLE ANIMATION MAP (팔괘대기애니메이션맵)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Map of all 8 trigram stance idle animations\n *\n * Use this map for efficient lookup of stance-specific idle animations.\n * Each animation includes proper guard position, breathing, and weight shifts.\n *\n * @korean 팔괘대기애니메이션맵\n */\nexport const TRIGRAM_IDLE_ANIMATIONS: ReadonlyMap<\n TrigramStance,\n SkeletalAnimation\n> = new Map([\n [TrigramStance.GEON, GEON_IDLE_ANIMATION],\n [TrigramStance.TAE, TAE_IDLE_ANIMATION],\n [TrigramStance.LI, LI_IDLE_ANIMATION],\n [TrigramStance.JIN, JIN_IDLE_ANIMATION],\n [TrigramStance.SON, SON_IDLE_ANIMATION],\n [TrigramStance.GAM, GAM_IDLE_ANIMATION],\n [TrigramStance.GAN, GAN_IDLE_ANIMATION],\n [TrigramStance.GON, GON_IDLE_ANIMATION],\n]);\n\n/**\n * Map of all 8 trigram stance idle animations by string name\n *\n * This map provides string-keyed access to idle animations for registry integration.\n * Animation names match the pattern \"stance_X\" used in useSkeletalAnimation.\n *\n * @korean 팔괘대기애니메이션문자열맵\n */\nexport const TRIGRAM_IDLE_ANIMATIONS_BY_NAME: ReadonlyMap<\n string,\n SkeletalAnimation\n> = new Map([\n [\"stance_geon\", GEON_IDLE_ANIMATION],\n [\"stance_tae\", TAE_IDLE_ANIMATION],\n [\"stance_li\", LI_IDLE_ANIMATION],\n [\"stance_jin\", JIN_IDLE_ANIMATION],\n [\"stance_son\", SON_IDLE_ANIMATION],\n [\"stance_gam\", GAM_IDLE_ANIMATION],\n [\"stance_gan\", GAN_IDLE_ANIMATION],\n [\"stance_gon\", GON_IDLE_ANIMATION],\n]);\n\n/**\n * Get idle animation for a specific trigram stance\n *\n * @param stance - Trigram stance identifier\n * @returns Stance-specific idle animation with breathing and weight shifts\n *\n * @example\n * ```typescript\n * const geonIdle = getTrigramIdleAnimation(TrigramStance.GEON);\n * // Returns GEON_IDLE_ANIMATION with high guard, forward breathing\n *\n * const gamIdle = getTrigramIdleAnimation(TrigramStance.GAM);\n * // Returns GAM_IDLE_ANIMATION with flowing parry guard\n * ```\n *\n * @korean 팔괘대기애니메이션가져오기\n */\nexport function getTrigramIdleAnimation(\n stance: TrigramStance,\n): SkeletalAnimation | undefined {\n return TRIGRAM_IDLE_ANIMATIONS.get(stance);\n}\n\n/**\n * Get idle animation by stance name string\n *\n * Convenient accessor for string-based stance lookups.\n *\n * @param stanceName - Stance name (e.g., \"geon\", \"tae\", \"li\")\n * @returns Stance-specific idle animation or undefined\n *\n * @korean 문자열로대기애니메이션가져오기\n */\nexport function getTrigramIdleByName(\n stanceName: string,\n): SkeletalAnimation | undefined {\n const normalizedName = stanceName.toLowerCase();\n\n for (const [stance, animation] of TRIGRAM_IDLE_ANIMATIONS) {\n if (stance === normalizedName) {\n return animation;\n }\n }\n\n return undefined;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ANIMATION COLLECTION (애니메이션모음)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Array of all trigram idle animations for iteration\n *\n * @korean 모든팔괘대기애니메이션\n */\nexport const ALL_TRIGRAM_IDLE_ANIMATIONS: readonly SkeletalAnimation[] = [\n GEON_IDLE_ANIMATION,\n TAE_IDLE_ANIMATION,\n LI_IDLE_ANIMATION,\n JIN_IDLE_ANIMATION,\n SON_IDLE_ANIMATION,\n GAM_IDLE_ANIMATION,\n GAN_IDLE_ANIMATION,\n GON_IDLE_ANIMATION,\n];\n\n/**\n * Idle animation metadata for debugging and introspection\n *\n * @korean 대기애니메이션메타데이터\n */\nexport const TRIGRAM_IDLE_METADATA = {\n GEON: {\n name: \"stance_geon\",\n korean: \"건 대기\",\n english: \"Heaven Idle\",\n breathingDuration: BREATHING_DURATIONS.GEON,\n weightShiftType: \"forward\" as const,\n philosophy: \"Creative force, direct power\",\n },\n TAE: {\n name: \"stance_tae\",\n korean: \"태 대기\",\n english: \"Lake Idle\",\n breathingDuration: BREATHING_DURATIONS.TAE,\n weightShiftType: \"circular\" as const,\n philosophy: \"Adaptability, fluid technique\",\n },\n LI: {\n name: \"stance_li\",\n korean: \"리 대기\",\n english: \"Fire Idle\",\n breathingDuration: BREATHING_DURATIONS.LI,\n weightShiftType: \"lateral\" as const,\n philosophy: \"Precision, vital point targeting\",\n },\n JIN: {\n name: \"stance_jin\",\n korean: \"진 대기\",\n english: \"Thunder Idle\",\n breathingDuration: BREATHING_DURATIONS.JIN,\n weightShiftType: \"forward\" as const,\n philosophy: \"Explosive force, shocking power\",\n },\n SON: {\n name: \"stance_son\",\n korean: \"손 대기\",\n english: \"Wind Idle\",\n breathingDuration: BREATHING_DURATIONS.SON,\n weightShiftType: \"lateral\" as const,\n philosophy: \"Continuous pressure, flowing attack\",\n },\n GAM: {\n name: \"stance_gam\",\n korean: \"감 대기\",\n english: \"Water Idle\",\n breathingDuration: BREATHING_DURATIONS.GAM,\n weightShiftType: \"circular\" as const,\n philosophy: \"Adaptation, flow-into-counter\",\n },\n GAN: {\n name: \"stance_gan\",\n korean: \"간 대기\",\n english: \"Mountain Idle\",\n breathingDuration: BREATHING_DURATIONS.GAN,\n weightShiftType: \"lateral\" as const,\n philosophy: \"Immovability, defensive mastery\",\n },\n GON: {\n name: \"stance_gon\",\n korean: \"곤 대기\",\n english: \"Earth Idle\",\n breathingDuration: BREATHING_DURATIONS.GON,\n weightShiftType: \"forward\" as const,\n philosophy: \"Stability, grounding and takedowns\",\n },\n} as const;\n"],"mappings":"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"}