blacktrigram 0.7.68 → 0.7.70

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 +11 -11
@@ -1 +1 @@
1
- {"version":3,"file":"TrigramCalculator.js","names":[],"sources":["../../../src/systems/trigram/TrigramCalculator.ts"],"sourcesContent":["import { TrigramStance } from \"../../types/common\";\nimport { StanceLaterality } from \"./types\";\n\n/**\n * Enhanced stance effectiveness matrix for Korean martial arts\n * Based on traditional I-Ching trigram relationships\n */\nconst STANCE_EFFECTIVENESS_MATRIX: Record<\n TrigramStance,\n Partial<Record<TrigramStance, number>>\n> = {\n [TrigramStance.GEON]: { [TrigramStance.GON]: 1.2, [TrigramStance.SON]: 0.8 },\n [TrigramStance.GON]: { [TrigramStance.GEON]: 0.8, [TrigramStance.GAM]: 1.2 },\n [TrigramStance.TAE]: { [TrigramStance.JIN]: 1.2, [TrigramStance.GAN]: 0.8 },\n [TrigramStance.JIN]: { [TrigramStance.TAE]: 0.8, [TrigramStance.SON]: 1.2 },\n [TrigramStance.LI]: { [TrigramStance.GAM]: 0.8, [TrigramStance.TAE]: 0.8 },\n [TrigramStance.GAM]: {\n // water extinguishes fire:\n [TrigramStance.LI]: 1.2,\n [TrigramStance.GON]: 0.8,\n },\n [TrigramStance.SON]: { [TrigramStance.GEON]: 1.2, [TrigramStance.JIN]: 0.8 },\n [TrigramStance.GAN]: { [TrigramStance.TAE]: 1.2, [TrigramStance.LI]: 0.8 },\n};\n\nexport class TrigramCalculator {\n /**\n * Calculate effectiveness of one stance against another\n */\n calculateStanceEffectiveness(\n attackerStance: TrigramStance,\n defenderStance: TrigramStance\n ): number {\n if (attackerStance === defenderStance) {\n return 1.0; // Neutral when same stance\n }\n\n const effectiveness =\n STANCE_EFFECTIVENESS_MATRIX[attackerStance]?.[defenderStance];\n return effectiveness ?? 1.0; // Default to neutral if no specific relationship\n }\n\n /**\n * Get the optimal counter stance for a given stance\n */\n getCounterStance(targetStance: TrigramStance): TrigramStance {\n let bestCounter = TrigramStance.GEON;\n let bestEffectiveness = 0;\n\n // Find stance with highest effectiveness against target\n for (const stance of Object.values(TrigramStance)) {\n const effectiveness = this.calculateStanceEffectiveness(\n stance,\n targetStance\n );\n if (effectiveness > bestEffectiveness) {\n bestEffectiveness = effectiveness;\n bestCounter = stance;\n }\n }\n\n return bestCounter;\n }\n\n /**\n * Calculate transition difficulty between stances\n */\n calculateTransitionDifficulty(\n fromStance: TrigramStance,\n toStance: TrigramStance\n ): number {\n if (fromStance === toStance) return 0;\n\n // Base difficulty for any transition\n const baseDifficulty = 0.5;\n\n // Get stance order for adjacency calculation\n const stanceOrder = Object.values(TrigramStance);\n const fromIndex = stanceOrder.indexOf(fromStance);\n const toIndex = stanceOrder.indexOf(toStance);\n\n if (fromIndex === -1 || toIndex === -1) {\n return 1.0; // Unknown stances, high difficulty\n }\n\n // Calculate distance (adjacent stances are easier)\n const distance = Math.min(\n Math.abs(toIndex - fromIndex),\n stanceOrder.length - Math.abs(toIndex - fromIndex)\n );\n\n // Normalize distance to 0-1 range and add base difficulty\n const normalizedDistance = distance / (stanceOrder.length / 2);\n return baseDifficulty + normalizedDistance * 0.5;\n }\n\n /**\n * Calculate stance effectiveness between attacker and defender\n */\n static calculateStanceEffectiveness(\n attackerStance: TrigramStance,\n defenderStance: TrigramStance\n ): number {\n // Use the effectiveness matrix from constants\n const effectiveness =\n STANCE_EFFECTIVENESS_MATRIX[attackerStance]?.[defenderStance];\n return effectiveness ?? 1.0; // Default neutral effectiveness\n }\n\n /**\n * Get optimal counter stance against opponent stance\n */\n static getCounterStance(opponentStance: TrigramStance): TrigramStance {\n // Find the stance that has highest effectiveness against opponent\n const stances = Object.values(TrigramStance);\n let bestCounter = TrigramStance.GEON;\n let bestEffectiveness = 0;\n\n stances.forEach((stance) => {\n const effectiveness = this.calculateStanceEffectiveness(\n stance,\n opponentStance\n );\n if (effectiveness > bestEffectiveness) {\n bestEffectiveness = effectiveness;\n bestCounter = stance;\n }\n });\n\n return bestCounter;\n }\n\n /**\n * Calculate difficulty of transitioning between stances\n */\n static calculateTransitionDifficulty(\n fromStance: TrigramStance,\n toStance: TrigramStance\n ): number {\n if (fromStance === toStance) {\n return 0; // No transition needed\n }\n\n // Base difficulty for any transition\n const baseDifficulty = 0.5;\n\n // Get stance order for adjacency calculation\n const stanceOrder = Object.values(TrigramStance);\n const fromIndex = stanceOrder.indexOf(fromStance);\n const toIndex = stanceOrder.indexOf(toStance);\n\n if (fromIndex === -1 || toIndex === -1) {\n return 1.0; // Unknown stances, high difficulty\n }\n\n // Calculate distance (adjacent stances are easier)\n const distance = Math.min(\n Math.abs(toIndex - fromIndex),\n stanceOrder.length - Math.abs(toIndex - fromIndex)\n );\n\n // Normalize distance to 0-1 range and add base difficulty\n const normalizedDistance = distance / (stanceOrder.length / 2);\n return baseDifficulty + normalizedDistance * 0.5;\n }\n\n /**\n * Calculate laterality modifier based on stance matching.\n * \n * In Korean martial arts, matched stances (both fighters in same laterality)\n * create tactical advantages for mid-level attacks as centerlines are more exposed.\n * Mismatched stances (opposite laterality) provide defensive advantages as lead guards\n * naturally protect the centerline.\n * \n * @param attackerLaterality - Attacker's stance laterality (left or right)\n * @param defenderLaterality - Defender's stance laterality (left or right)\n * @param attackLevel - Attack level: \"high\", \"mid\", or \"low\"\n * @returns Damage multiplier (1.0 = neutral, >1.0 = advantage, <1.0 = disadvantage)\n * \n * @example\n * ```typescript\n * // Matched stances: attacker gains mid-level advantage\n * const modifier = TrigramCalculator.calculateLateralityModifier(\"left\", \"left\", \"mid\");\n * // Returns 1.15 (+15% effectiveness)\n * \n * // Mismatched stances: defender's guard protects centerline\n * const modifier = TrigramCalculator.calculateLateralityModifier(\"left\", \"right\", \"mid\");\n * // Returns 0.90 (-10% effectiveness)\n * ```\n * \n * @korean 측면성수정자계산\n */\n static calculateLateralityModifier(\n attackerLaterality: StanceLaterality,\n defenderLaterality: StanceLaterality,\n attackLevel: \"high\" | \"mid\" | \"low\" = \"mid\"\n ): number {\n const isMatched = attackerLaterality === defenderLaterality;\n\n // Laterality primarily affects mid-level attacks (centerline attacks)\n if (attackLevel === \"mid\") {\n // Matched stances: Open centerline = offensive advantage\n // Mismatched stances: Protected centerline = defensive advantage\n return isMatched ? 1.15 : 0.90;\n }\n\n // High and low attacks less affected by laterality\n // Slight tactical variation still exists\n if (attackLevel === \"high\") {\n return isMatched ? 1.05 : 0.98;\n }\n\n if (attackLevel === \"low\") {\n return isMatched ? 1.03 : 0.99;\n }\n\n // Default neutral\n return 1.0;\n }\n} // end of class\n\nexport { STANCE_EFFECTIVENESS_MATRIX };\n"],"mappings":";;;;;;AAOA,IAAM,8BAGF;EACD,cAAc,OAAO;GAAG,cAAc,MAAM;GAAM,cAAc,MAAM;CAAI;EAC1E,cAAc,MAAM;GAAG,cAAc,OAAO;GAAM,cAAc,MAAM;CAAI;EAC1E,cAAc,MAAM;GAAG,cAAc,MAAM;GAAM,cAAc,MAAM;CAAI;EACzE,cAAc,MAAM;GAAG,cAAc,MAAM;GAAM,cAAc,MAAM;CAAI;EACzE,cAAc,KAAK;GAAG,cAAc,MAAM;GAAM,cAAc,MAAM;CAAI;EACxE,cAAc,MAAM;GAElB,cAAc,KAAK;GACnB,cAAc,MAAM;CACvB;EACC,cAAc,MAAM;GAAG,cAAc,OAAO;GAAM,cAAc,MAAM;CAAI;EAC1E,cAAc,MAAM;GAAG,cAAc,MAAM;GAAM,cAAc,KAAK;CAAI;AAC3E;AAEA,IAAa,oBAAb,MAA+B;;;;CAI7B,6BACE,gBACA,gBACQ;EACR,IAAI,mBAAmB,gBACrB,OAAO;EAKT,OADE,4BAA4B,kBAAkB,mBACxB;CAC1B;;;;CAKA,iBAAiB,cAA4C;EAC3D,IAAI,cAAc,cAAc;EAChC,IAAI,oBAAoB;EAGxB,KAAK,MAAM,UAAU,OAAO,OAAO,aAAa,GAAG;GACjD,MAAM,gBAAgB,KAAK,6BACzB,QACA,YACF;GACA,IAAI,gBAAgB,mBAAmB;IACrC,oBAAoB;IACpB,cAAc;GAChB;EACF;EAEA,OAAO;CACT;;;;CAKA,8BACE,YACA,UACQ;EACR,IAAI,eAAe,UAAU,OAAO;EAGpC,MAAM,iBAAiB;EAGvB,MAAM,cAAc,OAAO,OAAO,aAAa;EAC/C,MAAM,YAAY,YAAY,QAAQ,UAAU;EAChD,MAAM,UAAU,YAAY,QAAQ,QAAQ;EAE5C,IAAI,cAAc,MAAM,YAAY,IAClC,OAAO;EAWT,OAAO,iBAPU,KAAK,IACpB,KAAK,IAAI,UAAU,SAAS,GAC5B,YAAY,SAAS,KAAK,IAAI,UAAU,SAAS,CAIxB,KAAY,YAAY,SAAS,KACf;CAC/C;;;;CAKA,OAAO,6BACL,gBACA,gBACQ;EAIR,OADE,4BAA4B,kBAAkB,mBACxB;CAC1B;;;;CAKA,OAAO,iBAAiB,gBAA8C;EAEpE,MAAM,UAAU,OAAO,OAAO,aAAa;EAC3C,IAAI,cAAc,cAAc;EAChC,IAAI,oBAAoB;EAExB,QAAQ,SAAS,WAAW;GAC1B,MAAM,gBAAgB,KAAK,6BACzB,QACA,cACF;GACA,IAAI,gBAAgB,mBAAmB;IACrC,oBAAoB;IACpB,cAAc;GAChB;EACF,CAAC;EAED,OAAO;CACT;;;;CAKA,OAAO,8BACL,YACA,UACQ;EACR,IAAI,eAAe,UACjB,OAAO;EAIT,MAAM,iBAAiB;EAGvB,MAAM,cAAc,OAAO,OAAO,aAAa;EAC/C,MAAM,YAAY,YAAY,QAAQ,UAAU;EAChD,MAAM,UAAU,YAAY,QAAQ,QAAQ;EAE5C,IAAI,cAAc,MAAM,YAAY,IAClC,OAAO;EAWT,OAAO,iBAPU,KAAK,IACpB,KAAK,IAAI,UAAU,SAAS,GAC5B,YAAY,SAAS,KAAK,IAAI,UAAU,SAAS,CAIxB,KAAY,YAAY,SAAS,KACf;CAC/C;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BA,OAAO,4BACL,oBACA,oBACA,cAAsC,OAC9B;EACR,MAAM,YAAY,uBAAuB;EAGzC,IAAI,gBAAgB,OAGlB,OAAO,YAAY,OAAO;EAK5B,IAAI,gBAAgB,QAClB,OAAO,YAAY,OAAO;EAG5B,IAAI,gBAAgB,OAClB,OAAO,YAAY,OAAO;EAI5B,OAAO;CACT;AACF"}
1
+ {"version":3,"file":"TrigramCalculator.js","names":[],"sources":["../../../src/systems/trigram/TrigramCalculator.ts"],"sourcesContent":["import { TrigramStance } from \"../../types/common\";\nimport { StanceLaterality } from \"./types\";\n\n/**\n * Enhanced stance effectiveness matrix for Korean martial arts\n * Based on traditional I-Ching trigram relationships\n */\nconst STANCE_EFFECTIVENESS_MATRIX: Record<\n TrigramStance,\n Partial<Record<TrigramStance, number>>\n> = {\n [TrigramStance.GEON]: { [TrigramStance.GON]: 1.2, [TrigramStance.SON]: 0.8 },\n [TrigramStance.GON]: { [TrigramStance.GEON]: 0.8, [TrigramStance.GAM]: 1.2 },\n [TrigramStance.TAE]: { [TrigramStance.JIN]: 1.2, [TrigramStance.GAN]: 0.8 },\n [TrigramStance.JIN]: { [TrigramStance.TAE]: 0.8, [TrigramStance.SON]: 1.2 },\n [TrigramStance.LI]: { [TrigramStance.GAM]: 0.8, [TrigramStance.TAE]: 0.8 },\n [TrigramStance.GAM]: {\n // water extinguishes fire:\n [TrigramStance.LI]: 1.2,\n [TrigramStance.GON]: 0.8,\n },\n [TrigramStance.SON]: { [TrigramStance.GEON]: 1.2, [TrigramStance.JIN]: 0.8 },\n [TrigramStance.GAN]: { [TrigramStance.TAE]: 1.2, [TrigramStance.LI]: 0.8 },\n};\n\nexport class TrigramCalculator {\n /**\n * Calculate effectiveness of one stance against another\n */\n calculateStanceEffectiveness(\n attackerStance: TrigramStance,\n defenderStance: TrigramStance\n ): number {\n if (attackerStance === defenderStance) {\n return 1.0; // Neutral when same stance\n }\n\n const effectiveness =\n STANCE_EFFECTIVENESS_MATRIX[attackerStance]?.[defenderStance];\n return effectiveness ?? 1.0; // Default to neutral if no specific relationship\n }\n\n /**\n * Get the optimal counter stance for a given stance\n */\n getCounterStance(targetStance: TrigramStance): TrigramStance {\n let bestCounter = TrigramStance.GEON;\n let bestEffectiveness = 0;\n\n // Find stance with highest effectiveness against target\n for (const stance of Object.values(TrigramStance)) {\n const effectiveness = this.calculateStanceEffectiveness(\n stance,\n targetStance\n );\n if (effectiveness > bestEffectiveness) {\n bestEffectiveness = effectiveness;\n bestCounter = stance;\n }\n }\n\n return bestCounter;\n }\n\n /**\n * Calculate transition difficulty between stances\n */\n calculateTransitionDifficulty(\n fromStance: TrigramStance,\n toStance: TrigramStance\n ): number {\n if (fromStance === toStance) return 0;\n\n // Base difficulty for any transition\n const baseDifficulty = 0.5;\n\n // Get stance order for adjacency calculation\n const stanceOrder = Object.values(TrigramStance);\n const fromIndex = stanceOrder.indexOf(fromStance);\n const toIndex = stanceOrder.indexOf(toStance);\n\n if (fromIndex === -1 || toIndex === -1) {\n return 1.0; // Unknown stances, high difficulty\n }\n\n // Calculate distance (adjacent stances are easier)\n const distance = Math.min(\n Math.abs(toIndex - fromIndex),\n stanceOrder.length - Math.abs(toIndex - fromIndex)\n );\n\n // Normalize distance to 0-1 range and add base difficulty\n const normalizedDistance = distance / (stanceOrder.length / 2);\n return baseDifficulty + normalizedDistance * 0.5;\n }\n\n /**\n * Calculate stance effectiveness between attacker and defender\n */\n static calculateStanceEffectiveness(\n attackerStance: TrigramStance,\n defenderStance: TrigramStance\n ): number {\n // Use the effectiveness matrix from constants\n const effectiveness =\n STANCE_EFFECTIVENESS_MATRIX[attackerStance]?.[defenderStance];\n return effectiveness ?? 1.0; // Default neutral effectiveness\n }\n\n /**\n * Get optimal counter stance against opponent stance\n */\n static getCounterStance(opponentStance: TrigramStance): TrigramStance {\n // Find the stance that has highest effectiveness against opponent\n const stances = Object.values(TrigramStance);\n let bestCounter = TrigramStance.GEON;\n let bestEffectiveness = 0;\n\n stances.forEach((stance) => {\n const effectiveness = this.calculateStanceEffectiveness(\n stance,\n opponentStance\n );\n if (effectiveness > bestEffectiveness) {\n bestEffectiveness = effectiveness;\n bestCounter = stance;\n }\n });\n\n return bestCounter;\n }\n\n /**\n * Calculate difficulty of transitioning between stances\n */\n static calculateTransitionDifficulty(\n fromStance: TrigramStance,\n toStance: TrigramStance\n ): number {\n if (fromStance === toStance) {\n return 0; // No transition needed\n }\n\n // Base difficulty for any transition\n const baseDifficulty = 0.5;\n\n // Get stance order for adjacency calculation\n const stanceOrder = Object.values(TrigramStance);\n const fromIndex = stanceOrder.indexOf(fromStance);\n const toIndex = stanceOrder.indexOf(toStance);\n\n if (fromIndex === -1 || toIndex === -1) {\n return 1.0; // Unknown stances, high difficulty\n }\n\n // Calculate distance (adjacent stances are easier)\n const distance = Math.min(\n Math.abs(toIndex - fromIndex),\n stanceOrder.length - Math.abs(toIndex - fromIndex)\n );\n\n // Normalize distance to 0-1 range and add base difficulty\n const normalizedDistance = distance / (stanceOrder.length / 2);\n return baseDifficulty + normalizedDistance * 0.5;\n }\n\n /**\n * Calculate laterality modifier based on stance matching.\n * \n * In Korean martial arts, matched stances (both fighters in same laterality)\n * create tactical advantages for mid-level attacks as centerlines are more exposed.\n * Mismatched stances (opposite laterality) provide defensive advantages as lead guards\n * naturally protect the centerline.\n * \n * @param attackerLaterality - Attacker's stance laterality (left or right)\n * @param defenderLaterality - Defender's stance laterality (left or right)\n * @param attackLevel - Attack level: \"high\", \"mid\", or \"low\"\n * @returns Damage multiplier (1.0 = neutral, >1.0 = advantage, <1.0 = disadvantage)\n * \n * @example\n * ```typescript\n * // Matched stances: attacker gains mid-level advantage\n * const modifier = TrigramCalculator.calculateLateralityModifier(\"left\", \"left\", \"mid\");\n * // Returns 1.15 (+15% effectiveness)\n * \n * // Mismatched stances: defender's guard protects centerline\n * const modifier = TrigramCalculator.calculateLateralityModifier(\"left\", \"right\", \"mid\");\n * // Returns 0.90 (-10% effectiveness)\n * ```\n * \n * @korean 측면성수정자계산\n */\n static calculateLateralityModifier(\n attackerLaterality: StanceLaterality,\n defenderLaterality: StanceLaterality,\n attackLevel: \"high\" | \"mid\" | \"low\" = \"mid\"\n ): number {\n const isMatched = attackerLaterality === defenderLaterality;\n\n // Laterality primarily affects mid-level attacks (centerline attacks)\n if (attackLevel === \"mid\") {\n // Matched stances: Open centerline = offensive advantage\n // Mismatched stances: Protected centerline = defensive advantage\n return isMatched ? 1.15 : 0.90;\n }\n\n // High and low attacks less affected by laterality\n // Slight tactical variation still exists\n if (attackLevel === \"high\") {\n return isMatched ? 1.05 : 0.98;\n }\n\n if (attackLevel === \"low\") {\n return isMatched ? 1.03 : 0.99;\n }\n\n // Default neutral\n return 1.0;\n }\n} // end of class\n\nexport { STANCE_EFFECTIVENESS_MATRIX };\n"],"mappings":";;;;;;AAOA,IAAM,8BAGF;EACD,cAAc,OAAO;GAAG,cAAc,MAAM;GAAM,cAAc,MAAM;CAAI;EAC1E,cAAc,MAAM;GAAG,cAAc,OAAO;GAAM,cAAc,MAAM;CAAI;EAC1E,cAAc,MAAM;GAAG,cAAc,MAAM;GAAM,cAAc,MAAM;CAAI;EACzE,cAAc,MAAM;GAAG,cAAc,MAAM;GAAM,cAAc,MAAM;CAAI;EACzE,cAAc,KAAK;GAAG,cAAc,MAAM;GAAM,cAAc,MAAM;CAAI;EACxE,cAAc,MAAM;GAElB,cAAc,KAAK;GACnB,cAAc,MAAM;CACvB;EACC,cAAc,MAAM;GAAG,cAAc,OAAO;GAAM,cAAc,MAAM;CAAI;EAC1E,cAAc,MAAM;GAAG,cAAc,MAAM;GAAM,cAAc,KAAK;CAAI;AAC3E;AAEA,IAAa,oBAAb,MAA+B;;;;CAI7B,6BACE,gBACA,gBACQ;EACR,IAAI,mBAAmB,gBACrB,OAAO;EAKT,OADE,4BAA4B,eAAe,GAAG,mBACxB;CAC1B;;;;CAKA,iBAAiB,cAA4C;EAC3D,IAAI,cAAc,cAAc;EAChC,IAAI,oBAAoB;EAGxB,KAAK,MAAM,UAAU,OAAO,OAAO,aAAa,GAAG;GACjD,MAAM,gBAAgB,KAAK,6BACzB,QACA,YACF;GACA,IAAI,gBAAgB,mBAAmB;IACrC,oBAAoB;IACpB,cAAc;GAChB;EACF;EAEA,OAAO;CACT;;;;CAKA,8BACE,YACA,UACQ;EACR,IAAI,eAAe,UAAU,OAAO;EAGpC,MAAM,iBAAiB;EAGvB,MAAM,cAAc,OAAO,OAAO,aAAa;EAC/C,MAAM,YAAY,YAAY,QAAQ,UAAU;EAChD,MAAM,UAAU,YAAY,QAAQ,QAAQ;EAE5C,IAAI,cAAc,MAAM,YAAY,IAClC,OAAO;EAWT,OAAO,iBAPU,KAAK,IACpB,KAAK,IAAI,UAAU,SAAS,GAC5B,YAAY,SAAS,KAAK,IAAI,UAAU,SAAS,CAIxB,KAAY,YAAY,SAAS,KACf;CAC/C;;;;CAKA,OAAO,6BACL,gBACA,gBACQ;EAIR,OADE,4BAA4B,eAAe,GAAG,mBACxB;CAC1B;;;;CAKA,OAAO,iBAAiB,gBAA8C;EAEpE,MAAM,UAAU,OAAO,OAAO,aAAa;EAC3C,IAAI,cAAc,cAAc;EAChC,IAAI,oBAAoB;EAExB,QAAQ,SAAS,WAAW;GAC1B,MAAM,gBAAgB,KAAK,6BACzB,QACA,cACF;GACA,IAAI,gBAAgB,mBAAmB;IACrC,oBAAoB;IACpB,cAAc;GAChB;EACF,CAAC;EAED,OAAO;CACT;;;;CAKA,OAAO,8BACL,YACA,UACQ;EACR,IAAI,eAAe,UACjB,OAAO;EAIT,MAAM,iBAAiB;EAGvB,MAAM,cAAc,OAAO,OAAO,aAAa;EAC/C,MAAM,YAAY,YAAY,QAAQ,UAAU;EAChD,MAAM,UAAU,YAAY,QAAQ,QAAQ;EAE5C,IAAI,cAAc,MAAM,YAAY,IAClC,OAAO;EAWT,OAAO,iBAPU,KAAK,IACpB,KAAK,IAAI,UAAU,SAAS,GAC5B,YAAY,SAAS,KAAK,IAAI,UAAU,SAAS,CAIxB,KAAY,YAAY,SAAS,KACf;CAC/C;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BA,OAAO,4BACL,oBACA,oBACA,cAAsC,OAC9B;EACR,MAAM,YAAY,uBAAuB;EAGzC,IAAI,gBAAgB,OAGlB,OAAO,YAAY,OAAO;EAK5B,IAAI,gBAAgB,QAClB,OAAO,YAAY,OAAO;EAG5B,IAAI,gBAAgB,OAClB,OAAO,YAAY,OAAO;EAI5B,OAAO;CACT;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"TechniqueConfig.js","names":[],"sources":["../../../../src/systems/trigram/techniques/TechniqueConfig.ts"],"sourcesContent":["/**\n * Technique Configuration & Constants\n * 한국 무술 기법 설정 및 상수\n *\n * Contains all configuration, modifiers, effectiveness matrices,\n * and metadata for the Korean martial arts technique system.\n *\n * @module TechniqueConfig\n */\n\nimport {\n CombatAttackType,\n DamageType,\n TrigramStance,\n} from \"../../../types/common\";\n\n// =====================================================\n// TECHNIQUE MODIFIERS\n// =====================================================\n\n/**\n * Technique effectiveness modifiers\n */\nexport const TECHNIQUE_MODIFIERS = {\n DAMAGE_VARIANCE: 0.15, // ±15% damage variance\n CRITICAL_DAMAGE_BASE: 1.5,\n VITAL_POINT_BONUS: 2.0,\n STANCE_MISMATCH_PENALTY: 0.8,\n COMBO_MULTIPLIER: 1.1,\n} as const;\n\n// =====================================================\n// TECHNIQUE PROPERTIES\n// =====================================================\n\n/**\n * Base properties for each combat attack type\n */\nexport const TECHNIQUE_PROPERTIES: Record<\n CombatAttackType,\n {\n readonly baseDamage: number;\n readonly range: number;\n readonly accuracy: number;\n readonly kiCost: number;\n readonly staminaCost: number;\n }\n> = {\n [CombatAttackType.STRIKE]: {\n baseDamage: 20,\n range: 1.0,\n accuracy: 0.85,\n kiCost: 15,\n staminaCost: 10,\n },\n [CombatAttackType.THRUST]: {\n baseDamage: 25,\n range: 1.5,\n accuracy: 0.9,\n kiCost: 18,\n staminaCost: 12,\n },\n [CombatAttackType.BLOCK]: {\n baseDamage: 5,\n range: 0.5,\n accuracy: 0.95,\n kiCost: 8,\n staminaCost: 15,\n },\n [CombatAttackType.COUNTER_ATTACK]: {\n baseDamage: 22,\n range: 1.0,\n accuracy: 0.88,\n kiCost: 20,\n staminaCost: 15,\n },\n [CombatAttackType.THROW]: {\n baseDamage: 30,\n range: 0.8,\n accuracy: 0.75,\n kiCost: 25,\n staminaCost: 20,\n },\n [CombatAttackType.GRAPPLE]: {\n baseDamage: 15,\n range: 0.6,\n accuracy: 0.8,\n kiCost: 20,\n staminaCost: 25,\n },\n [CombatAttackType.PRESSURE_POINT]: {\n baseDamage: 12,\n range: 0.8,\n accuracy: 0.95,\n kiCost: 25,\n staminaCost: 8,\n },\n [CombatAttackType.NERVE_STRIKE]: {\n baseDamage: 18,\n range: 1.0,\n accuracy: 0.9,\n kiCost: 22,\n staminaCost: 12,\n },\n [CombatAttackType.PUNCH]: {\n baseDamage: 18,\n range: 1.2,\n accuracy: 0.88,\n kiCost: 12,\n staminaCost: 8,\n },\n [CombatAttackType.KICK]: {\n baseDamage: 22,\n range: 1.8,\n accuracy: 0.82,\n kiCost: 16,\n staminaCost: 14,\n },\n [CombatAttackType.ELBOW]: {\n baseDamage: 26,\n range: 0.9,\n accuracy: 0.86,\n kiCost: 18,\n staminaCost: 12,\n },\n [CombatAttackType.KNEE]: {\n baseDamage: 28,\n range: 0.7,\n accuracy: 0.84,\n kiCost: 20,\n staminaCost: 16,\n },\n} as const;\n\n// =====================================================\n// DAMAGE TYPE EFFECTIVENESS\n// =====================================================\n\n/**\n * Damage type effectiveness against different body tissues\n * 데미지 유형별 조직 효과 매트릭스\n */\nexport const DAMAGE_TYPE_EFFECTIVENESS: Record<\n DamageType,\n Record<string, number>\n> = {\n blunt: {\n bone: 1.3,\n muscle: 1.1,\n organ: 1.0,\n nerve: 0.8,\n vascular: 0.9,\n joint: 1.2,\n },\n piercing: {\n bone: 0.7,\n muscle: 1.2,\n organ: 1.4,\n nerve: 1.1,\n vascular: 1.5,\n joint: 0.8,\n },\n slashing: {\n bone: 0.5,\n muscle: 1.3,\n organ: 1.1,\n nerve: 0.9,\n vascular: 1.4,\n joint: 0.7,\n },\n pressure: {\n bone: 0.6,\n muscle: 0.9,\n organ: 1.1,\n nerve: 1.6,\n vascular: 1.3,\n joint: 1.0,\n },\n nerve: {\n bone: 0.4,\n muscle: 0.8,\n organ: 1.0,\n nerve: 1.8,\n vascular: 1.2,\n joint: 0.9,\n },\n joint: {\n bone: 1.1,\n muscle: 0.9,\n organ: 0.7,\n nerve: 0.8,\n vascular: 0.6,\n joint: 1.7,\n },\n internal: {\n bone: 0.3,\n muscle: 0.7,\n organ: 1.5,\n nerve: 1.3,\n vascular: 1.1,\n joint: 0.5,\n },\n impact: {\n bone: 1.2,\n muscle: 1.0,\n organ: 1.1,\n nerve: 0.9,\n vascular: 0.8,\n joint: 1.3,\n },\n crushing: {\n bone: 1.5,\n muscle: 1.2,\n organ: 1.3,\n nerve: 0.7,\n vascular: 0.8,\n joint: 1.4,\n },\n sharp: {\n bone: 0.6,\n muscle: 1.4,\n organ: 1.2,\n nerve: 1.0,\n vascular: 1.6,\n joint: 0.8,\n },\n electric: {\n bone: 0.2,\n muscle: 1.0,\n organ: 0.9,\n nerve: 2.0,\n vascular: 1.1,\n joint: 0.5,\n },\n fire: {\n bone: 0.3,\n muscle: 1.1,\n organ: 1.2,\n nerve: 1.4,\n vascular: 1.0,\n joint: 0.6,\n },\n ice: {\n bone: 0.4,\n muscle: 0.8,\n organ: 0.9,\n nerve: 1.2,\n vascular: 0.7,\n joint: 1.1,\n },\n poison: {\n bone: 0.1,\n muscle: 0.6,\n organ: 1.8,\n nerve: 1.5,\n vascular: 1.7,\n joint: 0.3,\n },\n psychic: {\n bone: 0.0,\n muscle: 0.2,\n organ: 0.5,\n nerve: 2.2,\n vascular: 0.4,\n joint: 0.1,\n },\n blood: {\n bone: 0.2,\n muscle: 0.8,\n organ: 1.0,\n nerve: 0.5,\n vascular: 2.0,\n joint: 0.3,\n },\n} as const;\n\n// =====================================================\n// TRIGRAM TECHNIQUE PROPERTIES\n// =====================================================\n\n/**\n * Korean trigram technique properties (팔괘 기법 특성)\n */\nexport const TRIGRAM_TECHNIQUE_PROPERTIES = {\n geon: {\n korean: \"건괘\",\n english: \"Heaven\",\n element: \"metal\",\n nature: \"yang\",\n combatStyle: \"direct_force\",\n preferredDamageTypes: [\"blunt\", \"crushing\", \"impact\"],\n philosophy: \"정의로운 행동을 통한 압도적 힘\",\n },\n tae: {\n korean: \"태괘\",\n english: \"Lake\",\n element: \"metal\",\n nature: \"yin\",\n combatStyle: \"fluid_adaptation\",\n preferredDamageTypes: [\"pressure\", \"joint\", \"nerve\"],\n philosophy: \"부드러운 지속성이 경직된 저항을 이긴다\",\n },\n li: {\n korean: \"리괘\",\n english: \"Fire\",\n element: \"fire\",\n nature: \"yang\",\n combatStyle: \"precision_strikes\",\n preferredDamageTypes: [\"piercing\", \"sharp\", \"fire\"],\n philosophy: \"외과적 정밀함으로 약점을 조명한다\",\n },\n jin: {\n korean: \"진괘\",\n english: \"Thunder\",\n element: \"wood\",\n nature: \"yang\",\n combatStyle: \"explosive_power\",\n preferredDamageTypes: [\"electric\", \"impact\", \"blunt\"],\n philosophy: \"번개처럼 치고 천둥처럼 움직인다\",\n },\n son: {\n korean: \"손괘\",\n english: \"Wind\",\n element: \"wood\",\n nature: \"yin\",\n combatStyle: \"continuous_pressure\",\n preferredDamageTypes: [\"slashing\", \"pressure\", \"nerve\"],\n philosophy: \"지속적인 부드러운 힘이 모든 방어를 관통한다\",\n },\n gam: {\n korean: \"감괘\",\n english: \"Water\",\n element: \"water\",\n nature: \"yang\",\n combatStyle: \"adaptive_flow\",\n preferredDamageTypes: [\"blood\", \"poison\", \"internal\"],\n philosophy: \"장애물 주위로 흘러 급소를 타격한다\",\n },\n gan: {\n korean: \"간괘\",\n english: \"Mountain\",\n element: \"earth\",\n nature: \"yang\",\n combatStyle: \"immovable_defense\",\n preferredDamageTypes: [\"blunt\", \"crushing\", \"internal\"],\n philosophy: \"정적 속에 무한한 잠재 에너지를 담는다\",\n },\n gon: {\n korean: \"곤괘\",\n english: \"Earth\",\n element: \"earth\",\n nature: \"yin\",\n combatStyle: \"supportive_control\",\n preferredDamageTypes: [\"joint\", \"pressure\", \"internal\"],\n philosophy: \"지원하고 양육하여 승리를 이룬다\",\n },\n} as const;\n\n// =====================================================\n// KOREAN NAMING CONVENTIONS\n// =====================================================\n\n/**\n * Korean technique naming convention (한국 무술 명명법)\n */\nexport const TECHNIQUE_NAMING = {\n prefixes: {\n heaven: \"천\", // Heaven/Sky\n earth: \"지\", // Earth\n human: \"인\", // Human\n wind: \"풍\", // Wind\n thunder: \"뇌\", // Thunder\n fire: \"화\", // Fire\n water: \"수\", // Water\n mountain: \"산\", // Mountain\n },\n suffixes: {\n strike: \"격\", // Strike/Hit\n thrust: \"찌르기\", // Thrust/Stab\n block: \"막기\", // Block/Defend\n throw: \"던지기\", // Throw\n technique: \"술\", // Technique/Art\n method: \"법\", // Method/Way\n },\n} as const;\n\n// =====================================================\n// TECHNIQUE CATEGORIES\n// =====================================================\n\n/**\n * Korean martial arts technique categories (한국 무술 기법 분류)\n */\nexport const KOREAN_TECHNIQUE_CATEGORIES = {\n striking: {\n korean: \"타격술\",\n english: \"Striking Techniques\",\n subcategories: [\"punch\", \"kick\", \"elbow\", \"knee\", \"palm\"],\n },\n grappling: {\n korean: \"잡기술\",\n english: \"Grappling Techniques\",\n subcategories: [\"throw\", \"takedown\", \"joint_lock\", \"choke\"],\n },\n pressure_point: {\n korean: \"혈도술\",\n english: \"Pressure Point Techniques\",\n subcategories: [\"nerve_strike\", \"blood_flow\", \"ki_disruption\"],\n },\n defensive: {\n korean: \"방어술\",\n english: \"Defensive Techniques\",\n subcategories: [\"block\", \"parry\", \"dodge\", \"counter\"],\n },\n} as const;\n\n// =====================================================\n// DIFFICULTY LEVELS\n// =====================================================\n\n/**\n * Korean technique difficulty progression (한국 무술 난이도 체계)\n */\nexport const TECHNIQUE_DIFFICULTY_LEVELS = {\n basic: {\n korean: \"기초\",\n english: \"Basic\",\n requirements: { ki: 10, stamina: 8, experience: 0 },\n },\n intermediate: {\n korean: \"중급\",\n english: \"Intermediate\",\n requirements: { ki: 20, stamina: 15, experience: 100 },\n },\n advanced: {\n korean: \"고급\",\n english: \"Advanced\",\n requirements: { ki: 35, stamina: 25, experience: 500 },\n },\n master: {\n korean: \"사범\",\n english: \"Master\",\n requirements: { ki: 50, stamina: 40, experience: 1000 },\n },\n} as const;\n\n// =====================================================\n// ARCHETYPE BONUSES\n// =====================================================\n\n/**\n * Korean archetype combat specializations (한국 무사 유형별 전투 특화)\n */\nexport const ARCHETYPE_TECHNIQUE_BONUSES = {\n musa: {\n korean: \"무사\",\n english: \"Traditional Warrior\",\n philosophy: \"Honor through strength, disciplined combat\",\n combatStyle: \"Direct confrontation, overwhelming force\",\n preferredTrigrams: [\"geon\", \"jin\"],\n techniques: {\n 관절기법: \"Joint manipulation and control\",\n 급소타격: \"Military-taught pressure point targeting\",\n 제압술: \"Honor-based control methods\",\n },\n bonuses: {\n damageResistance: 1.2,\n jointTechniques: 1.5,\n militaryDiscipline: 1.3,\n darkOpsEffectiveness: 0.85,\n damageBonus: 1.2,\n accuracyBonus: 1.1,\n kiEfficiency: 1.0,\n staminaEfficiency: 1.1,\n },\n preferredTechniques: [\"strike\", \"block\", \"counter_attack\"],\n },\n amsalja: {\n korean: \"암살자\",\n english: \"Shadow Assassin\",\n philosophy: \"Efficiency through invisibility, one perfect strike\",\n combatStyle: \"Stealth approaches, instant takedowns\",\n preferredTrigrams: [\"son\", \"gam\", \"li\"],\n techniques: {\n 무성제압: \"Silent takedowns preventing vocal response\",\n 신경파괴: \"Precise neural disruption for stealth\",\n 호흡차단: \"Silent breathing and consciousness targeting\",\n 암흑작전: \"Dark Ops techniques for silent incapacitation\",\n },\n bonuses: {\n stealthMultiplier: 1.8,\n oneStrikeKill: 2.0,\n silentMovement: 1.5,\n darkOpsEffectiveness: 1.3,\n nightOperationsBonus: 1.25,\n damageBonus: 1.5,\n accuracyBonus: 1.3,\n kiEfficiency: 1.2,\n staminaEfficiency: 0.9,\n },\n preferredTechniques: [\n \"nerve_strike\",\n \"pressure_point\",\n \"thrust\",\n \"darkops\",\n ],\n },\n hacker: {\n korean: \"해커\",\n english: \"Cyber Warrior\",\n philosophy: \"Information as power, technological advantage\",\n combatStyle: \"Environmental manipulation, tech-assisted strikes\",\n preferredTrigrams: [\"li\", \"tae\"],\n techniques: {\n 해부학적분석: \"Data-driven approach to vital points\",\n 생체역학파괴: \"Tech-enhanced body mechanics understanding\",\n 체계적제압: \"Algorithm-based damage accumulation\",\n 디지털타격: \"Digital targeting systems for Dark Ops\",\n },\n bonuses: {\n precisionAnalysis: 1.6,\n environmentalControl: 1.4,\n dataOptimization: 1.3,\n darkOpsEffectiveness: 1.1,\n damageBonus: 1.1,\n accuracyBonus: 1.4,\n kiEfficiency: 1.3,\n staminaEfficiency: 1.0,\n },\n preferredTechniques: [\"pressure_point\", \"nerve_strike\"],\n },\n jeongbo_yowon: {\n korean: \"정보요원\",\n english: \"Intelligence Operative\",\n philosophy: \"Knowledge through observation, strategic thinking\",\n combatStyle: \"Psychological manipulation, precise timing\",\n preferredTrigrams: [\"gan\", \"gon\"],\n techniques: {\n 고통순응: \"Intelligence-based submission through pain\",\n 심리적압박: \"Mental intimidation through technique\",\n 정보추출: \"Combat methods from interrogation training\",\n 첩보전술: \"Espionage tactics and Dark Ops methods\",\n },\n bonuses: {\n psychologicalWarfare: 1.5,\n strategicAnalysis: 1.4,\n painCompliance: 1.7,\n darkOpsEffectiveness: 1.15,\n damageBonus: 1.1,\n accuracyBonus: 1.2,\n kiEfficiency: 1.1,\n staminaEfficiency: 1.2,\n },\n preferredTechniques: [\"grapple\", \"pressure_point\"],\n },\n jojik_pokryeokbae: {\n korean: \"조직폭력배\",\n english: \"Organized Crime\",\n philosophy: \"Survival through ruthlessness, practical violence\",\n combatStyle: \"Dirty fighting, improvised weapons\",\n preferredTrigrams: [\"jin\", \"gam\"],\n techniques: {\n 환경활용: \"Street-smart use of surroundings as weapons\",\n 더러운기법: \"Brutal eye attacks, groin strikes, hair pulling\",\n 생존격투: \"Underground whatever-it-takes combat\",\n 무자비술: \"Ruthless Dark Ops adaptations\",\n },\n bonuses: {\n dirtyFighting: 1.8,\n survivalInstinct: 1.6,\n streetSmart: 1.5,\n darkOpsEffectiveness: 1.05,\n damageBonus: 1.3,\n accuracyBonus: 0.9,\n kiEfficiency: 0.9,\n staminaEfficiency: 1.3,\n },\n preferredTechniques: [\"strike\", \"throw\", \"grapple\"],\n },\n} as const;\n\n// =====================================================\n// STANCE-TRIGRAM MAPPING\n// =====================================================\n\n/**\n * Map TrigramStance enum to trigram key strings\n */\nexport function getTrigramKey(\n stance: TrigramStance\n): keyof typeof TRIGRAM_TECHNIQUE_PROPERTIES {\n const stanceMap: Record<\n TrigramStance,\n keyof typeof TRIGRAM_TECHNIQUE_PROPERTIES\n > = {\n [TrigramStance.GEON]: \"geon\",\n [TrigramStance.TAE]: \"tae\",\n [TrigramStance.LI]: \"li\",\n [TrigramStance.JIN]: \"jin\",\n [TrigramStance.SON]: \"son\",\n [TrigramStance.GAM]: \"gam\",\n [TrigramStance.GAN]: \"gan\",\n [TrigramStance.GON]: \"gon\",\n };\n return stanceMap[stance];\n}\n\n/**\n * Get trigram properties by stance\n */\nexport function getTrigramProperties(stance: TrigramStance) {\n const key = getTrigramKey(stance);\n return TRIGRAM_TECHNIQUE_PROPERTIES[key];\n}\n\n/**\n * Calculate damage effectiveness for a damage type against tissue\n */\nexport function calculateDamageEffectiveness(\n damageType: DamageType,\n tissueType: string\n): number {\n const effectiveness = DAMAGE_TYPE_EFFECTIVENESS[damageType];\n return effectiveness?.[tissueType] ?? 1.0;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"TechniqueConfig.js","names":[],"sources":["../../../../src/systems/trigram/techniques/TechniqueConfig.ts"],"sourcesContent":["/**\n * Technique Configuration & Constants\n * 한국 무술 기법 설정 및 상수\n *\n * Contains all configuration, modifiers, effectiveness matrices,\n * and metadata for the Korean martial arts technique system.\n *\n * @module TechniqueConfig\n */\n\nimport {\n CombatAttackType,\n DamageType,\n TrigramStance,\n} from \"../../../types/common\";\n\n// =====================================================\n// TECHNIQUE MODIFIERS\n// =====================================================\n\n/**\n * Technique effectiveness modifiers\n */\nexport const TECHNIQUE_MODIFIERS = {\n DAMAGE_VARIANCE: 0.15, // ±15% damage variance\n CRITICAL_DAMAGE_BASE: 1.5,\n VITAL_POINT_BONUS: 2.0,\n STANCE_MISMATCH_PENALTY: 0.8,\n COMBO_MULTIPLIER: 1.1,\n} as const;\n\n// =====================================================\n// TECHNIQUE PROPERTIES\n// =====================================================\n\n/**\n * Base properties for each combat attack type\n */\nexport const TECHNIQUE_PROPERTIES: Record<\n CombatAttackType,\n {\n readonly baseDamage: number;\n readonly range: number;\n readonly accuracy: number;\n readonly kiCost: number;\n readonly staminaCost: number;\n }\n> = {\n [CombatAttackType.STRIKE]: {\n baseDamage: 20,\n range: 1.0,\n accuracy: 0.85,\n kiCost: 15,\n staminaCost: 10,\n },\n [CombatAttackType.THRUST]: {\n baseDamage: 25,\n range: 1.5,\n accuracy: 0.9,\n kiCost: 18,\n staminaCost: 12,\n },\n [CombatAttackType.BLOCK]: {\n baseDamage: 5,\n range: 0.5,\n accuracy: 0.95,\n kiCost: 8,\n staminaCost: 15,\n },\n [CombatAttackType.COUNTER_ATTACK]: {\n baseDamage: 22,\n range: 1.0,\n accuracy: 0.88,\n kiCost: 20,\n staminaCost: 15,\n },\n [CombatAttackType.THROW]: {\n baseDamage: 30,\n range: 0.8,\n accuracy: 0.75,\n kiCost: 25,\n staminaCost: 20,\n },\n [CombatAttackType.GRAPPLE]: {\n baseDamage: 15,\n range: 0.6,\n accuracy: 0.8,\n kiCost: 20,\n staminaCost: 25,\n },\n [CombatAttackType.PRESSURE_POINT]: {\n baseDamage: 12,\n range: 0.8,\n accuracy: 0.95,\n kiCost: 25,\n staminaCost: 8,\n },\n [CombatAttackType.NERVE_STRIKE]: {\n baseDamage: 18,\n range: 1.0,\n accuracy: 0.9,\n kiCost: 22,\n staminaCost: 12,\n },\n [CombatAttackType.PUNCH]: {\n baseDamage: 18,\n range: 1.2,\n accuracy: 0.88,\n kiCost: 12,\n staminaCost: 8,\n },\n [CombatAttackType.KICK]: {\n baseDamage: 22,\n range: 1.8,\n accuracy: 0.82,\n kiCost: 16,\n staminaCost: 14,\n },\n [CombatAttackType.ELBOW]: {\n baseDamage: 26,\n range: 0.9,\n accuracy: 0.86,\n kiCost: 18,\n staminaCost: 12,\n },\n [CombatAttackType.KNEE]: {\n baseDamage: 28,\n range: 0.7,\n accuracy: 0.84,\n kiCost: 20,\n staminaCost: 16,\n },\n} as const;\n\n// =====================================================\n// DAMAGE TYPE EFFECTIVENESS\n// =====================================================\n\n/**\n * Damage type effectiveness against different body tissues\n * 데미지 유형별 조직 효과 매트릭스\n */\nexport const DAMAGE_TYPE_EFFECTIVENESS: Record<\n DamageType,\n Record<string, number>\n> = {\n blunt: {\n bone: 1.3,\n muscle: 1.1,\n organ: 1.0,\n nerve: 0.8,\n vascular: 0.9,\n joint: 1.2,\n },\n piercing: {\n bone: 0.7,\n muscle: 1.2,\n organ: 1.4,\n nerve: 1.1,\n vascular: 1.5,\n joint: 0.8,\n },\n slashing: {\n bone: 0.5,\n muscle: 1.3,\n organ: 1.1,\n nerve: 0.9,\n vascular: 1.4,\n joint: 0.7,\n },\n pressure: {\n bone: 0.6,\n muscle: 0.9,\n organ: 1.1,\n nerve: 1.6,\n vascular: 1.3,\n joint: 1.0,\n },\n nerve: {\n bone: 0.4,\n muscle: 0.8,\n organ: 1.0,\n nerve: 1.8,\n vascular: 1.2,\n joint: 0.9,\n },\n joint: {\n bone: 1.1,\n muscle: 0.9,\n organ: 0.7,\n nerve: 0.8,\n vascular: 0.6,\n joint: 1.7,\n },\n internal: {\n bone: 0.3,\n muscle: 0.7,\n organ: 1.5,\n nerve: 1.3,\n vascular: 1.1,\n joint: 0.5,\n },\n impact: {\n bone: 1.2,\n muscle: 1.0,\n organ: 1.1,\n nerve: 0.9,\n vascular: 0.8,\n joint: 1.3,\n },\n crushing: {\n bone: 1.5,\n muscle: 1.2,\n organ: 1.3,\n nerve: 0.7,\n vascular: 0.8,\n joint: 1.4,\n },\n sharp: {\n bone: 0.6,\n muscle: 1.4,\n organ: 1.2,\n nerve: 1.0,\n vascular: 1.6,\n joint: 0.8,\n },\n electric: {\n bone: 0.2,\n muscle: 1.0,\n organ: 0.9,\n nerve: 2.0,\n vascular: 1.1,\n joint: 0.5,\n },\n fire: {\n bone: 0.3,\n muscle: 1.1,\n organ: 1.2,\n nerve: 1.4,\n vascular: 1.0,\n joint: 0.6,\n },\n ice: {\n bone: 0.4,\n muscle: 0.8,\n organ: 0.9,\n nerve: 1.2,\n vascular: 0.7,\n joint: 1.1,\n },\n poison: {\n bone: 0.1,\n muscle: 0.6,\n organ: 1.8,\n nerve: 1.5,\n vascular: 1.7,\n joint: 0.3,\n },\n psychic: {\n bone: 0.0,\n muscle: 0.2,\n organ: 0.5,\n nerve: 2.2,\n vascular: 0.4,\n joint: 0.1,\n },\n blood: {\n bone: 0.2,\n muscle: 0.8,\n organ: 1.0,\n nerve: 0.5,\n vascular: 2.0,\n joint: 0.3,\n },\n} as const;\n\n// =====================================================\n// TRIGRAM TECHNIQUE PROPERTIES\n// =====================================================\n\n/**\n * Korean trigram technique properties (팔괘 기법 특성)\n */\nexport const TRIGRAM_TECHNIQUE_PROPERTIES = {\n geon: {\n korean: \"건괘\",\n english: \"Heaven\",\n element: \"metal\",\n nature: \"yang\",\n combatStyle: \"direct_force\",\n preferredDamageTypes: [\"blunt\", \"crushing\", \"impact\"],\n philosophy: \"정의로운 행동을 통한 압도적 힘\",\n },\n tae: {\n korean: \"태괘\",\n english: \"Lake\",\n element: \"metal\",\n nature: \"yin\",\n combatStyle: \"fluid_adaptation\",\n preferredDamageTypes: [\"pressure\", \"joint\", \"nerve\"],\n philosophy: \"부드러운 지속성이 경직된 저항을 이긴다\",\n },\n li: {\n korean: \"리괘\",\n english: \"Fire\",\n element: \"fire\",\n nature: \"yang\",\n combatStyle: \"precision_strikes\",\n preferredDamageTypes: [\"piercing\", \"sharp\", \"fire\"],\n philosophy: \"외과적 정밀함으로 약점을 조명한다\",\n },\n jin: {\n korean: \"진괘\",\n english: \"Thunder\",\n element: \"wood\",\n nature: \"yang\",\n combatStyle: \"explosive_power\",\n preferredDamageTypes: [\"electric\", \"impact\", \"blunt\"],\n philosophy: \"번개처럼 치고 천둥처럼 움직인다\",\n },\n son: {\n korean: \"손괘\",\n english: \"Wind\",\n element: \"wood\",\n nature: \"yin\",\n combatStyle: \"continuous_pressure\",\n preferredDamageTypes: [\"slashing\", \"pressure\", \"nerve\"],\n philosophy: \"지속적인 부드러운 힘이 모든 방어를 관통한다\",\n },\n gam: {\n korean: \"감괘\",\n english: \"Water\",\n element: \"water\",\n nature: \"yang\",\n combatStyle: \"adaptive_flow\",\n preferredDamageTypes: [\"blood\", \"poison\", \"internal\"],\n philosophy: \"장애물 주위로 흘러 급소를 타격한다\",\n },\n gan: {\n korean: \"간괘\",\n english: \"Mountain\",\n element: \"earth\",\n nature: \"yang\",\n combatStyle: \"immovable_defense\",\n preferredDamageTypes: [\"blunt\", \"crushing\", \"internal\"],\n philosophy: \"정적 속에 무한한 잠재 에너지를 담는다\",\n },\n gon: {\n korean: \"곤괘\",\n english: \"Earth\",\n element: \"earth\",\n nature: \"yin\",\n combatStyle: \"supportive_control\",\n preferredDamageTypes: [\"joint\", \"pressure\", \"internal\"],\n philosophy: \"지원하고 양육하여 승리를 이룬다\",\n },\n} as const;\n\n// =====================================================\n// KOREAN NAMING CONVENTIONS\n// =====================================================\n\n/**\n * Korean technique naming convention (한국 무술 명명법)\n */\nexport const TECHNIQUE_NAMING = {\n prefixes: {\n heaven: \"천\", // Heaven/Sky\n earth: \"지\", // Earth\n human: \"인\", // Human\n wind: \"풍\", // Wind\n thunder: \"뇌\", // Thunder\n fire: \"화\", // Fire\n water: \"수\", // Water\n mountain: \"산\", // Mountain\n },\n suffixes: {\n strike: \"격\", // Strike/Hit\n thrust: \"찌르기\", // Thrust/Stab\n block: \"막기\", // Block/Defend\n throw: \"던지기\", // Throw\n technique: \"술\", // Technique/Art\n method: \"법\", // Method/Way\n },\n} as const;\n\n// =====================================================\n// TECHNIQUE CATEGORIES\n// =====================================================\n\n/**\n * Korean martial arts technique categories (한국 무술 기법 분류)\n */\nexport const KOREAN_TECHNIQUE_CATEGORIES = {\n striking: {\n korean: \"타격술\",\n english: \"Striking Techniques\",\n subcategories: [\"punch\", \"kick\", \"elbow\", \"knee\", \"palm\"],\n },\n grappling: {\n korean: \"잡기술\",\n english: \"Grappling Techniques\",\n subcategories: [\"throw\", \"takedown\", \"joint_lock\", \"choke\"],\n },\n pressure_point: {\n korean: \"혈도술\",\n english: \"Pressure Point Techniques\",\n subcategories: [\"nerve_strike\", \"blood_flow\", \"ki_disruption\"],\n },\n defensive: {\n korean: \"방어술\",\n english: \"Defensive Techniques\",\n subcategories: [\"block\", \"parry\", \"dodge\", \"counter\"],\n },\n} as const;\n\n// =====================================================\n// DIFFICULTY LEVELS\n// =====================================================\n\n/**\n * Korean technique difficulty progression (한국 무술 난이도 체계)\n */\nexport const TECHNIQUE_DIFFICULTY_LEVELS = {\n basic: {\n korean: \"기초\",\n english: \"Basic\",\n requirements: { ki: 10, stamina: 8, experience: 0 },\n },\n intermediate: {\n korean: \"중급\",\n english: \"Intermediate\",\n requirements: { ki: 20, stamina: 15, experience: 100 },\n },\n advanced: {\n korean: \"고급\",\n english: \"Advanced\",\n requirements: { ki: 35, stamina: 25, experience: 500 },\n },\n master: {\n korean: \"사범\",\n english: \"Master\",\n requirements: { ki: 50, stamina: 40, experience: 1000 },\n },\n} as const;\n\n// =====================================================\n// ARCHETYPE BONUSES\n// =====================================================\n\n/**\n * Korean archetype combat specializations (한국 무사 유형별 전투 특화)\n */\nexport const ARCHETYPE_TECHNIQUE_BONUSES = {\n musa: {\n korean: \"무사\",\n english: \"Traditional Warrior\",\n philosophy: \"Honor through strength, disciplined combat\",\n combatStyle: \"Direct confrontation, overwhelming force\",\n preferredTrigrams: [\"geon\", \"jin\"],\n techniques: {\n 관절기법: \"Joint manipulation and control\",\n 급소타격: \"Military-taught pressure point targeting\",\n 제압술: \"Honor-based control methods\",\n },\n bonuses: {\n damageResistance: 1.2,\n jointTechniques: 1.5,\n militaryDiscipline: 1.3,\n darkOpsEffectiveness: 0.85,\n damageBonus: 1.2,\n accuracyBonus: 1.1,\n kiEfficiency: 1.0,\n staminaEfficiency: 1.1,\n },\n preferredTechniques: [\"strike\", \"block\", \"counter_attack\"],\n },\n amsalja: {\n korean: \"암살자\",\n english: \"Shadow Assassin\",\n philosophy: \"Efficiency through invisibility, one perfect strike\",\n combatStyle: \"Stealth approaches, instant takedowns\",\n preferredTrigrams: [\"son\", \"gam\", \"li\"],\n techniques: {\n 무성제압: \"Silent takedowns preventing vocal response\",\n 신경파괴: \"Precise neural disruption for stealth\",\n 호흡차단: \"Silent breathing and consciousness targeting\",\n 암흑작전: \"Dark Ops techniques for silent incapacitation\",\n },\n bonuses: {\n stealthMultiplier: 1.8,\n oneStrikeKill: 2.0,\n silentMovement: 1.5,\n darkOpsEffectiveness: 1.3,\n nightOperationsBonus: 1.25,\n damageBonus: 1.5,\n accuracyBonus: 1.3,\n kiEfficiency: 1.2,\n staminaEfficiency: 0.9,\n },\n preferredTechniques: [\n \"nerve_strike\",\n \"pressure_point\",\n \"thrust\",\n \"darkops\",\n ],\n },\n hacker: {\n korean: \"해커\",\n english: \"Cyber Warrior\",\n philosophy: \"Information as power, technological advantage\",\n combatStyle: \"Environmental manipulation, tech-assisted strikes\",\n preferredTrigrams: [\"li\", \"tae\"],\n techniques: {\n 해부학적분석: \"Data-driven approach to vital points\",\n 생체역학파괴: \"Tech-enhanced body mechanics understanding\",\n 체계적제압: \"Algorithm-based damage accumulation\",\n 디지털타격: \"Digital targeting systems for Dark Ops\",\n },\n bonuses: {\n precisionAnalysis: 1.6,\n environmentalControl: 1.4,\n dataOptimization: 1.3,\n darkOpsEffectiveness: 1.1,\n damageBonus: 1.1,\n accuracyBonus: 1.4,\n kiEfficiency: 1.3,\n staminaEfficiency: 1.0,\n },\n preferredTechniques: [\"pressure_point\", \"nerve_strike\"],\n },\n jeongbo_yowon: {\n korean: \"정보요원\",\n english: \"Intelligence Operative\",\n philosophy: \"Knowledge through observation, strategic thinking\",\n combatStyle: \"Psychological manipulation, precise timing\",\n preferredTrigrams: [\"gan\", \"gon\"],\n techniques: {\n 고통순응: \"Intelligence-based submission through pain\",\n 심리적압박: \"Mental intimidation through technique\",\n 정보추출: \"Combat methods from interrogation training\",\n 첩보전술: \"Espionage tactics and Dark Ops methods\",\n },\n bonuses: {\n psychologicalWarfare: 1.5,\n strategicAnalysis: 1.4,\n painCompliance: 1.7,\n darkOpsEffectiveness: 1.15,\n damageBonus: 1.1,\n accuracyBonus: 1.2,\n kiEfficiency: 1.1,\n staminaEfficiency: 1.2,\n },\n preferredTechniques: [\"grapple\", \"pressure_point\"],\n },\n jojik_pokryeokbae: {\n korean: \"조직폭력배\",\n english: \"Organized Crime\",\n philosophy: \"Survival through ruthlessness, practical violence\",\n combatStyle: \"Dirty fighting, improvised weapons\",\n preferredTrigrams: [\"jin\", \"gam\"],\n techniques: {\n 환경활용: \"Street-smart use of surroundings as weapons\",\n 더러운기법: \"Brutal eye attacks, groin strikes, hair pulling\",\n 생존격투: \"Underground whatever-it-takes combat\",\n 무자비술: \"Ruthless Dark Ops adaptations\",\n },\n bonuses: {\n dirtyFighting: 1.8,\n survivalInstinct: 1.6,\n streetSmart: 1.5,\n darkOpsEffectiveness: 1.05,\n damageBonus: 1.3,\n accuracyBonus: 0.9,\n kiEfficiency: 0.9,\n staminaEfficiency: 1.3,\n },\n preferredTechniques: [\"strike\", \"throw\", \"grapple\"],\n },\n} as const;\n\n// =====================================================\n// STANCE-TRIGRAM MAPPING\n// =====================================================\n\n/**\n * Map TrigramStance enum to trigram key strings\n */\nexport function getTrigramKey(\n stance: TrigramStance\n): keyof typeof TRIGRAM_TECHNIQUE_PROPERTIES {\n const stanceMap: Record<\n TrigramStance,\n keyof typeof TRIGRAM_TECHNIQUE_PROPERTIES\n > = {\n [TrigramStance.GEON]: \"geon\",\n [TrigramStance.TAE]: \"tae\",\n [TrigramStance.LI]: \"li\",\n [TrigramStance.JIN]: \"jin\",\n [TrigramStance.SON]: \"son\",\n [TrigramStance.GAM]: \"gam\",\n [TrigramStance.GAN]: \"gan\",\n [TrigramStance.GON]: \"gon\",\n };\n return stanceMap[stance];\n}\n\n/**\n * Get trigram properties by stance\n */\nexport function getTrigramProperties(stance: TrigramStance) {\n const key = getTrigramKey(stance);\n return TRIGRAM_TECHNIQUE_PROPERTIES[key];\n}\n\n/**\n * Calculate damage effectiveness for a damage type against tissue\n */\nexport function calculateDamageEffectiveness(\n damageType: DamageType,\n tissueType: string\n): number {\n const effectiveness = DAMAGE_TYPE_EFFECTIVENESS[damageType];\n return effectiveness?.[tissueType] ?? 1.0;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../src/systems/trigram/techniques/index.ts"],"sourcesContent":["/**\n * Techniques Module Index\n * 한국 무술 기법 모듈\n *\n * This module provides modular access to all Korean martial arts techniques\n * organized by trigram stance, plus Dark Ops techniques and configuration.\n *\n * Structure:\n * - Individual stance files (Geon, Tae, Li, Jin, Son, Gam, Gan, Gon)\n * - Dark Ops techniques for 암살자 archetype\n * - Configuration and constants\n *\n * @module techniques\n */\n\nimport { TrigramStance } from \"../../../types/common\";\nimport type { KoreanTechnique } from \"../../vitalpoint/types\";\n\n// =====================================================\n// STANCE TECHNIQUE IMPORTS\n// =====================================================\n\n// Basic stance techniques (array only)\nexport { GEON_TECHNIQUES } from \"./GeonTechniques\";\nexport { JIN_TECHNIQUES } from \"./JinTechniques\";\nexport { LI_TECHNIQUES } from \"./LiTechniques\";\nexport { TAE_TECHNIQUES } from \"./TaeTechniques\";\n\n// Extended stance techniques (with helper functions)\nexport {\n GAM_TECHNIQUE_COUNT,\n GAM_TECHNIQUES,\n getGamTechniqueById,\n getGamTechniquesByType,\n} from \"./GamTechniques\";\nexport {\n GAN_TECHNIQUE_COUNT,\n GAN_TECHNIQUES,\n getGanTechniqueById,\n getGanTechniquesByType,\n} from \"./GanTechniques\";\nexport {\n getGonTechniqueById,\n getGonTechniquesByType,\n GON_TECHNIQUE_COUNT,\n GON_TECHNIQUES,\n} from \"./GonTechniques\";\nexport {\n getSonTechniqueById,\n getSonTechniquesByType,\n SON_TECHNIQUE_COUNT,\n SON_TECHNIQUES,\n} from \"./SonTechniques\";\n\n// Import for composition\nimport { GAM_TECHNIQUES } from \"./GamTechniques\";\nimport { GAN_TECHNIQUES } from \"./GanTechniques\";\nimport { GEON_TECHNIQUES } from \"./GeonTechniques\";\nimport { GON_TECHNIQUES } from \"./GonTechniques\";\nimport { JIN_TECHNIQUES } from \"./JinTechniques\";\nimport { LI_TECHNIQUES } from \"./LiTechniques\";\nimport { SON_TECHNIQUES } from \"./SonTechniques\";\nimport { TAE_TECHNIQUES } from \"./TaeTechniques\";\n\n// =====================================================\n// DARK OPS TECHNIQUE IMPORTS\n// =====================================================\n\nexport {\n DARK_OPS_ARCHETYPE_BONUSES,\n DARK_OPS_NIGHT_BONUS,\n DARK_OPS_SPECIAL_EFFECTS,\n DARK_OPS_TECHNIQUE_COUNT,\n DARK_OPS_TECHNIQUES,\n DARK_OPS_UNITS,\n getDarkOpsArchetypeBonus,\n getDarkOpsTechniqueById,\n getDarkOpsTechniquesByUnit,\n} from \"./DarkOpsTechniques\";\n\n// =====================================================\n// CONFIGURATION IMPORTS\n// =====================================================\n\nexport {\n ARCHETYPE_TECHNIQUE_BONUSES,\n calculateDamageEffectiveness,\n DAMAGE_TYPE_EFFECTIVENESS,\n getTrigramKey,\n getTrigramProperties,\n KOREAN_TECHNIQUE_CATEGORIES,\n TECHNIQUE_DIFFICULTY_LEVELS,\n TECHNIQUE_MODIFIERS,\n TECHNIQUE_NAMING,\n TECHNIQUE_PROPERTIES,\n TRIGRAM_TECHNIQUE_PROPERTIES,\n} from \"./TechniqueConfig\";\n\n// =====================================================\n// COMPOSED TRIGRAM TECHNIQUES\n// =====================================================\n\n/**\n * Complete TRIGRAM_TECHNIQUES map organized by stance\n * This is the primary technique lookup used throughout the game\n *\n * 팔괘 기술 전체 맵 (스탠스별 구성)\n */\nexport const TRIGRAM_TECHNIQUES: Record<\n TrigramStance,\n readonly KoreanTechnique[]\n> = {\n [TrigramStance.GEON]: GEON_TECHNIQUES,\n [TrigramStance.TAE]: TAE_TECHNIQUES,\n [TrigramStance.LI]: LI_TECHNIQUES,\n [TrigramStance.JIN]: JIN_TECHNIQUES,\n [TrigramStance.SON]: SON_TECHNIQUES,\n [TrigramStance.GAM]: GAM_TECHNIQUES,\n [TrigramStance.GAN]: GAN_TECHNIQUES,\n [TrigramStance.GON]: GON_TECHNIQUES,\n} as const;\n\n// =====================================================\n// HELPER FUNCTIONS\n// =====================================================\n\n/**\n * Get all techniques for a specific stance\n */\nexport function getTechniquesByStance(\n stance: TrigramStance\n): readonly KoreanTechnique[] {\n return TRIGRAM_TECHNIQUES[stance] ?? [];\n}\n\n/**\n * Get a technique by ID from any stance\n */\nexport function getTechniqueById(id: string): KoreanTechnique | undefined {\n for (const techniques of Object.values(TRIGRAM_TECHNIQUES)) {\n const technique = techniques.find((t) => t.id === id);\n if (technique) return technique;\n }\n return undefined;\n}\n\n/**\n * Get all techniques across all stances\n */\nexport function getAllTechniques(): readonly KoreanTechnique[] {\n return Object.values(TRIGRAM_TECHNIQUES).flat();\n}\n\n/**\n * Get total technique count\n */\nexport function getTotalTechniqueCount(): number {\n return Object.values(TRIGRAM_TECHNIQUES).reduce(\n (sum, techniques) => sum + techniques.length,\n 0\n );\n}\n\n/**\n * Get technique count by stance\n */\nexport function getTechniqueCountByStance(): Record<TrigramStance, number> {\n return {\n [TrigramStance.GEON]: GEON_TECHNIQUES.length,\n [TrigramStance.TAE]: TAE_TECHNIQUES.length,\n [TrigramStance.LI]: LI_TECHNIQUES.length,\n [TrigramStance.JIN]: JIN_TECHNIQUES.length,\n [TrigramStance.SON]: SON_TECHNIQUES.length,\n [TrigramStance.GAM]: GAM_TECHNIQUES.length,\n [TrigramStance.GAN]: GAN_TECHNIQUES.length,\n [TrigramStance.GON]: GON_TECHNIQUES.length,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4GA,IAAa,qBAGT;EACD,cAAc,OAAO;EACrB,cAAc,MAAM;EACpB,cAAc,KAAK;EACnB,cAAc,MAAM;EACpB,cAAc,MAAM;EACpB,cAAc,MAAM;EACpB,cAAc,MAAM;EACpB,cAAc,MAAM;AACvB;;;;AASA,SAAgB,sBACd,QAC4B;CAC5B,OAAO,mBAAmB,WAAW,CAAC;AACxC;;;;AAKA,SAAgB,iBAAiB,IAAyC;CACxE,KAAK,MAAM,cAAc,OAAO,OAAO,kBAAkB,GAAG;EAC1D,MAAM,YAAY,WAAW,MAAM,MAAM,EAAE,OAAO,EAAE;EACpD,IAAI,WAAW,OAAO;CACxB;AAEF;;;;AAKA,SAAgB,mBAA+C;CAC7D,OAAO,OAAO,OAAO,kBAAkB,EAAE,KAAK;AAChD;;;;AAKA,SAAgB,yBAAiC;CAC/C,OAAO,OAAO,OAAO,kBAAkB,EAAE,QACtC,KAAK,eAAe,MAAM,WAAW,QACtC,CACF;AACF;;;;AAKA,SAAgB,4BAA2D;CACzE,OAAO;GACJ,cAAc,OAAO,gBAAgB;GACrC,cAAc,MAAM,eAAe;GACnC,cAAc,KAAK,cAAc;GACjC,cAAc,MAAM,eAAe;GACnC,cAAc,MAAM,eAAe;GACnC,cAAc,MAAM,eAAe;GACnC,cAAc,MAAM,eAAe;GACnC,cAAc,MAAM,eAAe;CACtC;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/systems/trigram/techniques/index.ts"],"sourcesContent":["/**\n * Techniques Module Index\n * 한국 무술 기법 모듈\n *\n * This module provides modular access to all Korean martial arts techniques\n * organized by trigram stance, plus Dark Ops techniques and configuration.\n *\n * Structure:\n * - Individual stance files (Geon, Tae, Li, Jin, Son, Gam, Gan, Gon)\n * - Dark Ops techniques for 암살자 archetype\n * - Configuration and constants\n *\n * @module techniques\n */\n\nimport { TrigramStance } from \"../../../types/common\";\nimport type { KoreanTechnique } from \"../../vitalpoint/types\";\n\n// =====================================================\n// STANCE TECHNIQUE IMPORTS\n// =====================================================\n\n// Basic stance techniques (array only)\nexport { GEON_TECHNIQUES } from \"./GeonTechniques\";\nexport { JIN_TECHNIQUES } from \"./JinTechniques\";\nexport { LI_TECHNIQUES } from \"./LiTechniques\";\nexport { TAE_TECHNIQUES } from \"./TaeTechniques\";\n\n// Extended stance techniques (with helper functions)\nexport {\n GAM_TECHNIQUE_COUNT,\n GAM_TECHNIQUES,\n getGamTechniqueById,\n getGamTechniquesByType,\n} from \"./GamTechniques\";\nexport {\n GAN_TECHNIQUE_COUNT,\n GAN_TECHNIQUES,\n getGanTechniqueById,\n getGanTechniquesByType,\n} from \"./GanTechniques\";\nexport {\n getGonTechniqueById,\n getGonTechniquesByType,\n GON_TECHNIQUE_COUNT,\n GON_TECHNIQUES,\n} from \"./GonTechniques\";\nexport {\n getSonTechniqueById,\n getSonTechniquesByType,\n SON_TECHNIQUE_COUNT,\n SON_TECHNIQUES,\n} from \"./SonTechniques\";\n\n// Import for composition\nimport { GAM_TECHNIQUES } from \"./GamTechniques\";\nimport { GAN_TECHNIQUES } from \"./GanTechniques\";\nimport { GEON_TECHNIQUES } from \"./GeonTechniques\";\nimport { GON_TECHNIQUES } from \"./GonTechniques\";\nimport { JIN_TECHNIQUES } from \"./JinTechniques\";\nimport { LI_TECHNIQUES } from \"./LiTechniques\";\nimport { SON_TECHNIQUES } from \"./SonTechniques\";\nimport { TAE_TECHNIQUES } from \"./TaeTechniques\";\n\n// =====================================================\n// DARK OPS TECHNIQUE IMPORTS\n// =====================================================\n\nexport {\n DARK_OPS_ARCHETYPE_BONUSES,\n DARK_OPS_NIGHT_BONUS,\n DARK_OPS_SPECIAL_EFFECTS,\n DARK_OPS_TECHNIQUE_COUNT,\n DARK_OPS_TECHNIQUES,\n DARK_OPS_UNITS,\n getDarkOpsArchetypeBonus,\n getDarkOpsTechniqueById,\n getDarkOpsTechniquesByUnit,\n} from \"./DarkOpsTechniques\";\n\n// =====================================================\n// CONFIGURATION IMPORTS\n// =====================================================\n\nexport {\n ARCHETYPE_TECHNIQUE_BONUSES,\n calculateDamageEffectiveness,\n DAMAGE_TYPE_EFFECTIVENESS,\n getTrigramKey,\n getTrigramProperties,\n KOREAN_TECHNIQUE_CATEGORIES,\n TECHNIQUE_DIFFICULTY_LEVELS,\n TECHNIQUE_MODIFIERS,\n TECHNIQUE_NAMING,\n TECHNIQUE_PROPERTIES,\n TRIGRAM_TECHNIQUE_PROPERTIES,\n} from \"./TechniqueConfig\";\n\n// =====================================================\n// COMPOSED TRIGRAM TECHNIQUES\n// =====================================================\n\n/**\n * Complete TRIGRAM_TECHNIQUES map organized by stance\n * This is the primary technique lookup used throughout the game\n *\n * 팔괘 기술 전체 맵 (스탠스별 구성)\n */\nexport const TRIGRAM_TECHNIQUES: Record<\n TrigramStance,\n readonly KoreanTechnique[]\n> = {\n [TrigramStance.GEON]: GEON_TECHNIQUES,\n [TrigramStance.TAE]: TAE_TECHNIQUES,\n [TrigramStance.LI]: LI_TECHNIQUES,\n [TrigramStance.JIN]: JIN_TECHNIQUES,\n [TrigramStance.SON]: SON_TECHNIQUES,\n [TrigramStance.GAM]: GAM_TECHNIQUES,\n [TrigramStance.GAN]: GAN_TECHNIQUES,\n [TrigramStance.GON]: GON_TECHNIQUES,\n} as const;\n\n// =====================================================\n// HELPER FUNCTIONS\n// =====================================================\n\n/**\n * Get all techniques for a specific stance\n */\nexport function getTechniquesByStance(\n stance: TrigramStance\n): readonly KoreanTechnique[] {\n return TRIGRAM_TECHNIQUES[stance] ?? [];\n}\n\n/**\n * Get a technique by ID from any stance\n */\nexport function getTechniqueById(id: string): KoreanTechnique | undefined {\n for (const techniques of Object.values(TRIGRAM_TECHNIQUES)) {\n const technique = techniques.find((t) => t.id === id);\n if (technique) return technique;\n }\n return undefined;\n}\n\n/**\n * Get all techniques across all stances\n */\nexport function getAllTechniques(): readonly KoreanTechnique[] {\n return Object.values(TRIGRAM_TECHNIQUES).flat();\n}\n\n/**\n * Get total technique count\n */\nexport function getTotalTechniqueCount(): number {\n return Object.values(TRIGRAM_TECHNIQUES).reduce(\n (sum, techniques) => sum + techniques.length,\n 0\n );\n}\n\n/**\n * Get technique count by stance\n */\nexport function getTechniqueCountByStance(): Record<TrigramStance, number> {\n return {\n [TrigramStance.GEON]: GEON_TECHNIQUES.length,\n [TrigramStance.TAE]: TAE_TECHNIQUES.length,\n [TrigramStance.LI]: LI_TECHNIQUES.length,\n [TrigramStance.JIN]: JIN_TECHNIQUES.length,\n [TrigramStance.SON]: SON_TECHNIQUES.length,\n [TrigramStance.GAM]: GAM_TECHNIQUES.length,\n [TrigramStance.GAN]: GAN_TECHNIQUES.length,\n [TrigramStance.GON]: GON_TECHNIQUES.length,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4GA,IAAa,qBAGT;EACD,cAAc,OAAO;EACrB,cAAc,MAAM;EACpB,cAAc,KAAK;EACnB,cAAc,MAAM;EACpB,cAAc,MAAM;EACpB,cAAc,MAAM;EACpB,cAAc,MAAM;EACpB,cAAc,MAAM;AACvB;;;;AASA,SAAgB,sBACd,QAC4B;CAC5B,OAAO,mBAAmB,WAAW,CAAC;AACxC;;;;AAKA,SAAgB,iBAAiB,IAAyC;CACxE,KAAK,MAAM,cAAc,OAAO,OAAO,kBAAkB,GAAG;EAC1D,MAAM,YAAY,WAAW,MAAM,MAAM,EAAE,OAAO,EAAE;EACpD,IAAI,WAAW,OAAO;CACxB;AAEF;;;;AAKA,SAAgB,mBAA+C;CAC7D,OAAO,OAAO,OAAO,kBAAkB,CAAC,CAAC,KAAK;AAChD;;;;AAKA,SAAgB,yBAAiC;CAC/C,OAAO,OAAO,OAAO,kBAAkB,CAAC,CAAC,QACtC,KAAK,eAAe,MAAM,WAAW,QACtC,CACF;AACF;;;;AAKA,SAAgB,4BAA2D;CACzE,OAAO;GACJ,cAAc,OAAO,gBAAgB;GACrC,cAAc,MAAM,eAAe;GACnC,cAAc,KAAK,cAAc;GACjC,cAAc,MAAM,eAAe;GACnC,cAAc,MAAM,eAAe;GACnC,cAAc,MAAM,eAAe;GACnC,cAAc,MAAM,eAAe;GACnC,cAAc,MAAM,eAAe;CACtC;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../../src/systems/trigram/types.ts"],"sourcesContent":["/**\n * Type definitions for trigram types\n * Auto-generated by type migration script\n */\n\n// Trigram system imports from shared types\nimport { TrigramStance } from \"../../types/common\";\n\nimport {\n KOREAN_COLORS,\n type KoreanText,\n type PlayerArchetype,\n} from \"../../types\";\nimport { EffectType } from \"../effects\";\n\n/**\n * Stance laterality representing which foot/side is forward.\n *\n * **Korean**: 자세 측면성\n *\n * In authentic Korean martial arts (태권도, 합기도, 택견), stances have\n * distinct left and right configurations:\n * - **왼발서기 (Oenbal Seogi)**: Left foot forward, left guard high\n * - **오른발서기 (Oreun Bal Seogi)**: Right foot forward, right guard high\n *\n * @category Trigram System\n * @korean 측면성\n */\nexport type StanceLaterality = \"left\" | \"right\";\n\n/**\n * Combined stance with laterality for complete stance specification.\n *\n * **Korean**: 측면 포함 자세\n *\n * Combines the trigram stance (8 types) with laterality (2 sides) to create\n * 16 distinct stance configurations. Format: `{stance}_{laterality}`\n *\n * Examples:\n * - \"geon_left\" - Heaven stance, left foot forward\n * - \"tae_right\" - Lake stance, right foot forward\n *\n * @category Trigram System\n * @korean 측면포함자세\n */\nexport type StanceWithSide = `${TrigramStance}_${StanceLaterality}`;\n\n/**\n * Parse a combined stance+laterality string into its components.\n *\n * **Korean**: 자세 측면 분리\n *\n * Takes a string in the format \"stance_laterality\" and returns the\n * individual stance and laterality components.\n *\n * @param stanceWithSide - Combined stance string (e.g., \"geon_left\")\n * @returns Object with stance and laterality, or null if invalid format\n *\n * @example\n * ```typescript\n * const result = parseStanceWithSide(\"geon_left\");\n * // { stance: \"geon\", laterality: \"left\" }\n *\n * const invalid = parseStanceWithSide(\"invalid\");\n * // null\n * ```\n *\n * @category Trigram System\n * @korean 자세측면분리\n */\nexport function parseStanceWithSide(\n stanceWithSide: string\n): { stance: TrigramStance; laterality: StanceLaterality } | null {\n const parts = stanceWithSide.split(\"_\");\n if (parts.length !== 2) {\n return null;\n }\n\n const [stancePart, lateralityPart] = parts;\n\n // Validate stance\n if (!Object.values(TrigramStance).includes(stancePart as TrigramStance)) {\n return null;\n }\n\n // Validate laterality\n if (lateralityPart !== \"left\" && lateralityPart !== \"right\") {\n return null;\n }\n\n return {\n stance: stancePart as TrigramStance,\n laterality: lateralityPart as StanceLaterality,\n };\n}\n\n/**\n * Create a combined stance+laterality string.\n *\n * **Korean**: 자세 측면 결합\n *\n * Combines a trigram stance and laterality into a single string identifier.\n *\n * @param stance - Trigram stance\n * @param laterality - Stance laterality\n * @returns Combined string in format \"stance_laterality\"\n *\n * @example\n * ```typescript\n * const combined = combineStanceWithSide(\"geon\", \"left\");\n * // \"geon_left\"\n * ```\n *\n * @category Trigram System\n * @korean 자세측면결합\n */\nexport function combineStanceWithSide(\n stance: TrigramStance,\n laterality: StanceLaterality\n): StanceWithSide {\n return `${stance}_${laterality}` as StanceWithSide;\n}\n\nexport interface TrigramTransitionCost {\n readonly ki: number;\n readonly stamina: number;\n readonly timeMilliseconds: number;\n}\n\nexport interface TrigramTransitionRule {\n readonly from: TrigramStance;\n readonly to: TrigramStance;\n readonly cost: TrigramTransitionCost;\n readonly effectiveness: number;\n readonly conditions?: ReadonlyArray<{\n type: \"player_stat\" | \"archetype\" | \"active_effect\";\n stat?: \"health\" | \"ki\" | \"stamina\";\n archetype?: PlayerArchetype;\n effectType?: EffectType;\n threshold?: number;\n value?: boolean | string;\n }>;\n readonly description: KoreanText;\n}\n\nexport interface TransitionMetrics {\n readonly cost: TrigramTransitionCost;\n readonly effectiveness: number;\n readonly risk: number;\n readonly stamina: number;\n readonly timeMilliseconds: number;\n}\n\nexport interface TransitionPath {\n readonly path: readonly TrigramStance[];\n readonly totalCost: TrigramTransitionCost;\n readonly effectiveness: number;\n readonly name: string;\n readonly description: KoreanText;\n}\n\nexport interface TrigramTheme {\n readonly primary: number;\n readonly secondary: number;\n readonly active: number;\n readonly hover: number;\n readonly text: number;\n}\n\nexport interface TrigramData {\n readonly id: TrigramStance;\n readonly korean: string;\n readonly english: string;\n readonly symbol: string;\n readonly element: string;\n readonly nature: \"yin\" | \"yang\";\n readonly philosophy: KoreanText;\n readonly combat: KoreanText;\n readonly theme: TrigramTheme;\n readonly name: KoreanText;\n readonly defensiveBonus: number;\n readonly kiFlowModifier: number;\n readonly techniques: {\n readonly primary: {\n readonly korean: string;\n readonly english: string;\n readonly damage: number;\n readonly kiCost: number;\n readonly staminaCost: number;\n readonly hitChance: number;\n readonly criticalChance: number;\n readonly description: KoreanText;\n readonly targetAreas: readonly string[];\n readonly effects: readonly string[];\n };\n };\n}\n\nexport interface StanceTransition {\n readonly from: TrigramStance;\n readonly to: TrigramStance;\n readonly difficulty: number;\n readonly time: number;\n readonly kiCost: number;\n readonly requirements?: string[];\n}\n\nexport interface TrigramPhilosophy {\n readonly trigram: TrigramStance;\n readonly principle: KoreanText;\n readonly application: KoreanText;\n readonly strengthsAgainst: readonly TrigramStance[];\n readonly weaknessesAgainst: readonly TrigramStance[];\n}\n\nexport interface TrigramCombatStyle {\n readonly trigram: TrigramStance;\n readonly combatApproach: string;\n readonly preferredRange: \"close\" | \"medium\" | \"long\";\n readonly focusArea: \"offense\" | \"defense\" | \"balance\";\n readonly keyCharacteristics: readonly string[];\n}\n\n// Minimal representations to avoid deep coupling to other systems\nexport interface TrigramTechniqueSummary {\n readonly id: string;\n readonly stance: TrigramStance;\n readonly name?: KoreanText;\n}\n\nexport interface TrigramPlayerContext {\n readonly currentStance?: TrigramStance;\n readonly ki?: number;\n readonly stamina?: number;\n}\n\nexport interface TrigramSystemInterface {\n getTechniqueForStance: (\n stance: TrigramStance,\n archetype?: PlayerArchetype\n ) => TrigramTechniqueSummary | undefined;\n calculateStanceEffectiveness: (\n attackerStance: TrigramStance,\n defenderStance: TrigramStance,\n technique?: TrigramTechniqueSummary\n ) => number;\n isValidTransition: (from: TrigramStance, to: TrigramStance) => boolean;\n getTransitionCost: (\n from: TrigramStance,\n to: TrigramStance,\n player?: TrigramPlayerContext\n ) => { ki: number; stamina: number; timeMs: number };\n recommendStance: (\n player: TrigramPlayerContext,\n opponent?: TrigramPlayerContext\n ) => TrigramStance;\n}\n\nexport interface TrigramSystem {\n readonly getCurrentStance: (playerId: string) => TrigramStance;\n readonly changeStance: (playerId: string, stance: TrigramStance) => boolean;\n readonly getStanceEffectiveness: (\n attacker: TrigramStance,\n defender: TrigramStance\n ) => number;\n}\n\n// Ki flow factors with all required properties\nexport interface KiFlowFactors {\n readonly playerLevelModifier: number;\n readonly stanceAffinity: number;\n readonly distance: number; // Added missing property\n readonly elementalHarmony: number; // Added missing property\n}\n\n// Trigram effectiveness matrix\nexport interface TrigramEffectivenessMatrix {\n readonly [attacker: string]: {\n readonly [defender: string]: number;\n };\n}\n\n// Trigram stance transition\nexport interface TrigramTransition {\n readonly from: TrigramStance;\n readonly to: TrigramStance;\n readonly difficulty: number;\n readonly kiCost: number;\n readonly staminaCost: number;\n readonly transitionTime: number;\n}\n\n// Archetype-trigram affinity\nexport interface ArchetypeTrigramAffinity {\n readonly archetype: PlayerArchetype;\n readonly preferredTrigrams: readonly TrigramStance[];\n readonly bonusEffectiveness: Record<TrigramStance, number>;\n readonly penaltyTrigrams: readonly TrigramStance[];\n}\n\n// Order of Trigrams for UI elements like wheels or selection lists\nexport const TRIGRAM_STANCES_ORDER: readonly TrigramStance[] = [\n \"geon\" as TrigramStance,\n \"tae\" as TrigramStance,\n \"li\" as TrigramStance,\n \"jin\" as TrigramStance,\n \"son\" as TrigramStance,\n \"gam\" as TrigramStance,\n \"gan\" as TrigramStance,\n \"gon\" as TrigramStance,\n] as const;\n\nexport const TRIGRAM_DATA: Record<TrigramStance, TrigramStanceData> = {\n [TrigramStance.GEON]: {\n name: { korean: \"건\", english: \"Heaven\" },\n symbol: \"☰\",\n element: \"metal\",\n nature: \"yang\",\n chinese: \"天\",\n attribute: { korean: \"강건\", chinese: \"剛健\" },\n meaning: { korean: \"창조와 리더십\", english: \"Creation and Leadership\" },\n philosophy: { korean: \"하늘\", english: \"Heaven\" },\n combat: { korean: \"직접 공격\", english: \"Direct attack\" },\n theme: {\n primary: KOREAN_COLORS.TRIGRAM_GEON_PRIMARY,\n secondary: KOREAN_COLORS.WHITE_SOLID,\n },\n defensiveBonus: 1.0,\n kiFlowModifier: 1.0,\n techniques: {\n primary: {\n korean: \"천둥벽력\",\n english: \"Thunder Strike\",\n damage: 15,\n kiCost: 8,\n staminaCost: 12,\n hitChance: 0.85,\n criticalChance: 0.12,\n description: {\n korean: \"하늘의 힘으로 적을 타격한다\",\n english: \"Strike the enemy with heavenly force\",\n },\n targetAreas: [\"torso\", \"head\"],\n effects: [\"stun\"],\n },\n },\n },\n [TrigramStance.TAE]: {\n name: { korean: \"태\", english: \"Lake\" },\n symbol: \"☱\",\n element: \"metal\",\n nature: \"yin\",\n chinese: \"澤\",\n attribute: { korean: \"기쁨\", chinese: \"愉悅\" },\n meaning: { korean: \"기쁨과 교류\", english: \"Joy and Exchange\" },\n philosophy: { korean: \"호수\", english: \"Lake\" },\n combat: { korean: \"유동적 적응\", english: \"Fluid adaptation\" },\n theme: {\n primary: KOREAN_COLORS.TRIGRAM_TAE_PRIMARY,\n secondary: KOREAN_COLORS.UI_STEEL_GRAY,\n },\n defensiveBonus: 1.1,\n kiFlowModifier: 1.2,\n techniques: {\n primary: {\n korean: \"유수연타\",\n english: \"Flowing Strikes\",\n damage: 10,\n kiCost: 5,\n staminaCost: 8,\n hitChance: 0.9,\n criticalChance: 0.1,\n description: {\n korean: \"물의 흐름처럼 연속적인 타격\",\n english: \"Continuous strikes like flowing water\",\n },\n targetAreas: [\"torso\", \"arms\"],\n effects: [\"knockback\"],\n },\n },\n },\n [TrigramStance.LI]: {\n name: { korean: \"리\", english: \"Fire\" },\n symbol: \"☲\",\n element: \"metal\",\n nature: \"yang\",\n chinese: \"火\",\n attribute: { korean: \"광명\", chinese: \"光明\" },\n meaning: { korean: \"열정과 명료함\", english: \"Passion and Clarity\" },\n philosophy: { korean: \"불\", english: \"Fire\" },\n combat: { korean: \"접근 공격\", english: \"Close attack\" },\n theme: {\n primary: KOREAN_COLORS.TRIGRAM_LI_PRIMARY,\n secondary: KOREAN_COLORS.ACCENT_RED,\n },\n defensiveBonus: 0.9,\n kiFlowModifier: 1.1,\n techniques: {\n primary: {\n korean: \"화염베기\",\n english: \"Flame Slash\",\n damage: 18,\n kiCost: 9,\n staminaCost: 11,\n hitChance: 0.8,\n criticalChance: 0.15,\n description: {\n korean: \"불의 형상을 한 날카로운 베기\",\n english: \"A sharp slash in the form of fire\",\n },\n targetAreas: [\"torso\", \"legs\"],\n effects: [\"burn\"],\n },\n },\n },\n [TrigramStance.JIN]: {\n name: { korean: \"진\", english: \"Thunder\" },\n symbol: \"☳\",\n element: \"metal\",\n nature: \"yang\",\n chinese: \"雷\",\n attribute: { korean: \"진동\", chinese: \"震動\" },\n meaning: { korean: \"움직임과 각성\", english: \"Movement and Awakening\" },\n philosophy: { korean: \"천둥\", english: \"Thunder\" },\n combat: { korean: \"돌진 공격\", english: \"Charge attack\" },\n theme: {\n primary: KOREAN_COLORS.TRIGRAM_JIN_PRIMARY,\n secondary: KOREAN_COLORS.SECONDARY_YELLOW,\n },\n defensiveBonus: 0.8,\n kiFlowModifier: 1.3,\n techniques: {\n primary: {\n korean: \"천둥의 박치기\",\n english: \"Thunder Clap\",\n damage: 20,\n kiCost: 10,\n staminaCost: 15,\n hitChance: 0.82,\n criticalChance: 0.18,\n description: {\n korean: \"천둥의 힘으로 적을 가격\",\n english: \"Strike the enemy with the force of thunder\",\n },\n targetAreas: [\"head\", \"torso\"],\n effects: [\"stun\", \"knockback\"],\n },\n },\n },\n [TrigramStance.SON]: {\n name: { korean: \"손\", english: \"Wind\" },\n symbol: \"☴\",\n element: \"metal\",\n nature: \"yin\",\n chinese: \"風\",\n attribute: { korean: \"손순\", chinese: \"巽順\" },\n meaning: { korean: \"침투와 영향\", english: \"Penetration and Influence\" },\n philosophy: { korean: \"바람\", english: \"Wind\" },\n combat: { korean: \"회피 공격\", english: \"Evasive attack\" },\n theme: {\n primary: KOREAN_COLORS.TRIGRAM_SON_PRIMARY,\n secondary: KOREAN_COLORS.POSITIVE_GREEN_DARK,\n },\n defensiveBonus: 1.2,\n kiFlowModifier: 0.9,\n techniques: {\n primary: {\n korean: \"바람베기\",\n english: \"Wind Cut\",\n damage: 12,\n kiCost: 6,\n staminaCost: 10,\n hitChance: 0.88,\n criticalChance: 0.14,\n description: {\n korean: \"바람의 힘으로 적을 베어내다\",\n english: \"Cut through the enemy with the power of wind\",\n },\n targetAreas: [\"torso\", \"arms\"],\n effects: [\"bleed\"],\n },\n },\n },\n [TrigramStance.GAM]: {\n name: { korean: \"감\", english: \"Water\" },\n symbol: \"☵\",\n element: \"metal\",\n nature: \"yin\",\n chinese: \"水\",\n attribute: { korean: \"험난\", chinese: \"險難\" },\n meaning: { korean: \"적응과 흐름\", english: \"Adaptation and Flow\" },\n philosophy: { korean: \"물\", english: \"Water\" },\n combat: { korean: \"유동 공격\", english: \"Flowing attack\" },\n theme: {\n primary: KOREAN_COLORS.TRIGRAM_GAM_PRIMARY,\n secondary: KOREAN_COLORS.PRIMARY_BLUE_DARK,\n },\n defensiveBonus: 1.3,\n kiFlowModifier: 1.1,\n techniques: {\n primary: {\n korean: \"수륙재해\",\n english: \"Water Whip\",\n damage: 14,\n kiCost: 7,\n staminaCost: 9,\n hitChance: 0.84,\n criticalChance: 0.13,\n description: {\n korean: \"물의 힘으로 적을 휘감아 타격\",\n english: \"Strike the enemy by wrapping them with the power of water\",\n },\n targetAreas: [\"torso\", \"legs\"],\n effects: [\"drown\"],\n },\n },\n },\n [TrigramStance.GAN]: {\n name: { korean: \"간\", english: \"Mountain\" },\n symbol: \"☶\",\n element: \"metal\",\n nature: \"yin\",\n chinese: \"山\",\n attribute: { korean: \"지정\", chinese: \"止靜\" },\n meaning: { korean: \"안정과 명상\", english: \"Stability and Meditation\" },\n philosophy: { korean: \"산\", english: \"Mountain\" },\n combat: { korean: \"방어 자세\", english: \"Defensive stance\" },\n theme: {\n primary: KOREAN_COLORS.TRIGRAM_GAN_PRIMARY,\n secondary: KOREAN_COLORS.UI_STEEL_GRAY_DARK,\n },\n defensiveBonus: 1.4,\n kiFlowModifier: 0.8,\n techniques: {\n primary: {\n korean: \"산의 수호\",\n english: \"Mountain Guard\",\n damage: 0,\n kiCost: 10,\n staminaCost: 15,\n hitChance: 1.0,\n criticalChance: 0.0,\n description: {\n korean: \"산처럼 견고한 방어 자세\",\n english: \"A defensive stance as solid as a mountain\",\n },\n targetAreas: [\"torso\"],\n effects: [\"block\"],\n },\n },\n },\n [TrigramStance.GON]: {\n name: { korean: \"곤\", english: \"Earth\" },\n symbol: \"☷\",\n element: \"metal\",\n nature: \"yang\",\n chinese: \"地\",\n attribute: { korean: \"순종\", chinese: \"順從\" },\n meaning: { korean: \"수용과 지지\", english: \"Receptiveness and Support\" },\n philosophy: { korean: \"지구\", english: \"Earth\" },\n combat: { korean: \"포용 공격\", english: \"Embracing attack\" },\n theme: {\n primary: KOREAN_COLORS.TRIGRAM_GON_PRIMARY,\n secondary: KOREAN_COLORS.SECONDARY_BROWN_DARK,\n },\n defensiveBonus: 1.1,\n kiFlowModifier: 1.2,\n techniques: {\n primary: {\n korean: \"지구의 방패\",\n english: \"Earth Shield\",\n damage: 0,\n kiCost: 12,\n staminaCost: 16,\n hitChance: 1.0,\n criticalChance: 0.0,\n description: {\n korean: \"지구의 힘으로 적의 공격을 막다\",\n english: \"Block the enemy's attack with the power of earth\",\n },\n targetAreas: [\"torso\"],\n effects: [\"block\"],\n },\n },\n },\n} as const;\n\n/**\n * Data structure for a Trigram stance containing philosophical,\n * combat, and visual properties for the Eight Trigrams system.\n * Includes Chinese characters, Korean/English names, attributes, and meanings.\n */\nexport interface TrigramStanceData {\n readonly name: { korean: string; english: string };\n readonly symbol: string;\n readonly element: string;\n readonly nature: \"yin\" | \"yang\";\n readonly chinese: string; // Chinese character (天, 澤, etc.)\n readonly attribute: { korean: string; chinese: string }; // Attribute (剛健, etc.)\n readonly meaning: { korean: string; english: string }; // Core meaning\n readonly philosophy: { korean: string; english: string };\n readonly combat: { korean: string; english: string };\n readonly theme: {\n primary: number;\n secondary: number;\n };\n readonly defensiveBonus: number;\n readonly kiFlowModifier: number;\n readonly techniques: {\n primary: {\n korean: string;\n english: string;\n damage: number;\n kiCost: number;\n staminaCost: number;\n hitChance: number;\n criticalChance: number;\n description: { korean: string; english: string };\n targetAreas: string[];\n effects: string[];\n };\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../../src/systems/trigram/types.ts"],"sourcesContent":["/**\n * Type definitions for trigram types\n * Auto-generated by type migration script\n */\n\n// Trigram system imports from shared types\nimport { TrigramStance } from \"../../types/common\";\n\nimport {\n KOREAN_COLORS,\n type KoreanText,\n type PlayerArchetype,\n} from \"../../types\";\nimport { EffectType } from \"../effects\";\n\n/**\n * Stance laterality representing which foot/side is forward.\n *\n * **Korean**: 자세 측면성\n *\n * In authentic Korean martial arts (태권도, 합기도, 택견), stances have\n * distinct left and right configurations:\n * - **왼발서기 (Oenbal Seogi)**: Left foot forward, left guard high\n * - **오른발서기 (Oreun Bal Seogi)**: Right foot forward, right guard high\n *\n * @category Trigram System\n * @korean 측면성\n */\nexport type StanceLaterality = \"left\" | \"right\";\n\n/**\n * Combined stance with laterality for complete stance specification.\n *\n * **Korean**: 측면 포함 자세\n *\n * Combines the trigram stance (8 types) with laterality (2 sides) to create\n * 16 distinct stance configurations. Format: `{stance}_{laterality}`\n *\n * Examples:\n * - \"geon_left\" - Heaven stance, left foot forward\n * - \"tae_right\" - Lake stance, right foot forward\n *\n * @category Trigram System\n * @korean 측면포함자세\n */\nexport type StanceWithSide = `${TrigramStance}_${StanceLaterality}`;\n\n/**\n * Parse a combined stance+laterality string into its components.\n *\n * **Korean**: 자세 측면 분리\n *\n * Takes a string in the format \"stance_laterality\" and returns the\n * individual stance and laterality components.\n *\n * @param stanceWithSide - Combined stance string (e.g., \"geon_left\")\n * @returns Object with stance and laterality, or null if invalid format\n *\n * @example\n * ```typescript\n * const result = parseStanceWithSide(\"geon_left\");\n * // { stance: \"geon\", laterality: \"left\" }\n *\n * const invalid = parseStanceWithSide(\"invalid\");\n * // null\n * ```\n *\n * @category Trigram System\n * @korean 자세측면분리\n */\nexport function parseStanceWithSide(\n stanceWithSide: string\n): { stance: TrigramStance; laterality: StanceLaterality } | null {\n const parts = stanceWithSide.split(\"_\");\n if (parts.length !== 2) {\n return null;\n }\n\n const [stancePart, lateralityPart] = parts;\n\n // Validate stance\n if (!Object.values(TrigramStance).includes(stancePart as TrigramStance)) {\n return null;\n }\n\n // Validate laterality\n if (lateralityPart !== \"left\" && lateralityPart !== \"right\") {\n return null;\n }\n\n return {\n stance: stancePart as TrigramStance,\n laterality: lateralityPart as StanceLaterality,\n };\n}\n\n/**\n * Create a combined stance+laterality string.\n *\n * **Korean**: 자세 측면 결합\n *\n * Combines a trigram stance and laterality into a single string identifier.\n *\n * @param stance - Trigram stance\n * @param laterality - Stance laterality\n * @returns Combined string in format \"stance_laterality\"\n *\n * @example\n * ```typescript\n * const combined = combineStanceWithSide(\"geon\", \"left\");\n * // \"geon_left\"\n * ```\n *\n * @category Trigram System\n * @korean 자세측면결합\n */\nexport function combineStanceWithSide(\n stance: TrigramStance,\n laterality: StanceLaterality\n): StanceWithSide {\n return `${stance}_${laterality}` as StanceWithSide;\n}\n\nexport interface TrigramTransitionCost {\n readonly ki: number;\n readonly stamina: number;\n readonly timeMilliseconds: number;\n}\n\nexport interface TrigramTransitionRule {\n readonly from: TrigramStance;\n readonly to: TrigramStance;\n readonly cost: TrigramTransitionCost;\n readonly effectiveness: number;\n readonly conditions?: ReadonlyArray<{\n type: \"player_stat\" | \"archetype\" | \"active_effect\";\n stat?: \"health\" | \"ki\" | \"stamina\";\n archetype?: PlayerArchetype;\n effectType?: EffectType;\n threshold?: number;\n value?: boolean | string;\n }>;\n readonly description: KoreanText;\n}\n\nexport interface TransitionMetrics {\n readonly cost: TrigramTransitionCost;\n readonly effectiveness: number;\n readonly risk: number;\n readonly stamina: number;\n readonly timeMilliseconds: number;\n}\n\nexport interface TransitionPath {\n readonly path: readonly TrigramStance[];\n readonly totalCost: TrigramTransitionCost;\n readonly effectiveness: number;\n readonly name: string;\n readonly description: KoreanText;\n}\n\nexport interface TrigramTheme {\n readonly primary: number;\n readonly secondary: number;\n readonly active: number;\n readonly hover: number;\n readonly text: number;\n}\n\nexport interface TrigramData {\n readonly id: TrigramStance;\n readonly korean: string;\n readonly english: string;\n readonly symbol: string;\n readonly element: string;\n readonly nature: \"yin\" | \"yang\";\n readonly philosophy: KoreanText;\n readonly combat: KoreanText;\n readonly theme: TrigramTheme;\n readonly name: KoreanText;\n readonly defensiveBonus: number;\n readonly kiFlowModifier: number;\n readonly techniques: {\n readonly primary: {\n readonly korean: string;\n readonly english: string;\n readonly damage: number;\n readonly kiCost: number;\n readonly staminaCost: number;\n readonly hitChance: number;\n readonly criticalChance: number;\n readonly description: KoreanText;\n readonly targetAreas: readonly string[];\n readonly effects: readonly string[];\n };\n };\n}\n\nexport interface StanceTransition {\n readonly from: TrigramStance;\n readonly to: TrigramStance;\n readonly difficulty: number;\n readonly time: number;\n readonly kiCost: number;\n readonly requirements?: string[];\n}\n\nexport interface TrigramPhilosophy {\n readonly trigram: TrigramStance;\n readonly principle: KoreanText;\n readonly application: KoreanText;\n readonly strengthsAgainst: readonly TrigramStance[];\n readonly weaknessesAgainst: readonly TrigramStance[];\n}\n\nexport interface TrigramCombatStyle {\n readonly trigram: TrigramStance;\n readonly combatApproach: string;\n readonly preferredRange: \"close\" | \"medium\" | \"long\";\n readonly focusArea: \"offense\" | \"defense\" | \"balance\";\n readonly keyCharacteristics: readonly string[];\n}\n\n// Minimal representations to avoid deep coupling to other systems\nexport interface TrigramTechniqueSummary {\n readonly id: string;\n readonly stance: TrigramStance;\n readonly name?: KoreanText;\n}\n\nexport interface TrigramPlayerContext {\n readonly currentStance?: TrigramStance;\n readonly ki?: number;\n readonly stamina?: number;\n}\n\nexport interface TrigramSystemInterface {\n getTechniqueForStance: (\n stance: TrigramStance,\n archetype?: PlayerArchetype\n ) => TrigramTechniqueSummary | undefined;\n calculateStanceEffectiveness: (\n attackerStance: TrigramStance,\n defenderStance: TrigramStance,\n technique?: TrigramTechniqueSummary\n ) => number;\n isValidTransition: (from: TrigramStance, to: TrigramStance) => boolean;\n getTransitionCost: (\n from: TrigramStance,\n to: TrigramStance,\n player?: TrigramPlayerContext\n ) => { ki: number; stamina: number; timeMs: number };\n recommendStance: (\n player: TrigramPlayerContext,\n opponent?: TrigramPlayerContext\n ) => TrigramStance;\n}\n\nexport interface TrigramSystem {\n readonly getCurrentStance: (playerId: string) => TrigramStance;\n readonly changeStance: (playerId: string, stance: TrigramStance) => boolean;\n readonly getStanceEffectiveness: (\n attacker: TrigramStance,\n defender: TrigramStance\n ) => number;\n}\n\n// Ki flow factors with all required properties\nexport interface KiFlowFactors {\n readonly playerLevelModifier: number;\n readonly stanceAffinity: number;\n readonly distance: number; // Added missing property\n readonly elementalHarmony: number; // Added missing property\n}\n\n// Trigram effectiveness matrix\nexport interface TrigramEffectivenessMatrix {\n readonly [attacker: string]: {\n readonly [defender: string]: number;\n };\n}\n\n// Trigram stance transition\nexport interface TrigramTransition {\n readonly from: TrigramStance;\n readonly to: TrigramStance;\n readonly difficulty: number;\n readonly kiCost: number;\n readonly staminaCost: number;\n readonly transitionTime: number;\n}\n\n// Archetype-trigram affinity\nexport interface ArchetypeTrigramAffinity {\n readonly archetype: PlayerArchetype;\n readonly preferredTrigrams: readonly TrigramStance[];\n readonly bonusEffectiveness: Record<TrigramStance, number>;\n readonly penaltyTrigrams: readonly TrigramStance[];\n}\n\n// Order of Trigrams for UI elements like wheels or selection lists\nexport const TRIGRAM_STANCES_ORDER: readonly TrigramStance[] = [\n \"geon\" as TrigramStance,\n \"tae\" as TrigramStance,\n \"li\" as TrigramStance,\n \"jin\" as TrigramStance,\n \"son\" as TrigramStance,\n \"gam\" as TrigramStance,\n \"gan\" as TrigramStance,\n \"gon\" as TrigramStance,\n] as const;\n\nexport const TRIGRAM_DATA: Record<TrigramStance, TrigramStanceData> = {\n [TrigramStance.GEON]: {\n name: { korean: \"건\", english: \"Heaven\" },\n symbol: \"☰\",\n element: \"metal\",\n nature: \"yang\",\n chinese: \"天\",\n attribute: { korean: \"강건\", chinese: \"剛健\" },\n meaning: { korean: \"창조와 리더십\", english: \"Creation and Leadership\" },\n philosophy: { korean: \"하늘\", english: \"Heaven\" },\n combat: { korean: \"직접 공격\", english: \"Direct attack\" },\n theme: {\n primary: KOREAN_COLORS.TRIGRAM_GEON_PRIMARY,\n secondary: KOREAN_COLORS.WHITE_SOLID,\n },\n defensiveBonus: 1.0,\n kiFlowModifier: 1.0,\n techniques: {\n primary: {\n korean: \"천둥벽력\",\n english: \"Thunder Strike\",\n damage: 15,\n kiCost: 8,\n staminaCost: 12,\n hitChance: 0.85,\n criticalChance: 0.12,\n description: {\n korean: \"하늘의 힘으로 적을 타격한다\",\n english: \"Strike the enemy with heavenly force\",\n },\n targetAreas: [\"torso\", \"head\"],\n effects: [\"stun\"],\n },\n },\n },\n [TrigramStance.TAE]: {\n name: { korean: \"태\", english: \"Lake\" },\n symbol: \"☱\",\n element: \"metal\",\n nature: \"yin\",\n chinese: \"澤\",\n attribute: { korean: \"기쁨\", chinese: \"愉悅\" },\n meaning: { korean: \"기쁨과 교류\", english: \"Joy and Exchange\" },\n philosophy: { korean: \"호수\", english: \"Lake\" },\n combat: { korean: \"유동적 적응\", english: \"Fluid adaptation\" },\n theme: {\n primary: KOREAN_COLORS.TRIGRAM_TAE_PRIMARY,\n secondary: KOREAN_COLORS.UI_STEEL_GRAY,\n },\n defensiveBonus: 1.1,\n kiFlowModifier: 1.2,\n techniques: {\n primary: {\n korean: \"유수연타\",\n english: \"Flowing Strikes\",\n damage: 10,\n kiCost: 5,\n staminaCost: 8,\n hitChance: 0.9,\n criticalChance: 0.1,\n description: {\n korean: \"물의 흐름처럼 연속적인 타격\",\n english: \"Continuous strikes like flowing water\",\n },\n targetAreas: [\"torso\", \"arms\"],\n effects: [\"knockback\"],\n },\n },\n },\n [TrigramStance.LI]: {\n name: { korean: \"리\", english: \"Fire\" },\n symbol: \"☲\",\n element: \"metal\",\n nature: \"yang\",\n chinese: \"火\",\n attribute: { korean: \"광명\", chinese: \"光明\" },\n meaning: { korean: \"열정과 명료함\", english: \"Passion and Clarity\" },\n philosophy: { korean: \"불\", english: \"Fire\" },\n combat: { korean: \"접근 공격\", english: \"Close attack\" },\n theme: {\n primary: KOREAN_COLORS.TRIGRAM_LI_PRIMARY,\n secondary: KOREAN_COLORS.ACCENT_RED,\n },\n defensiveBonus: 0.9,\n kiFlowModifier: 1.1,\n techniques: {\n primary: {\n korean: \"화염베기\",\n english: \"Flame Slash\",\n damage: 18,\n kiCost: 9,\n staminaCost: 11,\n hitChance: 0.8,\n criticalChance: 0.15,\n description: {\n korean: \"불의 형상을 한 날카로운 베기\",\n english: \"A sharp slash in the form of fire\",\n },\n targetAreas: [\"torso\", \"legs\"],\n effects: [\"burn\"],\n },\n },\n },\n [TrigramStance.JIN]: {\n name: { korean: \"진\", english: \"Thunder\" },\n symbol: \"☳\",\n element: \"metal\",\n nature: \"yang\",\n chinese: \"雷\",\n attribute: { korean: \"진동\", chinese: \"震動\" },\n meaning: { korean: \"움직임과 각성\", english: \"Movement and Awakening\" },\n philosophy: { korean: \"천둥\", english: \"Thunder\" },\n combat: { korean: \"돌진 공격\", english: \"Charge attack\" },\n theme: {\n primary: KOREAN_COLORS.TRIGRAM_JIN_PRIMARY,\n secondary: KOREAN_COLORS.SECONDARY_YELLOW,\n },\n defensiveBonus: 0.8,\n kiFlowModifier: 1.3,\n techniques: {\n primary: {\n korean: \"천둥의 박치기\",\n english: \"Thunder Clap\",\n damage: 20,\n kiCost: 10,\n staminaCost: 15,\n hitChance: 0.82,\n criticalChance: 0.18,\n description: {\n korean: \"천둥의 힘으로 적을 가격\",\n english: \"Strike the enemy with the force of thunder\",\n },\n targetAreas: [\"head\", \"torso\"],\n effects: [\"stun\", \"knockback\"],\n },\n },\n },\n [TrigramStance.SON]: {\n name: { korean: \"손\", english: \"Wind\" },\n symbol: \"☴\",\n element: \"metal\",\n nature: \"yin\",\n chinese: \"風\",\n attribute: { korean: \"손순\", chinese: \"巽順\" },\n meaning: { korean: \"침투와 영향\", english: \"Penetration and Influence\" },\n philosophy: { korean: \"바람\", english: \"Wind\" },\n combat: { korean: \"회피 공격\", english: \"Evasive attack\" },\n theme: {\n primary: KOREAN_COLORS.TRIGRAM_SON_PRIMARY,\n secondary: KOREAN_COLORS.POSITIVE_GREEN_DARK,\n },\n defensiveBonus: 1.2,\n kiFlowModifier: 0.9,\n techniques: {\n primary: {\n korean: \"바람베기\",\n english: \"Wind Cut\",\n damage: 12,\n kiCost: 6,\n staminaCost: 10,\n hitChance: 0.88,\n criticalChance: 0.14,\n description: {\n korean: \"바람의 힘으로 적을 베어내다\",\n english: \"Cut through the enemy with the power of wind\",\n },\n targetAreas: [\"torso\", \"arms\"],\n effects: [\"bleed\"],\n },\n },\n },\n [TrigramStance.GAM]: {\n name: { korean: \"감\", english: \"Water\" },\n symbol: \"☵\",\n element: \"metal\",\n nature: \"yin\",\n chinese: \"水\",\n attribute: { korean: \"험난\", chinese: \"險難\" },\n meaning: { korean: \"적응과 흐름\", english: \"Adaptation and Flow\" },\n philosophy: { korean: \"물\", english: \"Water\" },\n combat: { korean: \"유동 공격\", english: \"Flowing attack\" },\n theme: {\n primary: KOREAN_COLORS.TRIGRAM_GAM_PRIMARY,\n secondary: KOREAN_COLORS.PRIMARY_BLUE_DARK,\n },\n defensiveBonus: 1.3,\n kiFlowModifier: 1.1,\n techniques: {\n primary: {\n korean: \"수륙재해\",\n english: \"Water Whip\",\n damage: 14,\n kiCost: 7,\n staminaCost: 9,\n hitChance: 0.84,\n criticalChance: 0.13,\n description: {\n korean: \"물의 힘으로 적을 휘감아 타격\",\n english: \"Strike the enemy by wrapping them with the power of water\",\n },\n targetAreas: [\"torso\", \"legs\"],\n effects: [\"drown\"],\n },\n },\n },\n [TrigramStance.GAN]: {\n name: { korean: \"간\", english: \"Mountain\" },\n symbol: \"☶\",\n element: \"metal\",\n nature: \"yin\",\n chinese: \"山\",\n attribute: { korean: \"지정\", chinese: \"止靜\" },\n meaning: { korean: \"안정과 명상\", english: \"Stability and Meditation\" },\n philosophy: { korean: \"산\", english: \"Mountain\" },\n combat: { korean: \"방어 자세\", english: \"Defensive stance\" },\n theme: {\n primary: KOREAN_COLORS.TRIGRAM_GAN_PRIMARY,\n secondary: KOREAN_COLORS.UI_STEEL_GRAY_DARK,\n },\n defensiveBonus: 1.4,\n kiFlowModifier: 0.8,\n techniques: {\n primary: {\n korean: \"산의 수호\",\n english: \"Mountain Guard\",\n damage: 0,\n kiCost: 10,\n staminaCost: 15,\n hitChance: 1.0,\n criticalChance: 0.0,\n description: {\n korean: \"산처럼 견고한 방어 자세\",\n english: \"A defensive stance as solid as a mountain\",\n },\n targetAreas: [\"torso\"],\n effects: [\"block\"],\n },\n },\n },\n [TrigramStance.GON]: {\n name: { korean: \"곤\", english: \"Earth\" },\n symbol: \"☷\",\n element: \"metal\",\n nature: \"yang\",\n chinese: \"地\",\n attribute: { korean: \"순종\", chinese: \"順從\" },\n meaning: { korean: \"수용과 지지\", english: \"Receptiveness and Support\" },\n philosophy: { korean: \"지구\", english: \"Earth\" },\n combat: { korean: \"포용 공격\", english: \"Embracing attack\" },\n theme: {\n primary: KOREAN_COLORS.TRIGRAM_GON_PRIMARY,\n secondary: KOREAN_COLORS.SECONDARY_BROWN_DARK,\n },\n defensiveBonus: 1.1,\n kiFlowModifier: 1.2,\n techniques: {\n primary: {\n korean: \"지구의 방패\",\n english: \"Earth Shield\",\n damage: 0,\n kiCost: 12,\n staminaCost: 16,\n hitChance: 1.0,\n criticalChance: 0.0,\n description: {\n korean: \"지구의 힘으로 적의 공격을 막다\",\n english: \"Block the enemy's attack with the power of earth\",\n },\n targetAreas: [\"torso\"],\n effects: [\"block\"],\n },\n },\n },\n} as const;\n\n/**\n * Data structure for a Trigram stance containing philosophical,\n * combat, and visual properties for the Eight Trigrams system.\n * Includes Chinese characters, Korean/English names, attributes, and meanings.\n */\nexport interface TrigramStanceData {\n readonly name: { korean: string; english: string };\n readonly symbol: string;\n readonly element: string;\n readonly nature: \"yin\" | \"yang\";\n readonly chinese: string; // Chinese character (天, 澤, etc.)\n readonly attribute: { korean: string; chinese: string }; // Attribute (剛健, etc.)\n readonly meaning: { korean: string; english: string }; // Core meaning\n readonly philosophy: { korean: string; english: string };\n readonly combat: { korean: string; english: string };\n readonly theme: {\n primary: number;\n secondary: number;\n };\n readonly defensiveBonus: number;\n readonly kiFlowModifier: number;\n readonly techniques: {\n primary: {\n korean: string;\n english: string;\n damage: number;\n kiCost: number;\n staminaCost: number;\n hitChance: number;\n criticalChance: number;\n description: { korean: string; english: string };\n targetAreas: string[];\n effects: string[];\n };\n };\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"DamageCalculator.js","names":[],"sources":["../../../src/systems/vitalpoint/DamageCalculator.ts"],"sourcesContent":["import {\n PlayerArchetype,\n TrigramStance,\n VitalPointSeverity,\n} from \"../../types/common\";\nimport {\n calculateHipRotationPowerModifier,\n calculateKickPowerFromHipRotation,\n type HipRotationState,\n type KickType,\n} from \"../animation\";\nimport { PlayerState } from \"../player\";\nimport { TrigramCalculator } from \"../trigram/TrigramCalculator\";\nimport { asExtendedGonTechnique } from \"../trigram/types/GonTechniqueExtensions\";\nimport { StatusEffect } from \"../types\";\nimport { calculateMeridianFlow } from \"./KoreanAnatomy\";\nimport { getMeridiansForVitalPoint } from \"./MeridianVitalPointMapping\";\nimport {\n DamageResult,\n KoreanTechnique,\n VitalPoint,\n VitalPointHitResult,\n} from \"./types\";\n\nexport class DamageCalculator {\n /**\n * Vital point severity damage multipliers\n */\n private static readonly SEVERITY_MULTIPLIERS: Record<\n VitalPointSeverity,\n number\n > = {\n [VitalPointSeverity.MINOR]: 1.2,\n [VitalPointSeverity.MODERATE]: 1.5,\n [VitalPointSeverity.MAJOR]: 2.0,\n [VitalPointSeverity.CRITICAL]: 2.5,\n [VitalPointSeverity.LETHAL]: 3.0,\n };\n\n /**\n * Accuracy bonus scaling constants\n * Maps 0.0-1.0 accuracy to 0.8x-1.2x multiplier\n */\n private static readonly ACCURACY_MIN_MULTIPLIER = 0.8;\n private static readonly ACCURACY_RANGE = 0.4; // Range from min to max (1.2 - 0.8)\n\n /**\n * Calculate vital point damage with proper archetype bonuses\n */\n static calculateVitalPointDamage(\n vitalPoint: VitalPoint,\n baseDamage: number,\n attacker: PlayerState,\n accuracy: number,\n ): DamageResult {\n const effects: StatusEffect[] = [];\n\n // Fix: Use static method call instead of this\n const archetypeModifier = DamageCalculator.getArchetypeModifier(\n attacker.archetype,\n );\n const techniqueEffectiveness = accuracy;\n\n const finalDamage = Math.max(\n 1,\n (vitalPoint.baseDamage ?? vitalPoint.damage?.min ?? baseDamage) *\n archetypeModifier *\n techniqueEffectiveness,\n );\n\n // Create status effects from vital point\n vitalPoint.effects.forEach((effect) => {\n const statusEffect: StatusEffect = {\n id: `${effect.id}_${Date.now()}`,\n type: \"weakened\", // Map to valid EffectType\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- EffectIntensity type mapping from vital point effect\n intensity: \"moderate\" as any,\n duration: effect.duration,\n description: effect.description,\n stackable: effect.stackable,\n source: vitalPoint.id,\n startTime: Date.now(),\n endTime: Date.now() + effect.duration,\n };\n effects.push(statusEffect);\n });\n\n return {\n damage: finalDamage,\n effects,\n isCritical: accuracy > 0.9,\n isVitalPoint: true,\n };\n }\n\n /**\n * Fix: Add missing getArchetypeModifier method\n */\n static getArchetypeModifier(archetype: PlayerArchetype): number {\n switch (archetype) {\n case PlayerArchetype.MUSA:\n return 1.2; // Traditional warrior - strong base damage\n case PlayerArchetype.AMSALJA:\n return 1.5; // Assassin - high damage modifier\n case PlayerArchetype.HACKER:\n return 1.1; // Cyber warrior - precision over power\n case PlayerArchetype.JEONGBO_YOWON:\n return 1.1; // Intelligence operative - strategic damage\n case PlayerArchetype.JOJIK_POKRYEOKBAE:\n return 1.3; // Organized crime - brutal effectiveness\n default:\n return 1.0;\n }\n }\n\n /**\n * Calculate technique damage with vital point consideration\n */\n static calculateTechniqueDamage(\n technique: KoreanTechnique,\n attacker: PlayerState,\n vitalPoint: VitalPoint | null,\n accuracy: number,\n ): DamageResult {\n // Fix: Remove unused baseDamage variable and use technique.damage directly\n const effects: StatusEffect[] = [];\n const archetypeModifier = DamageCalculator.getArchetypeModifier(\n attacker.archetype,\n );\n\n let finalDamage = (technique.damage ?? 15) * archetypeModifier * accuracy;\n\n // Apply vital point multiplier if hitting a vital point\n if (vitalPoint) {\n finalDamage *=\n (vitalPoint.baseDamage ?? vitalPoint.damage?.min ?? 10) / 10;\n\n // Add vital point effects\n vitalPoint.effects.forEach((effect) => {\n const statusEffect: StatusEffect = {\n id: `${effect.id}_${Date.now()}`,\n type: \"weakened\",\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- EffectIntensity type mapping from vital point effect\n intensity: \"moderate\" as any,\n duration: effect.duration,\n description: effect.description,\n stackable: effect.stackable,\n source: vitalPoint.id,\n startTime: Date.now(),\n endTime: Date.now() + effect.duration,\n };\n effects.push(statusEffect);\n });\n }\n\n return {\n damage: Math.max(1, Math.floor(finalDamage)),\n effects,\n isCritical: accuracy > 0.8,\n isVitalPoint: !!vitalPoint,\n };\n }\n\n /**\n * Calculate damage reduction from defense\n */\n static calculateDamageReduction(\n incomingDamage: number,\n defenderDefense: number,\n isBlocking: boolean = false,\n ): number {\n const blockMultiplier = isBlocking ? 0.5 : 1.0;\n const defenseReduction = Math.min(0.8, defenderDefense / 200); // Max 80% reduction\n\n return Math.max(\n 1,\n incomingDamage * (1 - defenseReduction) * blockMultiplier,\n );\n }\n\n /**\n * Calculate critical hit chance\n */\n static calculateCriticalChance(\n baseCritChance: number,\n attacker: PlayerState,\n technique: KoreanTechnique,\n ): number {\n const archetypeBonus =\n DamageCalculator.getArchetypeModifier(attacker.archetype) * 0.1;\n const techniqueBonus = (technique.critChance || 0.1) * 0.5;\n\n return Math.min(0.95, baseCritChance + archetypeBonus + techniqueBonus);\n }\n\n /**\n * Calculate comprehensive vital point damage with all modifiers.\n *\n * **Korean**: 종합 급소 피해 계산 (Comprehensive Vital Point Damage Calculation)\n *\n * Integrates all damage modifiers including:\n * - Base damage from attacker strength and technique power\n * - Stance effectiveness (攻克关系)\n * - Vital point severity multipliers (1.5x-3.0x)\n * - Accuracy bonus (0.8x-1.2x)\n * - Meridian flow bonus (1.0x-1.3x at peak hours)\n * - Time-of-day bonus (+20% for Dark Ops techniques at night)\n * - Archetype-specific bonuses\n * - Hip rotation power modifier (1.0x-1.3x for strikes with full rotation)\n * - Critical hit multiplier (2x when accuracy > 0.9)\n * - Damage variance (±10% randomness)\n * - Defense reduction\n *\n * ## Damage Formula\n *\n * ```typescript\n * finalDamage =\n * baseDamage ×\n * stanceEffectiveness ×\n * vitalPointMultiplier ×\n * accuracyBonus ×\n * meridianBonus ×\n * timeBonus ×\n * archetypeBonus ×\n * hipRotationModifier ×\n * criticalMultiplier ×\n * variance ×\n * defenseReduction\n * ```\n *\n * @param attacker - Attacking player state\n * @param defender - Defending player state\n * @param technique - Korean martial arts technique being used\n * @param vitalPointHit - Result of vital point hit detection\n * @param currentHour - Current hour of day (0-23) for meridian flow\n * @param meridianStates - Current meridian disruption states (0=blocked, 1=normal)\n * @param hipRotationAngle - Hip rotation angle in radians (optional, defaults to 0)\n * @param kickHipState - Hip rotation state for kicks (optional, for kick-specific power)\n * @returns Comprehensive damage result with all modifiers applied\n *\n * @example\n * ```typescript\n * const result = DamageCalculator.calculateEnhancedVitalPointDamage(\n * attackerState,\n * defenderState,\n * technique,\n * vitalPointHitResult,\n * 2, // 2 AM - liver meridian peak\n * { liver: 1.0, gallbladder: 0.8 }\n * );\n * console.log(`Final damage: ${result.damage}`);\n * console.log(`Critical hit: ${result.isCritical}`);\n * ```\n *\n * @korean 종합급소피해계산\n */\n static calculateEnhancedVitalPointDamage(\n attacker: PlayerState,\n defender: PlayerState,\n technique: KoreanTechnique,\n vitalPointHit: VitalPointHitResult,\n currentHour: number,\n meridianStates: Record<string, number>,\n hipRotationAngle: number = 0,\n kickHipState?: HipRotationState,\n ): DamageResult {\n // 1. Base damage from technique\n const attackerStrength = attacker.attackPower || 50;\n const techniquePower = technique.damage || 15;\n const baseDamage = attackerStrength * (techniquePower / 10);\n\n // 2. Stance effectiveness (攻克关系)\n const stanceEffectiveness = TrigramCalculator.calculateStanceEffectiveness(\n attacker.currentStance,\n defender.currentStance,\n );\n\n // 3. Vital point severity multiplier\n const vitalPointMultiplier = vitalPointHit.vitalPointHit\n ? (DamageCalculator.SEVERITY_MULTIPLIERS[vitalPointHit.severity] ?? 1)\n : 1;\n\n // 4. Accuracy bonus (better aim = more damage)\n // Maps 0.0-1.0 accuracy to 0.8x-1.2x multiplier\n const accuracy = vitalPointHit.accuracy ?? 0.5;\n const accuracyBonus =\n DamageCalculator.ACCURACY_MIN_MULTIPLIER +\n accuracy * DamageCalculator.ACCURACY_RANGE;\n\n // 5. Meridian flow bonus\n const meridianBonus = DamageCalculator.calculateMeridianDamageBonus(\n vitalPointHit.vitalPointHit?.id ?? \"\",\n currentHour,\n meridianStates,\n );\n\n // 6. Time-of-day bonus (Dark Ops techniques at night)\n const timeBonus = DamageCalculator.calculateTimeBonus(\n technique,\n currentHour,\n );\n\n // 7. Archetype-specific bonus\n const archetypeBonus = DamageCalculator.getArchetypeDamageBonus(\n attacker.archetype,\n technique,\n vitalPointHit.vitalPointHit,\n );\n\n // 8. Hip rotation power modifier (허리회전 파워 보너스)\n // Determine technique type for appropriate modifier calculation\n let hipRotationModifier = 1.0;\n\n // Check if this is a kick technique and we have kick-specific hip state\n const techniqueName =\n technique.name?.english || technique.englishName || \"\";\n const isKickTechnique =\n technique.type === \"kick\" || techniqueName.toLowerCase().includes(\"kick\");\n\n if (kickHipState && isKickTechnique) {\n // Use advanced kick-specific hip rotation calculation (up to 40% bonus)\n const kickType = DamageCalculator.determineKickType(techniqueName);\n hipRotationModifier = calculateKickPowerFromHipRotation(\n kickHipState,\n kickType,\n );\n } else if (hipRotationAngle !== 0) {\n // Use general hip rotation for strikes/throws/joints (up to 30% bonus)\n const techniqueType: \"strike\" | \"throw\" | \"joint\" =\n technique.type === \"throw\"\n ? \"throw\"\n : technique.type === \"joint_lock\"\n ? \"joint\"\n : \"strike\";\n hipRotationModifier = calculateHipRotationPowerModifier(\n hipRotationAngle,\n techniqueType,\n );\n }\n\n // 9. Critical hit (accuracy > 0.9)\n const criticalMultiplier = accuracy > 0.9 ? 2.0 : 1.0;\n const isCritical = accuracy > 0.9;\n\n // 10. Calculate total damage before defense\n let totalDamage =\n baseDamage *\n stanceEffectiveness *\n vitalPointMultiplier *\n accuracyBonus *\n meridianBonus *\n timeBonus *\n archetypeBonus *\n hipRotationModifier *\n criticalMultiplier;\n\n // 11. Add damage variance (±10%)\n const variance = 0.9 + Math.random() * 0.2; // 0.9 to 1.1\n totalDamage *= variance;\n\n // 12. Apply defense reduction using existing method for consistency\n const defenderDefense = defender.defense || 0;\n const finalDamage = DamageCalculator.calculateDamageReduction(\n totalDamage,\n defenderDefense,\n false,\n );\n\n // 13. Combine effects from vital point hit\n const effects = vitalPointHit.effects || [];\n\n return {\n damage: Math.max(1, finalDamage), // Minimum 1 damage\n effects,\n isCritical,\n isVitalPoint: !!vitalPointHit.vitalPointHit,\n };\n }\n\n /**\n * Determine kick type from technique name for hip rotation power calculation\n *\n * @param techniqueName - Name of the technique\n * @returns Kick type for hip rotation calculation\n *\n * @private\n * @korean 차기유형결정\n */\n private static determineKickType(techniqueName: string): KickType {\n const name = techniqueName.toLowerCase();\n\n if (\n name.includes(\"front\") ||\n name.includes(\"앞차기\") ||\n name.includes(\"snap\")\n ) {\n return \"front\";\n } else if (\n name.includes(\"roundhouse\") ||\n name.includes(\"돌려차기\") ||\n name.includes(\"round\")\n ) {\n return \"roundhouse\";\n } else if (\n name.includes(\"side\") ||\n name.includes(\"옆차기\") ||\n name.includes(\"lateral\")\n ) {\n return \"side\";\n } else if (name.includes(\"hook\") || name.includes(\"후려차기\")) {\n return \"hook\";\n } else if (\n name.includes(\"axe\") ||\n name.includes(\"내려차기\") ||\n name.includes(\"downward\")\n ) {\n return \"axe\";\n }\n\n // Default to front kick for unknown kick types\n return \"front\";\n }\n\n /**\n * Calculate meridian flow damage bonus based on time of day.\n *\n * **Korean**: 경락 유효성 피해 보너스 계산\n *\n * Calculates bonus damage when striking vital points during their peak\n * meridian flow hours. Peak flow provides +30% damage bonus.\n *\n * @param vitalPointId - ID of the vital point being struck\n * @param currentHour - Current hour of day (0-23)\n * @param meridianStates - Current meridian disruption states\n * @returns Damage multiplier (1.0-1.3)\n *\n * @private\n * @korean 경락유효성피해보너스계산\n */\n private static calculateMeridianDamageBonus(\n vitalPointId: string,\n currentHour: number,\n meridianStates: Record<string, number>,\n ): number {\n if (!vitalPointId) return 1;\n\n const relatedMeridians = getMeridiansForVitalPoint(vitalPointId);\n let maxBonus = 1.0;\n\n for (const meridianId of relatedMeridians) {\n const flow = calculateMeridianFlow(meridianId, currentHour);\n const state = meridianStates[meridianId] ?? 1.0;\n\n // Peak flow (>0.9) with normal state gives +30% bonus\n // flow ranges from 0.7 to 1.3, state from 0 (blocked) to 1 (normal)\n const effectiveFlow = flow * state;\n if (effectiveFlow > 0.9) {\n // Bonus scales linearly from 1.0 (no bonus) at effectiveFlow = 0.9\n // to 1.3 (maximum 30% bonus) at effectiveFlow = 1.3:\n // bonus = 1.0 + ((effectiveFlow - 0.9) / 0.4) * 0.3\n const bonus = 1.0 + ((effectiveFlow - 0.9) / 0.4) * 0.3;\n maxBonus = Math.max(maxBonus, Math.min(1.3, bonus));\n }\n }\n\n return maxBonus;\n }\n\n /**\n * Calculate time-of-day bonus for Dark Ops techniques.\n *\n * **Korean**: 시간대 보너스 계산\n *\n * Dark Ops techniques gain +20% damage at night (20:00-05:59)\n * to reflect tactical advantage of darkness.\n *\n * @param technique - Technique being used\n * @param currentHour - Current hour of day (0-23)\n * @returns Time bonus multiplier (1.0 or 1.2)\n *\n * @private\n * @korean 시간대보너스계산\n */\n private static calculateTimeBonus(\n technique: KoreanTechnique,\n currentHour: number,\n ): number {\n // Dark Ops techniques get +20% at night (20:00-05:59)\n // Check if technique has dark_ops or stealth in its ID or type\n const isDarkOpsTechnique =\n technique.id.includes(\"dark_ops\") ||\n technique.id.includes(\"stealth\") ||\n technique.id.includes(\"shadow\") ||\n technique.id.includes(\"night\");\n\n if (isDarkOpsTechnique) {\n // Night hours: 20:00 through 05:59 (6 AM is considered daylight)\n if (currentHour >= 20 || currentHour < 6) {\n return 1.2;\n }\n }\n return 1.0;\n }\n\n /**\n * Get archetype-specific damage bonus for technique and vital point.\n *\n * **Korean**: 원형 특화 피해 보너스\n *\n * Each archetype has specialized bonuses for different techniques\n * and vital point categories:\n *\n * - **무사 (Musa)**: +20% with 건 (Geon) stance techniques\n * - **암살자 (Amsalja)**: +30% on neurological vital points\n * - **해커 (Hacker)**: +15% baseline precision bonus\n * - **정보요원 (Jeongbo)**: +25% on vascular vital points\n * - **조직폭력배 (Jojik)**: +20% on dirty/ruthless techniques\n *\n * @param archetype - Attacker's archetype\n * @param technique - Technique being used\n * @param vitalPoint - Vital point being struck (optional)\n * @returns Archetype damage multiplier (1.0-1.5)\n *\n * @private\n * @korean 원형특화피해보너스\n */\n private static getArchetypeDamageBonus(\n archetype: PlayerArchetype,\n technique: KoreanTechnique,\n vitalPoint?: VitalPoint,\n ): number {\n // Base archetype modifier\n let bonus = DamageCalculator.getArchetypeModifier(archetype);\n\n // Additional bonuses based on technique-archetype synergy\n switch (archetype) {\n case PlayerArchetype.MUSA:\n // Musa gets bonus with Geon (Heaven) stance techniques\n if (technique.stance === TrigramStance.GEON) {\n bonus *= 1.2;\n }\n break;\n\n case PlayerArchetype.AMSALJA:\n // Assassin gets bonus on neurological vital points\n if (vitalPoint?.category === \"neurological\") {\n bonus *= 1.3;\n }\n break;\n\n case PlayerArchetype.HACKER:\n // Hacker gets consistent precision bonus\n bonus *= 1.15;\n break;\n\n case PlayerArchetype.JEONGBO_YOWON:\n // Intelligence operative gets bonus on vascular targets\n if (vitalPoint?.category === \"vascular\") {\n bonus *= 1.25;\n }\n break;\n\n case PlayerArchetype.JOJIK_POKRYEOKBAE:\n // Organized crime gets bonus on ruthless techniques\n // Check for keywords in technique ID\n if (\n technique.id.includes(\"ruthless\") ||\n technique.id.includes(\"brutal\") ||\n technique.id.includes(\"dirty\")\n ) {\n bonus *= 1.2;\n }\n break;\n }\n\n // Cap maximum bonus at 1.5x\n return Math.min(1.5, bonus);\n }\n\n /**\n * Calculate throw/takedown impact damage with ground multiplier.\n *\n * **Korean**: 던지기 충격 피해 계산 (Throw Impact Damage Calculation)\n *\n * Applies groundImpactMultiplier from Gon (Earth) techniques when opponent\n * hits the ground after a throw or takedown. Integrates with base damage\n * calculation to provide authentic Ssireum/Hapkido throw mechanics.\n *\n * **Formula**:\n * ```\n * impactDamage = baseDamage × groundImpactMultiplier × strengthModifier\n * ```\n *\n * **Ground Impact Multiplier Ranges**:\n * - 1.0-1.2: Low impact (controlled takedowns)\n * - 1.3-1.5: Medium impact (standard throws)\n * - 1.6-1.8: High impact (power throws)\n * - 1.9-2.0: Maximum impact (slams like 대지강타)\n *\n * @param technique - Korean martial arts technique (checks for ExtendedGonTechnique)\n * @param baseDamage - Base damage before ground impact modifier\n * @param attackerStrength - Attacker's strength stat for scaling\n * @param options - Optional configuration for damage calculation\n * @param options.applyVariance - Whether to apply random ±5% variance (default: true)\n * @returns Enhanced damage result with ground impact applied\n *\n * @example\n * ```typescript\n * const throwDamage = DamageCalculator.calculateThrowImpactDamage(\n * ssireumThrowTechnique, // groundImpactMultiplier: 1.7\n * 50, // base damage\n * 80 // attacker strength\n * );\n * // Result: ~85 damage (50 × 1.7 × 1.0) with ±5% variance\n *\n * // For deterministic testing:\n * const testDamage = DamageCalculator.calculateThrowImpactDamage(\n * technique, 50, 80, { applyVariance: false }\n * );\n * ```\n *\n * @korean 던지기충격피해계산\n */\n static calculateThrowImpactDamage(\n technique: KoreanTechnique,\n baseDamage: number,\n attackerStrength: number = 50,\n options: { applyVariance?: boolean } = {},\n ): DamageResult {\n const { applyVariance = true } = options;\n // Check if technique has Gon-specific ground impact metadata\n // Use helper function for safe type casting\n const gonTechnique = asExtendedGonTechnique(technique);\n if (!gonTechnique) {\n // Non-Gon technique: return base damage without ground multiplier\n return {\n damage: Math.max(1, baseDamage),\n effects: [],\n isCritical: false,\n isVitalPoint: false,\n };\n }\n\n // Extract ground impact multiplier from validated Gon technique\n const groundMultiplier = gonTechnique.groundImpactMultiplier;\n\n // Calculate strength modifier (50 = baseline, scales ±20%)\n // Stronger attackers create more impact, weaker create less\n const strengthModifier = 0.8 + (attackerStrength / 250);\n\n // Apply ground impact multiplier with strength scaling\n let impactDamage = baseDamage * groundMultiplier * strengthModifier;\n\n // Add small damage variance (±5%) for realistic impact variation\n // Can be disabled for deterministic testing\n if (applyVariance) {\n const variance = 0.95 + Math.random() * 0.1; // 0.95 to 1.05\n impactDamage *= variance;\n }\n\n // Earth connection healing (대지는 모든 것을 품고 키운다)\n // Supportive healing is applied separately by calling system\n // This method focuses on damage calculation only\n\n return {\n damage: Math.max(1, Math.floor(impactDamage)),\n effects: [],\n isCritical: impactDamage > baseDamage * 1.5, // High impact = critical\n isVitalPoint: false,\n };\n }\n\n /**\n * Calculate earth's supportive healing from Gon technique.\n *\n * **Korean**: 대지 치유 계산 (Earth Healing Calculation)\n *\n * Implements Korean martial arts philosophy:\n * \"대지는 모든 것을 품고 키운다\" (The earth embraces and nurtures all things)\n *\n * Gon techniques restore HP to the attacker after successful execution\n * based on their connection with earth energy. Traditional techniques\n * like Ssireum throws provide stronger healing due to cultural authenticity.\n *\n * **Healing Formula**:\n * ```\n * healingAmount = supportiveHealing × (1 + earthAffinityBonus)\n * ```\n *\n * **Supportive Healing Ranges**:\n * - 0-2: Minimal earth connection (aggressive techniques)\n * - 3-4: Moderate earth connection (standard Ssireum)\n * - 5-6: Strong earth connection (traditional, sacrifice throws)\n * - 7-10: RESERVED for meditation/healing techniques\n *\n * @param technique - Korean martial arts technique (checks for ExtendedGonTechnique)\n * @param earthAffinityBonus - Player's earth affinity stat modifier (0.0-1.0)\n * @returns HP healing amount (0 if not a Gon technique)\n *\n * @example\n * ```typescript\n * const healing = DamageCalculator.calculateEarthHealing(\n * ssireumThrowTechnique, // supportiveHealing: 5\n * 0.3 // 30% earth affinity bonus\n * );\n * // Result: 6.5 HP restored (5 × 1.3)\n * ```\n *\n * @korean 대지치유계산\n */\n static calculateEarthHealing(\n technique: KoreanTechnique,\n earthAffinityBonus: number = 0,\n ): number {\n // Use helper function for safe type casting\n const gonTechnique = asExtendedGonTechnique(technique);\n if (!gonTechnique) {\n return 0; // Non-Gon technique: no earth healing\n }\n\n const baseHealing = gonTechnique.supportiveHealing;\n\n // Apply earth affinity bonus (typically 0-100% bonus)\n const affinityMultiplier = 1 + Math.max(0, Math.min(1, earthAffinityBonus));\n\n // Calculate final healing with bonus\n const healingAmount = baseHealing * affinityMultiplier;\n\n // Return rounded healing value (minimum 0)\n return Math.max(0, Math.floor(healingAmount));\n }\n}\n\nexport default DamageCalculator;\n"],"mappings":"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"}
1
+ {"version":3,"file":"DamageCalculator.js","names":[],"sources":["../../../src/systems/vitalpoint/DamageCalculator.ts"],"sourcesContent":["import {\n PlayerArchetype,\n TrigramStance,\n VitalPointSeverity,\n} from \"../../types/common\";\nimport {\n calculateHipRotationPowerModifier,\n calculateKickPowerFromHipRotation,\n type HipRotationState,\n type KickType,\n} from \"../animation\";\nimport { PlayerState } from \"../player\";\nimport { TrigramCalculator } from \"../trigram/TrigramCalculator\";\nimport { asExtendedGonTechnique } from \"../trigram/types/GonTechniqueExtensions\";\nimport { StatusEffect } from \"../types\";\nimport { calculateMeridianFlow } from \"./KoreanAnatomy\";\nimport { getMeridiansForVitalPoint } from \"./MeridianVitalPointMapping\";\nimport {\n DamageResult,\n KoreanTechnique,\n VitalPoint,\n VitalPointHitResult,\n} from \"./types\";\n\nexport class DamageCalculator {\n /**\n * Vital point severity damage multipliers\n */\n private static readonly SEVERITY_MULTIPLIERS: Record<\n VitalPointSeverity,\n number\n > = {\n [VitalPointSeverity.MINOR]: 1.2,\n [VitalPointSeverity.MODERATE]: 1.5,\n [VitalPointSeverity.MAJOR]: 2.0,\n [VitalPointSeverity.CRITICAL]: 2.5,\n [VitalPointSeverity.LETHAL]: 3.0,\n };\n\n /**\n * Accuracy bonus scaling constants\n * Maps 0.0-1.0 accuracy to 0.8x-1.2x multiplier\n */\n private static readonly ACCURACY_MIN_MULTIPLIER = 0.8;\n private static readonly ACCURACY_RANGE = 0.4; // Range from min to max (1.2 - 0.8)\n\n /**\n * Calculate vital point damage with proper archetype bonuses\n */\n static calculateVitalPointDamage(\n vitalPoint: VitalPoint,\n baseDamage: number,\n attacker: PlayerState,\n accuracy: number,\n ): DamageResult {\n const effects: StatusEffect[] = [];\n\n // Fix: Use static method call instead of this\n const archetypeModifier = DamageCalculator.getArchetypeModifier(\n attacker.archetype,\n );\n const techniqueEffectiveness = accuracy;\n\n const finalDamage = Math.max(\n 1,\n (vitalPoint.baseDamage ?? vitalPoint.damage?.min ?? baseDamage) *\n archetypeModifier *\n techniqueEffectiveness,\n );\n\n // Create status effects from vital point\n vitalPoint.effects.forEach((effect) => {\n const statusEffect: StatusEffect = {\n id: `${effect.id}_${Date.now()}`,\n type: \"weakened\", // Map to valid EffectType\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- EffectIntensity type mapping from vital point effect\n intensity: \"moderate\" as any,\n duration: effect.duration,\n description: effect.description,\n stackable: effect.stackable,\n source: vitalPoint.id,\n startTime: Date.now(),\n endTime: Date.now() + effect.duration,\n };\n effects.push(statusEffect);\n });\n\n return {\n damage: finalDamage,\n effects,\n isCritical: accuracy > 0.9,\n isVitalPoint: true,\n };\n }\n\n /**\n * Fix: Add missing getArchetypeModifier method\n */\n static getArchetypeModifier(archetype: PlayerArchetype): number {\n switch (archetype) {\n case PlayerArchetype.MUSA:\n return 1.2; // Traditional warrior - strong base damage\n case PlayerArchetype.AMSALJA:\n return 1.5; // Assassin - high damage modifier\n case PlayerArchetype.HACKER:\n return 1.1; // Cyber warrior - precision over power\n case PlayerArchetype.JEONGBO_YOWON:\n return 1.1; // Intelligence operative - strategic damage\n case PlayerArchetype.JOJIK_POKRYEOKBAE:\n return 1.3; // Organized crime - brutal effectiveness\n default:\n return 1.0;\n }\n }\n\n /**\n * Calculate technique damage with vital point consideration\n */\n static calculateTechniqueDamage(\n technique: KoreanTechnique,\n attacker: PlayerState,\n vitalPoint: VitalPoint | null,\n accuracy: number,\n ): DamageResult {\n // Fix: Remove unused baseDamage variable and use technique.damage directly\n const effects: StatusEffect[] = [];\n const archetypeModifier = DamageCalculator.getArchetypeModifier(\n attacker.archetype,\n );\n\n let finalDamage = (technique.damage ?? 15) * archetypeModifier * accuracy;\n\n // Apply vital point multiplier if hitting a vital point\n if (vitalPoint) {\n finalDamage *=\n (vitalPoint.baseDamage ?? vitalPoint.damage?.min ?? 10) / 10;\n\n // Add vital point effects\n vitalPoint.effects.forEach((effect) => {\n const statusEffect: StatusEffect = {\n id: `${effect.id}_${Date.now()}`,\n type: \"weakened\",\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- EffectIntensity type mapping from vital point effect\n intensity: \"moderate\" as any,\n duration: effect.duration,\n description: effect.description,\n stackable: effect.stackable,\n source: vitalPoint.id,\n startTime: Date.now(),\n endTime: Date.now() + effect.duration,\n };\n effects.push(statusEffect);\n });\n }\n\n return {\n damage: Math.max(1, Math.floor(finalDamage)),\n effects,\n isCritical: accuracy > 0.8,\n isVitalPoint: !!vitalPoint,\n };\n }\n\n /**\n * Calculate damage reduction from defense\n */\n static calculateDamageReduction(\n incomingDamage: number,\n defenderDefense: number,\n isBlocking: boolean = false,\n ): number {\n const blockMultiplier = isBlocking ? 0.5 : 1.0;\n const defenseReduction = Math.min(0.8, defenderDefense / 200); // Max 80% reduction\n\n return Math.max(\n 1,\n incomingDamage * (1 - defenseReduction) * blockMultiplier,\n );\n }\n\n /**\n * Calculate critical hit chance\n */\n static calculateCriticalChance(\n baseCritChance: number,\n attacker: PlayerState,\n technique: KoreanTechnique,\n ): number {\n const archetypeBonus =\n DamageCalculator.getArchetypeModifier(attacker.archetype) * 0.1;\n const techniqueBonus = (technique.critChance || 0.1) * 0.5;\n\n return Math.min(0.95, baseCritChance + archetypeBonus + techniqueBonus);\n }\n\n /**\n * Calculate comprehensive vital point damage with all modifiers.\n *\n * **Korean**: 종합 급소 피해 계산 (Comprehensive Vital Point Damage Calculation)\n *\n * Integrates all damage modifiers including:\n * - Base damage from attacker strength and technique power\n * - Stance effectiveness (攻克关系)\n * - Vital point severity multipliers (1.5x-3.0x)\n * - Accuracy bonus (0.8x-1.2x)\n * - Meridian flow bonus (1.0x-1.3x at peak hours)\n * - Time-of-day bonus (+20% for Dark Ops techniques at night)\n * - Archetype-specific bonuses\n * - Hip rotation power modifier (1.0x-1.3x for strikes with full rotation)\n * - Critical hit multiplier (2x when accuracy > 0.9)\n * - Damage variance (±10% randomness)\n * - Defense reduction\n *\n * ## Damage Formula\n *\n * ```typescript\n * finalDamage =\n * baseDamage ×\n * stanceEffectiveness ×\n * vitalPointMultiplier ×\n * accuracyBonus ×\n * meridianBonus ×\n * timeBonus ×\n * archetypeBonus ×\n * hipRotationModifier ×\n * criticalMultiplier ×\n * variance ×\n * defenseReduction\n * ```\n *\n * @param attacker - Attacking player state\n * @param defender - Defending player state\n * @param technique - Korean martial arts technique being used\n * @param vitalPointHit - Result of vital point hit detection\n * @param currentHour - Current hour of day (0-23) for meridian flow\n * @param meridianStates - Current meridian disruption states (0=blocked, 1=normal)\n * @param hipRotationAngle - Hip rotation angle in radians (optional, defaults to 0)\n * @param kickHipState - Hip rotation state for kicks (optional, for kick-specific power)\n * @returns Comprehensive damage result with all modifiers applied\n *\n * @example\n * ```typescript\n * const result = DamageCalculator.calculateEnhancedVitalPointDamage(\n * attackerState,\n * defenderState,\n * technique,\n * vitalPointHitResult,\n * 2, // 2 AM - liver meridian peak\n * { liver: 1.0, gallbladder: 0.8 }\n * );\n * console.log(`Final damage: ${result.damage}`);\n * console.log(`Critical hit: ${result.isCritical}`);\n * ```\n *\n * @korean 종합급소피해계산\n */\n static calculateEnhancedVitalPointDamage(\n attacker: PlayerState,\n defender: PlayerState,\n technique: KoreanTechnique,\n vitalPointHit: VitalPointHitResult,\n currentHour: number,\n meridianStates: Record<string, number>,\n hipRotationAngle: number = 0,\n kickHipState?: HipRotationState,\n ): DamageResult {\n // 1. Base damage from technique\n const attackerStrength = attacker.attackPower || 50;\n const techniquePower = technique.damage || 15;\n const baseDamage = attackerStrength * (techniquePower / 10);\n\n // 2. Stance effectiveness (攻克关系)\n const stanceEffectiveness = TrigramCalculator.calculateStanceEffectiveness(\n attacker.currentStance,\n defender.currentStance,\n );\n\n // 3. Vital point severity multiplier\n const vitalPointMultiplier = vitalPointHit.vitalPointHit\n ? (DamageCalculator.SEVERITY_MULTIPLIERS[vitalPointHit.severity] ?? 1)\n : 1;\n\n // 4. Accuracy bonus (better aim = more damage)\n // Maps 0.0-1.0 accuracy to 0.8x-1.2x multiplier\n const accuracy = vitalPointHit.accuracy ?? 0.5;\n const accuracyBonus =\n DamageCalculator.ACCURACY_MIN_MULTIPLIER +\n accuracy * DamageCalculator.ACCURACY_RANGE;\n\n // 5. Meridian flow bonus\n const meridianBonus = DamageCalculator.calculateMeridianDamageBonus(\n vitalPointHit.vitalPointHit?.id ?? \"\",\n currentHour,\n meridianStates,\n );\n\n // 6. Time-of-day bonus (Dark Ops techniques at night)\n const timeBonus = DamageCalculator.calculateTimeBonus(\n technique,\n currentHour,\n );\n\n // 7. Archetype-specific bonus\n const archetypeBonus = DamageCalculator.getArchetypeDamageBonus(\n attacker.archetype,\n technique,\n vitalPointHit.vitalPointHit,\n );\n\n // 8. Hip rotation power modifier (허리회전 파워 보너스)\n // Determine technique type for appropriate modifier calculation\n let hipRotationModifier = 1.0;\n\n // Check if this is a kick technique and we have kick-specific hip state\n const techniqueName =\n technique.name?.english || technique.englishName || \"\";\n const isKickTechnique =\n technique.type === \"kick\" || techniqueName.toLowerCase().includes(\"kick\");\n\n if (kickHipState && isKickTechnique) {\n // Use advanced kick-specific hip rotation calculation (up to 40% bonus)\n const kickType = DamageCalculator.determineKickType(techniqueName);\n hipRotationModifier = calculateKickPowerFromHipRotation(\n kickHipState,\n kickType,\n );\n } else if (hipRotationAngle !== 0) {\n // Use general hip rotation for strikes/throws/joints (up to 30% bonus)\n const techniqueType: \"strike\" | \"throw\" | \"joint\" =\n technique.type === \"throw\"\n ? \"throw\"\n : technique.type === \"joint_lock\"\n ? \"joint\"\n : \"strike\";\n hipRotationModifier = calculateHipRotationPowerModifier(\n hipRotationAngle,\n techniqueType,\n );\n }\n\n // 9. Critical hit (accuracy > 0.9)\n const criticalMultiplier = accuracy > 0.9 ? 2.0 : 1.0;\n const isCritical = accuracy > 0.9;\n\n // 10. Calculate total damage before defense\n let totalDamage =\n baseDamage *\n stanceEffectiveness *\n vitalPointMultiplier *\n accuracyBonus *\n meridianBonus *\n timeBonus *\n archetypeBonus *\n hipRotationModifier *\n criticalMultiplier;\n\n // 11. Add damage variance (±10%)\n const variance = 0.9 + Math.random() * 0.2; // 0.9 to 1.1\n totalDamage *= variance;\n\n // 12. Apply defense reduction using existing method for consistency\n const defenderDefense = defender.defense || 0;\n const finalDamage = DamageCalculator.calculateDamageReduction(\n totalDamage,\n defenderDefense,\n false,\n );\n\n // 13. Combine effects from vital point hit\n const effects = vitalPointHit.effects || [];\n\n return {\n damage: Math.max(1, finalDamage), // Minimum 1 damage\n effects,\n isCritical,\n isVitalPoint: !!vitalPointHit.vitalPointHit,\n };\n }\n\n /**\n * Determine kick type from technique name for hip rotation power calculation\n *\n * @param techniqueName - Name of the technique\n * @returns Kick type for hip rotation calculation\n *\n * @private\n * @korean 차기유형결정\n */\n private static determineKickType(techniqueName: string): KickType {\n const name = techniqueName.toLowerCase();\n\n if (\n name.includes(\"front\") ||\n name.includes(\"앞차기\") ||\n name.includes(\"snap\")\n ) {\n return \"front\";\n } else if (\n name.includes(\"roundhouse\") ||\n name.includes(\"돌려차기\") ||\n name.includes(\"round\")\n ) {\n return \"roundhouse\";\n } else if (\n name.includes(\"side\") ||\n name.includes(\"옆차기\") ||\n name.includes(\"lateral\")\n ) {\n return \"side\";\n } else if (name.includes(\"hook\") || name.includes(\"후려차기\")) {\n return \"hook\";\n } else if (\n name.includes(\"axe\") ||\n name.includes(\"내려차기\") ||\n name.includes(\"downward\")\n ) {\n return \"axe\";\n }\n\n // Default to front kick for unknown kick types\n return \"front\";\n }\n\n /**\n * Calculate meridian flow damage bonus based on time of day.\n *\n * **Korean**: 경락 유효성 피해 보너스 계산\n *\n * Calculates bonus damage when striking vital points during their peak\n * meridian flow hours. Peak flow provides +30% damage bonus.\n *\n * @param vitalPointId - ID of the vital point being struck\n * @param currentHour - Current hour of day (0-23)\n * @param meridianStates - Current meridian disruption states\n * @returns Damage multiplier (1.0-1.3)\n *\n * @private\n * @korean 경락유효성피해보너스계산\n */\n private static calculateMeridianDamageBonus(\n vitalPointId: string,\n currentHour: number,\n meridianStates: Record<string, number>,\n ): number {\n if (!vitalPointId) return 1;\n\n const relatedMeridians = getMeridiansForVitalPoint(vitalPointId);\n let maxBonus = 1.0;\n\n for (const meridianId of relatedMeridians) {\n const flow = calculateMeridianFlow(meridianId, currentHour);\n const state = meridianStates[meridianId] ?? 1.0;\n\n // Peak flow (>0.9) with normal state gives +30% bonus\n // flow ranges from 0.7 to 1.3, state from 0 (blocked) to 1 (normal)\n const effectiveFlow = flow * state;\n if (effectiveFlow > 0.9) {\n // Bonus scales linearly from 1.0 (no bonus) at effectiveFlow = 0.9\n // to 1.3 (maximum 30% bonus) at effectiveFlow = 1.3:\n // bonus = 1.0 + ((effectiveFlow - 0.9) / 0.4) * 0.3\n const bonus = 1.0 + ((effectiveFlow - 0.9) / 0.4) * 0.3;\n maxBonus = Math.max(maxBonus, Math.min(1.3, bonus));\n }\n }\n\n return maxBonus;\n }\n\n /**\n * Calculate time-of-day bonus for Dark Ops techniques.\n *\n * **Korean**: 시간대 보너스 계산\n *\n * Dark Ops techniques gain +20% damage at night (20:00-05:59)\n * to reflect tactical advantage of darkness.\n *\n * @param technique - Technique being used\n * @param currentHour - Current hour of day (0-23)\n * @returns Time bonus multiplier (1.0 or 1.2)\n *\n * @private\n * @korean 시간대보너스계산\n */\n private static calculateTimeBonus(\n technique: KoreanTechnique,\n currentHour: number,\n ): number {\n // Dark Ops techniques get +20% at night (20:00-05:59)\n // Check if technique has dark_ops or stealth in its ID or type\n const isDarkOpsTechnique =\n technique.id.includes(\"dark_ops\") ||\n technique.id.includes(\"stealth\") ||\n technique.id.includes(\"shadow\") ||\n technique.id.includes(\"night\");\n\n if (isDarkOpsTechnique) {\n // Night hours: 20:00 through 05:59 (6 AM is considered daylight)\n if (currentHour >= 20 || currentHour < 6) {\n return 1.2;\n }\n }\n return 1.0;\n }\n\n /**\n * Get archetype-specific damage bonus for technique and vital point.\n *\n * **Korean**: 원형 특화 피해 보너스\n *\n * Each archetype has specialized bonuses for different techniques\n * and vital point categories:\n *\n * - **무사 (Musa)**: +20% with 건 (Geon) stance techniques\n * - **암살자 (Amsalja)**: +30% on neurological vital points\n * - **해커 (Hacker)**: +15% baseline precision bonus\n * - **정보요원 (Jeongbo)**: +25% on vascular vital points\n * - **조직폭력배 (Jojik)**: +20% on dirty/ruthless techniques\n *\n * @param archetype - Attacker's archetype\n * @param technique - Technique being used\n * @param vitalPoint - Vital point being struck (optional)\n * @returns Archetype damage multiplier (1.0-1.5)\n *\n * @private\n * @korean 원형특화피해보너스\n */\n private static getArchetypeDamageBonus(\n archetype: PlayerArchetype,\n technique: KoreanTechnique,\n vitalPoint?: VitalPoint,\n ): number {\n // Base archetype modifier\n let bonus = DamageCalculator.getArchetypeModifier(archetype);\n\n // Additional bonuses based on technique-archetype synergy\n switch (archetype) {\n case PlayerArchetype.MUSA:\n // Musa gets bonus with Geon (Heaven) stance techniques\n if (technique.stance === TrigramStance.GEON) {\n bonus *= 1.2;\n }\n break;\n\n case PlayerArchetype.AMSALJA:\n // Assassin gets bonus on neurological vital points\n if (vitalPoint?.category === \"neurological\") {\n bonus *= 1.3;\n }\n break;\n\n case PlayerArchetype.HACKER:\n // Hacker gets consistent precision bonus\n bonus *= 1.15;\n break;\n\n case PlayerArchetype.JEONGBO_YOWON:\n // Intelligence operative gets bonus on vascular targets\n if (vitalPoint?.category === \"vascular\") {\n bonus *= 1.25;\n }\n break;\n\n case PlayerArchetype.JOJIK_POKRYEOKBAE:\n // Organized crime gets bonus on ruthless techniques\n // Check for keywords in technique ID\n if (\n technique.id.includes(\"ruthless\") ||\n technique.id.includes(\"brutal\") ||\n technique.id.includes(\"dirty\")\n ) {\n bonus *= 1.2;\n }\n break;\n }\n\n // Cap maximum bonus at 1.5x\n return Math.min(1.5, bonus);\n }\n\n /**\n * Calculate throw/takedown impact damage with ground multiplier.\n *\n * **Korean**: 던지기 충격 피해 계산 (Throw Impact Damage Calculation)\n *\n * Applies groundImpactMultiplier from Gon (Earth) techniques when opponent\n * hits the ground after a throw or takedown. Integrates with base damage\n * calculation to provide authentic Ssireum/Hapkido throw mechanics.\n *\n * **Formula**:\n * ```\n * impactDamage = baseDamage × groundImpactMultiplier × strengthModifier\n * ```\n *\n * **Ground Impact Multiplier Ranges**:\n * - 1.0-1.2: Low impact (controlled takedowns)\n * - 1.3-1.5: Medium impact (standard throws)\n * - 1.6-1.8: High impact (power throws)\n * - 1.9-2.0: Maximum impact (slams like 대지강타)\n *\n * @param technique - Korean martial arts technique (checks for ExtendedGonTechnique)\n * @param baseDamage - Base damage before ground impact modifier\n * @param attackerStrength - Attacker's strength stat for scaling\n * @param options - Optional configuration for damage calculation\n * @param options.applyVariance - Whether to apply random ±5% variance (default: true)\n * @returns Enhanced damage result with ground impact applied\n *\n * @example\n * ```typescript\n * const throwDamage = DamageCalculator.calculateThrowImpactDamage(\n * ssireumThrowTechnique, // groundImpactMultiplier: 1.7\n * 50, // base damage\n * 80 // attacker strength\n * );\n * // Result: ~85 damage (50 × 1.7 × 1.0) with ±5% variance\n *\n * // For deterministic testing:\n * const testDamage = DamageCalculator.calculateThrowImpactDamage(\n * technique, 50, 80, { applyVariance: false }\n * );\n * ```\n *\n * @korean 던지기충격피해계산\n */\n static calculateThrowImpactDamage(\n technique: KoreanTechnique,\n baseDamage: number,\n attackerStrength: number = 50,\n options: { applyVariance?: boolean } = {},\n ): DamageResult {\n const { applyVariance = true } = options;\n // Check if technique has Gon-specific ground impact metadata\n // Use helper function for safe type casting\n const gonTechnique = asExtendedGonTechnique(technique);\n if (!gonTechnique) {\n // Non-Gon technique: return base damage without ground multiplier\n return {\n damage: Math.max(1, baseDamage),\n effects: [],\n isCritical: false,\n isVitalPoint: false,\n };\n }\n\n // Extract ground impact multiplier from validated Gon technique\n const groundMultiplier = gonTechnique.groundImpactMultiplier;\n\n // Calculate strength modifier (50 = baseline, scales ±20%)\n // Stronger attackers create more impact, weaker create less\n const strengthModifier = 0.8 + (attackerStrength / 250);\n\n // Apply ground impact multiplier with strength scaling\n let impactDamage = baseDamage * groundMultiplier * strengthModifier;\n\n // Add small damage variance (±5%) for realistic impact variation\n // Can be disabled for deterministic testing\n if (applyVariance) {\n const variance = 0.95 + Math.random() * 0.1; // 0.95 to 1.05\n impactDamage *= variance;\n }\n\n // Earth connection healing (대지는 모든 것을 품고 키운다)\n // Supportive healing is applied separately by calling system\n // This method focuses on damage calculation only\n\n return {\n damage: Math.max(1, Math.floor(impactDamage)),\n effects: [],\n isCritical: impactDamage > baseDamage * 1.5, // High impact = critical\n isVitalPoint: false,\n };\n }\n\n /**\n * Calculate earth's supportive healing from Gon technique.\n *\n * **Korean**: 대지 치유 계산 (Earth Healing Calculation)\n *\n * Implements Korean martial arts philosophy:\n * \"대지는 모든 것을 품고 키운다\" (The earth embraces and nurtures all things)\n *\n * Gon techniques restore HP to the attacker after successful execution\n * based on their connection with earth energy. Traditional techniques\n * like Ssireum throws provide stronger healing due to cultural authenticity.\n *\n * **Healing Formula**:\n * ```\n * healingAmount = supportiveHealing × (1 + earthAffinityBonus)\n * ```\n *\n * **Supportive Healing Ranges**:\n * - 0-2: Minimal earth connection (aggressive techniques)\n * - 3-4: Moderate earth connection (standard Ssireum)\n * - 5-6: Strong earth connection (traditional, sacrifice throws)\n * - 7-10: RESERVED for meditation/healing techniques\n *\n * @param technique - Korean martial arts technique (checks for ExtendedGonTechnique)\n * @param earthAffinityBonus - Player's earth affinity stat modifier (0.0-1.0)\n * @returns HP healing amount (0 if not a Gon technique)\n *\n * @example\n * ```typescript\n * const healing = DamageCalculator.calculateEarthHealing(\n * ssireumThrowTechnique, // supportiveHealing: 5\n * 0.3 // 30% earth affinity bonus\n * );\n * // Result: 6.5 HP restored (5 × 1.3)\n * ```\n *\n * @korean 대지치유계산\n */\n static calculateEarthHealing(\n technique: KoreanTechnique,\n earthAffinityBonus: number = 0,\n ): number {\n // Use helper function for safe type casting\n const gonTechnique = asExtendedGonTechnique(technique);\n if (!gonTechnique) {\n return 0; // Non-Gon technique: no earth healing\n }\n\n const baseHealing = gonTechnique.supportiveHealing;\n\n // Apply earth affinity bonus (typically 0-100% bonus)\n const affinityMultiplier = 1 + Math.max(0, Math.min(1, earthAffinityBonus));\n\n // Calculate final healing with bonus\n const healingAmount = baseHealing * affinityMultiplier;\n\n // Return rounded healing value (minimum 0)\n return Math.max(0, Math.floor(healingAmount));\n }\n}\n\nexport default DamageCalculator;\n"],"mappings":"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"}