blacktrigram 0.7.68 → 0.7.69

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 (219) hide show
  1. package/lib/App2.js.map +1 -1
  2. package/lib/assets/index.css +987 -987
  3. package/lib/audio/AudioAssetLoader.js.map +1 -1
  4. package/lib/audio/AudioAssetRegistry.js +2 -2
  5. package/lib/audio/AudioAssetRegistry.js.map +1 -1
  6. package/lib/audio/AudioCache.js.map +1 -1
  7. package/lib/audio/AudioManager.js +1 -1
  8. package/lib/audio/AudioManager.js.map +1 -1
  9. package/lib/audio/AudioMonitor.js.map +1 -1
  10. package/lib/audio/AudioPool.js.map +1 -1
  11. package/lib/audio/AudioProvider.js.map +1 -1
  12. package/lib/audio/AudioUtils.js.map +1 -1
  13. package/lib/audio/BoneImpactAudioMap.js.map +1 -1
  14. package/lib/components/screens/combat/CombatScreen3D.js +3 -3
  15. package/lib/components/screens/combat/CombatScreen3D.js.map +1 -1
  16. package/lib/components/screens/combat/components/controls/CombatControlsPanel.js.map +1 -1
  17. package/lib/components/screens/combat/components/controls/PauseMenu.js.map +1 -1
  18. package/lib/components/screens/combat/components/effects/BloodDecals3D.js.map +1 -1
  19. package/lib/components/screens/combat/components/effects/BloodParticles3D.js.map +1 -1
  20. package/lib/components/screens/combat/components/effects/BloodViscosity3D.js.map +1 -1
  21. package/lib/components/screens/combat/components/effects/CombatParticleEffects3D.js.map +1 -1
  22. package/lib/components/screens/combat/components/effects/InternalDamage3D.js.map +1 -1
  23. package/lib/components/screens/combat/components/effects/ParticleAudio3D.js.map +1 -1
  24. package/lib/components/screens/combat/components/hud/FPSMonitor.js.map +1 -1
  25. package/lib/components/screens/combat/components/indicators/BalanceIndicator.js.map +1 -1
  26. package/lib/components/screens/combat/hooks/useAICombat.js.map +1 -1
  27. package/lib/components/screens/combat/hooks/useCombatActions.js.map +1 -1
  28. package/lib/components/screens/combat/hooks/useCombatAttackMovement.js.map +1 -1
  29. package/lib/components/screens/controls/ControlsScreen3D.js.map +1 -1
  30. package/lib/components/screens/controls/components/ControlCategoryTabsOverlayHtml.js.map +1 -1
  31. package/lib/components/screens/endscreen/components/MatchStatisticsDisplayOverlayHtml.js.map +1 -1
  32. package/lib/components/screens/endscreen/components/PerformanceBreakdownOverlayHtml.js.map +1 -1
  33. package/lib/components/screens/endscreen/components/VictoryAnimation3D.js.map +1 -1
  34. package/lib/components/screens/intro/IntroScreen3D.js +1 -1
  35. package/lib/components/screens/intro/IntroScreen3D.js.map +1 -1
  36. package/lib/components/screens/intro/components/AbilityListOverlayHtml.js.map +1 -1
  37. package/lib/components/screens/intro/components/ArchetypeCardGridOverlayHtml.js.map +1 -1
  38. package/lib/components/screens/intro/components/ArchetypeDisplayOverlayHtml.js.map +1 -1
  39. package/lib/components/screens/intro/components/EnhancedArchetypeDisplayOverlayHtml.js.map +1 -1
  40. package/lib/components/screens/intro/components/MenuButtonsOverlayHtml.js.map +1 -1
  41. package/lib/components/screens/intro/components/MenuSectionOverlayHtml.js.map +1 -1
  42. package/lib/components/screens/intro/components/StatBarOverlayHtml.js.map +1 -1
  43. package/lib/components/screens/philosophy/PhilosophyScreen3D.js.map +1 -1
  44. package/lib/components/screens/training/TrainingScreen3D.js +1 -1
  45. package/lib/components/screens/training/TrainingScreen3D.js.map +1 -1
  46. package/lib/components/screens/training/components/AnatomyOverlay3D.js.map +1 -1
  47. package/lib/components/screens/training/components/FootworkDrillsOverlayHtml.js.map +1 -1
  48. package/lib/components/screens/training/components/HitFeedbackEffect3D.js.map +1 -1
  49. package/lib/components/screens/training/components/TrainingButtonsOverlayHtml.js.map +1 -1
  50. package/lib/components/screens/training/components/TrainingDummy3D.js.map +1 -1
  51. package/lib/components/screens/training/components/TrainingModeSelectorOverlayHtml.js.map +1 -1
  52. package/lib/components/screens/training/components/TrainingStatsOverlayHtml.js.map +1 -1
  53. package/lib/components/screens/training/components/VitalPointMarker3D.js.map +1 -1
  54. package/lib/components/screens/training/hooks/useAttackMovement.js.map +1 -1
  55. package/lib/components/screens/training/hooks/useTrainingActions.js.map +1 -1
  56. package/lib/components/shared/mobile/ActionButtons.js.map +1 -1
  57. package/lib/components/shared/mobile/GestureRecognizerPure.js.map +1 -1
  58. package/lib/components/shared/mobile/HapticController.js.map +1 -1
  59. package/lib/components/shared/mobile/StanceWheelPure.js.map +1 -1
  60. package/lib/components/shared/mobile/VirtualDPad.js.map +1 -1
  61. package/lib/components/shared/three/anatomy/BoneAttachedMuscles.js.map +1 -1
  62. package/lib/components/shared/three/anatomy/BoneClothing.js.map +1 -1
  63. package/lib/components/shared/three/anatomy/BoneRenderer.js.map +1 -1
  64. package/lib/components/shared/three/anatomy/Face3D.js.map +1 -1
  65. package/lib/components/shared/three/effects/ActionFeedback.js.map +1 -1
  66. package/lib/components/shared/three/effects/DamageNumbers.js.map +1 -1
  67. package/lib/components/shared/three/effects/HitEffects3D.js.map +1 -1
  68. package/lib/components/shared/three/effects/StanceTransitionEffect.js.map +1 -1
  69. package/lib/components/shared/three/effects/VitalPointMarkers3D.js.map +1 -1
  70. package/lib/components/shared/three/indicators/ElementalColorSystem.js.map +1 -1
  71. package/lib/components/shared/three/indicators/GuardIndicator.js.map +1 -1
  72. package/lib/components/shared/three/scene/CombatArena3D.js.map +1 -1
  73. package/lib/components/shared/three/ui/BodyPartHealthDisplay.js.map +1 -1
  74. package/lib/components/shared/three/ui/CombatReadinessBar.js.map +1 -1
  75. package/lib/components/shared/three/ui/HealthBar.js.map +1 -1
  76. package/lib/components/shared/three/ui/PlayerHUD.js.map +1 -1
  77. package/lib/components/shared/three/ui/SpeedIndicatorHUD.js.map +1 -1
  78. package/lib/components/shared/three/ui/StaminaBar.js.map +1 -1
  79. package/lib/components/shared/three/ui/TechniqueCard.js.map +1 -1
  80. package/lib/components/shared/three/ui/VitalPointOverlayControlsHtml.js.map +1 -1
  81. package/lib/components/shared/ui/SplashScreen.js +2 -2
  82. package/lib/components/shared/ui/VitalPointOverlayControlsPure.js.map +1 -1
  83. package/lib/components/ui/combat/BalanceIndicatorOverlayHtml.js.map +1 -1
  84. package/lib/data/techniques.js.map +1 -1
  85. package/lib/hooks/useCombatTimer.js.map +1 -1
  86. package/lib/hooks/useKeyboardControls.js.map +1 -1
  87. package/lib/hooks/useSkeletalAnimation.js +2 -2
  88. package/lib/hooks/useSkeletalAnimation.js.map +1 -1
  89. package/lib/hooks/useTechniqueSelection.js.map +1 -1
  90. package/lib/hooks/useWebGLContextLossHandler.js.map +1 -1
  91. package/lib/index.js +2 -2
  92. package/lib/systems/CombatSystem.js.map +1 -1
  93. package/lib/systems/EffectCalculator.js.map +1 -1
  94. package/lib/systems/ResponsiveScaling.js.map +1 -1
  95. package/lib/systems/TrigramSystem.js.map +1 -1
  96. package/lib/systems/ai/AIPersonality.js.map +1 -1
  97. package/lib/systems/ai/ArchetypeEnforcer.js.map +1 -1
  98. package/lib/systems/ai/DecisionTree.js.map +1 -1
  99. package/lib/systems/animation/builders/KeyframeConfig.js.map +1 -1
  100. package/lib/systems/animation/builders/KeyframeInterpolation.js.map +1 -1
  101. package/lib/systems/animation/builders/MartialArtsAnimationBuilder.js.map +1 -1
  102. package/lib/systems/animation/builders/SkeletonRig.js +1 -1
  103. package/lib/systems/animation/builders/SkeletonRig.js.map +1 -1
  104. package/lib/systems/animation/catalogs/AttackAnimations.js +1 -1
  105. package/lib/systems/animation/catalogs/AttackAnimations.js.map +1 -1
  106. package/lib/systems/animation/catalogs/BasicAnimations.js +1 -1
  107. package/lib/systems/animation/catalogs/BasicAnimations.js.map +1 -1
  108. package/lib/systems/animation/catalogs/ComboAnimations.js +1 -1
  109. package/lib/systems/animation/catalogs/ComboAnimations.js.map +1 -1
  110. package/lib/systems/animation/catalogs/DarkOpsAnimations.js +1 -1
  111. package/lib/systems/animation/catalogs/DarkOpsAnimations.js.map +1 -1
  112. package/lib/systems/animation/catalogs/DefensiveAnimations.js +2 -11
  113. package/lib/systems/animation/catalogs/DefensiveAnimations.js.map +1 -1
  114. package/lib/systems/animation/catalogs/ElbowKneeAnimations.js +1 -1
  115. package/lib/systems/animation/catalogs/ElbowKneeAnimations.js.map +1 -1
  116. package/lib/systems/animation/catalogs/FootworkSkeletalAnimations.js +1 -1
  117. package/lib/systems/animation/catalogs/FootworkSkeletalAnimations.js.map +1 -1
  118. package/lib/systems/animation/catalogs/GamRedirectionAnimations.js.map +1 -1
  119. package/lib/systems/animation/catalogs/GamStanceAnimations.js.map +1 -1
  120. package/lib/systems/animation/catalogs/GamTechniqueAnimations.js.map +1 -1
  121. package/lib/systems/animation/catalogs/GanStanceAnimations.js +1 -1
  122. package/lib/systems/animation/catalogs/GanStanceAnimations.js.map +1 -1
  123. package/lib/systems/animation/catalogs/GanTechniqueAnimations.js +1 -1
  124. package/lib/systems/animation/catalogs/GanTechniqueAnimations.js.map +1 -1
  125. package/lib/systems/animation/catalogs/GeonStanceAnimations.js +1 -1
  126. package/lib/systems/animation/catalogs/GeonStanceAnimations.js.map +1 -1
  127. package/lib/systems/animation/catalogs/GonTechniqueAnimations.js +1 -1
  128. package/lib/systems/animation/catalogs/GonTechniqueAnimations.js.map +1 -1
  129. package/lib/systems/animation/catalogs/GrapplingAnimations.js +1 -1
  130. package/lib/systems/animation/catalogs/GrapplingAnimations.js.map +1 -1
  131. package/lib/systems/animation/catalogs/JinStanceAnimations.js +1 -1
  132. package/lib/systems/animation/catalogs/JinStanceAnimations.js.map +1 -1
  133. package/lib/systems/animation/catalogs/JinTechniqueAnimations.js +1 -1
  134. package/lib/systems/animation/catalogs/JinTechniqueAnimations.js.map +1 -1
  135. package/lib/systems/animation/catalogs/KickAnimations.js +1 -1
  136. package/lib/systems/animation/catalogs/KickAnimations.js.map +1 -1
  137. package/lib/systems/animation/catalogs/LiStanceAnimations.js +1 -1
  138. package/lib/systems/animation/catalogs/LiStanceAnimations.js.map +1 -1
  139. package/lib/systems/animation/catalogs/LiTechniqueAnimations.js.map +1 -1
  140. package/lib/systems/animation/catalogs/MovementAnimations.js +1 -1
  141. package/lib/systems/animation/catalogs/MovementAnimations.js.map +1 -1
  142. package/lib/systems/animation/catalogs/PunchAnimations.js +1 -1
  143. package/lib/systems/animation/catalogs/PunchAnimations.js.map +1 -1
  144. package/lib/systems/animation/catalogs/SonStanceAnimations.js +1 -1
  145. package/lib/systems/animation/catalogs/SonStanceAnimations.js.map +1 -1
  146. package/lib/systems/animation/catalogs/SonTechniqueAnimations.js +1 -1
  147. package/lib/systems/animation/catalogs/SonTechniqueAnimations.js.map +1 -1
  148. package/lib/systems/animation/catalogs/SpecializedPunchAnimations.js +1 -1
  149. package/lib/systems/animation/catalogs/SpecializedPunchAnimations.js.map +1 -1
  150. package/lib/systems/animation/catalogs/StanceAnimations.js +1 -1
  151. package/lib/systems/animation/catalogs/StanceAnimations.js.map +1 -1
  152. package/lib/systems/animation/catalogs/StanceAttackAnimations.js +215 -272
  153. package/lib/systems/animation/catalogs/StanceAttackAnimations.js.map +1 -1
  154. package/lib/systems/animation/catalogs/StanceIdleAnimations.js +2 -11
  155. package/lib/systems/animation/catalogs/StanceIdleAnimations.js.map +1 -1
  156. package/lib/systems/animation/catalogs/StanceLocomotionAnimations.js +2 -2
  157. package/lib/systems/animation/catalogs/StanceLocomotionAnimations.js.map +1 -1
  158. package/lib/systems/animation/catalogs/StepSkeletalAnimations.js +1 -1
  159. package/lib/systems/animation/catalogs/StepSkeletalAnimations.js.map +1 -1
  160. package/lib/systems/animation/catalogs/TaeJointLockAnimations.js.map +1 -1
  161. package/lib/systems/animation/catalogs/TaeStanceAnimations.js +1 -1
  162. package/lib/systems/animation/catalogs/TaeStanceAnimations.js.map +1 -1
  163. package/lib/systems/animation/core/AnimationOptimizations.js +1 -1
  164. package/lib/systems/animation/core/AnimationOptimizations.js.map +1 -1
  165. package/lib/systems/animation/core/AnimationPriority.js.map +1 -1
  166. package/lib/systems/animation/core/AnimationRegistry.js +11 -209
  167. package/lib/systems/animation/core/AnimationRegistry.js.map +1 -1
  168. package/lib/systems/animation/core/AnimationStateMachine.js +2 -2
  169. package/lib/systems/animation/core/AnimationStateMachine.js.map +1 -1
  170. package/lib/systems/animation/core/TechniqueAnimationMapper.js +1 -1
  171. package/lib/systems/animation/core/TechniqueAnimationMapper.js.map +1 -1
  172. package/lib/systems/animation/core/TechniqueAnimationMapping.js +1 -1
  173. package/lib/systems/animation/core/TechniqueAnimationMapping.js.map +1 -1
  174. package/lib/systems/animation/systems/MuscleActivation.js.map +1 -1
  175. package/lib/systems/bodypart/BodyPartDamageIntegration.js.map +1 -1
  176. package/lib/systems/bodypart/BodyPartHealthSystem.js.map +1 -1
  177. package/lib/systems/bodypart/BodyPartPositionMapping.js.map +1 -1
  178. package/lib/systems/bodypart/InjuryTracker.js.map +1 -1
  179. package/lib/systems/breathing/BreathingDisruptionSystem.js.map +1 -1
  180. package/lib/systems/combat/BalanceSystem.js.map +1 -1
  181. package/lib/systems/combat/BreakingStatusEffects.js.map +1 -1
  182. package/lib/systems/combat/CombatStateSystem.js.map +1 -1
  183. package/lib/systems/combat/GrappleSystem.js.map +1 -1
  184. package/lib/systems/combat/painConsciousnessUtils.js.map +1 -1
  185. package/lib/systems/combat/typeGuards.js.map +1 -1
  186. package/lib/systems/index.js +2 -2
  187. package/lib/systems/movement/integration.js.map +1 -1
  188. package/lib/systems/physics/AttackMovementPhysics.js.map +1 -1
  189. package/lib/systems/physics/CollisionDetection.js +1 -1
  190. package/lib/systems/physics/CollisionDetection.js.map +1 -1
  191. package/lib/systems/physics/KnockbackPhysics.js.map +1 -1
  192. package/lib/systems/physics/MovementPhysics.js.map +1 -1
  193. package/lib/systems/physics/PhysicalReachCalculator.js.map +1 -1
  194. package/lib/systems/physics/SpeedModifierSystem.js.map +1 -1
  195. package/lib/systems/trigram/KoreanTechniques.js.map +1 -1
  196. package/lib/systems/trigram/StanceManager.js.map +1 -1
  197. package/lib/systems/trigram/TransitionCalculator.js.map +1 -1
  198. package/lib/systems/trigram/TrigramCalculator.js.map +1 -1
  199. package/lib/systems/trigram/techniques/TechniqueConfig.js.map +1 -1
  200. package/lib/systems/trigram/techniques/index.js.map +1 -1
  201. package/lib/systems/trigram/types.js.map +1 -1
  202. package/lib/systems/vitalpoint/DamageCalculator.js.map +1 -1
  203. package/lib/systems/vitalpoint/KoreanAnatomy.js.map +1 -1
  204. package/lib/systems/vitalpoint/KoreanVitalPoints.js.map +1 -1
  205. package/lib/systems/vitalpoint/MeridianVitalPointMapping.js.map +1 -1
  206. package/lib/types/constants/designSystem.js.map +1 -1
  207. package/lib/utils/colorHelpers.js.map +1 -1
  208. package/lib/utils/colorUtils.js.map +1 -1
  209. package/lib/utils/controlMapping.js.map +1 -1
  210. package/lib/utils/deviceDetection.js.map +1 -1
  211. package/lib/utils/effectUtils.js.map +1 -1
  212. package/lib/utils/fabricTextures.js.map +1 -1
  213. package/lib/utils/htmlOverlayHelpers.js.map +1 -1
  214. package/lib/utils/performance/PerformanceMonitor.js.map +1 -1
  215. package/lib/utils/performance/PerformanceOverlay3D.js.map +1 -1
  216. package/lib/utils/safeAreaUtils.js.map +1 -1
  217. package/lib/utils/stanceHelpers.js.map +1 -1
  218. package/lib/utils/visualEffects.js.map +1 -1
  219. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"GamRedirectionAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/GamRedirectionAnimations.ts"],"sourcesContent":["import type { SkeletalAnimation } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\n\n// ═══════════════════════════════════════════════════════════════════════════\n// GAM TRIGRAM (감) - WATER: REDIRECTION & FLOW (유수/방향전환)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Flowing River Strike - 유수타격\n *\n * Signature Gam technique that flows like water around defenses.\n * Unlike direct strikes, this follows a curved path to bypass guards.\n *\n * Target: Face/Neck via curved trajectory\n * Principle: Flow (Yu)\n *\n * Phases:\n * 1. Flow Entry (유입): Circular wind-up\n * 2. Curve (곡선): Arcing strike path\n * 3. Impact (타격): Fluid impact\n * 4. Continue (지속): Follow-through like flowing water\n *\n * @korean 유수타격애니메이션\n */\nexport const GAM_FLOWING_RIVER_STRIKE: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"flowing_river_strike\", \"유수타격\")\n .asAttack(0.7)\n .stance()\n .parry(0.2) // Initial defensive flow\n .hookPunch(0.3) // Curved strike execution (using hook primitive for curve)\n .recover(0.2) // Flow back\n .build();\n\n/**\n * Redirection Counter - 방향전환반격\n *\n * Using the opponent's momentum against them.\n * Catching an attack and redirecting it while striking.\n *\n * Principle: Redirection (Banghyang Jeonhwan)\n *\n * @korean 방향전환반격애니메이션\n */\nexport const GAM_REDIRECTION_COUNTER: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"redirection_counter\", \"방향전환반격\")\n .asDefense(0.6)\n .parry(0.15) // Catch/Deflect\n .wristTwist(0.15) // Redirect vector\n .palmStrike(0.15) // Simultaneous counter\n .recover(0.15)\n .build();\n\n/**\n * Tidal Wave Palm - 해일장\n *\n * A heavy, crashing palm strike that mimics a tidal wave.\n * Builds energy from the ground up through a fluid body wave.\n *\n * Target: Chest/Solar Plexus\n * Principle: Heavy Flow (Jungrryu)\n *\n * @korean 해일장애니메이션\n */\nexport const GAM_TIDAL_WAVE_PALM: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"tidal_wave_palm\", \"해일장\")\n .asAttack(0.8)\n .stance()\n .punchWindup(0.25) // Deep gathering like drawing water\n .palmStrike(0.3) // Heavy crashing extension\n .recover(0.25)\n .build();\n\n/**\n * Whirlpool Counter - 소용돌이반격\n *\n * Circular defensive movement that traps the opponent's limb.\n *\n * Principle: Vortex (Soyongdori)\n *\n * @korean 소용돌이반격애니메이션\n */\nexport const GAM_WHIRLPOOL_COUNTER: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"whirlpool_counter\", \"소용돌이반격\")\n .asDefense(0.7)\n .parry(0.15) // Outer deflection\n .wristTwist(0.2) // Circular trap\n .jointLock(0.2) // Lock in the center\n .recover(0.15)\n .build();\n\n/**\n * Flowing Block - 유수막기 (Gam Water-Style Flowing Deflection)\n *\n * Soft blocking technique that absorbs and redirects force like water flowing around a rock.\n * Circular, continuous motion that yields rather than resists.\n *\n * Duration: 450ms (Slower, flowing defensive motion)\n *\n * @korean 유수막기애니메이션\n */\nexport const GAM_FLOWING_BLOCK: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"gam_flowing_block\", \"유수막기\")\n .asDefense(0.45)\n .shift(0.1, \"ease-out\") // Initial yielding motion\n .parry(0.15, \"linear\") // Continuous flowing deflection\n .shift(0.1, \"linear\") // Body flows with the deflection\n .recover(0.1)\n .build();\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAwBA,IAAa,2BACX,4BAA4B,OAAO,wBAAwB,MAAM,EAC9D,SAAS,EAAG,EACZ,OAAO,EACP,MAAM,EAAG,EACT,UAAU,EAAG,EACb,QAAQ,EAAG,EACX,MAAM;;;;;;;;;;;AAYX,IAAa,0BACX,4BAA4B,OAAO,uBAAuB,QAAQ,EAC/D,UAAU,EAAG,EACb,MAAM,GAAI,EACV,WAAW,GAAI,EACf,WAAW,GAAI,EACf,QAAQ,GAAI,EACZ,MAAM;;;;;;;;;;;;AAaX,IAAa,sBACX,4BAA4B,OAAO,mBAAmB,KAAK,EACxD,SAAS,EAAG,EACZ,OAAO,EACP,YAAY,GAAI,EAChB,WAAW,EAAG,EACd,QAAQ,GAAI,EACZ,MAAM;;;;;;;;;;AAWX,IAAa,wBACX,4BAA4B,OAAO,qBAAqB,QAAQ,EAC7D,UAAU,EAAG,EACb,MAAM,GAAI,EACV,WAAW,EAAG,EACd,UAAU,EAAG,EACb,QAAQ,GAAI,EACZ,MAAM;;;;;;;;;;;AAYX,IAAa,oBACX,4BAA4B,OAAO,qBAAqB,MAAM,EAC3D,UAAU,GAAI,EACd,MAAM,IAAK,UAAU,EACrB,MAAM,KAAM,QAAQ,EACpB,MAAM,IAAK,QAAQ,EACnB,QAAQ,EAAG,EACX,MAAM"}
1
+ {"version":3,"file":"GamRedirectionAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/GamRedirectionAnimations.ts"],"sourcesContent":["import type { SkeletalAnimation } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\n\n// ═══════════════════════════════════════════════════════════════════════════\n// GAM TRIGRAM (감) - WATER: REDIRECTION & FLOW (유수/방향전환)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Flowing River Strike - 유수타격\n *\n * Signature Gam technique that flows like water around defenses.\n * Unlike direct strikes, this follows a curved path to bypass guards.\n *\n * Target: Face/Neck via curved trajectory\n * Principle: Flow (Yu)\n *\n * Phases:\n * 1. Flow Entry (유입): Circular wind-up\n * 2. Curve (곡선): Arcing strike path\n * 3. Impact (타격): Fluid impact\n * 4. Continue (지속): Follow-through like flowing water\n *\n * @korean 유수타격애니메이션\n */\nexport const GAM_FLOWING_RIVER_STRIKE: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"flowing_river_strike\", \"유수타격\")\n .asAttack(0.7)\n .stance()\n .parry(0.2) // Initial defensive flow\n .hookPunch(0.3) // Curved strike execution (using hook primitive for curve)\n .recover(0.2) // Flow back\n .build();\n\n/**\n * Redirection Counter - 방향전환반격\n *\n * Using the opponent's momentum against them.\n * Catching an attack and redirecting it while striking.\n *\n * Principle: Redirection (Banghyang Jeonhwan)\n *\n * @korean 방향전환반격애니메이션\n */\nexport const GAM_REDIRECTION_COUNTER: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"redirection_counter\", \"방향전환반격\")\n .asDefense(0.6)\n .parry(0.15) // Catch/Deflect\n .wristTwist(0.15) // Redirect vector\n .palmStrike(0.15) // Simultaneous counter\n .recover(0.15)\n .build();\n\n/**\n * Tidal Wave Palm - 해일장\n *\n * A heavy, crashing palm strike that mimics a tidal wave.\n * Builds energy from the ground up through a fluid body wave.\n *\n * Target: Chest/Solar Plexus\n * Principle: Heavy Flow (Jungrryu)\n *\n * @korean 해일장애니메이션\n */\nexport const GAM_TIDAL_WAVE_PALM: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"tidal_wave_palm\", \"해일장\")\n .asAttack(0.8)\n .stance()\n .punchWindup(0.25) // Deep gathering like drawing water\n .palmStrike(0.3) // Heavy crashing extension\n .recover(0.25)\n .build();\n\n/**\n * Whirlpool Counter - 소용돌이반격\n *\n * Circular defensive movement that traps the opponent's limb.\n *\n * Principle: Vortex (Soyongdori)\n *\n * @korean 소용돌이반격애니메이션\n */\nexport const GAM_WHIRLPOOL_COUNTER: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"whirlpool_counter\", \"소용돌이반격\")\n .asDefense(0.7)\n .parry(0.15) // Outer deflection\n .wristTwist(0.2) // Circular trap\n .jointLock(0.2) // Lock in the center\n .recover(0.15)\n .build();\n\n/**\n * Flowing Block - 유수막기 (Gam Water-Style Flowing Deflection)\n *\n * Soft blocking technique that absorbs and redirects force like water flowing around a rock.\n * Circular, continuous motion that yields rather than resists.\n *\n * Duration: 450ms (Slower, flowing defensive motion)\n *\n * @korean 유수막기애니메이션\n */\nexport const GAM_FLOWING_BLOCK: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\"gam_flowing_block\", \"유수막기\")\n .asDefense(0.45)\n .shift(0.1, \"ease-out\") // Initial yielding motion\n .parry(0.15, \"linear\") // Continuous flowing deflection\n .shift(0.1, \"linear\") // Body flows with the deflection\n .recover(0.1)\n .build();\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAwBA,IAAa,2BACX,4BAA4B,OAAO,wBAAwB,MAAM,CAAC,CAC/D,SAAS,EAAG,CAAC,CACb,OAAO,CAAC,CACR,MAAM,EAAG,CAAC,CACV,UAAU,EAAG,CAAC,CACd,QAAQ,EAAG,CAAC,CACZ,MAAM;;;;;;;;;;;AAYX,IAAa,0BACX,4BAA4B,OAAO,uBAAuB,QAAQ,CAAC,CAChE,UAAU,EAAG,CAAC,CACd,MAAM,GAAI,CAAC,CACX,WAAW,GAAI,CAAC,CAChB,WAAW,GAAI,CAAC,CAChB,QAAQ,GAAI,CAAC,CACb,MAAM;;;;;;;;;;;;AAaX,IAAa,sBACX,4BAA4B,OAAO,mBAAmB,KAAK,CAAC,CACzD,SAAS,EAAG,CAAC,CACb,OAAO,CAAC,CACR,YAAY,GAAI,CAAC,CACjB,WAAW,EAAG,CAAC,CACf,QAAQ,GAAI,CAAC,CACb,MAAM;;;;;;;;;;AAWX,IAAa,wBACX,4BAA4B,OAAO,qBAAqB,QAAQ,CAAC,CAC9D,UAAU,EAAG,CAAC,CACd,MAAM,GAAI,CAAC,CACX,WAAW,EAAG,CAAC,CACf,UAAU,EAAG,CAAC,CACd,QAAQ,GAAI,CAAC,CACb,MAAM;;;;;;;;;;;AAYX,IAAa,oBACX,4BAA4B,OAAO,qBAAqB,MAAM,CAAC,CAC5D,UAAU,GAAI,CAAC,CACf,MAAM,IAAK,UAAU,CAAC,CACtB,MAAM,KAAM,QAAQ,CAAC,CACrB,MAAM,IAAK,QAAQ,CAAC,CACpB,QAAQ,EAAG,CAAC,CACZ,MAAM"}
@@ -1 +1 @@
1
- {"version":3,"file":"GamStanceAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/GamStanceAnimations.ts"],"sourcesContent":["/**\n * ☵ Gam (Water) Stance-Specific Animations\n *\n * Specialized idle, movement, guard, and adaptive counter animations for the Gam (감/Water) trigram.\n * Embodies adaptive flow and redirection from Hapkido techniques with water-like yielding principles.\n *\n * **Korean Martial Arts Context:**\n * - **무술**: 합기도 적응 기술 (Hapkido Adaptive Techniques)\n * - **특성**: 혈류 차단 (Blood Flow Disruption), 양보와 방향 전환 (Yielding and Redirecting)\n * - **철학**: 물의 적응력 (Water's Adaptability), 흐름의 지혜 (Flowing Wisdom)\n * - **대표 기술**: 수류반격 (Water Flow Counter/Adaptive Redirection)\n *\n * Animation Philosophy:\n * - **물처럼 흘러라** (Flow Like Water) - No resistance, only adaptation\n * - **적의 힘을 이용** (Use Enemy's Force) - Redirection over blocking\n * - **완전한 이완** (Complete Relaxation) - No tension in movements\n * - **끊임없는 적응** (Endless Adaptation) - Constant readiness to adjust\n *\n * @module systems/animation/catalogs/GamStanceAnimations\n * @category Animation\n * @korean 감괘자세애니메이션\n */\n\nimport { BoneName } from \"@/types/skeletal\";\nimport type { SkeletalAnimation } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\n\n// Import Gam Water adaptive techniques (감괘 적응 기술)\nimport {\n GAM_WATER_FLOW_COUNTER_ANIMATION,\n GAM_FLOWING_TAKEDOWN,\n} from \"./GamTechniqueAnimations\";\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☵ GAM IDLE FLOWING ANIMATION (감괘 흐름 자세)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gam Idle Flowing Animation\n *\n * **Korean**: 감괘 흐름 자세 (Gam-gwae Heureum Jase)\n * **Philosophy**: Water's adaptability through relaxed readiness\n *\n * Characteristics:\n * - Complete relaxation with no tension\n * - Subtle weight shifts demonstrating adaptability\n * - Shoulders completely loose and low\n * - Hands open and ready to receive force\n * - Breathing deep and flowing like water\n *\n * Animation Cycle:\n * - 0ms: Neutral relaxed position\n * - 625ms: Subtle weight shift left (물의 호흡)\n * - 1250ms: Return to center\n * - 1875ms: Subtle weight shift right\n * - 2500ms: Complete cycle\n *\n * @korean 감괘흐름자세\n * @duration 2500ms (2.5 second cycle)\n * @category Idle Animation\n */\nexport const GAM_IDLE_FLOWING: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"gam_idle_flowing\",\n \"감괘 흐름 자세\"\n )\n .asIdle(2.5, true)\n // Keyframe 0ms: Neutral relaxed position (baseline)\n .at(0)\n .rotate(BoneName.PELVIS, 0, 0, 0) // Neutral pelvis\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0) // Neutral spine\n .rotate(BoneName.SHOULDER_L, 0.09, 0.14, -0.17) // ~5°, ~8°, ~-10° (relaxed low)\n .rotate(BoneName.SHOULDER_R, 0.09, -0.14, 0.17) // ~5°, ~-8°, ~10°\n .rotate(BoneName.ELBOW_L, 0, 0, -0.52) // -30° (soft bend)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.52) // 30° (soft bend)\n .rotate(BoneName.WRIST_L, -0.09, 0, -0.05) // -5°, 0°, -3° (relaxed wrists)\n .rotate(BoneName.WRIST_R, -0.09, 0, 0.05) // -5°, 0°, 3°\n .rotate(BoneName.HEAD, 0, 0, 0) // Head neutral, aware\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Keyframe 625ms: Subtle weight shift left (물의 호흡)\n .at(0.625)\n .rotate(BoneName.PELVIS, 0, 0, -0.0349) // 0°, 0°, -2° (minimal shift)\n .rotate(BoneName.SPINE_UPPER, 0, -0.0349, 0) // 0°, -2°, 0° (flowing with weight)\n .rotate(BoneName.SHOULDER_L, 0.10, 0.17, -0.21) // 6°, 10°, -12° (left rises slightly)\n .rotate(BoneName.SHOULDER_R, 0.07, -0.10, 0.14) // 4°, -6°, 8° (right lowers)\n .rotate(BoneName.WRIST_L, -0.05, 0, -0.09) // -3°, 0°, -5° (subtle flow)\n .rotate(BoneName.WRIST_R, -0.12, 0, 0.02) // -7°, 0°, 1°\n .position(BoneName.PELVIS, -0.01, 0, 0) // Minimal lateral shift left\n .done<MartialArtsAnimationBuilder>()\n // Keyframe 1250ms: Return to center\n .at(1.25)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .rotate(BoneName.SHOULDER_L, 0.09, 0.14, -0.17)\n .rotate(BoneName.SHOULDER_R, 0.09, -0.14, 0.17)\n .rotate(BoneName.WRIST_L, -0.09, 0, -0.05)\n .rotate(BoneName.WRIST_R, -0.09, 0, 0.05)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Keyframe 1875ms: Subtle weight shift right\n .at(1.875)\n .rotate(BoneName.PELVIS, 0, 0, 0.0349) // 0°, 0°, 2° (minimal shift)\n .rotate(BoneName.SPINE_UPPER, 0, 0.0349, 0) // 0°, 2°, 0°\n .rotate(BoneName.SHOULDER_L, 0.07, 0.10, -0.14) // 4°, 6°, -8° (left lowers)\n .rotate(BoneName.SHOULDER_R, 0.10, -0.17, 0.21) // 6°, -10°, 12° (right rises)\n .rotate(BoneName.WRIST_L, -0.12, 0, -0.02) // -7°, 0°, -1°\n .rotate(BoneName.WRIST_R, -0.05, 0, 0.09) // -3°, 0°, 5°\n .position(BoneName.PELVIS, 0.01, 0, 0) // Minimal lateral shift right\n .done<MartialArtsAnimationBuilder>()\n // Keyframe 2500ms: Return to start (complete cycle)\n .at(2.5)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .rotate(BoneName.SHOULDER_L, 0.09, 0.14, -0.17)\n .rotate(BoneName.SHOULDER_R, 0.09, -0.14, 0.17)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.52)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.52)\n .rotate(BoneName.WRIST_L, -0.09, 0, -0.05)\n .rotate(BoneName.WRIST_R, -0.09, 0, 0.05)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☵ GAM YIELDING SIDESTEP (물의 양보)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gam Yielding Sidestep Animation\n *\n * **Korean**: 물의 양보 (Mul-ui Yangbo) - Water's Yielding\n * **Technique**: Lateral movement yielding to opponent's force\n *\n * Characteristics:\n * - Weight transfer follows natural flow\n * - Upper body remains centered and relaxed\n * - Feet glide rather than step\n * - No resistance, only adaptation\n * - Seamless transition to counter position\n *\n * Animation Phases:\n * - 0-167ms: Initial weight shift (양보 시작)\n * - 167-400ms: Gliding lateral movement (흐름)\n * - 400-583ms: Landing and settling (정착)\n *\n * @korean 물의양보\n * @frames 10 frames (58.3ms per frame at 60fps, total 583ms)\n * @duration 583ms\n * @category Movement Animation\n */\nexport const GAM_YIELDING_SIDESTEP: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"gam_yielding_sidestep\",\n \"물의 양보\"\n )\n .asMovement(0.583, false)\n // Phase 1: Initial weight shift (0ms)\n .at(0)\n .rotate(BoneName.PELVIS, 0, -0.09, 0) // 0°, -5° (weight begins shift)\n .rotate(BoneName.SPINE_UPPER, 0, -0.05, 0) // Upper body stays centered\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (left leg loads)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20° (right leg ready to glide)\n .rotate(BoneName.SHOULDER_L, 0.09, 0.14, -0.17) // Relaxed guard maintained\n .rotate(BoneName.SHOULDER_R, 0.09, -0.14, 0.17)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Gliding lateral movement (283ms - midpoint)\n .at(0.283)\n .rotate(BoneName.PELVIS, 0, -0.14, 0) // 0°, -8° (flowing lateral)\n .rotate(BoneName.SPINE_UPPER, 0, -0.03, 0) // Minimal rotation\n .rotate(BoneName.KNEE_L, -0.17, 0, 0) // -10° (left leg extends)\n .rotate(BoneName.KNEE_R, -0.44, 0, 0) // -25° (right leg glides)\n .rotate(BoneName.SHOULDER_L, 0.10, 0.17, -0.14) // Slight adjustment\n .rotate(BoneName.SHOULDER_R, 0.08, -0.10, 0.14)\n .position(BoneName.PELVIS, -0.12, 0.01, 0) // Lateral with slight rise\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Landing and settling (583ms)\n .at(0.583)\n .rotate(BoneName.PELVIS, 0, -0.10, 0) // 0°, -6° (settled)\n .rotate(BoneName.SPINE_UPPER, 0, -0.02, 0) // Return to center\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20° (grounded)\n .rotate(BoneName.SHOULDER_L, 0.09, 0.14, -0.17) // Guard restored\n .rotate(BoneName.SHOULDER_R, 0.09, -0.14, 0.17)\n .position(BoneName.PELVIS, -0.20, 0, 0) // Final lateral position\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☵ GAM FLOWING RETREAT STEP (수류 후퇴)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gam Flowing Retreat Step Animation\n *\n * **Korean**: 수류 후퇴 (Suryu Hutoe) - Water Flow Retreat\n * **Technique**: Backward movement with no resistance\n *\n * Characteristics:\n * - Body flows with opponent's momentum\n * - Hands stay forward to maintain contact\n * - No breaking of flow, continuous movement\n * - Seamless transition to counter position\n * - Weight shifts smoothly backward\n *\n * Animation Phases:\n * - 0-200ms: Initial backward flow (후퇴 시작)\n * - 200-533ms: Continuous backward glide (지속 흐름)\n * - 533-750ms: Settling in counter position (반격 준비)\n *\n * @korean 수류후퇴\n * @frames 13 frames (57.7ms per frame at 60fps, total 750ms)\n * @duration 750ms\n * @category Movement Animation\n */\nexport const GAM_FLOWING_RETREAT_STEP: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"gam_flowing_retreat_step\",\n \"수류 후퇴\"\n )\n .asMovement(0.75, false)\n // Phase 1: Initial backward flow (0ms)\n .at(0)\n .rotate(BoneName.PELVIS, -0.05, 0, 0) // -3° (lean back begins)\n .rotate(BoneName.SPINE_UPPER, -0.03, 0, 0) // Slight backward lean\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° (front leg ready)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (back leg loads)\n .rotate(BoneName.SHOULDER_L, 0.05, 0.17, -0.14) // 3°, 10°, -8° (hands forward)\n .rotate(BoneName.SHOULDER_R, 0.05, -0.17, 0.14) // Maintain contact position\n .rotate(BoneName.ELBOW_L, 0, 0, -0.70) // -40° (arms extending forward)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.70) // To maintain contact\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Continuous backward glide (367ms - midpoint)\n .at(0.367)\n .rotate(BoneName.PELVIS, -0.09, 0, 0) // -5° (flowing back)\n .rotate(BoneName.SPINE_UPPER, -0.05, 0, 0) // Maintain forward contact\n .rotate(BoneName.KNEE_L, -0.17, 0, 0) // -10° (front leg extends)\n .rotate(BoneName.KNEE_R, -0.44, 0, 0) // -25° (back leg absorbs)\n .rotate(BoneName.SHOULDER_L, 0.07, 0.21, -0.17) // Arms extend to maintain\n .rotate(BoneName.SHOULDER_R, 0.07, -0.21, 0.17)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.87) // -50° (maximum extension)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.87)\n .position(BoneName.PELVIS, 0, -0.02, -0.25) // Back and slightly down\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Settling in counter position (750ms)\n .at(0.75)\n .rotate(BoneName.PELVIS, -0.07, 0, 0) // -4° (settled back)\n .rotate(BoneName.SPINE_UPPER, -0.03, 0, 0) // Upright but ready\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable front)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20° (grounded back)\n .rotate(BoneName.SHOULDER_L, 0.09, 0.17, -0.14) // Return to guard\n .rotate(BoneName.SHOULDER_R, 0.09, -0.17, 0.14)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.52) // -30° (guard position)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.52)\n .position(BoneName.PELVIS, 0, 0, -0.40) // Final backward position\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// EXPORTS\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * All Gam stance animations for idle, movement, and combat techniques\n */\nexport const GAM_STANCE_ANIMATIONS = {\n idle: GAM_IDLE_FLOWING,\n movement: {\n yieldingSidestep: GAM_YIELDING_SIDESTEP,\n flowingRetreat: GAM_FLOWING_RETREAT_STEP,\n },\n // Water Adaptive Counter Techniques (감괘 적응 기술)\n techniques: {\n waterFlowCounter: GAM_WATER_FLOW_COUNTER_ANIMATION,\n flowingTakedown: GAM_FLOWING_TAKEDOWN,\n },\n} as const;\n"],"mappings":"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"}
1
+ {"version":3,"file":"GamStanceAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/GamStanceAnimations.ts"],"sourcesContent":["/**\n * ☵ Gam (Water) Stance-Specific Animations\n *\n * Specialized idle, movement, guard, and adaptive counter animations for the Gam (감/Water) trigram.\n * Embodies adaptive flow and redirection from Hapkido techniques with water-like yielding principles.\n *\n * **Korean Martial Arts Context:**\n * - **무술**: 합기도 적응 기술 (Hapkido Adaptive Techniques)\n * - **특성**: 혈류 차단 (Blood Flow Disruption), 양보와 방향 전환 (Yielding and Redirecting)\n * - **철학**: 물의 적응력 (Water's Adaptability), 흐름의 지혜 (Flowing Wisdom)\n * - **대표 기술**: 수류반격 (Water Flow Counter/Adaptive Redirection)\n *\n * Animation Philosophy:\n * - **물처럼 흘러라** (Flow Like Water) - No resistance, only adaptation\n * - **적의 힘을 이용** (Use Enemy's Force) - Redirection over blocking\n * - **완전한 이완** (Complete Relaxation) - No tension in movements\n * - **끊임없는 적응** (Endless Adaptation) - Constant readiness to adjust\n *\n * @module systems/animation/catalogs/GamStanceAnimations\n * @category Animation\n * @korean 감괘자세애니메이션\n */\n\nimport { BoneName } from \"@/types/skeletal\";\nimport type { SkeletalAnimation } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\n\n// Import Gam Water adaptive techniques (감괘 적응 기술)\nimport {\n GAM_WATER_FLOW_COUNTER_ANIMATION,\n GAM_FLOWING_TAKEDOWN,\n} from \"./GamTechniqueAnimations\";\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☵ GAM IDLE FLOWING ANIMATION (감괘 흐름 자세)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gam Idle Flowing Animation\n *\n * **Korean**: 감괘 흐름 자세 (Gam-gwae Heureum Jase)\n * **Philosophy**: Water's adaptability through relaxed readiness\n *\n * Characteristics:\n * - Complete relaxation with no tension\n * - Subtle weight shifts demonstrating adaptability\n * - Shoulders completely loose and low\n * - Hands open and ready to receive force\n * - Breathing deep and flowing like water\n *\n * Animation Cycle:\n * - 0ms: Neutral relaxed position\n * - 625ms: Subtle weight shift left (물의 호흡)\n * - 1250ms: Return to center\n * - 1875ms: Subtle weight shift right\n * - 2500ms: Complete cycle\n *\n * @korean 감괘흐름자세\n * @duration 2500ms (2.5 second cycle)\n * @category Idle Animation\n */\nexport const GAM_IDLE_FLOWING: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"gam_idle_flowing\",\n \"감괘 흐름 자세\"\n )\n .asIdle(2.5, true)\n // Keyframe 0ms: Neutral relaxed position (baseline)\n .at(0)\n .rotate(BoneName.PELVIS, 0, 0, 0) // Neutral pelvis\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0) // Neutral spine\n .rotate(BoneName.SHOULDER_L, 0.09, 0.14, -0.17) // ~5°, ~8°, ~-10° (relaxed low)\n .rotate(BoneName.SHOULDER_R, 0.09, -0.14, 0.17) // ~5°, ~-8°, ~10°\n .rotate(BoneName.ELBOW_L, 0, 0, -0.52) // -30° (soft bend)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.52) // 30° (soft bend)\n .rotate(BoneName.WRIST_L, -0.09, 0, -0.05) // -5°, 0°, -3° (relaxed wrists)\n .rotate(BoneName.WRIST_R, -0.09, 0, 0.05) // -5°, 0°, 3°\n .rotate(BoneName.HEAD, 0, 0, 0) // Head neutral, aware\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Keyframe 625ms: Subtle weight shift left (물의 호흡)\n .at(0.625)\n .rotate(BoneName.PELVIS, 0, 0, -0.0349) // 0°, 0°, -2° (minimal shift)\n .rotate(BoneName.SPINE_UPPER, 0, -0.0349, 0) // 0°, -2°, 0° (flowing with weight)\n .rotate(BoneName.SHOULDER_L, 0.10, 0.17, -0.21) // 6°, 10°, -12° (left rises slightly)\n .rotate(BoneName.SHOULDER_R, 0.07, -0.10, 0.14) // 4°, -6°, 8° (right lowers)\n .rotate(BoneName.WRIST_L, -0.05, 0, -0.09) // -3°, 0°, -5° (subtle flow)\n .rotate(BoneName.WRIST_R, -0.12, 0, 0.02) // -7°, 0°, 1°\n .position(BoneName.PELVIS, -0.01, 0, 0) // Minimal lateral shift left\n .done<MartialArtsAnimationBuilder>()\n // Keyframe 1250ms: Return to center\n .at(1.25)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .rotate(BoneName.SHOULDER_L, 0.09, 0.14, -0.17)\n .rotate(BoneName.SHOULDER_R, 0.09, -0.14, 0.17)\n .rotate(BoneName.WRIST_L, -0.09, 0, -0.05)\n .rotate(BoneName.WRIST_R, -0.09, 0, 0.05)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Keyframe 1875ms: Subtle weight shift right\n .at(1.875)\n .rotate(BoneName.PELVIS, 0, 0, 0.0349) // 0°, 0°, 2° (minimal shift)\n .rotate(BoneName.SPINE_UPPER, 0, 0.0349, 0) // 0°, 2°, 0°\n .rotate(BoneName.SHOULDER_L, 0.07, 0.10, -0.14) // 4°, 6°, -8° (left lowers)\n .rotate(BoneName.SHOULDER_R, 0.10, -0.17, 0.21) // 6°, -10°, 12° (right rises)\n .rotate(BoneName.WRIST_L, -0.12, 0, -0.02) // -7°, 0°, -1°\n .rotate(BoneName.WRIST_R, -0.05, 0, 0.09) // -3°, 0°, 5°\n .position(BoneName.PELVIS, 0.01, 0, 0) // Minimal lateral shift right\n .done<MartialArtsAnimationBuilder>()\n // Keyframe 2500ms: Return to start (complete cycle)\n .at(2.5)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .rotate(BoneName.SHOULDER_L, 0.09, 0.14, -0.17)\n .rotate(BoneName.SHOULDER_R, 0.09, -0.14, 0.17)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.52)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.52)\n .rotate(BoneName.WRIST_L, -0.09, 0, -0.05)\n .rotate(BoneName.WRIST_R, -0.09, 0, 0.05)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☵ GAM YIELDING SIDESTEP (물의 양보)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gam Yielding Sidestep Animation\n *\n * **Korean**: 물의 양보 (Mul-ui Yangbo) - Water's Yielding\n * **Technique**: Lateral movement yielding to opponent's force\n *\n * Characteristics:\n * - Weight transfer follows natural flow\n * - Upper body remains centered and relaxed\n * - Feet glide rather than step\n * - No resistance, only adaptation\n * - Seamless transition to counter position\n *\n * Animation Phases:\n * - 0-167ms: Initial weight shift (양보 시작)\n * - 167-400ms: Gliding lateral movement (흐름)\n * - 400-583ms: Landing and settling (정착)\n *\n * @korean 물의양보\n * @frames 10 frames (58.3ms per frame at 60fps, total 583ms)\n * @duration 583ms\n * @category Movement Animation\n */\nexport const GAM_YIELDING_SIDESTEP: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"gam_yielding_sidestep\",\n \"물의 양보\"\n )\n .asMovement(0.583, false)\n // Phase 1: Initial weight shift (0ms)\n .at(0)\n .rotate(BoneName.PELVIS, 0, -0.09, 0) // 0°, -5° (weight begins shift)\n .rotate(BoneName.SPINE_UPPER, 0, -0.05, 0) // Upper body stays centered\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (left leg loads)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20° (right leg ready to glide)\n .rotate(BoneName.SHOULDER_L, 0.09, 0.14, -0.17) // Relaxed guard maintained\n .rotate(BoneName.SHOULDER_R, 0.09, -0.14, 0.17)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Gliding lateral movement (283ms - midpoint)\n .at(0.283)\n .rotate(BoneName.PELVIS, 0, -0.14, 0) // 0°, -8° (flowing lateral)\n .rotate(BoneName.SPINE_UPPER, 0, -0.03, 0) // Minimal rotation\n .rotate(BoneName.KNEE_L, -0.17, 0, 0) // -10° (left leg extends)\n .rotate(BoneName.KNEE_R, -0.44, 0, 0) // -25° (right leg glides)\n .rotate(BoneName.SHOULDER_L, 0.10, 0.17, -0.14) // Slight adjustment\n .rotate(BoneName.SHOULDER_R, 0.08, -0.10, 0.14)\n .position(BoneName.PELVIS, -0.12, 0.01, 0) // Lateral with slight rise\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Landing and settling (583ms)\n .at(0.583)\n .rotate(BoneName.PELVIS, 0, -0.10, 0) // 0°, -6° (settled)\n .rotate(BoneName.SPINE_UPPER, 0, -0.02, 0) // Return to center\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20° (grounded)\n .rotate(BoneName.SHOULDER_L, 0.09, 0.14, -0.17) // Guard restored\n .rotate(BoneName.SHOULDER_R, 0.09, -0.14, 0.17)\n .position(BoneName.PELVIS, -0.20, 0, 0) // Final lateral position\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☵ GAM FLOWING RETREAT STEP (수류 후퇴)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gam Flowing Retreat Step Animation\n *\n * **Korean**: 수류 후퇴 (Suryu Hutoe) - Water Flow Retreat\n * **Technique**: Backward movement with no resistance\n *\n * Characteristics:\n * - Body flows with opponent's momentum\n * - Hands stay forward to maintain contact\n * - No breaking of flow, continuous movement\n * - Seamless transition to counter position\n * - Weight shifts smoothly backward\n *\n * Animation Phases:\n * - 0-200ms: Initial backward flow (후퇴 시작)\n * - 200-533ms: Continuous backward glide (지속 흐름)\n * - 533-750ms: Settling in counter position (반격 준비)\n *\n * @korean 수류후퇴\n * @frames 13 frames (57.7ms per frame at 60fps, total 750ms)\n * @duration 750ms\n * @category Movement Animation\n */\nexport const GAM_FLOWING_RETREAT_STEP: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"gam_flowing_retreat_step\",\n \"수류 후퇴\"\n )\n .asMovement(0.75, false)\n // Phase 1: Initial backward flow (0ms)\n .at(0)\n .rotate(BoneName.PELVIS, -0.05, 0, 0) // -3° (lean back begins)\n .rotate(BoneName.SPINE_UPPER, -0.03, 0, 0) // Slight backward lean\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° (front leg ready)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (back leg loads)\n .rotate(BoneName.SHOULDER_L, 0.05, 0.17, -0.14) // 3°, 10°, -8° (hands forward)\n .rotate(BoneName.SHOULDER_R, 0.05, -0.17, 0.14) // Maintain contact position\n .rotate(BoneName.ELBOW_L, 0, 0, -0.70) // -40° (arms extending forward)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.70) // To maintain contact\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Continuous backward glide (367ms - midpoint)\n .at(0.367)\n .rotate(BoneName.PELVIS, -0.09, 0, 0) // -5° (flowing back)\n .rotate(BoneName.SPINE_UPPER, -0.05, 0, 0) // Maintain forward contact\n .rotate(BoneName.KNEE_L, -0.17, 0, 0) // -10° (front leg extends)\n .rotate(BoneName.KNEE_R, -0.44, 0, 0) // -25° (back leg absorbs)\n .rotate(BoneName.SHOULDER_L, 0.07, 0.21, -0.17) // Arms extend to maintain\n .rotate(BoneName.SHOULDER_R, 0.07, -0.21, 0.17)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.87) // -50° (maximum extension)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.87)\n .position(BoneName.PELVIS, 0, -0.02, -0.25) // Back and slightly down\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Settling in counter position (750ms)\n .at(0.75)\n .rotate(BoneName.PELVIS, -0.07, 0, 0) // -4° (settled back)\n .rotate(BoneName.SPINE_UPPER, -0.03, 0, 0) // Upright but ready\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable front)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20° (grounded back)\n .rotate(BoneName.SHOULDER_L, 0.09, 0.17, -0.14) // Return to guard\n .rotate(BoneName.SHOULDER_R, 0.09, -0.17, 0.14)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.52) // -30° (guard position)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.52)\n .position(BoneName.PELVIS, 0, 0, -0.40) // Final backward position\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// EXPORTS\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * All Gam stance animations for idle, movement, and combat techniques\n */\nexport const GAM_STANCE_ANIMATIONS = {\n idle: GAM_IDLE_FLOWING,\n movement: {\n yieldingSidestep: GAM_YIELDING_SIDESTEP,\n flowingRetreat: GAM_FLOWING_RETREAT_STEP,\n },\n // Water Adaptive Counter Techniques (감괘 적응 기술)\n techniques: {\n waterFlowCounter: GAM_WATER_FLOW_COUNTER_ANIMATION,\n flowingTakedown: GAM_FLOWING_TAKEDOWN,\n },\n} as const;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"GamTechniqueAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/GamTechniqueAnimations.ts"],"sourcesContent":["/**\n * ☵ Gam (Water) Technique Combat Animations\n *\n * Advanced combat technique animations for the Gam (감/Water) trigram focusing on\n * adaptive counters, flowing redirection, and takedown techniques from Hapkido.\n *\n * **Korean Martial Arts Context:**\n * - **기술 유형**: 반격 기술 (Counter Techniques), 넘어뜨리기 (Takedowns)\n * - **원리**: 적응과 흐름 (Adaptation and Flow), 상대의 힘 이용 (Using Opponent's Force)\n * - **철학**: 물처럼 흘러 적의 힘을 이용하라 (Flow like water and use enemy's force)\n *\n * Technique Categories:\n * - **수류반격** (Water Flow Counter) - Receive, redirect, counter sequence\n * - **흐르는 넘어뜨리기** (Flowing Takedown) - Blend, off-balance, takedown\n *\n * @module systems/animation/catalogs/GamTechniqueAnimations\n * @category Animation\n * @korean 감괘기술애니메이션\n */\n\nimport { BoneName } from \"@/types/skeletal\";\nimport type { SkeletalAnimation } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☵ GAM WATER FLOW COUNTER (수류반격)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gam Water Flow Counter Animation\n *\n * **Korean**: 수류반격 (Suryu Bangyeok)\n * **Technique**: Yielding redirection into flowing counter\n * **Target Points**: Balance disruption, blood flow restriction\n *\n * This is the signature Gam technique demonstrating complete water philosophy:\n * - Accept opponent's force with yielding motion (receive)\n * - Guide force in circular path away from center (redirect)\n * - Flow into takedown or strike with opponent's momentum (counter)\n * - Return to adaptive guard maintaining contact (recovery)\n *\n * Animation Phases (Total: 1400ms):\n * - Receive Phase (0-350ms): Accept incoming attack with yield\n * - Redirect Phase (350-950ms): Circular redirection of force\n * - Counter Phase (950-1400ms): Flow into counter with opponent's momentum\n *\n * Biomechanics:\n * - Initial yield: Spine rotates away (-20°), hips shift (-5°)\n * - Redirection: Maximum spine rotation (-25°), arms guide in circle\n * - Counter: Spine reverses (+20°), both hands push/pull\n *\n * @korean 수류반격\n * @duration 1400ms (receive 350ms + redirect 600ms + counter 450ms)\n * @category Counter Animation\n */\nexport const GAM_WATER_FLOW_COUNTER_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"gam_water_flow_counter\",\n \"수류반격\"\n )\n .asAttack(1.4)\n \n // ═══════════════════════════════════════════════════════════════════════\n // RECEIVE PHASE (수용 단계) - 0-350ms, frames 0-6\n // Accept opponent's attack with yielding motion\n // ═══════════════════════════════════════════════════════════════════════\n \n // Frame 0: Guard position, receiving incoming attack\n .at(0)\n .rotate(BoneName.PELVIS, 0, 0, 0) // Neutral pelvis\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0) // Upright spine\n .rotate(BoneName.SHOULDER_L, 0.17, 0.26, -0.17) // ~10°, ~15°, ~-10° (receiving position)\n .rotate(BoneName.SHOULDER_R, 0.09, -0.14, 0.17) // Ready to yield\n .rotate(BoneName.ELBOW_L, 0, 0, -0.70) // -40° (arm extended to receive)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.52) // -30° (support position)\n .rotate(BoneName.WRIST_L, 0, 0, -0.17) // Palm open to receive\n .rotate(BoneName.WRIST_R, 0, 0, 0) // Neutral\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n \n // Frame 6 (350ms): Maximum yield - accept force\n .at(0.35)\n .rotate(BoneName.PELVIS, 0, -0.14, -0.05) // 0°, -8°, -3° (weight shifts away)\n .rotate(BoneName.SPINE_UPPER, 0, -0.17, 0) // 0°, ~-10°, 0° (spine yields away)\n .rotate(BoneName.SHOULDER_L, 0.26, 0.35, -0.21) // 15°, 20°, -12° (accept force)\n .rotate(BoneName.SHOULDER_R, 0.12, -0.17, 0.21) // Supporting position\n .rotate(BoneName.ELBOW_L, 0, 0, -0.87) // -50° (arm absorbs)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.70) // -40° (support absorbs)\n .rotate(BoneName.WRIST_L, 0.09, 0, -0.26) // 5°, 0°, -15° (palm guides)\n .rotate(BoneName.WRIST_R, 0.05, 0, 0.09) // Slight adjustment\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° (legs absorb)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15°\n .position(BoneName.PELVIS, -0.03, -0.01, -0.02) // Slight yield back\n .done<MartialArtsAnimationBuilder>()\n \n // ═══════════════════════════════════════════════════════════════════════\n // REDIRECT PHASE (전환 단계) - 350-950ms, frames 7-16\n // Circular redirection of opponent's force\n // ═══════════════════════════════════════════════════════════════════════\n \n // Frame 11 (650ms): Begin circular redirection\n .at(0.65)\n .rotate(BoneName.PELVIS, 0, -0.26, -0.09) // 0°, -15°, -5° (circular motion begins)\n .rotate(BoneName.SPINE_UPPER, 0, -0.35, 0) // 0°, -20°, 0° (circular redirection)\n .rotate(BoneName.SHOULDER_L, 0.44, 0.52, -0.26) // 25°, 30°, -15° (guide in circle)\n .rotate(BoneName.SHOULDER_R, 0.35, -0.17, 0.17) // 20°, -10°, 10° (right hand joins)\n .rotate(BoneName.ELBOW_L, 0, 0.26, -1.05) // 0°, 15°, -60° (circular control)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.70) // -40° (support control)\n .rotate(BoneName.WRIST_L, 0.17, 0.09, -0.35) // 10°, 5°, -20° (palm controls)\n .rotate(BoneName.WRIST_R, 0.09, -0.05, 0.14) // Guiding motion\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (legs stable)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20°\n .position(BoneName.PELVIS, -0.05, -0.01, -0.03) // Continue circular path\n .done<MartialArtsAnimationBuilder>()\n \n // Frame 16 (950ms): Maximum redirection - force fully redirected\n .at(0.95)\n .rotate(BoneName.PELVIS, 0, -0.35, -0.12) // 0°, -20°, -7° (maximum rotation)\n .rotate(BoneName.SPINE_UPPER, 0, -0.44, 0) // 0°, -25°, 0° (maximum redirection)\n .rotate(BoneName.SHOULDER_L, 0.52, 0.61, -0.31) // 30°, 35°, -18° (maximum control)\n .rotate(BoneName.SHOULDER_R, 0.44, -0.26, 0.21) // 25°, -15°, 12° (both hands control)\n .rotate(BoneName.ELBOW_L, 0, 0.35, -1.22) // 0°, 20°, -70° (full circle)\n .rotate(BoneName.ELBOW_R, 0, 0.17, 0.87) // 0°, 10°, -50° (support engaged)\n .rotate(BoneName.WRIST_L, 0.21, 0.12, -0.40) // Maximum control position\n .rotate(BoneName.WRIST_R, 0.14, -0.09, 0.17)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // Stable base\n .rotate(BoneName.KNEE_R, -0.35, 0, 0)\n .position(BoneName.PELVIS, -0.06, -0.01, -0.04) // Maximum circular position\n .done<MartialArtsAnimationBuilder>()\n \n // ═══════════════════════════════════════════════════════════════════════\n // COUNTER PHASE (반격 단계) - 950-1400ms, frames 17-24\n // Flow into counter using opponent's redirected momentum\n // ═══════════════════════════════════════════════════════════════════════\n \n // Frame 20 (1150ms): Begin counter flow\n .at(1.15)\n .rotate(BoneName.PELVIS, 0, 0.17, 0.09) // 0°, 10°, 5° (reverse to counter)\n .rotate(BoneName.SPINE_UPPER, 0, 0.17, 0) // 0°, 10°, 0° (flow into counter)\n .rotate(BoneName.SHOULDER_L, 0.61, 0.35, -0.17) // 35°, 20°, -10° (push motion)\n .rotate(BoneName.SHOULDER_R, 0.70, -0.35, 0.14) // 40°, -20°, 8° (pull motion)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.52) // -30° (extending for counter)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.44) // -25° (pulling for counter)\n .rotate(BoneName.WRIST_L, 0.14, 0.05, -0.17) // Push/control position\n .rotate(BoneName.WRIST_R, 0.12, -0.07, 0.14)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° (legs drive counter)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15°\n .position(BoneName.PELVIS, -0.03, 0, -0.02) // Return toward center\n .done<MartialArtsAnimationBuilder>()\n \n // Frame 24 (1400ms): Complete counter - opponent off-balance/down\n .at(1.4)\n .rotate(BoneName.PELVIS, 0, 0.314, 0.105) // 0°, ~18°, ~6° (full counter rotation)\n .rotate(BoneName.SPINE_UPPER, 0, 0.35, 0) // 0°, 20°, 0° (complete counter)\n .rotate(BoneName.SHOULDER_L, 0.70, 0.26, -0.14) // 40°, 15°, -8° (counter complete)\n .rotate(BoneName.SHOULDER_R, 0.79, -0.314, 0.17) // 45°, ~-18°, 10° (control maintained)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.44) // -25° (arms control opponent)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.35) // -20°\n .rotate(BoneName.WRIST_L, 0.17, 0.07, -0.12) // Control grip applied\n .rotate(BoneName.WRIST_R, 0.14, -0.09, 0.17)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable finish)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20°\n .position(BoneName.PELVIS, 0, 0, 0) // Return to center\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☵ GAM FLOWING TAKEDOWN (흐르는 넘어뜨리기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gam Flowing Takedown Animation\n *\n * **Korean**: 수류 넘어뜨리기 (Suryu Neomeotteurigi) - Water Flow Takedown\n * **Technique**: Blend, off-balance, flowing takedown using minimum force\n *\n * This technique demonstrates water's ability to overcome through adaptation:\n * - Blend with opponent's movement (no resistance)\n * - Subtle shift to break balance (minimal force)\n * - Flowing takedown following natural gravity\n *\n * Animation Phases (Total: 1517ms):\n * - Blend Phase (0-444ms): Match opponent's movement\n * - Off-Balance Phase (444-889ms): Subtle balance disruption\n * - Takedown Phase (889-1517ms): Flowing descent to ground\n *\n * Biomechanics:\n * - Blend: Arms wrap and match movement, spine neutral\n * - Off-balance: Small hip shift (-3°), opponent's structure compromised\n * - Takedown: Controlled descent, maintaining contact throughout\n *\n * @korean 수류넘어뜨리기\n * @duration 1517ms (blend 444ms + off-balance 445ms + takedown 628ms)\n * @category Throw Animation\n */\nexport const GAM_FLOWING_TAKEDOWN: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"gam_flowing_takedown\",\n \"수류 넘어뜨리기\"\n )\n .asAttack(1.517)\n \n // ═══════════════════════════════════════════════════════════════════════\n // BLEND PHASE (혼합 단계) - 0-444ms, frames 0-8\n // Match opponent's movement with no resistance\n // ═══════════════════════════════════════════════════════════════════════\n \n // Frame 0: Initial contact and blend entry\n .at(0)\n .rotate(BoneName.PELVIS, 0, -0.09, 0) // 0°, -5°, 0° (slight angle to opponent)\n .rotate(BoneName.SPINE_UPPER, 0, -0.05, 0) // Neutral, ready to blend\n .rotate(BoneName.SHOULDER_L, 0.26, 0.44, -0.09) // 15°, 25°, -5° (reaching for contact)\n .rotate(BoneName.SHOULDER_R, 0.17, -0.26, 0.14) // Mirror position\n .rotate(BoneName.ELBOW_L, 0, 0, -0.87) // -50° (arms extending to wrap)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.87) // -50°\n .rotate(BoneName.WRIST_L, 0, 0.09, -0.09) // Hands open for contact\n .rotate(BoneName.WRIST_R, 0, -0.09, 0.09)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n \n // Frame 8 (444ms): Full blend - matching opponent's movement\n .at(0.444)\n .rotate(BoneName.PELVIS, 0, -0.14, 0) // 0°, -8°, 0° (blended angle)\n .rotate(BoneName.SPINE_UPPER, 0, -0.09, 0) // 0°, -5°, 0° (follow opponent)\n .rotate(BoneName.SHOULDER_L, 0.35, 0.52, -0.14) // 20°, 30°, -8° (wrapped position)\n .rotate(BoneName.SHOULDER_R, 0.26, -0.35, 0.17) // Both arms engaged\n .rotate(BoneName.ELBOW_L, 0, 0.14, -1.05) // 0°, 8°, -60° (wrap complete)\n .rotate(BoneName.ELBOW_R, 0, -0.14, 1.05) // Mirror wrap\n .rotate(BoneName.WRIST_L, 0.09, 0.17, -0.14) // Hands in contact\n .rotate(BoneName.WRIST_R, 0.09, -0.17, 0.14)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable base)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15°\n .position(BoneName.PELVIS, -0.02, 0, -0.01) // Slight movement with opponent\n .done<MartialArtsAnimationBuilder>()\n \n // ═══════════════════════════════════════════════════════════════════════\n // OFF-BALANCE PHASE (균형 붕괴) - 444-889ms, frames 9-16\n // Subtle shifts to break opponent's structure\n // ═══════════════════════════════════════════════════════════════════════\n \n // Frame 12 (667ms): Begin off-balancing motion\n .at(0.667)\n .rotate(BoneName.PELVIS, -0.03, -0.17, -0.05) // -2°, -10°, -3° (subtle shift)\n .rotate(BoneName.SPINE_UPPER, -0.05, -0.12, 0) // -3°, -7°, 0° (begin break)\n .rotate(BoneName.SHOULDER_L, 0.44, 0.61, -0.17) // 25°, 35°, -10° (control tightens)\n .rotate(BoneName.SHOULDER_R, 0.35, -0.44, 0.21) // Opposite pressure\n .rotate(BoneName.ELBOW_L, 0, 0.21, -1.14) // 0°, 12°, -65° (leverage applied)\n .rotate(BoneName.ELBOW_R, 0, -0.21, 1.14)\n .rotate(BoneName.WRIST_L, 0.12, 0.21, -0.17) // Control grip\n .rotate(BoneName.WRIST_R, 0.12, -0.21, 0.17)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° (legs drive)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15°\n .position(BoneName.PELVIS, -0.04, -0.01, -0.02) // Shift for off-balance\n .done<MartialArtsAnimationBuilder>()\n \n // Frame 16 (889ms): Opponent's balance fully compromised\n .at(0.889)\n .rotate(BoneName.PELVIS, -0.05, -0.21, -0.07) // -3°, -12°, -4° (maximum shift)\n .rotate(BoneName.SPINE_UPPER, -0.09, -0.17, 0) // -5°, -10°, 0° (structure broken)\n .rotate(BoneName.SHOULDER_L, 0.52, 0.70, -0.21) // 30°, 40°, -12° (full control)\n .rotate(BoneName.SHOULDER_R, 0.44, -0.52, 0.26) // Maximum leverage\n .rotate(BoneName.ELBOW_L, 0, 0.26, -1.22) // 0°, 15°, -70° (maximum leverage)\n .rotate(BoneName.ELBOW_R, 0, -0.26, 1.22)\n .rotate(BoneName.WRIST_L, 0.14, 0.26, -0.21) // Tight control\n .rotate(BoneName.WRIST_R, 0.14, -0.26, 0.21)\n .rotate(BoneName.KNEE_L, -0.44, 0, 0) // -25° (deep bend for takedown)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20°\n .position(BoneName.PELVIS, -0.05, -0.02, -0.03) // Maximum off-balance position\n .done<MartialArtsAnimationBuilder>()\n \n // ═══════════════════════════════════════════════════════════════════════\n // TAKEDOWN PHASE (넘어뜨리기) - 889-1517ms, frames 17-26\n // Flowing descent to ground with opponent\n // ═══════════════════════════════════════════════════════════════════════\n \n // Frame 21 (1167ms): Mid-takedown - descending together\n .at(1.167)\n .rotate(BoneName.PELVIS, -0.12, -0.26, -0.09) // -7°, -15°, -5° (descending)\n .rotate(BoneName.SPINE_UPPER, -0.17, -0.21, 0) // -10°, -12°, 0° (following down)\n .rotate(BoneName.SHOULDER_L, 0.61, 0.79, -0.26) // 35°, 45°, -15° (maintain control)\n .rotate(BoneName.SHOULDER_R, 0.52, -0.61, 0.31) // Control throughout\n .rotate(BoneName.ELBOW_L, 0, 0.31, -1.31) // 0°, 18°, -75° (arms follow)\n .rotate(BoneName.ELBOW_R, 0, -0.31, 1.31)\n .rotate(BoneName.WRIST_L, 0.17, 0.31, -0.26) // Maintain contact\n .rotate(BoneName.WRIST_R, 0.17, -0.31, 0.26)\n .rotate(BoneName.KNEE_L, -0.70, 0, 0) // -40° (deep descent)\n .rotate(BoneName.KNEE_R, -0.61, 0, 0) // -35°\n .position(BoneName.PELVIS, -0.06, -0.10, -0.05) // Descending with opponent\n .done<MartialArtsAnimationBuilder>()\n \n // Frame 26 (1517ms): Takedown complete - opponent on ground\n .at(1.517)\n .rotate(BoneName.PELVIS, -0.17, -0.31, -0.12) // -10°, -18°, -7° (ground position)\n .rotate(BoneName.SPINE_UPPER, -0.26, -0.26, 0) // -15°, -15°, 0° (control maintained)\n .rotate(BoneName.SHOULDER_L, 0.70, 0.87, -0.31) // 40°, 50°, -18° (final control)\n .rotate(BoneName.SHOULDER_R, 0.61, -0.70, 0.35) // Control established\n .rotate(BoneName.ELBOW_L, 0, 0.35, -1.40) // 0°, 20°, -80° (pinning position)\n .rotate(BoneName.ELBOW_R, 0, -0.35, 1.40)\n .rotate(BoneName.WRIST_L, 0.21, 0.35, -0.31) // Ground control\n .rotate(BoneName.WRIST_R, 0.21, -0.35, 0.31)\n .rotate(BoneName.KNEE_L, -0.87, 0, 0) // -50° (kneeling position)\n .rotate(BoneName.KNEE_R, -0.79, 0, 0) // -45°\n .position(BoneName.PELVIS, -0.07, -0.20, -0.06) // Final ground position\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// EXPORTS\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * All Gam technique combat animations\n */\nexport const GAM_TECHNIQUE_ANIMATIONS = {\n counter: GAM_WATER_FLOW_COUNTER_ANIMATION,\n takedown: GAM_FLOWING_TAKEDOWN,\n} as const;\n"],"mappings":"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"}
1
+ {"version":3,"file":"GamTechniqueAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/GamTechniqueAnimations.ts"],"sourcesContent":["/**\n * ☵ Gam (Water) Technique Combat Animations\n *\n * Advanced combat technique animations for the Gam (감/Water) trigram focusing on\n * adaptive counters, flowing redirection, and takedown techniques from Hapkido.\n *\n * **Korean Martial Arts Context:**\n * - **기술 유형**: 반격 기술 (Counter Techniques), 넘어뜨리기 (Takedowns)\n * - **원리**: 적응과 흐름 (Adaptation and Flow), 상대의 힘 이용 (Using Opponent's Force)\n * - **철학**: 물처럼 흘러 적의 힘을 이용하라 (Flow like water and use enemy's force)\n *\n * Technique Categories:\n * - **수류반격** (Water Flow Counter) - Receive, redirect, counter sequence\n * - **흐르는 넘어뜨리기** (Flowing Takedown) - Blend, off-balance, takedown\n *\n * @module systems/animation/catalogs/GamTechniqueAnimations\n * @category Animation\n * @korean 감괘기술애니메이션\n */\n\nimport { BoneName } from \"@/types/skeletal\";\nimport type { SkeletalAnimation } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☵ GAM WATER FLOW COUNTER (수류반격)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gam Water Flow Counter Animation\n *\n * **Korean**: 수류반격 (Suryu Bangyeok)\n * **Technique**: Yielding redirection into flowing counter\n * **Target Points**: Balance disruption, blood flow restriction\n *\n * This is the signature Gam technique demonstrating complete water philosophy:\n * - Accept opponent's force with yielding motion (receive)\n * - Guide force in circular path away from center (redirect)\n * - Flow into takedown or strike with opponent's momentum (counter)\n * - Return to adaptive guard maintaining contact (recovery)\n *\n * Animation Phases (Total: 1400ms):\n * - Receive Phase (0-350ms): Accept incoming attack with yield\n * - Redirect Phase (350-950ms): Circular redirection of force\n * - Counter Phase (950-1400ms): Flow into counter with opponent's momentum\n *\n * Biomechanics:\n * - Initial yield: Spine rotates away (-20°), hips shift (-5°)\n * - Redirection: Maximum spine rotation (-25°), arms guide in circle\n * - Counter: Spine reverses (+20°), both hands push/pull\n *\n * @korean 수류반격\n * @duration 1400ms (receive 350ms + redirect 600ms + counter 450ms)\n * @category Counter Animation\n */\nexport const GAM_WATER_FLOW_COUNTER_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"gam_water_flow_counter\",\n \"수류반격\"\n )\n .asAttack(1.4)\n \n // ═══════════════════════════════════════════════════════════════════════\n // RECEIVE PHASE (수용 단계) - 0-350ms, frames 0-6\n // Accept opponent's attack with yielding motion\n // ═══════════════════════════════════════════════════════════════════════\n \n // Frame 0: Guard position, receiving incoming attack\n .at(0)\n .rotate(BoneName.PELVIS, 0, 0, 0) // Neutral pelvis\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0) // Upright spine\n .rotate(BoneName.SHOULDER_L, 0.17, 0.26, -0.17) // ~10°, ~15°, ~-10° (receiving position)\n .rotate(BoneName.SHOULDER_R, 0.09, -0.14, 0.17) // Ready to yield\n .rotate(BoneName.ELBOW_L, 0, 0, -0.70) // -40° (arm extended to receive)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.52) // -30° (support position)\n .rotate(BoneName.WRIST_L, 0, 0, -0.17) // Palm open to receive\n .rotate(BoneName.WRIST_R, 0, 0, 0) // Neutral\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n \n // Frame 6 (350ms): Maximum yield - accept force\n .at(0.35)\n .rotate(BoneName.PELVIS, 0, -0.14, -0.05) // 0°, -8°, -3° (weight shifts away)\n .rotate(BoneName.SPINE_UPPER, 0, -0.17, 0) // 0°, ~-10°, 0° (spine yields away)\n .rotate(BoneName.SHOULDER_L, 0.26, 0.35, -0.21) // 15°, 20°, -12° (accept force)\n .rotate(BoneName.SHOULDER_R, 0.12, -0.17, 0.21) // Supporting position\n .rotate(BoneName.ELBOW_L, 0, 0, -0.87) // -50° (arm absorbs)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.70) // -40° (support absorbs)\n .rotate(BoneName.WRIST_L, 0.09, 0, -0.26) // 5°, 0°, -15° (palm guides)\n .rotate(BoneName.WRIST_R, 0.05, 0, 0.09) // Slight adjustment\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° (legs absorb)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15°\n .position(BoneName.PELVIS, -0.03, -0.01, -0.02) // Slight yield back\n .done<MartialArtsAnimationBuilder>()\n \n // ═══════════════════════════════════════════════════════════════════════\n // REDIRECT PHASE (전환 단계) - 350-950ms, frames 7-16\n // Circular redirection of opponent's force\n // ═══════════════════════════════════════════════════════════════════════\n \n // Frame 11 (650ms): Begin circular redirection\n .at(0.65)\n .rotate(BoneName.PELVIS, 0, -0.26, -0.09) // 0°, -15°, -5° (circular motion begins)\n .rotate(BoneName.SPINE_UPPER, 0, -0.35, 0) // 0°, -20°, 0° (circular redirection)\n .rotate(BoneName.SHOULDER_L, 0.44, 0.52, -0.26) // 25°, 30°, -15° (guide in circle)\n .rotate(BoneName.SHOULDER_R, 0.35, -0.17, 0.17) // 20°, -10°, 10° (right hand joins)\n .rotate(BoneName.ELBOW_L, 0, 0.26, -1.05) // 0°, 15°, -60° (circular control)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.70) // -40° (support control)\n .rotate(BoneName.WRIST_L, 0.17, 0.09, -0.35) // 10°, 5°, -20° (palm controls)\n .rotate(BoneName.WRIST_R, 0.09, -0.05, 0.14) // Guiding motion\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (legs stable)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20°\n .position(BoneName.PELVIS, -0.05, -0.01, -0.03) // Continue circular path\n .done<MartialArtsAnimationBuilder>()\n \n // Frame 16 (950ms): Maximum redirection - force fully redirected\n .at(0.95)\n .rotate(BoneName.PELVIS, 0, -0.35, -0.12) // 0°, -20°, -7° (maximum rotation)\n .rotate(BoneName.SPINE_UPPER, 0, -0.44, 0) // 0°, -25°, 0° (maximum redirection)\n .rotate(BoneName.SHOULDER_L, 0.52, 0.61, -0.31) // 30°, 35°, -18° (maximum control)\n .rotate(BoneName.SHOULDER_R, 0.44, -0.26, 0.21) // 25°, -15°, 12° (both hands control)\n .rotate(BoneName.ELBOW_L, 0, 0.35, -1.22) // 0°, 20°, -70° (full circle)\n .rotate(BoneName.ELBOW_R, 0, 0.17, 0.87) // 0°, 10°, -50° (support engaged)\n .rotate(BoneName.WRIST_L, 0.21, 0.12, -0.40) // Maximum control position\n .rotate(BoneName.WRIST_R, 0.14, -0.09, 0.17)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // Stable base\n .rotate(BoneName.KNEE_R, -0.35, 0, 0)\n .position(BoneName.PELVIS, -0.06, -0.01, -0.04) // Maximum circular position\n .done<MartialArtsAnimationBuilder>()\n \n // ═══════════════════════════════════════════════════════════════════════\n // COUNTER PHASE (반격 단계) - 950-1400ms, frames 17-24\n // Flow into counter using opponent's redirected momentum\n // ═══════════════════════════════════════════════════════════════════════\n \n // Frame 20 (1150ms): Begin counter flow\n .at(1.15)\n .rotate(BoneName.PELVIS, 0, 0.17, 0.09) // 0°, 10°, 5° (reverse to counter)\n .rotate(BoneName.SPINE_UPPER, 0, 0.17, 0) // 0°, 10°, 0° (flow into counter)\n .rotate(BoneName.SHOULDER_L, 0.61, 0.35, -0.17) // 35°, 20°, -10° (push motion)\n .rotate(BoneName.SHOULDER_R, 0.70, -0.35, 0.14) // 40°, -20°, 8° (pull motion)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.52) // -30° (extending for counter)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.44) // -25° (pulling for counter)\n .rotate(BoneName.WRIST_L, 0.14, 0.05, -0.17) // Push/control position\n .rotate(BoneName.WRIST_R, 0.12, -0.07, 0.14)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° (legs drive counter)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15°\n .position(BoneName.PELVIS, -0.03, 0, -0.02) // Return toward center\n .done<MartialArtsAnimationBuilder>()\n \n // Frame 24 (1400ms): Complete counter - opponent off-balance/down\n .at(1.4)\n .rotate(BoneName.PELVIS, 0, 0.314, 0.105) // 0°, ~18°, ~6° (full counter rotation)\n .rotate(BoneName.SPINE_UPPER, 0, 0.35, 0) // 0°, 20°, 0° (complete counter)\n .rotate(BoneName.SHOULDER_L, 0.70, 0.26, -0.14) // 40°, 15°, -8° (counter complete)\n .rotate(BoneName.SHOULDER_R, 0.79, -0.314, 0.17) // 45°, ~-18°, 10° (control maintained)\n .rotate(BoneName.ELBOW_L, 0, 0, -0.44) // -25° (arms control opponent)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.35) // -20°\n .rotate(BoneName.WRIST_L, 0.17, 0.07, -0.12) // Control grip applied\n .rotate(BoneName.WRIST_R, 0.14, -0.09, 0.17)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable finish)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20°\n .position(BoneName.PELVIS, 0, 0, 0) // Return to center\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☵ GAM FLOWING TAKEDOWN (흐르는 넘어뜨리기)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gam Flowing Takedown Animation\n *\n * **Korean**: 수류 넘어뜨리기 (Suryu Neomeotteurigi) - Water Flow Takedown\n * **Technique**: Blend, off-balance, flowing takedown using minimum force\n *\n * This technique demonstrates water's ability to overcome through adaptation:\n * - Blend with opponent's movement (no resistance)\n * - Subtle shift to break balance (minimal force)\n * - Flowing takedown following natural gravity\n *\n * Animation Phases (Total: 1517ms):\n * - Blend Phase (0-444ms): Match opponent's movement\n * - Off-Balance Phase (444-889ms): Subtle balance disruption\n * - Takedown Phase (889-1517ms): Flowing descent to ground\n *\n * Biomechanics:\n * - Blend: Arms wrap and match movement, spine neutral\n * - Off-balance: Small hip shift (-3°), opponent's structure compromised\n * - Takedown: Controlled descent, maintaining contact throughout\n *\n * @korean 수류넘어뜨리기\n * @duration 1517ms (blend 444ms + off-balance 445ms + takedown 628ms)\n * @category Throw Animation\n */\nexport const GAM_FLOWING_TAKEDOWN: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"gam_flowing_takedown\",\n \"수류 넘어뜨리기\"\n )\n .asAttack(1.517)\n \n // ═══════════════════════════════════════════════════════════════════════\n // BLEND PHASE (혼합 단계) - 0-444ms, frames 0-8\n // Match opponent's movement with no resistance\n // ═══════════════════════════════════════════════════════════════════════\n \n // Frame 0: Initial contact and blend entry\n .at(0)\n .rotate(BoneName.PELVIS, 0, -0.09, 0) // 0°, -5°, 0° (slight angle to opponent)\n .rotate(BoneName.SPINE_UPPER, 0, -0.05, 0) // Neutral, ready to blend\n .rotate(BoneName.SHOULDER_L, 0.26, 0.44, -0.09) // 15°, 25°, -5° (reaching for contact)\n .rotate(BoneName.SHOULDER_R, 0.17, -0.26, 0.14) // Mirror position\n .rotate(BoneName.ELBOW_L, 0, 0, -0.87) // -50° (arms extending to wrap)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.87) // -50°\n .rotate(BoneName.WRIST_L, 0, 0.09, -0.09) // Hands open for contact\n .rotate(BoneName.WRIST_R, 0, -0.09, 0.09)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n \n // Frame 8 (444ms): Full blend - matching opponent's movement\n .at(0.444)\n .rotate(BoneName.PELVIS, 0, -0.14, 0) // 0°, -8°, 0° (blended angle)\n .rotate(BoneName.SPINE_UPPER, 0, -0.09, 0) // 0°, -5°, 0° (follow opponent)\n .rotate(BoneName.SHOULDER_L, 0.35, 0.52, -0.14) // 20°, 30°, -8° (wrapped position)\n .rotate(BoneName.SHOULDER_R, 0.26, -0.35, 0.17) // Both arms engaged\n .rotate(BoneName.ELBOW_L, 0, 0.14, -1.05) // 0°, 8°, -60° (wrap complete)\n .rotate(BoneName.ELBOW_R, 0, -0.14, 1.05) // Mirror wrap\n .rotate(BoneName.WRIST_L, 0.09, 0.17, -0.14) // Hands in contact\n .rotate(BoneName.WRIST_R, 0.09, -0.17, 0.14)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable base)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15°\n .position(BoneName.PELVIS, -0.02, 0, -0.01) // Slight movement with opponent\n .done<MartialArtsAnimationBuilder>()\n \n // ═══════════════════════════════════════════════════════════════════════\n // OFF-BALANCE PHASE (균형 붕괴) - 444-889ms, frames 9-16\n // Subtle shifts to break opponent's structure\n // ═══════════════════════════════════════════════════════════════════════\n \n // Frame 12 (667ms): Begin off-balancing motion\n .at(0.667)\n .rotate(BoneName.PELVIS, -0.03, -0.17, -0.05) // -2°, -10°, -3° (subtle shift)\n .rotate(BoneName.SPINE_UPPER, -0.05, -0.12, 0) // -3°, -7°, 0° (begin break)\n .rotate(BoneName.SHOULDER_L, 0.44, 0.61, -0.17) // 25°, 35°, -10° (control tightens)\n .rotate(BoneName.SHOULDER_R, 0.35, -0.44, 0.21) // Opposite pressure\n .rotate(BoneName.ELBOW_L, 0, 0.21, -1.14) // 0°, 12°, -65° (leverage applied)\n .rotate(BoneName.ELBOW_R, 0, -0.21, 1.14)\n .rotate(BoneName.WRIST_L, 0.12, 0.21, -0.17) // Control grip\n .rotate(BoneName.WRIST_R, 0.12, -0.21, 0.17)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° (legs drive)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15°\n .position(BoneName.PELVIS, -0.04, -0.01, -0.02) // Shift for off-balance\n .done<MartialArtsAnimationBuilder>()\n \n // Frame 16 (889ms): Opponent's balance fully compromised\n .at(0.889)\n .rotate(BoneName.PELVIS, -0.05, -0.21, -0.07) // -3°, -12°, -4° (maximum shift)\n .rotate(BoneName.SPINE_UPPER, -0.09, -0.17, 0) // -5°, -10°, 0° (structure broken)\n .rotate(BoneName.SHOULDER_L, 0.52, 0.70, -0.21) // 30°, 40°, -12° (full control)\n .rotate(BoneName.SHOULDER_R, 0.44, -0.52, 0.26) // Maximum leverage\n .rotate(BoneName.ELBOW_L, 0, 0.26, -1.22) // 0°, 15°, -70° (maximum leverage)\n .rotate(BoneName.ELBOW_R, 0, -0.26, 1.22)\n .rotate(BoneName.WRIST_L, 0.14, 0.26, -0.21) // Tight control\n .rotate(BoneName.WRIST_R, 0.14, -0.26, 0.21)\n .rotate(BoneName.KNEE_L, -0.44, 0, 0) // -25° (deep bend for takedown)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20°\n .position(BoneName.PELVIS, -0.05, -0.02, -0.03) // Maximum off-balance position\n .done<MartialArtsAnimationBuilder>()\n \n // ═══════════════════════════════════════════════════════════════════════\n // TAKEDOWN PHASE (넘어뜨리기) - 889-1517ms, frames 17-26\n // Flowing descent to ground with opponent\n // ═══════════════════════════════════════════════════════════════════════\n \n // Frame 21 (1167ms): Mid-takedown - descending together\n .at(1.167)\n .rotate(BoneName.PELVIS, -0.12, -0.26, -0.09) // -7°, -15°, -5° (descending)\n .rotate(BoneName.SPINE_UPPER, -0.17, -0.21, 0) // -10°, -12°, 0° (following down)\n .rotate(BoneName.SHOULDER_L, 0.61, 0.79, -0.26) // 35°, 45°, -15° (maintain control)\n .rotate(BoneName.SHOULDER_R, 0.52, -0.61, 0.31) // Control throughout\n .rotate(BoneName.ELBOW_L, 0, 0.31, -1.31) // 0°, 18°, -75° (arms follow)\n .rotate(BoneName.ELBOW_R, 0, -0.31, 1.31)\n .rotate(BoneName.WRIST_L, 0.17, 0.31, -0.26) // Maintain contact\n .rotate(BoneName.WRIST_R, 0.17, -0.31, 0.26)\n .rotate(BoneName.KNEE_L, -0.70, 0, 0) // -40° (deep descent)\n .rotate(BoneName.KNEE_R, -0.61, 0, 0) // -35°\n .position(BoneName.PELVIS, -0.06, -0.10, -0.05) // Descending with opponent\n .done<MartialArtsAnimationBuilder>()\n \n // Frame 26 (1517ms): Takedown complete - opponent on ground\n .at(1.517)\n .rotate(BoneName.PELVIS, -0.17, -0.31, -0.12) // -10°, -18°, -7° (ground position)\n .rotate(BoneName.SPINE_UPPER, -0.26, -0.26, 0) // -15°, -15°, 0° (control maintained)\n .rotate(BoneName.SHOULDER_L, 0.70, 0.87, -0.31) // 40°, 50°, -18° (final control)\n .rotate(BoneName.SHOULDER_R, 0.61, -0.70, 0.35) // Control established\n .rotate(BoneName.ELBOW_L, 0, 0.35, -1.40) // 0°, 20°, -80° (pinning position)\n .rotate(BoneName.ELBOW_R, 0, -0.35, 1.40)\n .rotate(BoneName.WRIST_L, 0.21, 0.35, -0.31) // Ground control\n .rotate(BoneName.WRIST_R, 0.21, -0.35, 0.31)\n .rotate(BoneName.KNEE_L, -0.87, 0, 0) // -50° (kneeling position)\n .rotate(BoneName.KNEE_R, -0.79, 0, 0) // -45°\n .position(BoneName.PELVIS, -0.07, -0.20, -0.06) // Final ground position\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// EXPORTS\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * All Gam technique combat animations\n */\nexport const GAM_TECHNIQUE_ANIMATIONS = {\n counter: GAM_WATER_FLOW_COUNTER_ANIMATION,\n takedown: GAM_FLOWING_TAKEDOWN,\n} as const;\n"],"mappings":"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"}
@@ -121,7 +121,7 @@ var GAN_HIGH_SOLID_GUARD_TRANSITION = MartialArtsAnimationBuilder.create("gan_hi
121
121
  * Map of all Gan stance-specific animations for easy access
122
122
  * @korean 간괘자세애니메이션맵
123
123
  */
124
- var GAN_STANCE_ANIMATIONS = new Map([
124
+ var GAN_STANCE_ANIMATIONS = /* @__PURE__ */ new Map([
125
125
  ["gan_idle_rooted", GAN_IDLE_ROOTED],
126
126
  ["gan_short_root_step", GAN_SHORT_ROOT_STEP],
127
127
  ["gan_defensive_angle_shift", GAN_DEFENSIVE_ANGLE_SHIFT],
@@ -1 +1 @@
1
- {"version":3,"file":"GanStanceAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/GanStanceAnimations.ts"],"sourcesContent":["/**\n * ☶ Gan (Mountain) Stance-Specific Animations\n *\n * Specialized idle, movement, and guard animations for the Gan (간/Mountain) trigram.\n * Embodies immovable defense and patient counter from Hapkido defensive techniques.\n *\n * **Korean Martial Arts Context:**\n * - **무술**: 합기도 방어 기술 (Hapkido Defensive Blocks)\n * - **특성**: 부동의 방어 (Immovable Defense), 반격 기술 (Counter Techniques)\n * - **철학**: 산의 불변성 (Mountain's Immutability), 바위의 견고함 (Rock's Solidity)\n * - **대표 기술**: 반석방어 (Rock Defense/Immovable Counter)\n *\n * @module systems/animation/catalogs/GanStanceAnimations\n * @category Animation\n * @korean 간괘자세애니메이션\n */\n\nimport { BoneName, type SkeletalAnimation } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\n\n// Import Gan Mountain defensive techniques (간괘 방어 기술)\nimport {\n GAN_ROCK_DEFENSE_ANIMATION,\n GAN_DEFENSIVE_REVERSAL,\n} from \"./GanTechniqueAnimations\";\n\n/**\n * Anatomical safety constants for Gan (Mountain) trigram animations\n *\n * These limits document safe physiological ranges for Korean martial arts movements.\n * The constants serve as reference documentation validated by Korean martial arts experts\n * and inform the design of all Gan animations to ensure realistic, safe joint mechanics.\n *\n * Note: These are documentation constants. The actual animation rotations are designed\n * to stay well within these limits naturally through authentic Hapkido defensive biomechanics.\n */\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☶ GAN IDLE ROOTED ANIMATION (간괘 뿌리 자세)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gan Idle Rooted Animation\n *\n * **Korean**: 간괘 뿌리 자세 (Gan-gwae Ppuri Jase)\n * **Philosophy**: Mountain's immovability through rooted stillness\n *\n * Characteristics:\n * - Minimal movement emphasizing stability (산의 고요)\n * - Deep breathing without upper body motion\n * - Weight grounded through entire stance\n * - High solid guard position maintained\n *\n * Animation Cycle:\n * - 0ms: Rooted neutral position\n * - 1600ms: Deep breath (minimal chest expansion)\n * - 3200ms: Return to start (complete cycle)\n *\n * @korean 간괘뿌리자세\n * @duration 3200ms (3.2 second cycle)\n * @category Idle Animation\n */\nexport const GAN_IDLE_ROOTED: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"gan_idle_rooted\",\n \"간괘 뿌리 자세\"\n )\n .asIdle(3.2, true)\n // Keyframe 0ms: Rooted neutral position (baseline)\n .at(0)\n .rotate(BoneName.PELVIS, 0, 0, 0) // Neutral pelvis - immovable\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0) // Neutral spine - solid\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0) // Lower spine stable\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° bent for stability\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° bent for stability\n .rotate(BoneName.SHOULDER_L, -0.35, 0, -0.44) // -20°, 0°, -25° (high guard)\n .rotate(BoneName.SHOULDER_R, -0.35, 0, 0.44) // -20°, 0°, 25° (high guard)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.92) // -110° (reinforced structure)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.92) // 110° (reinforced structure)\n .rotate(BoneName.WRIST_L, 0, 0, 0) // Neutral wrists\n .rotate(BoneName.WRIST_R, 0, 0, 0)\n .rotate(BoneName.HEAD, 0, 0, 0) // Head steady, focused\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Keyframe 1600ms: Deep breath (minimal movement - mountain stillness)\n .at(1.6)\n .rotate(BoneName.SPINE_UPPER, -0.017, 0, 0) // -1° (tiny chest expansion)\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0) // Lower spine remains stable\n .rotate(BoneName.SHOULDER_L, -0.366, 0, -0.453) // -21°, 0°, -26° (slight shoulder adjustment)\n .rotate(BoneName.SHOULDER_R, -0.366, 0, 0.453) // -21°, 0°, 26°\n .rotate(BoneName.ELBOW_L, 0, 0, -1.92) // -110° (maintained guard structure)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.92) // 110° (maintained guard structure)\n .rotate(BoneName.WRIST_L, 0, 0, 0) // Wrists remain neutral\n .rotate(BoneName.WRIST_R, 0, 0, 0)\n .rotate(BoneName.KNEE_L, -0.279, 0, 0) // -16° (slightly deeper root)\n .rotate(BoneName.KNEE_R, -0.279, 0, 0) // -16°\n .rotate(BoneName.HEAD, 0, 0, 0) // Head steady - mountain focus\n .position(BoneName.PELVIS, 0, 0, 0) // No movement - mountain doesn't shift\n .done<MartialArtsAnimationBuilder>()\n // Keyframe 3200ms: Return to start (complete cycle)\n .at(3.2)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0) // Stable lower spine\n .rotate(BoneName.SHOULDER_L, -0.35, 0, -0.44)\n .rotate(BoneName.SHOULDER_R, -0.35, 0, 0.44)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.92) // -110° (guard restored)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.92) // 110° (guard restored)\n .rotate(BoneName.WRIST_L, 0, 0, 0) // Neutral wrists\n .rotate(BoneName.WRIST_R, 0, 0, 0)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0)\n .rotate(BoneName.HEAD, 0, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☶ GAN SHORT ROOT STEP (산의 걸음)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gan Short Root Step Animation\n *\n * **Korean**: 산의 걸음 (San-ui Georeum) - Mountain's Walk\n * **Technique**: Minimal forward movement maintaining root\n *\n * Characteristics:\n * - Each step reinforces stability (no excess motion)\n * - Weight stays low and grounded\n * - Guard remains solid throughout\n * - No compromise to balance\n *\n * Animation Phases:\n * - 0-133ms: Weight shift preparation (frames 0-2)\n * - 133-267ms: Minimal forward step (frames 3-5)\n * - 267-400ms: Root reinforcement (frames 6-8)\n *\n * @korean 산의걸음\n * @frames 9 frames (~44ms per frame at 60fps)\n * @duration 400ms\n * @category Movement Animation\n */\nexport const GAN_SHORT_ROOT_STEP: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"gan_short_root_step\",\n \"산의 걸음\"\n )\n .asMovement(0.4, false)\n // Phase 1: Weight shift preparation (0ms, frame 0)\n .at(0)\n .rotate(BoneName.PELVIS, 0.087, 0, 0) // 5° forward tilt (minimal)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20° rear leg prepares\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° front leg ready\n .rotate(BoneName.FOOT_L, 0, 0, 0) // Front foot flat\n .rotate(BoneName.FOOT_R, 0.087, 0, 0) // 5° rear foot prepares to push\n .rotate(BoneName.SHOULDER_L, -0.35, 0, -0.44) // Guard maintained\n .rotate(BoneName.SHOULDER_R, -0.35, 0, 0.44)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.92)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.92)\n .rotate(BoneName.HEAD, 0.052, 0, 0) // 3° head slightly forward (aware)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Minimal forward step (200ms, frame 5)\n .at(0.2)\n .rotate(BoneName.PELVIS, 0.105, 0, 0) // 6° slight forward\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° extending\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° absorbing weight\n .rotate(BoneName.FOOT_L, -0.052, 0, 0) // -3° foot plants\n .rotate(BoneName.FOOT_R, 0.174, 0, 0) // 10° rear foot pushes off\n .rotate(BoneName.SHOULDER_L, -0.35, 0, -0.44) // Guard solid\n .rotate(BoneName.SHOULDER_R, -0.35, 0, 0.44)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.92) // -110° (maintained)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.92) // 110° (maintained)\n .rotate(BoneName.HEAD, 0.052, 0, 0) // 3° head tracks forward\n .position(BoneName.PELVIS, 0, 0, 0.15) // Minimal forward movement\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Root reinforcement (400ms, frame 9)\n .at(0.4)\n .rotate(BoneName.PELVIS, 0, 0, 0) // Return to neutral\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° rooted\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° rooted\n .rotate(BoneName.FOOT_L, 0, 0, 0) // Front foot grounded\n .rotate(BoneName.FOOT_R, 0, 0, 0) // Rear foot settled\n .rotate(BoneName.SHOULDER_L, -0.35, 0, -0.44) // Guard maintained\n .rotate(BoneName.SHOULDER_R, -0.35, 0, 0.44)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.92)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.92)\n .rotate(BoneName.HEAD, 0, 0, 0) // Head returns to neutral focus\n .position(BoneName.PELVIS, 0, 0, 0.25) // Short step complete\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☶ GAN DEFENSIVE ANGLE SHIFT (방어 각도 전환)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gan Defensive Angle Shift Animation\n *\n * **Korean**: 방어 각도 전환 (Bangeo Gakdo Jeonhwan) - Defensive Angle Transition\n * **Technique**: Small angle change for better defensive position\n *\n * Characteristics:\n * - Pivot on one foot maintaining stability\n * - Guard remains solid throughout\n * - No compromise to balance\n * - Repositions for optimal counter angle\n *\n * Animation Phases:\n * - 0-167ms: Begin pivot (frames 0-3)\n * - 167-367ms: Angle rotation (frames 4-7)\n * - 367-500ms: Settle and root (frames 8-10)\n *\n * @korean 방어각도전환\n * @frames 11 frames (~45ms per frame at 60fps)\n * @duration 500ms\n * @category Movement Animation\n */\nexport const GAN_DEFENSIVE_ANGLE_SHIFT: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"gan_defensive_angle_shift\",\n \"방어 각도 전환\"\n )\n .asMovement(0.5, false)\n // Phase 1: Begin pivot (0ms, frame 0)\n .at(0)\n .rotate(BoneName.PELVIS, 0, -0.174, 0) // 0°, -10° (begin rotation)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° (pivot foot loads)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (support foot stable)\n .rotate(BoneName.FOOT_L, 0, -0.087, 0) // 0°, -5° (beginning pivot)\n .rotate(BoneName.FOOT_R, 0, 0, 0) // Support foot flat\n .rotate(BoneName.SHOULDER_L, -0.35, 0, -0.44) // Guard maintained\n .rotate(BoneName.SHOULDER_R, -0.35, 0, 0.44)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.92)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.92)\n .rotate(BoneName.HEAD, 0, -0.087, 0) // 0°, -5° (head begins tracking)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Angle rotation (267ms, frame 6)\n .at(0.267)\n .rotate(BoneName.PELVIS, 0, -0.349, 0) // 0°, -20° (maximum rotation)\n .rotate(BoneName.SPINE_LOWER, 0, -0.262, 0) // 0°, -15° (torso follows)\n .rotate(BoneName.SPINE_UPPER, 0, -0.174, 0) // 0°, -10° (upper body stable)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° (pivot foot)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (support foot)\n .rotate(BoneName.FOOT_L, 0, -0.262, 0) // 0°, -15° (pivot complete)\n .rotate(BoneName.FOOT_R, 0, 0.052, 0) // 0°, 3° (support adjusts)\n .rotate(BoneName.HEAD, 0, -0.174, 0) // 0°, -10° (eyes track forward)\n .rotate(BoneName.SHOULDER_L, -0.35, 0, -0.44) // Guard maintained\n .rotate(BoneName.SHOULDER_R, -0.35, 0, 0.44)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.92) // -110° (maintained)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.92) // 110° (maintained)\n .position(BoneName.PELVIS, -0.05, 0, 0) // Minimal lateral shift\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Settle and root (500ms, frame 11)\n .at(0.5)\n .rotate(BoneName.PELVIS, 0, -0.349, 0) // 0°, -20° (settled angle)\n .rotate(BoneName.SPINE_LOWER, 0, -0.262, 0) // 0°, -15°\n .rotate(BoneName.SPINE_UPPER, 0, -0.174, 0) // 0°, -10°\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (rooted)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (rooted)\n .rotate(BoneName.FOOT_L, 0, -0.262, 0) // 0°, -15° (planted)\n .rotate(BoneName.FOOT_R, 0, 0, 0) // Support foot flat and stable\n .rotate(BoneName.HEAD, 0, -0.174, 0) // 0°, -10°\n .rotate(BoneName.SHOULDER_L, -0.35, 0, -0.44) // Guard solid\n .rotate(BoneName.SHOULDER_R, -0.35, 0, 0.44)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.92)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.92)\n .position(BoneName.PELVIS, -0.08, 0, 0) // Final position\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☶ GAN HIGH SOLID GUARD TRANSITION (산 방어 전환)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gan High Solid Guard Transition Animation\n *\n * **Korean**: 산 방어 전환 (San Bangeo Jeonhwan) - Mountain Guard Transition\n * **Technique**: Transition into Gan's characteristic high solid guard\n *\n * Characteristics:\n * - High guard protecting head and upper body\n * - Elbows reinforcing structure\n * - Fists positioned for blocking\n * - Stance wide and immovable\n *\n * Animation Phases:\n * - 0-167ms: Begin guard transition\n * - 167-333ms: Establish high solid guard\n *\n * @korean 산방어전환\n * @duration 333ms\n * @category Stance Animation\n */\nexport const GAN_HIGH_SOLID_GUARD_TRANSITION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"gan_high_solid_guard_transition\",\n \"산 방어 전환\"\n )\n .asStance(0.333, false)\n // Phase 1: Begin guard transition (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_L, -0.262, 0, -0.349) // -15°, 0°, -20° (raising)\n .rotate(BoneName.SHOULDER_R, -0.262, 0, 0.349) // -15°, 0°, 20° (raising)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.57) // -90° (transitioning)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.57) // 90° (transitioning)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0) // Neutral upper spine\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0) // Stable lower spine\n .rotate(BoneName.PELVIS, 0, 0, 0) // Neutral pelvis\n .rotate(BoneName.HEAD, 0.052, 0, 0) // 3° head lifts slightly\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Establish high solid guard (333ms)\n .at(0.333)\n .rotate(BoneName.SHOULDER_L, -0.35, 0, -0.44) // -20°, 0°, -25° (Gan high guard)\n .rotate(BoneName.SHOULDER_R, -0.35, 0, 0.44) // -20°, 0°, 25° (Gan high guard)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.92) // -110° (reinforced structure)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.92) // 110° (reinforced structure)\n .rotate(BoneName.WRIST_L, 0, 0, 0) // Neutral wrists for blocking\n .rotate(BoneName.WRIST_R, 0, 0, 0)\n .rotate(BoneName.SPINE_UPPER, -0.035, 0, 0) // -2° slight chest lift for solid structure\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0) // Lower spine stable\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable stance)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (stable stance)\n .rotate(BoneName.HEAD, 0, 0, 0) // Head neutral, focused\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// EXPORTS\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Map of all Gan stance-specific animations for easy access\n * @korean 간괘자세애니메이션맵\n */\nexport const GAN_STANCE_ANIMATIONS: ReadonlyMap<string, SkeletalAnimation> = new Map([\n // Idle & Movement\n [\"gan_idle_rooted\", GAN_IDLE_ROOTED],\n [\"gan_short_root_step\", GAN_SHORT_ROOT_STEP],\n [\"gan_defensive_angle_shift\", GAN_DEFENSIVE_ANGLE_SHIFT],\n \n // Stance Transitions\n [\"gan_high_solid_guard_transition\", GAN_HIGH_SOLID_GUARD_TRANSITION],\n \n // Mountain Defensive Block Techniques (간괘 방어 기술)\n [\"gan_rock_defense_animation\", GAN_ROCK_DEFENSE_ANIMATION],\n [\"gan_defensive_reversal\", GAN_DEFENSIVE_REVERSAL],\n]);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8DA,IAAa,kBACX,4BAA4B,OAC1B,mBACA,UACF,EACG,OAAO,KAAK,IAAI,EAEhB,GAAG,CAAC,EACJ,OAAO,SAAS,QAAQ,GAAG,GAAG,CAAC,EAC/B,OAAO,SAAS,aAAa,GAAG,GAAG,CAAC,EACpC,OAAO,SAAS,aAAa,GAAG,GAAG,CAAC,EACpC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,YAAY,MAAO,GAAG,IAAK,EAC3C,OAAO,SAAS,YAAY,MAAO,GAAG,GAAI,EAC1C,OAAO,SAAS,SAAS,GAAG,GAAG,KAAK,EACpC,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,EACnC,OAAO,SAAS,SAAS,GAAG,GAAG,CAAC,EAChC,OAAO,SAAS,SAAS,GAAG,GAAG,CAAC,EAChC,OAAO,SAAS,MAAM,GAAG,GAAG,CAAC,EAC7B,SAAS,SAAS,QAAQ,GAAG,GAAG,CAAC,EACjC,KAAkC,EAElC,GAAG,GAAG,EACN,OAAO,SAAS,aAAa,OAAQ,GAAG,CAAC,EACzC,OAAO,SAAS,aAAa,GAAG,GAAG,CAAC,EACpC,OAAO,SAAS,YAAY,OAAQ,GAAG,KAAM,EAC7C,OAAO,SAAS,YAAY,OAAQ,GAAG,IAAK,EAC5C,OAAO,SAAS,SAAS,GAAG,GAAG,KAAK,EACpC,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,EACnC,OAAO,SAAS,SAAS,GAAG,GAAG,CAAC,EAChC,OAAO,SAAS,SAAS,GAAG,GAAG,CAAC,EAChC,OAAO,SAAS,QAAQ,OAAQ,GAAG,CAAC,EACpC,OAAO,SAAS,QAAQ,OAAQ,GAAG,CAAC,EACpC,OAAO,SAAS,MAAM,GAAG,GAAG,CAAC,EAC7B,SAAS,SAAS,QAAQ,GAAG,GAAG,CAAC,EACjC,KAAkC,EAElC,GAAG,GAAG,EACN,OAAO,SAAS,aAAa,GAAG,GAAG,CAAC,EACpC,OAAO,SAAS,aAAa,GAAG,GAAG,CAAC,EACpC,OAAO,SAAS,YAAY,MAAO,GAAG,IAAK,EAC3C,OAAO,SAAS,YAAY,MAAO,GAAG,GAAI,EAC1C,OAAO,SAAS,SAAS,GAAG,GAAG,KAAK,EACpC,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,EACnC,OAAO,SAAS,SAAS,GAAG,GAAG,CAAC,EAChC,OAAO,SAAS,SAAS,GAAG,GAAG,CAAC,EAChC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,MAAM,GAAG,GAAG,CAAC,EAC7B,SAAS,SAAS,QAAQ,GAAG,GAAG,CAAC,EACjC,KAAkC,EAClC,MAAM;;;;;;;;;;;;;;;;;;;;;;;AA4BX,IAAa,sBACX,4BAA4B,OAC1B,uBACA,OACF,EACG,WAAW,IAAK,KAAK,EAErB,GAAG,CAAC,EACJ,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,QAAQ,GAAG,GAAG,CAAC,EAC/B,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,YAAY,MAAO,GAAG,IAAK,EAC3C,OAAO,SAAS,YAAY,MAAO,GAAG,GAAI,EAC1C,OAAO,SAAS,SAAS,GAAG,GAAG,KAAK,EACpC,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,EACnC,OAAO,SAAS,MAAM,MAAO,GAAG,CAAC,EACjC,SAAS,SAAS,QAAQ,GAAG,GAAG,CAAC,EACjC,KAAkC,EAElC,GAAG,EAAG,EACN,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,QAAQ,OAAQ,GAAG,CAAC,EACpC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,YAAY,MAAO,GAAG,IAAK,EAC3C,OAAO,SAAS,YAAY,MAAO,GAAG,GAAI,EAC1C,OAAO,SAAS,SAAS,GAAG,GAAG,KAAK,EACpC,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,EACnC,OAAO,SAAS,MAAM,MAAO,GAAG,CAAC,EACjC,SAAS,SAAS,QAAQ,GAAG,GAAG,GAAI,EACpC,KAAkC,EAElC,GAAG,EAAG,EACN,OAAO,SAAS,QAAQ,GAAG,GAAG,CAAC,EAC/B,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,QAAQ,GAAG,GAAG,CAAC,EAC/B,OAAO,SAAS,QAAQ,GAAG,GAAG,CAAC,EAC/B,OAAO,SAAS,YAAY,MAAO,GAAG,IAAK,EAC3C,OAAO,SAAS,YAAY,MAAO,GAAG,GAAI,EAC1C,OAAO,SAAS,SAAS,GAAG,GAAG,KAAK,EACpC,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,EACnC,OAAO,SAAS,MAAM,GAAG,GAAG,CAAC,EAC7B,SAAS,SAAS,QAAQ,GAAG,GAAG,GAAI,EACpC,KAAkC,EAClC,MAAM;;;;;;;;;;;;;;;;;;;;;;;AA4BX,IAAa,4BACX,4BAA4B,OAC1B,6BACA,UACF,EACG,WAAW,IAAK,KAAK,EAErB,GAAG,CAAC,EACJ,OAAO,SAAS,QAAQ,GAAG,OAAQ,CAAC,EACpC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,QAAQ,GAAG,OAAQ,CAAC,EACpC,OAAO,SAAS,QAAQ,GAAG,GAAG,CAAC,EAC/B,OAAO,SAAS,YAAY,MAAO,GAAG,IAAK,EAC3C,OAAO,SAAS,YAAY,MAAO,GAAG,GAAI,EAC1C,OAAO,SAAS,SAAS,GAAG,GAAG,KAAK,EACpC,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,EACnC,OAAO,SAAS,MAAM,GAAG,OAAQ,CAAC,EAClC,SAAS,SAAS,QAAQ,GAAG,GAAG,CAAC,EACjC,KAAkC,EAElC,GAAG,IAAK,EACR,OAAO,SAAS,QAAQ,GAAG,OAAQ,CAAC,EACpC,OAAO,SAAS,aAAa,GAAG,OAAQ,CAAC,EACzC,OAAO,SAAS,aAAa,GAAG,OAAQ,CAAC,EACzC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,QAAQ,GAAG,OAAQ,CAAC,EACpC,OAAO,SAAS,QAAQ,GAAG,MAAO,CAAC,EACnC,OAAO,SAAS,MAAM,GAAG,OAAQ,CAAC,EAClC,OAAO,SAAS,YAAY,MAAO,GAAG,IAAK,EAC3C,OAAO,SAAS,YAAY,MAAO,GAAG,GAAI,EAC1C,OAAO,SAAS,SAAS,GAAG,GAAG,KAAK,EACpC,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,EACnC,SAAS,SAAS,QAAQ,MAAO,GAAG,CAAC,EACrC,KAAkC,EAElC,GAAG,EAAG,EACN,OAAO,SAAS,QAAQ,GAAG,OAAQ,CAAC,EACpC,OAAO,SAAS,aAAa,GAAG,OAAQ,CAAC,EACzC,OAAO,SAAS,aAAa,GAAG,OAAQ,CAAC,EACzC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,QAAQ,GAAG,OAAQ,CAAC,EACpC,OAAO,SAAS,QAAQ,GAAG,GAAG,CAAC,EAC/B,OAAO,SAAS,MAAM,GAAG,OAAQ,CAAC,EAClC,OAAO,SAAS,YAAY,MAAO,GAAG,IAAK,EAC3C,OAAO,SAAS,YAAY,MAAO,GAAG,GAAI,EAC1C,OAAO,SAAS,SAAS,GAAG,GAAG,KAAK,EACpC,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,EACnC,SAAS,SAAS,QAAQ,MAAO,GAAG,CAAC,EACrC,KAAkC,EAClC,MAAM;;;;;;;;;;;;;;;;;;;;;AA0BX,IAAa,kCACX,4BAA4B,OAC1B,mCACA,SACF,EACG,SAAS,MAAO,KAAK,EAErB,GAAG,CAAC,EACJ,OAAO,SAAS,YAAY,OAAQ,GAAG,KAAM,EAC7C,OAAO,SAAS,YAAY,OAAQ,GAAG,IAAK,EAC5C,OAAO,SAAS,SAAS,GAAG,GAAG,KAAK,EACpC,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,EACnC,OAAO,SAAS,aAAa,GAAG,GAAG,CAAC,EACpC,OAAO,SAAS,aAAa,GAAG,GAAG,CAAC,EACpC,OAAO,SAAS,QAAQ,GAAG,GAAG,CAAC,EAC/B,OAAO,SAAS,MAAM,MAAO,GAAG,CAAC,EACjC,SAAS,SAAS,QAAQ,GAAG,GAAG,CAAC,EACjC,KAAkC,EAElC,GAAG,IAAK,EACR,OAAO,SAAS,YAAY,MAAO,GAAG,IAAK,EAC3C,OAAO,SAAS,YAAY,MAAO,GAAG,GAAI,EAC1C,OAAO,SAAS,SAAS,GAAG,GAAG,KAAK,EACpC,OAAO,SAAS,SAAS,GAAG,GAAG,IAAI,EACnC,OAAO,SAAS,SAAS,GAAG,GAAG,CAAC,EAChC,OAAO,SAAS,SAAS,GAAG,GAAG,CAAC,EAChC,OAAO,SAAS,aAAa,OAAQ,GAAG,CAAC,EACzC,OAAO,SAAS,aAAa,GAAG,GAAG,CAAC,EACpC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,QAAQ,MAAO,GAAG,CAAC,EACnC,OAAO,SAAS,MAAM,GAAG,GAAG,CAAC,EAC7B,SAAS,SAAS,QAAQ,GAAG,GAAG,CAAC,EACjC,KAAkC,EAClC,MAAM;;;;;AAUX,IAAa,wBAAgE,IAAI,IAAI;CAEnF,CAAC,mBAAmB,eAAe;CACnC,CAAC,uBAAuB,mBAAmB;CAC3C,CAAC,6BAA6B,yBAAyB;CAGvD,CAAC,mCAAmC,+BAA+B;CAGnE,CAAC,8BAA8B,0BAA0B;CACzD,CAAC,0BAA0B,sBAAsB;AACnD,CAAC"}
1
+ {"version":3,"file":"GanStanceAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/GanStanceAnimations.ts"],"sourcesContent":["/**\n * ☶ Gan (Mountain) Stance-Specific Animations\n *\n * Specialized idle, movement, and guard animations for the Gan (간/Mountain) trigram.\n * Embodies immovable defense and patient counter from Hapkido defensive techniques.\n *\n * **Korean Martial Arts Context:**\n * - **무술**: 합기도 방어 기술 (Hapkido Defensive Blocks)\n * - **특성**: 부동의 방어 (Immovable Defense), 반격 기술 (Counter Techniques)\n * - **철학**: 산의 불변성 (Mountain's Immutability), 바위의 견고함 (Rock's Solidity)\n * - **대표 기술**: 반석방어 (Rock Defense/Immovable Counter)\n *\n * @module systems/animation/catalogs/GanStanceAnimations\n * @category Animation\n * @korean 간괘자세애니메이션\n */\n\nimport { BoneName, type SkeletalAnimation } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\n\n// Import Gan Mountain defensive techniques (간괘 방어 기술)\nimport {\n GAN_ROCK_DEFENSE_ANIMATION,\n GAN_DEFENSIVE_REVERSAL,\n} from \"./GanTechniqueAnimations\";\n\n/**\n * Anatomical safety constants for Gan (Mountain) trigram animations\n *\n * These limits document safe physiological ranges for Korean martial arts movements.\n * The constants serve as reference documentation validated by Korean martial arts experts\n * and inform the design of all Gan animations to ensure realistic, safe joint mechanics.\n *\n * Note: These are documentation constants. The actual animation rotations are designed\n * to stay well within these limits naturally through authentic Hapkido defensive biomechanics.\n */\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☶ GAN IDLE ROOTED ANIMATION (간괘 뿌리 자세)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gan Idle Rooted Animation\n *\n * **Korean**: 간괘 뿌리 자세 (Gan-gwae Ppuri Jase)\n * **Philosophy**: Mountain's immovability through rooted stillness\n *\n * Characteristics:\n * - Minimal movement emphasizing stability (산의 고요)\n * - Deep breathing without upper body motion\n * - Weight grounded through entire stance\n * - High solid guard position maintained\n *\n * Animation Cycle:\n * - 0ms: Rooted neutral position\n * - 1600ms: Deep breath (minimal chest expansion)\n * - 3200ms: Return to start (complete cycle)\n *\n * @korean 간괘뿌리자세\n * @duration 3200ms (3.2 second cycle)\n * @category Idle Animation\n */\nexport const GAN_IDLE_ROOTED: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"gan_idle_rooted\",\n \"간괘 뿌리 자세\"\n )\n .asIdle(3.2, true)\n // Keyframe 0ms: Rooted neutral position (baseline)\n .at(0)\n .rotate(BoneName.PELVIS, 0, 0, 0) // Neutral pelvis - immovable\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0) // Neutral spine - solid\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0) // Lower spine stable\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° bent for stability\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° bent for stability\n .rotate(BoneName.SHOULDER_L, -0.35, 0, -0.44) // -20°, 0°, -25° (high guard)\n .rotate(BoneName.SHOULDER_R, -0.35, 0, 0.44) // -20°, 0°, 25° (high guard)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.92) // -110° (reinforced structure)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.92) // 110° (reinforced structure)\n .rotate(BoneName.WRIST_L, 0, 0, 0) // Neutral wrists\n .rotate(BoneName.WRIST_R, 0, 0, 0)\n .rotate(BoneName.HEAD, 0, 0, 0) // Head steady, focused\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Keyframe 1600ms: Deep breath (minimal movement - mountain stillness)\n .at(1.6)\n .rotate(BoneName.SPINE_UPPER, -0.017, 0, 0) // -1° (tiny chest expansion)\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0) // Lower spine remains stable\n .rotate(BoneName.SHOULDER_L, -0.366, 0, -0.453) // -21°, 0°, -26° (slight shoulder adjustment)\n .rotate(BoneName.SHOULDER_R, -0.366, 0, 0.453) // -21°, 0°, 26°\n .rotate(BoneName.ELBOW_L, 0, 0, -1.92) // -110° (maintained guard structure)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.92) // 110° (maintained guard structure)\n .rotate(BoneName.WRIST_L, 0, 0, 0) // Wrists remain neutral\n .rotate(BoneName.WRIST_R, 0, 0, 0)\n .rotate(BoneName.KNEE_L, -0.279, 0, 0) // -16° (slightly deeper root)\n .rotate(BoneName.KNEE_R, -0.279, 0, 0) // -16°\n .rotate(BoneName.HEAD, 0, 0, 0) // Head steady - mountain focus\n .position(BoneName.PELVIS, 0, 0, 0) // No movement - mountain doesn't shift\n .done<MartialArtsAnimationBuilder>()\n // Keyframe 3200ms: Return to start (complete cycle)\n .at(3.2)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0) // Stable lower spine\n .rotate(BoneName.SHOULDER_L, -0.35, 0, -0.44)\n .rotate(BoneName.SHOULDER_R, -0.35, 0, 0.44)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.92) // -110° (guard restored)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.92) // 110° (guard restored)\n .rotate(BoneName.WRIST_L, 0, 0, 0) // Neutral wrists\n .rotate(BoneName.WRIST_R, 0, 0, 0)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0)\n .rotate(BoneName.HEAD, 0, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☶ GAN SHORT ROOT STEP (산의 걸음)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gan Short Root Step Animation\n *\n * **Korean**: 산의 걸음 (San-ui Georeum) - Mountain's Walk\n * **Technique**: Minimal forward movement maintaining root\n *\n * Characteristics:\n * - Each step reinforces stability (no excess motion)\n * - Weight stays low and grounded\n * - Guard remains solid throughout\n * - No compromise to balance\n *\n * Animation Phases:\n * - 0-133ms: Weight shift preparation (frames 0-2)\n * - 133-267ms: Minimal forward step (frames 3-5)\n * - 267-400ms: Root reinforcement (frames 6-8)\n *\n * @korean 산의걸음\n * @frames 9 frames (~44ms per frame at 60fps)\n * @duration 400ms\n * @category Movement Animation\n */\nexport const GAN_SHORT_ROOT_STEP: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"gan_short_root_step\",\n \"산의 걸음\"\n )\n .asMovement(0.4, false)\n // Phase 1: Weight shift preparation (0ms, frame 0)\n .at(0)\n .rotate(BoneName.PELVIS, 0.087, 0, 0) // 5° forward tilt (minimal)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0) // -20° rear leg prepares\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° front leg ready\n .rotate(BoneName.FOOT_L, 0, 0, 0) // Front foot flat\n .rotate(BoneName.FOOT_R, 0.087, 0, 0) // 5° rear foot prepares to push\n .rotate(BoneName.SHOULDER_L, -0.35, 0, -0.44) // Guard maintained\n .rotate(BoneName.SHOULDER_R, -0.35, 0, 0.44)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.92)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.92)\n .rotate(BoneName.HEAD, 0.052, 0, 0) // 3° head slightly forward (aware)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Minimal forward step (200ms, frame 5)\n .at(0.2)\n .rotate(BoneName.PELVIS, 0.105, 0, 0) // 6° slight forward\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° extending\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° absorbing weight\n .rotate(BoneName.FOOT_L, -0.052, 0, 0) // -3° foot plants\n .rotate(BoneName.FOOT_R, 0.174, 0, 0) // 10° rear foot pushes off\n .rotate(BoneName.SHOULDER_L, -0.35, 0, -0.44) // Guard solid\n .rotate(BoneName.SHOULDER_R, -0.35, 0, 0.44)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.92) // -110° (maintained)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.92) // 110° (maintained)\n .rotate(BoneName.HEAD, 0.052, 0, 0) // 3° head tracks forward\n .position(BoneName.PELVIS, 0, 0, 0.15) // Minimal forward movement\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Root reinforcement (400ms, frame 9)\n .at(0.4)\n .rotate(BoneName.PELVIS, 0, 0, 0) // Return to neutral\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° rooted\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° rooted\n .rotate(BoneName.FOOT_L, 0, 0, 0) // Front foot grounded\n .rotate(BoneName.FOOT_R, 0, 0, 0) // Rear foot settled\n .rotate(BoneName.SHOULDER_L, -0.35, 0, -0.44) // Guard maintained\n .rotate(BoneName.SHOULDER_R, -0.35, 0, 0.44)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.92)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.92)\n .rotate(BoneName.HEAD, 0, 0, 0) // Head returns to neutral focus\n .position(BoneName.PELVIS, 0, 0, 0.25) // Short step complete\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☶ GAN DEFENSIVE ANGLE SHIFT (방어 각도 전환)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gan Defensive Angle Shift Animation\n *\n * **Korean**: 방어 각도 전환 (Bangeo Gakdo Jeonhwan) - Defensive Angle Transition\n * **Technique**: Small angle change for better defensive position\n *\n * Characteristics:\n * - Pivot on one foot maintaining stability\n * - Guard remains solid throughout\n * - No compromise to balance\n * - Repositions for optimal counter angle\n *\n * Animation Phases:\n * - 0-167ms: Begin pivot (frames 0-3)\n * - 167-367ms: Angle rotation (frames 4-7)\n * - 367-500ms: Settle and root (frames 8-10)\n *\n * @korean 방어각도전환\n * @frames 11 frames (~45ms per frame at 60fps)\n * @duration 500ms\n * @category Movement Animation\n */\nexport const GAN_DEFENSIVE_ANGLE_SHIFT: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"gan_defensive_angle_shift\",\n \"방어 각도 전환\"\n )\n .asMovement(0.5, false)\n // Phase 1: Begin pivot (0ms, frame 0)\n .at(0)\n .rotate(BoneName.PELVIS, 0, -0.174, 0) // 0°, -10° (begin rotation)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° (pivot foot loads)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (support foot stable)\n .rotate(BoneName.FOOT_L, 0, -0.087, 0) // 0°, -5° (beginning pivot)\n .rotate(BoneName.FOOT_R, 0, 0, 0) // Support foot flat\n .rotate(BoneName.SHOULDER_L, -0.35, 0, -0.44) // Guard maintained\n .rotate(BoneName.SHOULDER_R, -0.35, 0, 0.44)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.92)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.92)\n .rotate(BoneName.HEAD, 0, -0.087, 0) // 0°, -5° (head begins tracking)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Angle rotation (267ms, frame 6)\n .at(0.267)\n .rotate(BoneName.PELVIS, 0, -0.349, 0) // 0°, -20° (maximum rotation)\n .rotate(BoneName.SPINE_LOWER, 0, -0.262, 0) // 0°, -15° (torso follows)\n .rotate(BoneName.SPINE_UPPER, 0, -0.174, 0) // 0°, -10° (upper body stable)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° (pivot foot)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (support foot)\n .rotate(BoneName.FOOT_L, 0, -0.262, 0) // 0°, -15° (pivot complete)\n .rotate(BoneName.FOOT_R, 0, 0.052, 0) // 0°, 3° (support adjusts)\n .rotate(BoneName.HEAD, 0, -0.174, 0) // 0°, -10° (eyes track forward)\n .rotate(BoneName.SHOULDER_L, -0.35, 0, -0.44) // Guard maintained\n .rotate(BoneName.SHOULDER_R, -0.35, 0, 0.44)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.92) // -110° (maintained)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.92) // 110° (maintained)\n .position(BoneName.PELVIS, -0.05, 0, 0) // Minimal lateral shift\n .done<MartialArtsAnimationBuilder>()\n // Phase 3: Settle and root (500ms, frame 11)\n .at(0.5)\n .rotate(BoneName.PELVIS, 0, -0.349, 0) // 0°, -20° (settled angle)\n .rotate(BoneName.SPINE_LOWER, 0, -0.262, 0) // 0°, -15°\n .rotate(BoneName.SPINE_UPPER, 0, -0.174, 0) // 0°, -10°\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (rooted)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (rooted)\n .rotate(BoneName.FOOT_L, 0, -0.262, 0) // 0°, -15° (planted)\n .rotate(BoneName.FOOT_R, 0, 0, 0) // Support foot flat and stable\n .rotate(BoneName.HEAD, 0, -0.174, 0) // 0°, -10°\n .rotate(BoneName.SHOULDER_L, -0.35, 0, -0.44) // Guard solid\n .rotate(BoneName.SHOULDER_R, -0.35, 0, 0.44)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.92)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.92)\n .position(BoneName.PELVIS, -0.08, 0, 0) // Final position\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☶ GAN HIGH SOLID GUARD TRANSITION (산 방어 전환)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gan High Solid Guard Transition Animation\n *\n * **Korean**: 산 방어 전환 (San Bangeo Jeonhwan) - Mountain Guard Transition\n * **Technique**: Transition into Gan's characteristic high solid guard\n *\n * Characteristics:\n * - High guard protecting head and upper body\n * - Elbows reinforcing structure\n * - Fists positioned for blocking\n * - Stance wide and immovable\n *\n * Animation Phases:\n * - 0-167ms: Begin guard transition\n * - 167-333ms: Establish high solid guard\n *\n * @korean 산방어전환\n * @duration 333ms\n * @category Stance Animation\n */\nexport const GAN_HIGH_SOLID_GUARD_TRANSITION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"gan_high_solid_guard_transition\",\n \"산 방어 전환\"\n )\n .asStance(0.333, false)\n // Phase 1: Begin guard transition (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_L, -0.262, 0, -0.349) // -15°, 0°, -20° (raising)\n .rotate(BoneName.SHOULDER_R, -0.262, 0, 0.349) // -15°, 0°, 20° (raising)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.57) // -90° (transitioning)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.57) // 90° (transitioning)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0) // Neutral upper spine\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0) // Stable lower spine\n .rotate(BoneName.PELVIS, 0, 0, 0) // Neutral pelvis\n .rotate(BoneName.HEAD, 0.052, 0, 0) // 3° head lifts slightly\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Phase 2: Establish high solid guard (333ms)\n .at(0.333)\n .rotate(BoneName.SHOULDER_L, -0.35, 0, -0.44) // -20°, 0°, -25° (Gan high guard)\n .rotate(BoneName.SHOULDER_R, -0.35, 0, 0.44) // -20°, 0°, 25° (Gan high guard)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.92) // -110° (reinforced structure)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.92) // 110° (reinforced structure)\n .rotate(BoneName.WRIST_L, 0, 0, 0) // Neutral wrists for blocking\n .rotate(BoneName.WRIST_R, 0, 0, 0)\n .rotate(BoneName.SPINE_UPPER, -0.035, 0, 0) // -2° slight chest lift for solid structure\n .rotate(BoneName.SPINE_LOWER, 0, 0, 0) // Lower spine stable\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable stance)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0) // -15° (stable stance)\n .rotate(BoneName.HEAD, 0, 0, 0) // Head neutral, focused\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// EXPORTS\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Map of all Gan stance-specific animations for easy access\n * @korean 간괘자세애니메이션맵\n */\nexport const GAN_STANCE_ANIMATIONS: ReadonlyMap<string, SkeletalAnimation> = new Map([\n // Idle & Movement\n [\"gan_idle_rooted\", GAN_IDLE_ROOTED],\n [\"gan_short_root_step\", GAN_SHORT_ROOT_STEP],\n [\"gan_defensive_angle_shift\", GAN_DEFENSIVE_ANGLE_SHIFT],\n \n // Stance Transitions\n [\"gan_high_solid_guard_transition\", GAN_HIGH_SOLID_GUARD_TRANSITION],\n \n // Mountain Defensive Block Techniques (간괘 방어 기술)\n [\"gan_rock_defense_animation\", GAN_ROCK_DEFENSE_ANIMATION],\n [\"gan_defensive_reversal\", GAN_DEFENSIVE_REVERSAL],\n]);\n"],"mappings":"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"}
@@ -76,7 +76,7 @@ var GAN_DEFENSIVE_REVERSAL = MartialArtsAnimationBuilder.create("gan_defensive_r
76
76
  * Map of all Gan technique combat animations for easy access
77
77
  * @korean 간괘기술애니메이션맵
78
78
  */
79
- var GAN_TECHNIQUE_ANIMATIONS = new Map([["gan_rock_defense", GAN_ROCK_DEFENSE_ANIMATION], ["gan_defensive_reversal", GAN_DEFENSIVE_REVERSAL]]);
79
+ var GAN_TECHNIQUE_ANIMATIONS = /* @__PURE__ */ new Map([["gan_rock_defense", GAN_ROCK_DEFENSE_ANIMATION], ["gan_defensive_reversal", GAN_DEFENSIVE_REVERSAL]]);
80
80
  //#endregion
81
81
  export { GAN_DEFENSIVE_REVERSAL, GAN_ROCK_DEFENSE_ANIMATION, GAN_TECHNIQUE_ANIMATIONS };
82
82
 
@@ -1 +1 @@
1
- {"version":3,"file":"GanTechniqueAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/GanTechniqueAnimations.ts"],"sourcesContent":["/**\n * ☶ Gan (Mountain) Technique Combat Animations\n *\n * Specialized combat technique animations for the Gan (간/Mountain) trigram.\n * Embodies defensive blocks, absorption, and powerful counter-attacks.\n *\n * **Korean Martial Arts Context:**\n * - **무술**: 합기도 방어 기술 (Hapkido Defensive Techniques)\n * - **특성**: 반석방어 (Rock Defense), 역습 (Reversal Counter)\n * - **철학**: 바위처럼 막기 (Block Like Rock), 산처럼 역습 (Counter Like Mountain)\n * - **대표 기술**: 반석방어 (Rock Defense), 방어 역습 (Defensive Reversal)\n *\n * @module systems/animation/catalogs/GanTechniqueAnimations\n * @category Animation\n * @korean 간괘기술애니메이션\n */\n\nimport { BoneName, type SkeletalAnimation } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☶ GAN ROCK DEFENSE ANIMATION (반석방어)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gan Rock Defense Animation\n *\n * **Korean**: 반석방어 (Banseok Bangeo) - Rock Defense\n * **Technique**: Solid block followed by powerful counter from absorbed energy\n * **Target Points**: Superior striking position after absorption\n *\n * Characteristics:\n * - Block: Solid block with reinforced structure\n * - Absorb: Ground impact force through stable stance\n * - Counter: Powerful counter using stored energy\n * - Recovery: Return to immovable guard\n *\n * Animation Phases:\n * - 0-300ms: Block phase (frames 0-5) - Reinforced block with structure\n * - 300-600ms: Absorb phase (frames 6-10) - Ground impact through stance\n * - 600-1000ms: Counter phase (frames 11-17) - Explosive counter strike\n * - 1000-1200ms: Recovery phase (frames 18-20) - Return to guard\n *\n * **Performance**: Targets 60fps (16.67ms per frame)\n * **Damage Type**: Defensive counter with accumulated power\n *\n * @korean 반석방어\n * @frames 20 total (6 block, 6 absorb, 8 counter)\n * @duration 1200ms\n * @category Defense Animation\n */\nexport const GAN_ROCK_DEFENSE_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"gan_rock_defense\",\n \"반석방어\"\n )\n .asDefense(1.2)\n // =================================================================\n // BLOCK PHASE (0-300ms, frames 0-6)\n // =================================================================\n // Frame 0: Guard position baseline (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_L, -0.35, 0, -0.44) // -20°, 0°, -25° (guard position)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.92) // -110° (guard ready)\n .rotate(BoneName.WRIST_L, 0, 0, 0) // Neutral wrist\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0) // Neutral spine\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable stance)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Frame 3: Block engagement (150ms)\n .at(0.15)\n .rotate(BoneName.SHOULDER_L, -0.35, 0.174, -0.524) // -20°, 10°, -30° (block extends)\n .rotate(BoneName.ELBOW_L, 0, 0, -2.09) // -120° (elbow structure solid)\n .rotate(BoneName.FOREARM_L, 0.174, 0, 0) // 10°, 0°, 0° (forearm absorbs)\n .rotate(BoneName.SHOULDER_R, -0.262, 0, 0.349) // -15°, 0°, 20° (supporting arm)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.74) // 100° (support structure)\n .rotate(BoneName.SPINE_UPPER, 0, -0.087, 0) // 0°, -5° (minor rotation to block)\n .done<MartialArtsAnimationBuilder>()\n // Frame 6: Maximum block (300ms)\n .at(0.3)\n .rotate(BoneName.SHOULDER_L, -0.436, 0.262, -0.558) // -25°, 15°, -32° (reinforced block)\n .rotate(BoneName.ELBOW_L, 0, 0, -2.18) // -125° (maximum elbow structure)\n .rotate(BoneName.FOREARM_L, 0.174, 0, 0) // 10° (forearm solid)\n .rotate(BoneName.SHOULDER_R, -0.262, 0, 0.349) // -15°, 0°, 20° (supporting)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.74) // 100°\n .rotate(BoneName.SPINE_UPPER, 0, -0.087, 0) // 0°, -5°\n .done<MartialArtsAnimationBuilder>()\n // =================================================================\n // ABSORB PHASE (300-600ms, frames 7-12)\n // =================================================================\n // Frame 9: Begin absorption (450ms)\n .at(0.45)\n .rotate(BoneName.SPINE_UPPER, 0, -0.14, 0) // 0°, -8° (ground the impact)\n .rotate(BoneName.PELVIS, 0, -0.105, 0) // 0°, -6° (hip absorbs)\n .rotate(BoneName.KNEE_L, -0.349, 0, 0) // -20° (lower stance absorbs)\n .rotate(BoneName.KNEE_R, -0.349, 0, 0) // -20°\n .rotate(BoneName.SHOULDER_L, -0.489, 0.14, -0.558) // -28°, 8°, -32° (maintain block)\n .rotate(BoneName.ELBOW_L, 0, 0, -2.18) // -125° (structure held)\n .position(BoneName.PELVIS, 0, -0.02, 0) // Slight drop to absorb\n .done<MartialArtsAnimationBuilder>()\n // Frame 12: Maximum absorption (600ms)\n .at(0.6)\n .rotate(BoneName.SPINE_UPPER, 0, -0.174, 0) // 0°, -10° (maximum absorption)\n .rotate(BoneName.PELVIS, 0, -0.14, 0) // 0°, -8°\n .rotate(BoneName.KNEE_L, -0.384, 0, 0) // -22° (deepest absorption)\n .rotate(BoneName.KNEE_R, -0.384, 0, 0) // -22°\n .rotate(BoneName.SHOULDER_L, -0.524, 0.174, -0.611) // -30°, 10°, -35° (block held firm)\n .rotate(BoneName.ELBOW_L, 0, 0, -2.18) // -125°\n .position(BoneName.PELVIS, 0, -0.04, 0) // Lower for absorption\n .done<MartialArtsAnimationBuilder>()\n // =================================================================\n // COUNTER PHASE (600-1000ms, frames 13-20)\n // =================================================================\n // Frame 15: Counter preparation (750ms)\n .at(0.75)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0) // 0°, 0° (returning to neutral)\n .rotate(BoneName.PELVIS, 0, 0.087, 0) // 0°, 5° (hip begins counter rotation)\n .rotate(BoneName.KNEE_L, -0.262, 0, 0) // -15° (rising from absorption)\n .rotate(BoneName.KNEE_R, -0.262, 0, 0) // -15°\n .rotate(BoneName.SHOULDER_L, -0.35, 0.087, -0.349) // -20°, 5°, -20° (guard maintained)\n .rotate(BoneName.SHOULDER_R, 0.436, 0, -0.174) // 25°, 0°, -10° (counter preparing)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.262) // 15° (arm extending for counter)\n .position(BoneName.PELVIS, 0, -0.02, 0)\n .done<MartialArtsAnimationBuilder>()\n // Frame 18: Counter strike (900ms)\n .at(0.9)\n .rotate(BoneName.SPINE_UPPER, 0, 0.174, 0) // 0°, 10° (counter rotation)\n .rotate(BoneName.PELVIS, 0, 0.262, 0) // 0°, 15° (hip drives counter)\n .rotate(BoneName.KNEE_L, -0.174, 0, 0) // -10° (rise from absorption)\n .rotate(BoneName.KNEE_R, -0.174, 0, 0) // -10°\n .rotate(BoneName.SHOULDER_R, 0.785, 0, 0) // 45°, 0°, 0° (counter strike forward)\n .rotate(BoneName.ELBOW_R, 0, 0, -0.262) // -15° (extending)\n .rotate(BoneName.WRIST_R, 0.174, 0, 0) // 10° (strike alignment)\n .rotate(BoneName.SHOULDER_L, -0.35, 0.087, -0.349) // -20°, 5°, -20° (guard maintained)\n .position(BoneName.PELVIS, 0, 0, 0.05) // Forward shift for power\n .done<MartialArtsAnimationBuilder>()\n // Frame 20: Full counter extension (1000ms)\n .at(1.0)\n .rotate(BoneName.SPINE_UPPER, 0, 0.262, 0) // 0°, 15° (full counter rotation)\n .rotate(BoneName.PELVIS, 0, 0.314, 0) // 0°, 18° (maximum hip drive)\n .rotate(BoneName.KNEE_L, -0.262, 0, 0) // -15° (stable stance)\n .rotate(BoneName.KNEE_R, -0.262, 0, 0) // -15°\n .rotate(BoneName.SHOULDER_R, 1.047, 0, -0.087) // 60°, 0°, -5° (counter strike extended)\n .rotate(BoneName.ELBOW_R, 0, 0, 0) // 0° (fully extended)\n .rotate(BoneName.WRIST_R, 0.174, 0, 0) // 10° (impact position)\n .rotate(BoneName.SHOULDER_L, -0.35, 0, -0.44) // Guard maintained\n .rotate(BoneName.HEAD, 0, 0.174, 0) // 0°, 10° (head tracks strike)\n .position(BoneName.PELVIS, 0, 0, 0.1) // Full forward drive\n .done<MartialArtsAnimationBuilder>()\n // =================================================================\n // RECOVERY PHASE (1000-1200ms, frames 21-22)\n // =================================================================\n // Frame 22: Return to guard (1200ms)\n .at(1.2)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0) // Return to neutral\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable stance)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.35, 0, -0.44) // -20°, 0°, -25° (guard restored)\n .rotate(BoneName.SHOULDER_R, -0.35, 0, 0.44) // -20°, 0°, 25°\n .rotate(BoneName.ELBOW_L, 0, 0, -1.92) // -110°\n .rotate(BoneName.ELBOW_R, 0, 0, 1.92) // 110°\n .rotate(BoneName.WRIST_L, 0, 0, 0)\n .rotate(BoneName.WRIST_R, 0, 0, 0)\n .rotate(BoneName.HEAD, 0, 0, 0) // Head returns to neutral focus\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☶ GAN DEFENSIVE REVERSAL ANIMATION (방어 역습)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gan Defensive Reversal Animation\n *\n * **Korean**: 바위 역습 (Bawi Yeokseup) - Rock Reversal\n * **Technique**: Block opponent's attack, control limb, reverse position with power\n *\n * Characteristics:\n * - Block opponent's attack solidly\n * - Control opponent's limb with lock\n * - Reverse position with power\n * - Maintain immovable foundation throughout\n *\n * Animation Phases:\n * - 0-300ms: Block phase (frames 0-5) - Solid defensive block\n * - 300-700ms: Control phase (frames 6-13) - Limb control and lock\n * - 700-1100ms: Reversal phase (frames 14-21) - Power reversal\n * - 1100-1333ms: Recovery phase (frames 22-24) - Return to guard\n *\n * **Performance**: Targets 60fps (16.67ms per frame)\n * **Damage Type**: Joint manipulation and positional reversal\n *\n * @korean 바위역습\n * @frames 24 total (6 block, 8 control, 10 reversal)\n * @duration 1333ms\n * @category Defense Animation\n */\nexport const GAN_DEFENSIVE_REVERSAL: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"gan_defensive_reversal\",\n \"바위 역습\"\n )\n .asDefense(1.333)\n // =================================================================\n // BLOCK PHASE (0-300ms, frames 0-6)\n // =================================================================\n // Frame 0: Guard baseline (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_L, -0.35, 0, -0.44) // -20°, 0°, -25° (guard)\n .rotate(BoneName.SHOULDER_R, -0.35, 0, 0.44) // -20°, 0°, 25°\n .rotate(BoneName.ELBOW_L, 0, 0, -1.92) // -110° (guard ready)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.92) // 110°\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Frame 3: Block engagement (150ms)\n .at(0.15)\n .rotate(BoneName.SHOULDER_L, -0.35, 0.262, -0.524) // -20°, 15°, -30° (block extends)\n .rotate(BoneName.ELBOW_L, 0, 0, -2.09) // -120° (solid structure)\n .rotate(BoneName.SHOULDER_R, -0.262, 0, 0.349) // -15°, 0°, 20° (supporting)\n .rotate(BoneName.SPINE_UPPER, 0, -0.087, 0) // 0°, -5° (rotation into block)\n .done<MartialArtsAnimationBuilder>()\n // Frame 6: Block solid (300ms)\n .at(0.3)\n .rotate(BoneName.SHOULDER_L, -0.436, 0.349, -0.558) // -25°, 20°, -32° (reinforced)\n .rotate(BoneName.ELBOW_L, 0, 0, -2.18) // -125° (maximum structure)\n .rotate(BoneName.FOREARM_L, 0.174, 0, 0) // 10° (absorbing)\n .rotate(BoneName.SPINE_UPPER, 0, -0.14, 0) // 0°, -8°\n .done<MartialArtsAnimationBuilder>()\n // =================================================================\n // CONTROL PHASE (300-700ms, frames 7-14)\n // =================================================================\n // Frame 9: Begin limb control (450ms)\n .at(0.45)\n .rotate(BoneName.SHOULDER_L, -0.349, 0.436, -0.436) // -20°, 25°, -25° (rotating to control)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.92) // -110° (bending to grasp)\n .rotate(BoneName.WRIST_L, 0.174, 0.262, 0) // 10°, 15°, 0° (wrist control)\n .rotate(BoneName.SHOULDER_R, -0.262, 0.262, 0.524) // -15°, 15°, 30° (assisting control)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.57) // 90° (reaching to assist)\n .rotate(BoneName.SPINE_UPPER, 0, -0.174, 0) // 0°, -10° (twisting for control)\n .done<MartialArtsAnimationBuilder>()\n // Frame 11: Limb captured (550ms)\n .at(0.55)\n .rotate(BoneName.SHOULDER_L, -0.262, 0.524, -0.349) // -15°, 30°, -20° (control grip)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.74) // -100° (locked position)\n .rotate(BoneName.WRIST_L, 0.262, 0.349, 0) // 15°, 20°, 0° (firm control)\n .rotate(BoneName.SHOULDER_R, -0.174, 0.349, 0.611) // -10°, 20°, 35° (both hands control)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4) // 80° (assisting grip)\n .rotate(BoneName.WRIST_R, 0.174, 0.262, 0) // 10°, 15°, 0°\n .rotate(BoneName.SPINE_UPPER, 0, -0.262, 0) // 0°, -15° (torque on limb)\n .done<MartialArtsAnimationBuilder>()\n // Frame 14: Maximum control (700ms)\n .at(0.7)\n .rotate(BoneName.SHOULDER_L, -0.174, 0.611, -0.262) // -10°, 35°, -15° (peak control)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.57) // -90° (locked)\n .rotate(BoneName.WRIST_L, 0.349, 0.436, 0) // 20°, 25°, 0° (maximum pressure)\n .rotate(BoneName.SHOULDER_R, -0.087, 0.436, 0.698) // -5°, 25°, 40° (both hands)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.22) // 70° (tight grip)\n .rotate(BoneName.WRIST_R, 0.262, 0.349, 0) // 15°, 20°, 0°\n .rotate(BoneName.SPINE_UPPER, 0, -0.349, 0) // 0°, -20° (maximum torque)\n .rotate(BoneName.PELVIS, 0, -0.174, 0) // 0°, -10° (hip into control)\n .done<MartialArtsAnimationBuilder>()\n // =================================================================\n // REVERSAL PHASE (700-1100ms, frames 15-22)\n // =================================================================\n // Frame 17: Begin reversal (850ms)\n .at(0.85)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0) // 0°, 0° (unwinding)\n .rotate(BoneName.PELVIS, 0, 0.174, 0) // 0°, 10° (reversing rotation)\n .rotate(BoneName.SHOULDER_L, -0.087, 0.349, -0.174) // -5°, 20°, -10° (pulling)\n .rotate(BoneName.SHOULDER_R, 0.174, 0.174, 0.349) // 10°, 10°, 20° (pushing)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° (dropping for power)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0)\n .position(BoneName.PELVIS, 0, -0.03, 0) // Lowering for reversal power\n .done<MartialArtsAnimationBuilder>()\n // Frame 19: Mid-reversal (950ms)\n .at(0.95)\n .rotate(BoneName.SPINE_UPPER, 0, 0.262, 0) // 0°, 15° (reversing direction)\n .rotate(BoneName.PELVIS, 0, 0.349, 0) // 0°, 20° (hip drives reversal)\n .rotate(BoneName.SHOULDER_L, 0, 0, -0.087) // 0°, 0°, -5° (releasing control)\n .rotate(BoneName.SHOULDER_R, 0.611, 0, 0.174) // 35°, 0°, 10° (pushing through)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.524) // 30° (extending for push)\n .rotate(BoneName.KNEE_L, -0.262, 0, 0) // -15° (rising)\n .rotate(BoneName.KNEE_R, -0.262, 0, 0)\n .position(BoneName.PELVIS, 0, -0.01, 0.05) // Forward and up\n .done<MartialArtsAnimationBuilder>()\n // Frame 22: Full reversal (1100ms)\n .at(1.1)\n .rotate(BoneName.SPINE_UPPER, 0, 0.436, 0) // 0°, 25° (full reversal rotation)\n .rotate(BoneName.PELVIS, 0, 0.524, 0) // 0°, 30° (maximum hip drive)\n .rotate(BoneName.SHOULDER_L, 0.174, -0.174, 0) // 10°, -10°, 0° (cleared)\n .rotate(BoneName.SHOULDER_R, 0.873, 0, 0) // 50°, 0°, 0° (full push extension)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.174) // 10° (extended)\n .rotate(BoneName.WRIST_R, 0.174, 0, 0) // 10° (push position)\n .rotate(BoneName.KNEE_L, -0.174, 0, 0) // -10° (stable)\n .rotate(BoneName.KNEE_R, -0.174, 0, 0)\n .rotate(BoneName.HEAD, 0, 0.349, 0) // 0°, 20° (head tracks reversal direction)\n .position(BoneName.PELVIS, 0, 0, 0.15) // Maximum forward reversal\n .done<MartialArtsAnimationBuilder>()\n // =================================================================\n // RECOVERY PHASE (1100-1333ms, frames 23-24)\n // =================================================================\n // Frame 24: Return to guard (1333ms)\n .at(1.333)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0) // Return to neutral\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.35, 0, -0.44) // -20°, 0°, -25° (guard restored)\n .rotate(BoneName.SHOULDER_R, -0.35, 0, 0.44) // -20°, 0°, 25°\n .rotate(BoneName.ELBOW_L, 0, 0, -1.92) // -110°\n .rotate(BoneName.ELBOW_R, 0, 0, 1.92) // 110°\n .rotate(BoneName.WRIST_L, 0, 0, 0)\n .rotate(BoneName.WRIST_R, 0, 0, 0)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable stance)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0)\n .rotate(BoneName.HEAD, 0, 0, 0) // Head returns to neutral focus\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// EXPORTS\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Map of all Gan technique combat animations for easy access\n * @korean 간괘기술애니메이션맵\n */\nexport const GAN_TECHNIQUE_ANIMATIONS: ReadonlyMap<string, SkeletalAnimation> = new Map([\n // Combat Techniques\n [\"gan_rock_defense\", GAN_ROCK_DEFENSE_ANIMATION],\n [\"gan_defensive_reversal\", GAN_DEFENSIVE_REVERSAL],\n]);\n"],"mappings":"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"}
1
+ {"version":3,"file":"GanTechniqueAnimations.js","names":[],"sources":["../../../../src/systems/animation/catalogs/GanTechniqueAnimations.ts"],"sourcesContent":["/**\n * ☶ Gan (Mountain) Technique Combat Animations\n *\n * Specialized combat technique animations for the Gan (간/Mountain) trigram.\n * Embodies defensive blocks, absorption, and powerful counter-attacks.\n *\n * **Korean Martial Arts Context:**\n * - **무술**: 합기도 방어 기술 (Hapkido Defensive Techniques)\n * - **특성**: 반석방어 (Rock Defense), 역습 (Reversal Counter)\n * - **철학**: 바위처럼 막기 (Block Like Rock), 산처럼 역습 (Counter Like Mountain)\n * - **대표 기술**: 반석방어 (Rock Defense), 방어 역습 (Defensive Reversal)\n *\n * @module systems/animation/catalogs/GanTechniqueAnimations\n * @category Animation\n * @korean 간괘기술애니메이션\n */\n\nimport { BoneName, type SkeletalAnimation } from \"@/types/skeletal\";\nimport { MartialArtsAnimationBuilder } from \"../builders/MartialArtsAnimationBuilder\";\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☶ GAN ROCK DEFENSE ANIMATION (반석방어)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gan Rock Defense Animation\n *\n * **Korean**: 반석방어 (Banseok Bangeo) - Rock Defense\n * **Technique**: Solid block followed by powerful counter from absorbed energy\n * **Target Points**: Superior striking position after absorption\n *\n * Characteristics:\n * - Block: Solid block with reinforced structure\n * - Absorb: Ground impact force through stable stance\n * - Counter: Powerful counter using stored energy\n * - Recovery: Return to immovable guard\n *\n * Animation Phases:\n * - 0-300ms: Block phase (frames 0-5) - Reinforced block with structure\n * - 300-600ms: Absorb phase (frames 6-10) - Ground impact through stance\n * - 600-1000ms: Counter phase (frames 11-17) - Explosive counter strike\n * - 1000-1200ms: Recovery phase (frames 18-20) - Return to guard\n *\n * **Performance**: Targets 60fps (16.67ms per frame)\n * **Damage Type**: Defensive counter with accumulated power\n *\n * @korean 반석방어\n * @frames 20 total (6 block, 6 absorb, 8 counter)\n * @duration 1200ms\n * @category Defense Animation\n */\nexport const GAN_ROCK_DEFENSE_ANIMATION: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"gan_rock_defense\",\n \"반석방어\"\n )\n .asDefense(1.2)\n // =================================================================\n // BLOCK PHASE (0-300ms, frames 0-6)\n // =================================================================\n // Frame 0: Guard position baseline (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_L, -0.35, 0, -0.44) // -20°, 0°, -25° (guard position)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.92) // -110° (guard ready)\n .rotate(BoneName.WRIST_L, 0, 0, 0) // Neutral wrist\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0) // Neutral spine\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable stance)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Frame 3: Block engagement (150ms)\n .at(0.15)\n .rotate(BoneName.SHOULDER_L, -0.35, 0.174, -0.524) // -20°, 10°, -30° (block extends)\n .rotate(BoneName.ELBOW_L, 0, 0, -2.09) // -120° (elbow structure solid)\n .rotate(BoneName.FOREARM_L, 0.174, 0, 0) // 10°, 0°, 0° (forearm absorbs)\n .rotate(BoneName.SHOULDER_R, -0.262, 0, 0.349) // -15°, 0°, 20° (supporting arm)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.74) // 100° (support structure)\n .rotate(BoneName.SPINE_UPPER, 0, -0.087, 0) // 0°, -5° (minor rotation to block)\n .done<MartialArtsAnimationBuilder>()\n // Frame 6: Maximum block (300ms)\n .at(0.3)\n .rotate(BoneName.SHOULDER_L, -0.436, 0.262, -0.558) // -25°, 15°, -32° (reinforced block)\n .rotate(BoneName.ELBOW_L, 0, 0, -2.18) // -125° (maximum elbow structure)\n .rotate(BoneName.FOREARM_L, 0.174, 0, 0) // 10° (forearm solid)\n .rotate(BoneName.SHOULDER_R, -0.262, 0, 0.349) // -15°, 0°, 20° (supporting)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.74) // 100°\n .rotate(BoneName.SPINE_UPPER, 0, -0.087, 0) // 0°, -5°\n .done<MartialArtsAnimationBuilder>()\n // =================================================================\n // ABSORB PHASE (300-600ms, frames 7-12)\n // =================================================================\n // Frame 9: Begin absorption (450ms)\n .at(0.45)\n .rotate(BoneName.SPINE_UPPER, 0, -0.14, 0) // 0°, -8° (ground the impact)\n .rotate(BoneName.PELVIS, 0, -0.105, 0) // 0°, -6° (hip absorbs)\n .rotate(BoneName.KNEE_L, -0.349, 0, 0) // -20° (lower stance absorbs)\n .rotate(BoneName.KNEE_R, -0.349, 0, 0) // -20°\n .rotate(BoneName.SHOULDER_L, -0.489, 0.14, -0.558) // -28°, 8°, -32° (maintain block)\n .rotate(BoneName.ELBOW_L, 0, 0, -2.18) // -125° (structure held)\n .position(BoneName.PELVIS, 0, -0.02, 0) // Slight drop to absorb\n .done<MartialArtsAnimationBuilder>()\n // Frame 12: Maximum absorption (600ms)\n .at(0.6)\n .rotate(BoneName.SPINE_UPPER, 0, -0.174, 0) // 0°, -10° (maximum absorption)\n .rotate(BoneName.PELVIS, 0, -0.14, 0) // 0°, -8°\n .rotate(BoneName.KNEE_L, -0.384, 0, 0) // -22° (deepest absorption)\n .rotate(BoneName.KNEE_R, -0.384, 0, 0) // -22°\n .rotate(BoneName.SHOULDER_L, -0.524, 0.174, -0.611) // -30°, 10°, -35° (block held firm)\n .rotate(BoneName.ELBOW_L, 0, 0, -2.18) // -125°\n .position(BoneName.PELVIS, 0, -0.04, 0) // Lower for absorption\n .done<MartialArtsAnimationBuilder>()\n // =================================================================\n // COUNTER PHASE (600-1000ms, frames 13-20)\n // =================================================================\n // Frame 15: Counter preparation (750ms)\n .at(0.75)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0) // 0°, 0° (returning to neutral)\n .rotate(BoneName.PELVIS, 0, 0.087, 0) // 0°, 5° (hip begins counter rotation)\n .rotate(BoneName.KNEE_L, -0.262, 0, 0) // -15° (rising from absorption)\n .rotate(BoneName.KNEE_R, -0.262, 0, 0) // -15°\n .rotate(BoneName.SHOULDER_L, -0.35, 0.087, -0.349) // -20°, 5°, -20° (guard maintained)\n .rotate(BoneName.SHOULDER_R, 0.436, 0, -0.174) // 25°, 0°, -10° (counter preparing)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.262) // 15° (arm extending for counter)\n .position(BoneName.PELVIS, 0, -0.02, 0)\n .done<MartialArtsAnimationBuilder>()\n // Frame 18: Counter strike (900ms)\n .at(0.9)\n .rotate(BoneName.SPINE_UPPER, 0, 0.174, 0) // 0°, 10° (counter rotation)\n .rotate(BoneName.PELVIS, 0, 0.262, 0) // 0°, 15° (hip drives counter)\n .rotate(BoneName.KNEE_L, -0.174, 0, 0) // -10° (rise from absorption)\n .rotate(BoneName.KNEE_R, -0.174, 0, 0) // -10°\n .rotate(BoneName.SHOULDER_R, 0.785, 0, 0) // 45°, 0°, 0° (counter strike forward)\n .rotate(BoneName.ELBOW_R, 0, 0, -0.262) // -15° (extending)\n .rotate(BoneName.WRIST_R, 0.174, 0, 0) // 10° (strike alignment)\n .rotate(BoneName.SHOULDER_L, -0.35, 0.087, -0.349) // -20°, 5°, -20° (guard maintained)\n .position(BoneName.PELVIS, 0, 0, 0.05) // Forward shift for power\n .done<MartialArtsAnimationBuilder>()\n // Frame 20: Full counter extension (1000ms)\n .at(1.0)\n .rotate(BoneName.SPINE_UPPER, 0, 0.262, 0) // 0°, 15° (full counter rotation)\n .rotate(BoneName.PELVIS, 0, 0.314, 0) // 0°, 18° (maximum hip drive)\n .rotate(BoneName.KNEE_L, -0.262, 0, 0) // -15° (stable stance)\n .rotate(BoneName.KNEE_R, -0.262, 0, 0) // -15°\n .rotate(BoneName.SHOULDER_R, 1.047, 0, -0.087) // 60°, 0°, -5° (counter strike extended)\n .rotate(BoneName.ELBOW_R, 0, 0, 0) // 0° (fully extended)\n .rotate(BoneName.WRIST_R, 0.174, 0, 0) // 10° (impact position)\n .rotate(BoneName.SHOULDER_L, -0.35, 0, -0.44) // Guard maintained\n .rotate(BoneName.HEAD, 0, 0.174, 0) // 0°, 10° (head tracks strike)\n .position(BoneName.PELVIS, 0, 0, 0.1) // Full forward drive\n .done<MartialArtsAnimationBuilder>()\n // =================================================================\n // RECOVERY PHASE (1000-1200ms, frames 21-22)\n // =================================================================\n // Frame 22: Return to guard (1200ms)\n .at(1.2)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0) // Return to neutral\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable stance)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.35, 0, -0.44) // -20°, 0°, -25° (guard restored)\n .rotate(BoneName.SHOULDER_R, -0.35, 0, 0.44) // -20°, 0°, 25°\n .rotate(BoneName.ELBOW_L, 0, 0, -1.92) // -110°\n .rotate(BoneName.ELBOW_R, 0, 0, 1.92) // 110°\n .rotate(BoneName.WRIST_L, 0, 0, 0)\n .rotate(BoneName.WRIST_R, 0, 0, 0)\n .rotate(BoneName.HEAD, 0, 0, 0) // Head returns to neutral focus\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// ☶ GAN DEFENSIVE REVERSAL ANIMATION (방어 역습)\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Gan Defensive Reversal Animation\n *\n * **Korean**: 바위 역습 (Bawi Yeokseup) - Rock Reversal\n * **Technique**: Block opponent's attack, control limb, reverse position with power\n *\n * Characteristics:\n * - Block opponent's attack solidly\n * - Control opponent's limb with lock\n * - Reverse position with power\n * - Maintain immovable foundation throughout\n *\n * Animation Phases:\n * - 0-300ms: Block phase (frames 0-5) - Solid defensive block\n * - 300-700ms: Control phase (frames 6-13) - Limb control and lock\n * - 700-1100ms: Reversal phase (frames 14-21) - Power reversal\n * - 1100-1333ms: Recovery phase (frames 22-24) - Return to guard\n *\n * **Performance**: Targets 60fps (16.67ms per frame)\n * **Damage Type**: Joint manipulation and positional reversal\n *\n * @korean 바위역습\n * @frames 24 total (6 block, 8 control, 10 reversal)\n * @duration 1333ms\n * @category Defense Animation\n */\nexport const GAN_DEFENSIVE_REVERSAL: SkeletalAnimation =\n MartialArtsAnimationBuilder.create(\n \"gan_defensive_reversal\",\n \"바위 역습\"\n )\n .asDefense(1.333)\n // =================================================================\n // BLOCK PHASE (0-300ms, frames 0-6)\n // =================================================================\n // Frame 0: Guard baseline (0ms)\n .at(0)\n .rotate(BoneName.SHOULDER_L, -0.35, 0, -0.44) // -20°, 0°, -25° (guard)\n .rotate(BoneName.SHOULDER_R, -0.35, 0, 0.44) // -20°, 0°, 25°\n .rotate(BoneName.ELBOW_L, 0, 0, -1.92) // -110° (guard ready)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.92) // 110°\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0)\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0)\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n // Frame 3: Block engagement (150ms)\n .at(0.15)\n .rotate(BoneName.SHOULDER_L, -0.35, 0.262, -0.524) // -20°, 15°, -30° (block extends)\n .rotate(BoneName.ELBOW_L, 0, 0, -2.09) // -120° (solid structure)\n .rotate(BoneName.SHOULDER_R, -0.262, 0, 0.349) // -15°, 0°, 20° (supporting)\n .rotate(BoneName.SPINE_UPPER, 0, -0.087, 0) // 0°, -5° (rotation into block)\n .done<MartialArtsAnimationBuilder>()\n // Frame 6: Block solid (300ms)\n .at(0.3)\n .rotate(BoneName.SHOULDER_L, -0.436, 0.349, -0.558) // -25°, 20°, -32° (reinforced)\n .rotate(BoneName.ELBOW_L, 0, 0, -2.18) // -125° (maximum structure)\n .rotate(BoneName.FOREARM_L, 0.174, 0, 0) // 10° (absorbing)\n .rotate(BoneName.SPINE_UPPER, 0, -0.14, 0) // 0°, -8°\n .done<MartialArtsAnimationBuilder>()\n // =================================================================\n // CONTROL PHASE (300-700ms, frames 7-14)\n // =================================================================\n // Frame 9: Begin limb control (450ms)\n .at(0.45)\n .rotate(BoneName.SHOULDER_L, -0.349, 0.436, -0.436) // -20°, 25°, -25° (rotating to control)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.92) // -110° (bending to grasp)\n .rotate(BoneName.WRIST_L, 0.174, 0.262, 0) // 10°, 15°, 0° (wrist control)\n .rotate(BoneName.SHOULDER_R, -0.262, 0.262, 0.524) // -15°, 15°, 30° (assisting control)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.57) // 90° (reaching to assist)\n .rotate(BoneName.SPINE_UPPER, 0, -0.174, 0) // 0°, -10° (twisting for control)\n .done<MartialArtsAnimationBuilder>()\n // Frame 11: Limb captured (550ms)\n .at(0.55)\n .rotate(BoneName.SHOULDER_L, -0.262, 0.524, -0.349) // -15°, 30°, -20° (control grip)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.74) // -100° (locked position)\n .rotate(BoneName.WRIST_L, 0.262, 0.349, 0) // 15°, 20°, 0° (firm control)\n .rotate(BoneName.SHOULDER_R, -0.174, 0.349, 0.611) // -10°, 20°, 35° (both hands control)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.4) // 80° (assisting grip)\n .rotate(BoneName.WRIST_R, 0.174, 0.262, 0) // 10°, 15°, 0°\n .rotate(BoneName.SPINE_UPPER, 0, -0.262, 0) // 0°, -15° (torque on limb)\n .done<MartialArtsAnimationBuilder>()\n // Frame 14: Maximum control (700ms)\n .at(0.7)\n .rotate(BoneName.SHOULDER_L, -0.174, 0.611, -0.262) // -10°, 35°, -15° (peak control)\n .rotate(BoneName.ELBOW_L, 0, 0, -1.57) // -90° (locked)\n .rotate(BoneName.WRIST_L, 0.349, 0.436, 0) // 20°, 25°, 0° (maximum pressure)\n .rotate(BoneName.SHOULDER_R, -0.087, 0.436, 0.698) // -5°, 25°, 40° (both hands)\n .rotate(BoneName.ELBOW_R, 0, 0, 1.22) // 70° (tight grip)\n .rotate(BoneName.WRIST_R, 0.262, 0.349, 0) // 15°, 20°, 0°\n .rotate(BoneName.SPINE_UPPER, 0, -0.349, 0) // 0°, -20° (maximum torque)\n .rotate(BoneName.PELVIS, 0, -0.174, 0) // 0°, -10° (hip into control)\n .done<MartialArtsAnimationBuilder>()\n // =================================================================\n // REVERSAL PHASE (700-1100ms, frames 15-22)\n // =================================================================\n // Frame 17: Begin reversal (850ms)\n .at(0.85)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0) // 0°, 0° (unwinding)\n .rotate(BoneName.PELVIS, 0, 0.174, 0) // 0°, 10° (reversing rotation)\n .rotate(BoneName.SHOULDER_L, -0.087, 0.349, -0.174) // -5°, 20°, -10° (pulling)\n .rotate(BoneName.SHOULDER_R, 0.174, 0.174, 0.349) // 10°, 10°, 20° (pushing)\n .rotate(BoneName.KNEE_L, -0.35, 0, 0) // -20° (dropping for power)\n .rotate(BoneName.KNEE_R, -0.35, 0, 0)\n .position(BoneName.PELVIS, 0, -0.03, 0) // Lowering for reversal power\n .done<MartialArtsAnimationBuilder>()\n // Frame 19: Mid-reversal (950ms)\n .at(0.95)\n .rotate(BoneName.SPINE_UPPER, 0, 0.262, 0) // 0°, 15° (reversing direction)\n .rotate(BoneName.PELVIS, 0, 0.349, 0) // 0°, 20° (hip drives reversal)\n .rotate(BoneName.SHOULDER_L, 0, 0, -0.087) // 0°, 0°, -5° (releasing control)\n .rotate(BoneName.SHOULDER_R, 0.611, 0, 0.174) // 35°, 0°, 10° (pushing through)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.524) // 30° (extending for push)\n .rotate(BoneName.KNEE_L, -0.262, 0, 0) // -15° (rising)\n .rotate(BoneName.KNEE_R, -0.262, 0, 0)\n .position(BoneName.PELVIS, 0, -0.01, 0.05) // Forward and up\n .done<MartialArtsAnimationBuilder>()\n // Frame 22: Full reversal (1100ms)\n .at(1.1)\n .rotate(BoneName.SPINE_UPPER, 0, 0.436, 0) // 0°, 25° (full reversal rotation)\n .rotate(BoneName.PELVIS, 0, 0.524, 0) // 0°, 30° (maximum hip drive)\n .rotate(BoneName.SHOULDER_L, 0.174, -0.174, 0) // 10°, -10°, 0° (cleared)\n .rotate(BoneName.SHOULDER_R, 0.873, 0, 0) // 50°, 0°, 0° (full push extension)\n .rotate(BoneName.ELBOW_R, 0, 0, 0.174) // 10° (extended)\n .rotate(BoneName.WRIST_R, 0.174, 0, 0) // 10° (push position)\n .rotate(BoneName.KNEE_L, -0.174, 0, 0) // -10° (stable)\n .rotate(BoneName.KNEE_R, -0.174, 0, 0)\n .rotate(BoneName.HEAD, 0, 0.349, 0) // 0°, 20° (head tracks reversal direction)\n .position(BoneName.PELVIS, 0, 0, 0.15) // Maximum forward reversal\n .done<MartialArtsAnimationBuilder>()\n // =================================================================\n // RECOVERY PHASE (1100-1333ms, frames 23-24)\n // =================================================================\n // Frame 24: Return to guard (1333ms)\n .at(1.333)\n .rotate(BoneName.SPINE_UPPER, 0, 0, 0) // Return to neutral\n .rotate(BoneName.PELVIS, 0, 0, 0)\n .rotate(BoneName.SHOULDER_L, -0.35, 0, -0.44) // -20°, 0°, -25° (guard restored)\n .rotate(BoneName.SHOULDER_R, -0.35, 0, 0.44) // -20°, 0°, 25°\n .rotate(BoneName.ELBOW_L, 0, 0, -1.92) // -110°\n .rotate(BoneName.ELBOW_R, 0, 0, 1.92) // 110°\n .rotate(BoneName.WRIST_L, 0, 0, 0)\n .rotate(BoneName.WRIST_R, 0, 0, 0)\n .rotate(BoneName.KNEE_L, -0.26, 0, 0) // -15° (stable stance)\n .rotate(BoneName.KNEE_R, -0.26, 0, 0)\n .rotate(BoneName.HEAD, 0, 0, 0) // Head returns to neutral focus\n .position(BoneName.PELVIS, 0, 0, 0)\n .done<MartialArtsAnimationBuilder>()\n .build();\n\n// ═══════════════════════════════════════════════════════════════════════════\n// EXPORTS\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Map of all Gan technique combat animations for easy access\n * @korean 간괘기술애니메이션맵\n */\nexport const GAN_TECHNIQUE_ANIMATIONS: ReadonlyMap<string, SkeletalAnimation> = new Map([\n // Combat Techniques\n [\"gan_rock_defense\", GAN_ROCK_DEFENSE_ANIMATION],\n [\"gan_defensive_reversal\", GAN_DEFENSIVE_REVERSAL],\n]);\n"],"mappings":"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"}
@@ -322,7 +322,7 @@ var GEON_ELBOW_SMASH = MartialArtsAnimationBuilder.create("geon_elbow_smash", "
322
322
  * Map of all Geon-specific animations for easy access
323
323
  * @korean 건괘애니메이션맵
324
324
  */
325
- var GEON_ANIMATIONS = new Map([
325
+ var GEON_ANIMATIONS = /* @__PURE__ */ new Map([
326
326
  ["geon_idle_breathing", GEON_IDLE_BREATHING],
327
327
  ["geon_forward_advance", GEON_FORWARD_ADVANCE],
328
328
  ["geon_diagonal_power_step", GEON_DIAGONAL_POWER_STEP],