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":"AIPersonality.js","names":[],"sources":["../../../src/systems/ai/AIPersonality.ts"],"sourcesContent":["/**\n * AI Personality System for Korean Martial Arts Combat\n * Defines behavioral archetypes that guide AI decision-making\n */\n\nimport { PlayerArchetype, TrigramStance } from \"@/types\";\n\n/**\n * Movement pattern types for archetype behavior\n *\n * @korean 이동 패턴 타입\n */\nexport type MovementPattern =\n | \"aggressive\"\n | \"evasive\"\n | \"analytical\"\n | \"unpredictable\";\n\n/**\n * Vital target priority for archetype-specific combat strategies\n *\n * @korean 급소 우선순위\n */\nexport type VitalTargetPriority =\n | \"health\"\n | \"pain\"\n | \"consciousness\"\n | \"balanced\";\n\n/**\n * Technique category types for archetype preferences\n *\n * @korean 기술 범주\n */\nexport type TechniqueCategory =\n | \"joint_manipulation\"\n | \"bone_strikes\"\n | \"nerve_strikes\"\n | \"silent_takedowns\"\n | \"anatomical_analysis\"\n | \"calculated_strikes\"\n | \"psychological_pressure\"\n | \"submission_induction\"\n | \"dirty_techniques\"\n | \"environmental_usage\";\n\n/**\n * Archetype-specific behavior profile\n *\n * Defines combat preferences, movement patterns, and tactical decision-making\n * unique to each of the 5 player archetypes.\n *\n * @korean 원형별 행동 프로필\n */\nexport interface ArchetypeBehavior {\n /** Preferred trigram stances for this archetype */\n readonly preferredStances: readonly TrigramStance[];\n /** Optimal combat range in grid cells (1 cell = ~40px) */\n readonly optimalRange: number;\n /** Health percentage threshold to trigger retreat behavior */\n readonly retreatThreshold: number;\n /** Technique categories this archetype favors */\n readonly techniqueSelectionBias: readonly TechniqueCategory[];\n /** Movement pattern characteristic of this archetype */\n readonly movementPattern: MovementPattern;\n /** Whether archetype follows honor code (affects retreat behavior) */\n readonly honorCode: boolean;\n /** Priority system for vital point targeting */\n readonly vitalTargetPriority: VitalTargetPriority;\n}\n\n/**\n * AI personality profile defining combat behavior\n */\nexport interface AIPersonality {\n readonly name: string;\n readonly koreanName: string;\n readonly archetype: PlayerArchetype;\n readonly aggressionLevel: number; // 0.0-1.0: How often AI attacks\n readonly defensePreference: number; // 0.0-1.0: Tendency to block/counter\n readonly comboTendency: number; // 0.0-1.0: Likelihood to continue combos\n readonly stanceSwitchFrequency: number; // 0.0-1.0: How often changes stance\n readonly feintChance: number; // 0.0-1.0: Probability of fake attacks\n readonly tacticalRetreatThreshold: number; // Health % to retreat\n readonly favoredStances: readonly TrigramStance[];\n readonly description: {\n readonly korean: string;\n readonly english: string;\n };\n}\n\n/**\n * Archetype-specific behavior profiles\n *\n * Maps each of the 5 player archetypes to their unique combat behaviors,\n * movement patterns, and tactical preferences based on Korean martial arts\n * traditions and game design philosophy.\n *\n * @korean 원형별 행동 프로필\n */\nexport const ARCHETYPE_BEHAVIORS: Record<PlayerArchetype, ArchetypeBehavior> = {\n [PlayerArchetype.MUSA]: {\n preferredStances: [\n TrigramStance.GEON,\n TrigramStance.JIN,\n TrigramStance.GAN,\n ], // Heaven, Thunder, Mountain\n optimalRange: 1, // Close quarters (1 cell = ~40px)\n retreatThreshold: 5, // Enhanced: fights to near-death (honor code)\n techniqueSelectionBias: [\"joint_manipulation\", \"bone_strikes\"],\n movementPattern: \"aggressive\",\n honorCode: true, // Never retreats above threshold\n vitalTargetPriority: \"balanced\",\n },\n [PlayerArchetype.AMSALJA]: {\n preferredStances: [TrigramStance.SON, TrigramStance.GAM], // Wind, Water\n optimalRange: 1, // Stealth melee (1 cell)\n retreatThreshold: 20, // Enhanced: tactical retreat, not cowardice\n techniqueSelectionBias: [\"nerve_strikes\", \"silent_takedowns\"],\n movementPattern: \"evasive\",\n honorCode: false,\n vitalTargetPriority: \"consciousness\",\n },\n [PlayerArchetype.HACKER]: {\n preferredStances: [TrigramStance.LI, TrigramStance.TAE], // Fire, Lake\n optimalRange: 3, // Mid-range analysis (3 cells = ~120px)\n retreatThreshold: 50,\n techniqueSelectionBias: [\"anatomical_analysis\", \"calculated_strikes\"],\n movementPattern: \"analytical\",\n honorCode: false,\n vitalTargetPriority: \"balanced\",\n },\n [PlayerArchetype.JEONGBO_YOWON]: {\n preferredStances: [TrigramStance.GAN, TrigramStance.GON], // Mountain, Earth\n optimalRange: 2, // Tactical mid-range (2 cells = ~80px)\n retreatThreshold: 40,\n techniqueSelectionBias: [\"psychological_pressure\", \"submission_induction\"],\n movementPattern: \"analytical\",\n honorCode: false,\n vitalTargetPriority: \"pain\",\n },\n [PlayerArchetype.JOJIK_POKRYEOKBAE]: {\n preferredStances: [TrigramStance.JIN, TrigramStance.GAM], // Thunder, Water (adaptable)\n optimalRange: 1, // Close brutal combat (1 cell)\n retreatThreshold: 70, // Retreats pragmatically\n techniqueSelectionBias: [\"dirty_techniques\", \"environmental_usage\"],\n movementPattern: \"unpredictable\",\n honorCode: false,\n vitalTargetPriority: \"health\",\n },\n};\n\n/**\n * Five AI personality archetypes inspired by Korean martial arts philosophy\n */\nexport const AI_PERSONALITIES: Record<string, AIPersonality> = {\n /**\n * 맹공자 (Maenggongja) - Fierce Attacker\n * Aggressive pressure fighter using Musa archetype\n *\n * **Enhanced Aggression (Issue #enhance-ai-aggression)**:\n * - Increased aggression: 0.85 → 0.95 (overwhelming force)\n * - Reduced defense: 0.2 → 0.1 (all-in offensive)\n * - Increased combo tendency: 0.7 → 0.8 (sustained pressure)\n * - Reduced retreat threshold: 0.15 → 0.05 (honor code: fights to near-death)\n *\n * **Dynamic Stance Rotation (Issue #dynamic-ai-stance-rotation)**:\n * - Increased stance switch frequency: 0.3 → 0.5 (more tactical flexibility)\n */\n AGGRESSIVE_STRIKER: {\n name: \"Aggressive Striker\",\n koreanName: \"맹공자\",\n archetype: PlayerArchetype.MUSA,\n aggressionLevel: 0.95, // Enhanced from 0.85\n defensePreference: 0.1, // Reduced from 0.2\n comboTendency: 0.8, // Increased from 0.7\n stanceSwitchFrequency: 0.15, // Reduced: Musa focuses on overwhelming force, not stance dancing\n feintChance: 0.15,\n tacticalRetreatThreshold: 0.05, // Reduced from 0.15\n favoredStances: [\n TrigramStance.GEON, // Heaven - Direct force\n TrigramStance.JIN, // Thunder - Explosive power\n TrigramStance.LI, // Fire - Precision strikes\n ],\n description: {\n korean: \"정면 돌파를 선호하는 공격적인 전사\",\n english: \"Aggressive warrior who prefers frontal assault\",\n },\n },\n\n /**\n * 기술가 (Gisulga) - Technical Master\n * Precision fighter using Amsalja archetype\n *\n * **Enhanced Aggression (Issue #enhance-ai-aggression)**:\n * - Increased aggression: 0.5 → 0.85 (instant takedown focus)\n * - Reduced defense: 0.6 → 0.3 (opportunistic aggression)\n * - Increased combo tendency: 0.4 → 0.6 (lethal sequences)\n * - Reduced retreat threshold: 0.35 → 0.20 (tactical retreat, not cowardice)\n *\n * **Dynamic Stance Rotation (Issue #dynamic-ai-stance-rotation)**:\n * - Increased stance switch frequency: 0.7 → 0.85 (highly adaptive)\n */\n TECHNICAL_MASTER: {\n name: \"Technical Master\",\n koreanName: \"기술가\",\n archetype: PlayerArchetype.AMSALJA,\n aggressionLevel: 0.95, // Enhanced for fatal precision strikes\n defensePreference: 0.2, // Reduced: assassins attack, don't defend\n comboTendency: 0.7, // Increased for lethal combinations\n stanceSwitchFrequency: 0.2, // Reduced: precision strikers commit to their stance\n feintChance: 0.35,\n tacticalRetreatThreshold: 0.15, // Reduced: assassins press the attack\n favoredStances: [\n TrigramStance.SON, // Wind - Continuous pressure\n TrigramStance.GAM, // Water - Flow and adaptation\n TrigramStance.TAE, // Lake - Fluid manipulation\n ],\n description: {\n korean: \"정밀한 기술로 약점을 노리는 달인\",\n english: \"Master who targets weaknesses with precise techniques\",\n },\n },\n\n /**\n * 균형 잡힌 자 (Gyunhyeong Jabin-ja) - Balanced Fighter\n * All-around fighter using Jeongbo Yowon archetype\n *\n * **Dynamic Stance Rotation (Issue #dynamic-ai-stance-rotation)**:\n * - Increased stance switch frequency: 0.5 → 0.7 (strategic switching)\n */\n BALANCED_FIGHTER: {\n name: \"Balanced Fighter\",\n koreanName: \"균형 잡힌 자\",\n archetype: PlayerArchetype.JEONGBO_YOWON,\n aggressionLevel: 0.75, // Enhanced: intelligence operatives are decisive\n defensePreference: 0.4, // Slightly reduced for more aggression\n comboTendency: 0.6, // Increased for calculated sequences\n stanceSwitchFrequency: 0.25, // Reduced: strategic, not reactive\n feintChance: 0.3, // Increased: psychological warfare\n tacticalRetreatThreshold: 0.2, // Slightly reduced\n favoredStances: [\n TrigramStance.GEON, // Heaven\n TrigramStance.GAM, // Water\n TrigramStance.GAN, // Mountain\n TrigramStance.GON, // Earth\n ],\n description: {\n korean: \"공격과 방어의 조화를 추구하는 전략가\",\n english: \"Strategist seeking harmony between offense and defense\",\n },\n },\n\n /**\n * 방어의 달인 (Bangeo-ui Dallin) - Defensive Specialist\n * Counter-attack focused using Hacker archetype\n *\n * **Dynamic Stance Rotation (Issue #dynamic-ai-stance-rotation)**:\n * - Increased stance switch frequency: 0.4 → 0.6 (analytical adaptation)\n */\n DEFENSIVE_SPECIALIST: {\n name: \"Defensive Specialist\",\n koreanName: \"방어의 달인\",\n archetype: PlayerArchetype.HACKER,\n aggressionLevel: 0.55, // Enhanced: hackers exploit vulnerabilities aggressively\n defensePreference: 0.6, // Reduced: still defensive but not passive\n comboTendency: 0.5, // Increased for analytical attack chains\n stanceSwitchFrequency: 0.2, // Reduced: analytical fighters don't fidget\n feintChance: 0.45, // Increased: data-driven misdirection\n tacticalRetreatThreshold: 0.3, // Reduced: hackers are more confident\n favoredStances: [\n TrigramStance.GAN, // Mountain - Defensive mastery\n TrigramStance.GON, // Earth - Grounding\n TrigramStance.GAM, // Water - Adaptation\n ],\n description: {\n korean: \"방어에서 반격의 기회를 찾는 전문가\",\n english: \"Expert who finds counter-attack opportunities through defense\",\n },\n },\n\n /**\n * 혼돈의 전사 (Hondon-ui Jeonsa) - Chaos Warrior\n * Unpredictable fighter using Jojik Pokryeokbae archetype\n *\n * **Dynamic Stance Rotation (Issue #dynamic-ai-stance-rotation)**:\n * - Increased stance switch frequency: 0.8 → 0.95 (unpredictable chaos)\n */\n CHAOS_WARRIOR: {\n name: \"Chaos Warrior\",\n koreanName: \"혼돈의 전사\",\n archetype: PlayerArchetype.JOJIK_POKRYEOKBAE,\n aggressionLevel: 0.9, // Enhanced: brutal pragmatists attack relentlessly\n defensePreference: 0.2, // Reduced: dirty fighters don't retreat\n comboTendency: 0.7, // Increased for vicious combinations\n stanceSwitchFrequency: 0.3, // Reduced: chaos is in attacks, not stance dancing\n feintChance: 0.5,\n tacticalRetreatThreshold: 0.05, // Reduced: fights to the bitter end\n favoredStances: [\n TrigramStance.LI, // Fire - Unpredictable\n TrigramStance.SON, // Wind - Constant motion\n TrigramStance.JIN, // Thunder - Explosive\n TrigramStance.TAE, // Lake - Fluid\n ],\n description: {\n korean: \"예측 불가능한 패턴으로 상대를 혼란시키는 전사\",\n english: \"Warrior who confuses opponents with unpredictable patterns\",\n },\n },\n};\n\n/**\n * Get a random AI personality\n */\nexport function getRandomPersonality(): AIPersonality {\n const personalities = Object.values(AI_PERSONALITIES);\n return personalities[Math.floor(Math.random() * personalities.length)];\n}\n\n/**\n * Get personality by archetype\n */\nexport function getPersonalityByArchetype(\n archetype: PlayerArchetype,\n): AIPersonality {\n const personality = Object.values(AI_PERSONALITIES).find(\n (p) => p.archetype === archetype,\n );\n return personality ?? AI_PERSONALITIES.BALANCED_FIGHTER;\n}\n\n/**\n * Get personality by name key\n */\nexport function getPersonalityByName(name: string): AIPersonality {\n return AI_PERSONALITIES[name] ?? AI_PERSONALITIES.BALANCED_FIGHTER;\n}\n\n/**\n * List all available personalities\n */\nexport function getAllPersonalities(): readonly AIPersonality[] {\n return Object.values(AI_PERSONALITIES);\n}\n\n/**\n * Get archetype-specific behavior profile\n *\n * Retrieves the unique combat behavior configuration for a given archetype,\n * including movement patterns, optimal ranges, and tactical preferences.\n *\n * @param archetype - Player archetype to get behavior for\n * @returns Archetype behavior profile\n *\n * @korean 원형별 행동 프로필 가져오기\n */\nexport function getArchetypeBehavior(\n archetype: PlayerArchetype,\n): ArchetypeBehavior {\n return ARCHETYPE_BEHAVIORS[archetype];\n}\n\n/**\n * Check if archetype follows honor code\n *\n * Honor code affects retreat behavior - honor-bound archetypes like Musa\n * will not retreat above their health threshold.\n *\n * @param archetype - Player archetype to check\n * @returns True if archetype follows honor code\n *\n * @korean 명예 규범 확인\n */\nexport function followsHonorCode(archetype: PlayerArchetype): boolean {\n return ARCHETYPE_BEHAVIORS[archetype].honorCode;\n}\n\n/**\n * Get optimal combat range for archetype\n *\n * Returns the preferred distance in grid cells (1 cell = ~40px) where\n * the archetype is most effective in combat.\n *\n * @param archetype - Player archetype\n * @returns Optimal range in grid cells\n *\n * @korean 최적 전투 거리 가져오기\n */\nexport function getOptimalRange(archetype: PlayerArchetype): number {\n return ARCHETYPE_BEHAVIORS[archetype].optimalRange;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AIPersonality.js","names":[],"sources":["../../../src/systems/ai/AIPersonality.ts"],"sourcesContent":["/**\n * AI Personality System for Korean Martial Arts Combat\n * Defines behavioral archetypes that guide AI decision-making\n */\n\nimport { PlayerArchetype, TrigramStance } from \"@/types\";\n\n/**\n * Movement pattern types for archetype behavior\n *\n * @korean 이동 패턴 타입\n */\nexport type MovementPattern =\n | \"aggressive\"\n | \"evasive\"\n | \"analytical\"\n | \"unpredictable\";\n\n/**\n * Vital target priority for archetype-specific combat strategies\n *\n * @korean 급소 우선순위\n */\nexport type VitalTargetPriority =\n | \"health\"\n | \"pain\"\n | \"consciousness\"\n | \"balanced\";\n\n/**\n * Technique category types for archetype preferences\n *\n * @korean 기술 범주\n */\nexport type TechniqueCategory =\n | \"joint_manipulation\"\n | \"bone_strikes\"\n | \"nerve_strikes\"\n | \"silent_takedowns\"\n | \"anatomical_analysis\"\n | \"calculated_strikes\"\n | \"psychological_pressure\"\n | \"submission_induction\"\n | \"dirty_techniques\"\n | \"environmental_usage\";\n\n/**\n * Archetype-specific behavior profile\n *\n * Defines combat preferences, movement patterns, and tactical decision-making\n * unique to each of the 5 player archetypes.\n *\n * @korean 원형별 행동 프로필\n */\nexport interface ArchetypeBehavior {\n /** Preferred trigram stances for this archetype */\n readonly preferredStances: readonly TrigramStance[];\n /** Optimal combat range in grid cells (1 cell = ~40px) */\n readonly optimalRange: number;\n /** Health percentage threshold to trigger retreat behavior */\n readonly retreatThreshold: number;\n /** Technique categories this archetype favors */\n readonly techniqueSelectionBias: readonly TechniqueCategory[];\n /** Movement pattern characteristic of this archetype */\n readonly movementPattern: MovementPattern;\n /** Whether archetype follows honor code (affects retreat behavior) */\n readonly honorCode: boolean;\n /** Priority system for vital point targeting */\n readonly vitalTargetPriority: VitalTargetPriority;\n}\n\n/**\n * AI personality profile defining combat behavior\n */\nexport interface AIPersonality {\n readonly name: string;\n readonly koreanName: string;\n readonly archetype: PlayerArchetype;\n readonly aggressionLevel: number; // 0.0-1.0: How often AI attacks\n readonly defensePreference: number; // 0.0-1.0: Tendency to block/counter\n readonly comboTendency: number; // 0.0-1.0: Likelihood to continue combos\n readonly stanceSwitchFrequency: number; // 0.0-1.0: How often changes stance\n readonly feintChance: number; // 0.0-1.0: Probability of fake attacks\n readonly tacticalRetreatThreshold: number; // Health % to retreat\n readonly favoredStances: readonly TrigramStance[];\n readonly description: {\n readonly korean: string;\n readonly english: string;\n };\n}\n\n/**\n * Archetype-specific behavior profiles\n *\n * Maps each of the 5 player archetypes to their unique combat behaviors,\n * movement patterns, and tactical preferences based on Korean martial arts\n * traditions and game design philosophy.\n *\n * @korean 원형별 행동 프로필\n */\nexport const ARCHETYPE_BEHAVIORS: Record<PlayerArchetype, ArchetypeBehavior> = {\n [PlayerArchetype.MUSA]: {\n preferredStances: [\n TrigramStance.GEON,\n TrigramStance.JIN,\n TrigramStance.GAN,\n ], // Heaven, Thunder, Mountain\n optimalRange: 1, // Close quarters (1 cell = ~40px)\n retreatThreshold: 5, // Enhanced: fights to near-death (honor code)\n techniqueSelectionBias: [\"joint_manipulation\", \"bone_strikes\"],\n movementPattern: \"aggressive\",\n honorCode: true, // Never retreats above threshold\n vitalTargetPriority: \"balanced\",\n },\n [PlayerArchetype.AMSALJA]: {\n preferredStances: [TrigramStance.SON, TrigramStance.GAM], // Wind, Water\n optimalRange: 1, // Stealth melee (1 cell)\n retreatThreshold: 20, // Enhanced: tactical retreat, not cowardice\n techniqueSelectionBias: [\"nerve_strikes\", \"silent_takedowns\"],\n movementPattern: \"evasive\",\n honorCode: false,\n vitalTargetPriority: \"consciousness\",\n },\n [PlayerArchetype.HACKER]: {\n preferredStances: [TrigramStance.LI, TrigramStance.TAE], // Fire, Lake\n optimalRange: 3, // Mid-range analysis (3 cells = ~120px)\n retreatThreshold: 50,\n techniqueSelectionBias: [\"anatomical_analysis\", \"calculated_strikes\"],\n movementPattern: \"analytical\",\n honorCode: false,\n vitalTargetPriority: \"balanced\",\n },\n [PlayerArchetype.JEONGBO_YOWON]: {\n preferredStances: [TrigramStance.GAN, TrigramStance.GON], // Mountain, Earth\n optimalRange: 2, // Tactical mid-range (2 cells = ~80px)\n retreatThreshold: 40,\n techniqueSelectionBias: [\"psychological_pressure\", \"submission_induction\"],\n movementPattern: \"analytical\",\n honorCode: false,\n vitalTargetPriority: \"pain\",\n },\n [PlayerArchetype.JOJIK_POKRYEOKBAE]: {\n preferredStances: [TrigramStance.JIN, TrigramStance.GAM], // Thunder, Water (adaptable)\n optimalRange: 1, // Close brutal combat (1 cell)\n retreatThreshold: 70, // Retreats pragmatically\n techniqueSelectionBias: [\"dirty_techniques\", \"environmental_usage\"],\n movementPattern: \"unpredictable\",\n honorCode: false,\n vitalTargetPriority: \"health\",\n },\n};\n\n/**\n * Five AI personality archetypes inspired by Korean martial arts philosophy\n */\nexport const AI_PERSONALITIES: Record<string, AIPersonality> = {\n /**\n * 맹공자 (Maenggongja) - Fierce Attacker\n * Aggressive pressure fighter using Musa archetype\n *\n * **Enhanced Aggression (Issue #enhance-ai-aggression)**:\n * - Increased aggression: 0.85 → 0.95 (overwhelming force)\n * - Reduced defense: 0.2 → 0.1 (all-in offensive)\n * - Increased combo tendency: 0.7 → 0.8 (sustained pressure)\n * - Reduced retreat threshold: 0.15 → 0.05 (honor code: fights to near-death)\n *\n * **Dynamic Stance Rotation (Issue #dynamic-ai-stance-rotation)**:\n * - Increased stance switch frequency: 0.3 → 0.5 (more tactical flexibility)\n */\n AGGRESSIVE_STRIKER: {\n name: \"Aggressive Striker\",\n koreanName: \"맹공자\",\n archetype: PlayerArchetype.MUSA,\n aggressionLevel: 0.95, // Enhanced from 0.85\n defensePreference: 0.1, // Reduced from 0.2\n comboTendency: 0.8, // Increased from 0.7\n stanceSwitchFrequency: 0.15, // Reduced: Musa focuses on overwhelming force, not stance dancing\n feintChance: 0.15,\n tacticalRetreatThreshold: 0.05, // Reduced from 0.15\n favoredStances: [\n TrigramStance.GEON, // Heaven - Direct force\n TrigramStance.JIN, // Thunder - Explosive power\n TrigramStance.LI, // Fire - Precision strikes\n ],\n description: {\n korean: \"정면 돌파를 선호하는 공격적인 전사\",\n english: \"Aggressive warrior who prefers frontal assault\",\n },\n },\n\n /**\n * 기술가 (Gisulga) - Technical Master\n * Precision fighter using Amsalja archetype\n *\n * **Enhanced Aggression (Issue #enhance-ai-aggression)**:\n * - Increased aggression: 0.5 → 0.85 (instant takedown focus)\n * - Reduced defense: 0.6 → 0.3 (opportunistic aggression)\n * - Increased combo tendency: 0.4 → 0.6 (lethal sequences)\n * - Reduced retreat threshold: 0.35 → 0.20 (tactical retreat, not cowardice)\n *\n * **Dynamic Stance Rotation (Issue #dynamic-ai-stance-rotation)**:\n * - Increased stance switch frequency: 0.7 → 0.85 (highly adaptive)\n */\n TECHNICAL_MASTER: {\n name: \"Technical Master\",\n koreanName: \"기술가\",\n archetype: PlayerArchetype.AMSALJA,\n aggressionLevel: 0.95, // Enhanced for fatal precision strikes\n defensePreference: 0.2, // Reduced: assassins attack, don't defend\n comboTendency: 0.7, // Increased for lethal combinations\n stanceSwitchFrequency: 0.2, // Reduced: precision strikers commit to their stance\n feintChance: 0.35,\n tacticalRetreatThreshold: 0.15, // Reduced: assassins press the attack\n favoredStances: [\n TrigramStance.SON, // Wind - Continuous pressure\n TrigramStance.GAM, // Water - Flow and adaptation\n TrigramStance.TAE, // Lake - Fluid manipulation\n ],\n description: {\n korean: \"정밀한 기술로 약점을 노리는 달인\",\n english: \"Master who targets weaknesses with precise techniques\",\n },\n },\n\n /**\n * 균형 잡힌 자 (Gyunhyeong Jabin-ja) - Balanced Fighter\n * All-around fighter using Jeongbo Yowon archetype\n *\n * **Dynamic Stance Rotation (Issue #dynamic-ai-stance-rotation)**:\n * - Increased stance switch frequency: 0.5 → 0.7 (strategic switching)\n */\n BALANCED_FIGHTER: {\n name: \"Balanced Fighter\",\n koreanName: \"균형 잡힌 자\",\n archetype: PlayerArchetype.JEONGBO_YOWON,\n aggressionLevel: 0.75, // Enhanced: intelligence operatives are decisive\n defensePreference: 0.4, // Slightly reduced for more aggression\n comboTendency: 0.6, // Increased for calculated sequences\n stanceSwitchFrequency: 0.25, // Reduced: strategic, not reactive\n feintChance: 0.3, // Increased: psychological warfare\n tacticalRetreatThreshold: 0.2, // Slightly reduced\n favoredStances: [\n TrigramStance.GEON, // Heaven\n TrigramStance.GAM, // Water\n TrigramStance.GAN, // Mountain\n TrigramStance.GON, // Earth\n ],\n description: {\n korean: \"공격과 방어의 조화를 추구하는 전략가\",\n english: \"Strategist seeking harmony between offense and defense\",\n },\n },\n\n /**\n * 방어의 달인 (Bangeo-ui Dallin) - Defensive Specialist\n * Counter-attack focused using Hacker archetype\n *\n * **Dynamic Stance Rotation (Issue #dynamic-ai-stance-rotation)**:\n * - Increased stance switch frequency: 0.4 → 0.6 (analytical adaptation)\n */\n DEFENSIVE_SPECIALIST: {\n name: \"Defensive Specialist\",\n koreanName: \"방어의 달인\",\n archetype: PlayerArchetype.HACKER,\n aggressionLevel: 0.55, // Enhanced: hackers exploit vulnerabilities aggressively\n defensePreference: 0.6, // Reduced: still defensive but not passive\n comboTendency: 0.5, // Increased for analytical attack chains\n stanceSwitchFrequency: 0.2, // Reduced: analytical fighters don't fidget\n feintChance: 0.45, // Increased: data-driven misdirection\n tacticalRetreatThreshold: 0.3, // Reduced: hackers are more confident\n favoredStances: [\n TrigramStance.GAN, // Mountain - Defensive mastery\n TrigramStance.GON, // Earth - Grounding\n TrigramStance.GAM, // Water - Adaptation\n ],\n description: {\n korean: \"방어에서 반격의 기회를 찾는 전문가\",\n english: \"Expert who finds counter-attack opportunities through defense\",\n },\n },\n\n /**\n * 혼돈의 전사 (Hondon-ui Jeonsa) - Chaos Warrior\n * Unpredictable fighter using Jojik Pokryeokbae archetype\n *\n * **Dynamic Stance Rotation (Issue #dynamic-ai-stance-rotation)**:\n * - Increased stance switch frequency: 0.8 → 0.95 (unpredictable chaos)\n */\n CHAOS_WARRIOR: {\n name: \"Chaos Warrior\",\n koreanName: \"혼돈의 전사\",\n archetype: PlayerArchetype.JOJIK_POKRYEOKBAE,\n aggressionLevel: 0.9, // Enhanced: brutal pragmatists attack relentlessly\n defensePreference: 0.2, // Reduced: dirty fighters don't retreat\n comboTendency: 0.7, // Increased for vicious combinations\n stanceSwitchFrequency: 0.3, // Reduced: chaos is in attacks, not stance dancing\n feintChance: 0.5,\n tacticalRetreatThreshold: 0.05, // Reduced: fights to the bitter end\n favoredStances: [\n TrigramStance.LI, // Fire - Unpredictable\n TrigramStance.SON, // Wind - Constant motion\n TrigramStance.JIN, // Thunder - Explosive\n TrigramStance.TAE, // Lake - Fluid\n ],\n description: {\n korean: \"예측 불가능한 패턴으로 상대를 혼란시키는 전사\",\n english: \"Warrior who confuses opponents with unpredictable patterns\",\n },\n },\n};\n\n/**\n * Get a random AI personality\n */\nexport function getRandomPersonality(): AIPersonality {\n const personalities = Object.values(AI_PERSONALITIES);\n return personalities[Math.floor(Math.random() * personalities.length)];\n}\n\n/**\n * Get personality by archetype\n */\nexport function getPersonalityByArchetype(\n archetype: PlayerArchetype,\n): AIPersonality {\n const personality = Object.values(AI_PERSONALITIES).find(\n (p) => p.archetype === archetype,\n );\n return personality ?? AI_PERSONALITIES.BALANCED_FIGHTER;\n}\n\n/**\n * Get personality by name key\n */\nexport function getPersonalityByName(name: string): AIPersonality {\n return AI_PERSONALITIES[name] ?? AI_PERSONALITIES.BALANCED_FIGHTER;\n}\n\n/**\n * List all available personalities\n */\nexport function getAllPersonalities(): readonly AIPersonality[] {\n return Object.values(AI_PERSONALITIES);\n}\n\n/**\n * Get archetype-specific behavior profile\n *\n * Retrieves the unique combat behavior configuration for a given archetype,\n * including movement patterns, optimal ranges, and tactical preferences.\n *\n * @param archetype - Player archetype to get behavior for\n * @returns Archetype behavior profile\n *\n * @korean 원형별 행동 프로필 가져오기\n */\nexport function getArchetypeBehavior(\n archetype: PlayerArchetype,\n): ArchetypeBehavior {\n return ARCHETYPE_BEHAVIORS[archetype];\n}\n\n/**\n * Check if archetype follows honor code\n *\n * Honor code affects retreat behavior - honor-bound archetypes like Musa\n * will not retreat above their health threshold.\n *\n * @param archetype - Player archetype to check\n * @returns True if archetype follows honor code\n *\n * @korean 명예 규범 확인\n */\nexport function followsHonorCode(archetype: PlayerArchetype): boolean {\n return ARCHETYPE_BEHAVIORS[archetype].honorCode;\n}\n\n/**\n * Get optimal combat range for archetype\n *\n * Returns the preferred distance in grid cells (1 cell = ~40px) where\n * the archetype is most effective in combat.\n *\n * @param archetype - Player archetype\n * @returns Optimal range in grid cells\n *\n * @korean 최적 전투 거리 가져오기\n */\nexport function getOptimalRange(archetype: PlayerArchetype): number {\n return ARCHETYPE_BEHAVIORS[archetype].optimalRange;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAoGA,IAAa,sBAAkE;EAC5E,gBAAgB,OAAO;EACtB,kBAAkB;GAChB,cAAc;GACd,cAAc;GACd,cAAc;EAChB;EACA,cAAc;EACd,kBAAkB;EAClB,wBAAwB,CAAC,sBAAsB,cAAc;EAC7D,iBAAiB;EACjB,WAAW;EACX,qBAAqB;CACvB;EACC,gBAAgB,UAAU;EACzB,kBAAkB,CAAC,cAAc,KAAK,cAAc,GAAG;EACvD,cAAc;EACd,kBAAkB;EAClB,wBAAwB,CAAC,iBAAiB,kBAAkB;EAC5D,iBAAiB;EACjB,WAAW;EACX,qBAAqB;CACvB;EACC,gBAAgB,SAAS;EACxB,kBAAkB,CAAC,cAAc,IAAI,cAAc,GAAG;EACtD,cAAc;EACd,kBAAkB;EAClB,wBAAwB,CAAC,uBAAuB,oBAAoB;EACpE,iBAAiB;EACjB,WAAW;EACX,qBAAqB;CACvB;EACC,gBAAgB,gBAAgB;EAC/B,kBAAkB,CAAC,cAAc,KAAK,cAAc,GAAG;EACvD,cAAc;EACd,kBAAkB;EAClB,wBAAwB,CAAC,0BAA0B,sBAAsB;EACzE,iBAAiB;EACjB,WAAW;EACX,qBAAqB;CACvB;EACC,gBAAgB,oBAAoB;EACnC,kBAAkB,CAAC,cAAc,KAAK,cAAc,GAAG;EACvD,cAAc;EACd,kBAAkB;EAClB,wBAAwB,CAAC,oBAAoB,qBAAqB;EAClE,iBAAiB;EACjB,WAAW;EACX,qBAAqB;CACvB;AACF;;;;AAKA,IAAa,mBAAkD;;;;;;;;;;;;;;CAc7D,oBAAoB;EAClB,MAAM;EACN,YAAY;EACZ,WAAW,gBAAgB;EAC3B,iBAAiB;EACjB,mBAAmB;EACnB,eAAe;EACf,uBAAuB;EACvB,aAAa;EACb,0BAA0B;EAC1B,gBAAgB;GACd,cAAc;GACd,cAAc;GACd,cAAc;EAChB;EACA,aAAa;GACX,QAAQ;GACR,SAAS;EACX;CACF;;;;;;;;;;;;;;CAeA,kBAAkB;EAChB,MAAM;EACN,YAAY;EACZ,WAAW,gBAAgB;EAC3B,iBAAiB;EACjB,mBAAmB;EACnB,eAAe;EACf,uBAAuB;EACvB,aAAa;EACb,0BAA0B;EAC1B,gBAAgB;GACd,cAAc;GACd,cAAc;GACd,cAAc;EAChB;EACA,aAAa;GACX,QAAQ;GACR,SAAS;EACX;CACF;;;;;;;;CASA,kBAAkB;EAChB,MAAM;EACN,YAAY;EACZ,WAAW,gBAAgB;EAC3B,iBAAiB;EACjB,mBAAmB;EACnB,eAAe;EACf,uBAAuB;EACvB,aAAa;EACb,0BAA0B;EAC1B,gBAAgB;GACd,cAAc;GACd,cAAc;GACd,cAAc;GACd,cAAc;EAChB;EACA,aAAa;GACX,QAAQ;GACR,SAAS;EACX;CACF;;;;;;;;CASA,sBAAsB;EACpB,MAAM;EACN,YAAY;EACZ,WAAW,gBAAgB;EAC3B,iBAAiB;EACjB,mBAAmB;EACnB,eAAe;EACf,uBAAuB;EACvB,aAAa;EACb,0BAA0B;EAC1B,gBAAgB;GACd,cAAc;GACd,cAAc;GACd,cAAc;EAChB;EACA,aAAa;GACX,QAAQ;GACR,SAAS;EACX;CACF;;;;;;;;CASA,eAAe;EACb,MAAM;EACN,YAAY;EACZ,WAAW,gBAAgB;EAC3B,iBAAiB;EACjB,mBAAmB;EACnB,eAAe;EACf,uBAAuB;EACvB,aAAa;EACb,0BAA0B;EAC1B,gBAAgB;GACd,cAAc;GACd,cAAc;GACd,cAAc;GACd,cAAc;EAChB;EACA,aAAa;GACX,QAAQ;GACR,SAAS;EACX;CACF;AACF;;;;AAKA,SAAgB,uBAAsC;CACpD,MAAM,gBAAgB,OAAO,OAAO,gBAAgB;CACpD,OAAO,cAAc,KAAK,MAAM,KAAK,OAAO,IAAI,cAAc,MAAM;AACtE;;;;AAKA,SAAgB,0BACd,WACe;CAIf,OAHoB,OAAO,OAAO,gBAAgB,CAAC,CAAC,MACjD,MAAM,EAAE,cAAc,SAElB,KAAe,iBAAiB;AACzC;;;;AAKA,SAAgB,qBAAqB,MAA6B;CAChE,OAAO,iBAAiB,SAAS,iBAAiB;AACpD;;;;AAKA,SAAgB,sBAAgD;CAC9D,OAAO,OAAO,OAAO,gBAAgB;AACvC;;;;;;;;;;;;AAaA,SAAgB,qBACd,WACmB;CACnB,OAAO,oBAAoB;AAC7B;;;;;;;;;;;;AAaA,SAAgB,iBAAiB,WAAqC;CACpE,OAAO,oBAAoB,UAAU,CAAC;AACxC;;;;;;;;;;;;AAaA,SAAgB,gBAAgB,WAAoC;CAClE,OAAO,oBAAoB,UAAU,CAAC;AACxC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ArchetypeEnforcer.js","names":[],"sources":["../../../src/systems/ai/ArchetypeEnforcer.ts"],"sourcesContent":["/**\n * Archetype Behavior Enforcement System\n * \n * Centralizes archetype-specific combat philosophy enforcement to ensure\n * each of the 5 player archetypes has immediately recognizable and distinct\n * AI behavior patterns.\n * \n * **Korean Philosophy Integration (한국 무술 철학)**:\n * - 무사 (Musa): 명예 (Honor) - Direct, honorable combat\n * - 암살자 (Amsalja): 은밀 (Stealth) - Silent, precise takedowns\n * - 해커 (Hacker): 분석 (Analysis) - Tech-enhanced tactical combat\n * - 정보요원 (Jeongbo): 심리전 (Psychological Warfare) - Strategic manipulation\n * - 조직폭력배 (Jojik): 생존 (Survival) - Ruthless, unpredictable tactics\n * \n * @module systems/ai/ArchetypeEnforcer\n * @category AI Combat\n * @korean 원형 행동 강화 시스템\n */\n\nimport { PlayerArchetype } from \"@/types\";\nimport { AIDecision, AIActionType, CombatContext } from \"./types\";\n\n/**\n * Archetype enforcement rules defining distinct combat behaviors\n * \n * Each archetype has:\n * - Preferred actions (used most frequently)\n * - Prohibited actions (never used due to philosophy)\n * - Signature move (iconic technique with specific trigger condition)\n * - Action frequencies (target distribution percentages)\n * \n * **Note on Action Frequencies**:\n * These values represent **target frequencies/proportions** for each action type\n * rather than a single normalized probability distribution. Multiple actions can have\n * high target frequencies because they can occur in overlapping situations:\n * - ATTACK (70%) and TECHNIQUE (70%) both represent aggressive behavior\n * - STANCE_CHANGE (80%) occurs frequently but doesn't prevent other actions\n * - The frequencies serve as **behavioral targets** to guide AI personality,\n * and are not required to sum to 100% across all actions\n * \n * @korean 원형 강화 규칙\n */\nexport interface ArchetypeEnforcementRules {\n /** Actions this archetype uses most frequently */\n readonly preferredActions: readonly AIActionType[];\n \n /** Actions this archetype never uses (philosophy conflicts) */\n readonly prohibitedActions: readonly AIActionType[];\n \n /** Signature technique ID for this archetype */\n readonly signatureMove: string;\n \n /** Condition function to trigger signature move */\n readonly signatureCondition: (context: CombatContext) => boolean;\n \n /** Target frequency distribution for each action type (0.0-1.0) */\n readonly actionFrequencies: Readonly<Record<AIActionType, number>>;\n}\n\n/**\n * Archetype enforcement rules for all 5 player archetypes\n * \n * Defines distinct combat philosophies with measurable behavior patterns\n * that make each archetype immediately identifiable through AI actions.\n * \n * @korean 5대 원형 강화 규칙\n */\nexport const ARCHETYPE_ENFORCEMENT: Record<PlayerArchetype, ArchetypeEnforcementRules> = {\n [PlayerArchetype.MUSA]: {\n preferredActions: [AIActionType.ATTACK, AIActionType.APPROACH, AIActionType.TECHNIQUE],\n prohibitedActions: [AIActionType.FEINT], // Honor code: No deception\n signatureMove: \"musa_mountain_breaker\",\n signatureCondition: (context) => {\n /**\n * Musa (무사) signature move condition: Mountain Breaker when opponent <40% health\n * \n * NOTE: Uses opponentMaxHealth if available, otherwise assumes symmetric max-health\n * pools (context.playerMaxHealth === opponentMaxHealth). If asymmetric max health\n * exists, CombatContext provides opponentMaxHealth for accurate calculation.\n */\n const maxHealth = context.opponentMaxHealth ?? context.playerMaxHealth;\n if (maxHealth <= 0) {\n // Defensive guard: avoid divide-by-zero / invalid percentages\n return false;\n }\n const opponentHealthPercent = context.opponentHealth / maxHealth;\n return opponentHealthPercent < 0.40; // Finishing move when opponent <40% health\n },\n actionFrequencies: {\n /**\n * Musa (무사) Action Frequencies - Honor Code Warrior\n * \n * These frequencies represent behavioral targets (not strict probability distributions).\n * Multiple actions can have high frequencies as they represent overlapping aggressive behavior.\n * \n * **Honor Code Rules**:\n * - FEINT: 0% (prohibited - no deception)\n * - RETREAT: 2% (minimal - only at critical health <10%, handled by evaluateSurvival)\n * - DEFEND: 10% (minimal - offense-focused philosophy)\n * \n * The 2% retreat frequency applies only when health drops below the honor threshold (~5-10%),\n * enforced by evaluateSurvival logic. Above this threshold, Musa never retreats.\n */\n [AIActionType.ATTACK]: 0.70, // 70% aggressive attacks\n [AIActionType.DEFEND]: 0.10, // 10% defense (honor code: minimal defense)\n [AIActionType.RETREAT]: 0.02, // 2% retreat (only at critical health <10%)\n [AIActionType.APPROACH]: 0.15, // 15% approach\n [AIActionType.FEINT]: 0.00, // 0% feints (prohibited by honor code)\n [AIActionType.TECHNIQUE]: 0.70, // 70% techniques (overlaps with attack)\n [AIActionType.COUNTER]: 0.10, // 10% counters\n [AIActionType.STANCE_CHANGE]: 0.10, // 10% stance changes\n [AIActionType.CIRCLE]: 0.05, // 5% circling\n [AIActionType.WAIT]: 0.03, // 3% wait\n [AIActionType.COMBO]: 0.05, // 5% combos\n },\n },\n\n [PlayerArchetype.AMSALJA]: {\n preferredActions: [AIActionType.TECHNIQUE, AIActionType.CIRCLE, AIActionType.COUNTER],\n prohibitedActions: [], // No prohibitions (pragmatic assassin)\n signatureMove: \"amsalja_silent_death\",\n signatureCondition: (context) => {\n // Execute Silent Death when opponent is VULNERABLE or worse\n return (\n context.opponentBalance === \"VULNERABLE\" ||\n context.opponentBalance === \"HELPLESS\"\n );\n },\n actionFrequencies: {\n [AIActionType.TECHNIQUE]: 0.60, // 60% techniques (vital point priority)\n [AIActionType.CIRCLE]: 0.20, // 20% circling (stealth positioning to flanks/rear)\n [AIActionType.ATTACK]: 0.15, // 15% basic attacks\n [AIActionType.RETREAT]: 0.05, // 5% tactical retreats (at 60% health threshold)\n [AIActionType.DEFEND]: 0.10, // 10% defense\n [AIActionType.APPROACH]: 0.10, // 10% approach\n [AIActionType.FEINT]: 0.10, // 10% feints\n [AIActionType.COUNTER]: 0.20, // 20% counters\n [AIActionType.STANCE_CHANGE]: 0.15, // 15% stance changes\n [AIActionType.WAIT]: 0.05, // 5% wait\n [AIActionType.COMBO]: 0.10, // 10% combos\n },\n },\n\n [PlayerArchetype.HACKER]: {\n preferredActions: [AIActionType.WAIT, AIActionType.TECHNIQUE, AIActionType.CIRCLE],\n prohibitedActions: [], // Analytical, uses all tactics\n signatureMove: \"hacker_system_crash\",\n signatureCondition: (context) => {\n // Execute System Crash after 20 seconds of observation (data collection phase)\n return context.timeInMatch > 20000;\n },\n actionFrequencies: {\n [AIActionType.WAIT]: 0.25, // 25% observation (data collection)\n [AIActionType.TECHNIQUE]: 0.40, // 40% tech-assisted strikes\n [AIActionType.CIRCLE]: 0.15, // 15% repositioning (maintain mid-range)\n [AIActionType.ATTACK]: 0.15, // 15% basic attacks\n [AIActionType.DEFEND]: 0.05, // 5% defense\n [AIActionType.APPROACH]: 0.05, // 5% approach (prefers mid-range)\n [AIActionType.RETREAT]: 0.10, // 10% retreat (maintain optimal distance)\n [AIActionType.FEINT]: 0.05, // 5% feints\n [AIActionType.COUNTER]: 0.15, // 15% counters\n [AIActionType.STANCE_CHANGE]: 0.10, // 10% stance changes\n [AIActionType.COMBO]: 0.05, // 5% combos\n },\n },\n\n [PlayerArchetype.JEONGBO_YOWON]: {\n preferredActions: [AIActionType.FEINT, AIActionType.COUNTER, AIActionType.TECHNIQUE],\n prohibitedActions: [], // Psychological warfare, uses all tactics\n signatureMove: \"jeongbo_precision_takedown\",\n signatureCondition: (context) => {\n // Execute Precision Takedown when opponent is HELPLESS (implemented in Issue #1186)\n return context.opponentBalance === \"HELPLESS\";\n },\n actionFrequencies: {\n [AIActionType.FEINT]: 0.30, // 30% psychological pressure (feints)\n [AIActionType.TECHNIQUE]: 0.35, // 35% precision strikes\n [AIActionType.COUNTER]: 0.20, // 20% counters\n [AIActionType.WAIT]: 0.10, // 10% observation (strategic timing)\n [AIActionType.ATTACK]: 0.05, // 5% basic attacks\n [AIActionType.DEFEND]: 0.10, // 10% defense\n [AIActionType.APPROACH]: 0.10, // 10% approach\n [AIActionType.RETREAT]: 0.05, // 5% tactical retreats\n [AIActionType.CIRCLE]: 0.15, // 15% circling (intimidation)\n [AIActionType.STANCE_CHANGE]: 0.10, // 10% stance changes\n [AIActionType.COMBO]: 0.05, // 5% combos\n },\n },\n\n [PlayerArchetype.JOJIK_POKRYEOKBAE]: {\n preferredActions: [AIActionType.ATTACK, AIActionType.TECHNIQUE, AIActionType.STANCE_CHANGE],\n prohibitedActions: [], // No rules, survival at any cost\n signatureMove: \"jojik_improvised_weapon\",\n signatureCondition: (context) => {\n /**\n * Jojik (조직폭력배) signature move: Improvised Weapon when desperate (<30% health)\n * \n * This condition uses playerHealth (the AI's health) to trigger desperate tactics.\n */\n const maxHealth = context.playerMaxHealth;\n if (maxHealth <= 0) {\n // Defensive guard: avoid divide-by-zero\n return false;\n }\n const playerHealthPercent = context.playerHealth / maxHealth;\n return playerHealthPercent < 0.30; // Desperate improvised weapon when health <30%\n },\n actionFrequencies: {\n /**\n * Jojik (조직폭력배) Action Frequencies - Chaotic Survivor\n * \n * These frequencies represent behavioral targets for Jojik's unpredictable fighting style.\n * \n * **Key Behavioral Characteristics**:\n * - STANCE_CHANGE: 80% (extremely high for unpredictability)\n * This means that in approximately 80% of decision cycles where a stance change\n * is a valid option, the AI will evaluate and strongly favor a stance change,\n * creating the erratic, chaotic movement pattern that defines Jojik's combat style.\n * \n * - RETREAT: 5% base, but survival instinct triggers tactical retreat at 70% health\n * (handled by evaluateSurvival logic with personality.tacticalRetreatThreshold)\n * \n * The high stance change frequency is the primary mechanism for Jojik's unpredictable behavior.\n */\n [AIActionType.ATTACK]: 0.50, // 50% chaotic attacks\n [AIActionType.TECHNIQUE]: 0.25, // 25% dirty techniques\n [AIActionType.STANCE_CHANGE]: 0.80, // 80% unpredictable stance changes (defines chaotic behavior)\n [AIActionType.RETREAT]: 0.05, // 5% pragmatic retreats (survival instinct at 70% health via threshold)\n [AIActionType.FEINT]: 0.05, // 5% deceptive moves\n [AIActionType.DEFEND]: 0.10, // 10% defense\n [AIActionType.APPROACH]: 0.15, // 15% approach\n [AIActionType.COUNTER]: 0.10, // 10% counters\n [AIActionType.CIRCLE]: 0.10, // 10% circling\n [AIActionType.WAIT]: 0.03, // 3% wait\n [AIActionType.COMBO]: 0.10, // 10% combos\n },\n },\n};\n\n/**\n * Enforce archetype-specific behavior on AI decision\n * \n * Applies philosophy-based restrictions and redirects to enforce distinct\n * combat patterns for each archetype. This ensures players can identify\n * which archetype they're fighting based on behavior alone.\n * \n * **Enforcement Logic**:\n * 1. Check for prohibited actions → Replace with preferred action\n * 2. Check for signature move condition → Override with signature move\n * 3. Return decision (possibly modified)\n * \n * @korean 원형 행동 강화\n * \n * @param decision - Original AI decision from DecisionTree\n * @param archetype - Player archetype to enforce\n * @param context - Current combat context\n * @returns Modified decision enforcing archetype philosophy\n */\nexport function enforceArchetypeBehavior(\n decision: AIDecision,\n archetype: PlayerArchetype,\n context: CombatContext\n): AIDecision {\n const rules = ARCHETYPE_ENFORCEMENT[archetype];\n\n // Check for prohibited actions\n if (rules.prohibitedActions.includes(decision.action)) {\n // Replace with preferred action (random selection from preferred set)\n // Defensive guard: Ensure preferredActions is not empty\n if (rules.preferredActions.length === 0) {\n console.warn(\n `[ArchetypeEnforcer] ${archetype} has empty preferredActions array. Using original decision with warning.`\n );\n return {\n ...decision,\n reason: `Archetype enforcement: ${archetype} prohibited action ${decision.action}, but no alternatives available`,\n };\n }\n\n const alternativeAction = rules.preferredActions[\n Math.floor(Math.random() * rules.preferredActions.length)\n ];\n\n return {\n ...decision,\n action: alternativeAction,\n reason: `Archetype enforcement: ${archetype} does not use ${decision.action} (원형 강화: ${decision.action} 사용 불가)`,\n };\n }\n\n // Check for signature move condition\n if (rules.signatureCondition(context)) {\n // Override with signature move\n return {\n action: AIActionType.TECHNIQUE,\n targetVitalPoint: undefined, // Let technique selection handle vital point targeting\n priority: 10, // Maximum priority\n reason: `Signature move: ${rules.signatureMove} for ${archetype} (서명 기술: ${rules.signatureMove})`,\n };\n }\n\n // No enforcement needed - return original decision\n return decision;\n}\n\n/**\n * Get signature move ID for archetype\n * \n * Returns the technique ID of this archetype's signature move.\n * Used for technique selection in useAICombat.ts.\n * \n * @korean 서명 기술 ID 가져오기\n * \n * @param archetype - Player archetype\n * @returns Signature technique ID\n */\nexport function getSignatureMove(archetype: PlayerArchetype): string {\n return ARCHETYPE_ENFORCEMENT[archetype].signatureMove;\n}\n\n/**\n * Check if signature move condition is met\n * \n * Evaluates whether the archetype should execute its signature move\n * based on current combat context.\n * \n * @korean 서명 기술 조건 확인\n * \n * @param archetype - Player archetype\n * @param context - Current combat context\n * @returns True if signature move should be executed\n */\nexport function shouldExecuteSignatureMove(\n archetype: PlayerArchetype,\n context: CombatContext\n): boolean {\n const rules = ARCHETYPE_ENFORCEMENT[archetype];\n return rules.signatureCondition(context);\n}\n\n/**\n * Get action frequency target for archetype\n * \n * Returns the target frequency (0.0-1.0) for a specific action type\n * based on archetype combat philosophy.\n * \n * @korean 행동 빈도 목표 가져오기\n * \n * @param archetype - Player archetype\n * @param actionType - AI action type\n * @returns Target frequency for this action (0.0-1.0)\n */\nexport function getActionFrequency(\n archetype: PlayerArchetype,\n actionType: AIActionType\n): number {\n return ARCHETYPE_ENFORCEMENT[archetype].actionFrequencies[actionType] ?? 0.0;\n}\n\n/**\n * Check if action is prohibited for archetype\n * \n * Returns true if the archetype's philosophy prohibits using this action.\n * \n * @korean 금지된 행동 확인\n * \n * @param archetype - Player archetype\n * @param actionType - AI action type to check\n * @returns True if action is prohibited\n */\nexport function isActionProhibited(\n archetype: PlayerArchetype,\n actionType: AIActionType\n): boolean {\n return ARCHETYPE_ENFORCEMENT[archetype].prohibitedActions.includes(actionType);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ArchetypeEnforcer.js","names":[],"sources":["../../../src/systems/ai/ArchetypeEnforcer.ts"],"sourcesContent":["/**\n * Archetype Behavior Enforcement System\n * \n * Centralizes archetype-specific combat philosophy enforcement to ensure\n * each of the 5 player archetypes has immediately recognizable and distinct\n * AI behavior patterns.\n * \n * **Korean Philosophy Integration (한국 무술 철학)**:\n * - 무사 (Musa): 명예 (Honor) - Direct, honorable combat\n * - 암살자 (Amsalja): 은밀 (Stealth) - Silent, precise takedowns\n * - 해커 (Hacker): 분석 (Analysis) - Tech-enhanced tactical combat\n * - 정보요원 (Jeongbo): 심리전 (Psychological Warfare) - Strategic manipulation\n * - 조직폭력배 (Jojik): 생존 (Survival) - Ruthless, unpredictable tactics\n * \n * @module systems/ai/ArchetypeEnforcer\n * @category AI Combat\n * @korean 원형 행동 강화 시스템\n */\n\nimport { PlayerArchetype } from \"@/types\";\nimport { AIDecision, AIActionType, CombatContext } from \"./types\";\n\n/**\n * Archetype enforcement rules defining distinct combat behaviors\n * \n * Each archetype has:\n * - Preferred actions (used most frequently)\n * - Prohibited actions (never used due to philosophy)\n * - Signature move (iconic technique with specific trigger condition)\n * - Action frequencies (target distribution percentages)\n * \n * **Note on Action Frequencies**:\n * These values represent **target frequencies/proportions** for each action type\n * rather than a single normalized probability distribution. Multiple actions can have\n * high target frequencies because they can occur in overlapping situations:\n * - ATTACK (70%) and TECHNIQUE (70%) both represent aggressive behavior\n * - STANCE_CHANGE (80%) occurs frequently but doesn't prevent other actions\n * - The frequencies serve as **behavioral targets** to guide AI personality,\n * and are not required to sum to 100% across all actions\n * \n * @korean 원형 강화 규칙\n */\nexport interface ArchetypeEnforcementRules {\n /** Actions this archetype uses most frequently */\n readonly preferredActions: readonly AIActionType[];\n \n /** Actions this archetype never uses (philosophy conflicts) */\n readonly prohibitedActions: readonly AIActionType[];\n \n /** Signature technique ID for this archetype */\n readonly signatureMove: string;\n \n /** Condition function to trigger signature move */\n readonly signatureCondition: (context: CombatContext) => boolean;\n \n /** Target frequency distribution for each action type (0.0-1.0) */\n readonly actionFrequencies: Readonly<Record<AIActionType, number>>;\n}\n\n/**\n * Archetype enforcement rules for all 5 player archetypes\n * \n * Defines distinct combat philosophies with measurable behavior patterns\n * that make each archetype immediately identifiable through AI actions.\n * \n * @korean 5대 원형 강화 규칙\n */\nexport const ARCHETYPE_ENFORCEMENT: Record<PlayerArchetype, ArchetypeEnforcementRules> = {\n [PlayerArchetype.MUSA]: {\n preferredActions: [AIActionType.ATTACK, AIActionType.APPROACH, AIActionType.TECHNIQUE],\n prohibitedActions: [AIActionType.FEINT], // Honor code: No deception\n signatureMove: \"musa_mountain_breaker\",\n signatureCondition: (context) => {\n /**\n * Musa (무사) signature move condition: Mountain Breaker when opponent <40% health\n * \n * NOTE: Uses opponentMaxHealth if available, otherwise assumes symmetric max-health\n * pools (context.playerMaxHealth === opponentMaxHealth). If asymmetric max health\n * exists, CombatContext provides opponentMaxHealth for accurate calculation.\n */\n const maxHealth = context.opponentMaxHealth ?? context.playerMaxHealth;\n if (maxHealth <= 0) {\n // Defensive guard: avoid divide-by-zero / invalid percentages\n return false;\n }\n const opponentHealthPercent = context.opponentHealth / maxHealth;\n return opponentHealthPercent < 0.40; // Finishing move when opponent <40% health\n },\n actionFrequencies: {\n /**\n * Musa (무사) Action Frequencies - Honor Code Warrior\n * \n * These frequencies represent behavioral targets (not strict probability distributions).\n * Multiple actions can have high frequencies as they represent overlapping aggressive behavior.\n * \n * **Honor Code Rules**:\n * - FEINT: 0% (prohibited - no deception)\n * - RETREAT: 2% (minimal - only at critical health <10%, handled by evaluateSurvival)\n * - DEFEND: 10% (minimal - offense-focused philosophy)\n * \n * The 2% retreat frequency applies only when health drops below the honor threshold (~5-10%),\n * enforced by evaluateSurvival logic. Above this threshold, Musa never retreats.\n */\n [AIActionType.ATTACK]: 0.70, // 70% aggressive attacks\n [AIActionType.DEFEND]: 0.10, // 10% defense (honor code: minimal defense)\n [AIActionType.RETREAT]: 0.02, // 2% retreat (only at critical health <10%)\n [AIActionType.APPROACH]: 0.15, // 15% approach\n [AIActionType.FEINT]: 0.00, // 0% feints (prohibited by honor code)\n [AIActionType.TECHNIQUE]: 0.70, // 70% techniques (overlaps with attack)\n [AIActionType.COUNTER]: 0.10, // 10% counters\n [AIActionType.STANCE_CHANGE]: 0.10, // 10% stance changes\n [AIActionType.CIRCLE]: 0.05, // 5% circling\n [AIActionType.WAIT]: 0.03, // 3% wait\n [AIActionType.COMBO]: 0.05, // 5% combos\n },\n },\n\n [PlayerArchetype.AMSALJA]: {\n preferredActions: [AIActionType.TECHNIQUE, AIActionType.CIRCLE, AIActionType.COUNTER],\n prohibitedActions: [], // No prohibitions (pragmatic assassin)\n signatureMove: \"amsalja_silent_death\",\n signatureCondition: (context) => {\n // Execute Silent Death when opponent is VULNERABLE or worse\n return (\n context.opponentBalance === \"VULNERABLE\" ||\n context.opponentBalance === \"HELPLESS\"\n );\n },\n actionFrequencies: {\n [AIActionType.TECHNIQUE]: 0.60, // 60% techniques (vital point priority)\n [AIActionType.CIRCLE]: 0.20, // 20% circling (stealth positioning to flanks/rear)\n [AIActionType.ATTACK]: 0.15, // 15% basic attacks\n [AIActionType.RETREAT]: 0.05, // 5% tactical retreats (at 60% health threshold)\n [AIActionType.DEFEND]: 0.10, // 10% defense\n [AIActionType.APPROACH]: 0.10, // 10% approach\n [AIActionType.FEINT]: 0.10, // 10% feints\n [AIActionType.COUNTER]: 0.20, // 20% counters\n [AIActionType.STANCE_CHANGE]: 0.15, // 15% stance changes\n [AIActionType.WAIT]: 0.05, // 5% wait\n [AIActionType.COMBO]: 0.10, // 10% combos\n },\n },\n\n [PlayerArchetype.HACKER]: {\n preferredActions: [AIActionType.WAIT, AIActionType.TECHNIQUE, AIActionType.CIRCLE],\n prohibitedActions: [], // Analytical, uses all tactics\n signatureMove: \"hacker_system_crash\",\n signatureCondition: (context) => {\n // Execute System Crash after 20 seconds of observation (data collection phase)\n return context.timeInMatch > 20000;\n },\n actionFrequencies: {\n [AIActionType.WAIT]: 0.25, // 25% observation (data collection)\n [AIActionType.TECHNIQUE]: 0.40, // 40% tech-assisted strikes\n [AIActionType.CIRCLE]: 0.15, // 15% repositioning (maintain mid-range)\n [AIActionType.ATTACK]: 0.15, // 15% basic attacks\n [AIActionType.DEFEND]: 0.05, // 5% defense\n [AIActionType.APPROACH]: 0.05, // 5% approach (prefers mid-range)\n [AIActionType.RETREAT]: 0.10, // 10% retreat (maintain optimal distance)\n [AIActionType.FEINT]: 0.05, // 5% feints\n [AIActionType.COUNTER]: 0.15, // 15% counters\n [AIActionType.STANCE_CHANGE]: 0.10, // 10% stance changes\n [AIActionType.COMBO]: 0.05, // 5% combos\n },\n },\n\n [PlayerArchetype.JEONGBO_YOWON]: {\n preferredActions: [AIActionType.FEINT, AIActionType.COUNTER, AIActionType.TECHNIQUE],\n prohibitedActions: [], // Psychological warfare, uses all tactics\n signatureMove: \"jeongbo_precision_takedown\",\n signatureCondition: (context) => {\n // Execute Precision Takedown when opponent is HELPLESS (implemented in Issue #1186)\n return context.opponentBalance === \"HELPLESS\";\n },\n actionFrequencies: {\n [AIActionType.FEINT]: 0.30, // 30% psychological pressure (feints)\n [AIActionType.TECHNIQUE]: 0.35, // 35% precision strikes\n [AIActionType.COUNTER]: 0.20, // 20% counters\n [AIActionType.WAIT]: 0.10, // 10% observation (strategic timing)\n [AIActionType.ATTACK]: 0.05, // 5% basic attacks\n [AIActionType.DEFEND]: 0.10, // 10% defense\n [AIActionType.APPROACH]: 0.10, // 10% approach\n [AIActionType.RETREAT]: 0.05, // 5% tactical retreats\n [AIActionType.CIRCLE]: 0.15, // 15% circling (intimidation)\n [AIActionType.STANCE_CHANGE]: 0.10, // 10% stance changes\n [AIActionType.COMBO]: 0.05, // 5% combos\n },\n },\n\n [PlayerArchetype.JOJIK_POKRYEOKBAE]: {\n preferredActions: [AIActionType.ATTACK, AIActionType.TECHNIQUE, AIActionType.STANCE_CHANGE],\n prohibitedActions: [], // No rules, survival at any cost\n signatureMove: \"jojik_improvised_weapon\",\n signatureCondition: (context) => {\n /**\n * Jojik (조직폭력배) signature move: Improvised Weapon when desperate (<30% health)\n * \n * This condition uses playerHealth (the AI's health) to trigger desperate tactics.\n */\n const maxHealth = context.playerMaxHealth;\n if (maxHealth <= 0) {\n // Defensive guard: avoid divide-by-zero\n return false;\n }\n const playerHealthPercent = context.playerHealth / maxHealth;\n return playerHealthPercent < 0.30; // Desperate improvised weapon when health <30%\n },\n actionFrequencies: {\n /**\n * Jojik (조직폭력배) Action Frequencies - Chaotic Survivor\n * \n * These frequencies represent behavioral targets for Jojik's unpredictable fighting style.\n * \n * **Key Behavioral Characteristics**:\n * - STANCE_CHANGE: 80% (extremely high for unpredictability)\n * This means that in approximately 80% of decision cycles where a stance change\n * is a valid option, the AI will evaluate and strongly favor a stance change,\n * creating the erratic, chaotic movement pattern that defines Jojik's combat style.\n * \n * - RETREAT: 5% base, but survival instinct triggers tactical retreat at 70% health\n * (handled by evaluateSurvival logic with personality.tacticalRetreatThreshold)\n * \n * The high stance change frequency is the primary mechanism for Jojik's unpredictable behavior.\n */\n [AIActionType.ATTACK]: 0.50, // 50% chaotic attacks\n [AIActionType.TECHNIQUE]: 0.25, // 25% dirty techniques\n [AIActionType.STANCE_CHANGE]: 0.80, // 80% unpredictable stance changes (defines chaotic behavior)\n [AIActionType.RETREAT]: 0.05, // 5% pragmatic retreats (survival instinct at 70% health via threshold)\n [AIActionType.FEINT]: 0.05, // 5% deceptive moves\n [AIActionType.DEFEND]: 0.10, // 10% defense\n [AIActionType.APPROACH]: 0.15, // 15% approach\n [AIActionType.COUNTER]: 0.10, // 10% counters\n [AIActionType.CIRCLE]: 0.10, // 10% circling\n [AIActionType.WAIT]: 0.03, // 3% wait\n [AIActionType.COMBO]: 0.10, // 10% combos\n },\n },\n};\n\n/**\n * Enforce archetype-specific behavior on AI decision\n * \n * Applies philosophy-based restrictions and redirects to enforce distinct\n * combat patterns for each archetype. This ensures players can identify\n * which archetype they're fighting based on behavior alone.\n * \n * **Enforcement Logic**:\n * 1. Check for prohibited actions → Replace with preferred action\n * 2. Check for signature move condition → Override with signature move\n * 3. Return decision (possibly modified)\n * \n * @korean 원형 행동 강화\n * \n * @param decision - Original AI decision from DecisionTree\n * @param archetype - Player archetype to enforce\n * @param context - Current combat context\n * @returns Modified decision enforcing archetype philosophy\n */\nexport function enforceArchetypeBehavior(\n decision: AIDecision,\n archetype: PlayerArchetype,\n context: CombatContext\n): AIDecision {\n const rules = ARCHETYPE_ENFORCEMENT[archetype];\n\n // Check for prohibited actions\n if (rules.prohibitedActions.includes(decision.action)) {\n // Replace with preferred action (random selection from preferred set)\n // Defensive guard: Ensure preferredActions is not empty\n if (rules.preferredActions.length === 0) {\n console.warn(\n `[ArchetypeEnforcer] ${archetype} has empty preferredActions array. Using original decision with warning.`\n );\n return {\n ...decision,\n reason: `Archetype enforcement: ${archetype} prohibited action ${decision.action}, but no alternatives available`,\n };\n }\n\n const alternativeAction = rules.preferredActions[\n Math.floor(Math.random() * rules.preferredActions.length)\n ];\n\n return {\n ...decision,\n action: alternativeAction,\n reason: `Archetype enforcement: ${archetype} does not use ${decision.action} (원형 강화: ${decision.action} 사용 불가)`,\n };\n }\n\n // Check for signature move condition\n if (rules.signatureCondition(context)) {\n // Override with signature move\n return {\n action: AIActionType.TECHNIQUE,\n targetVitalPoint: undefined, // Let technique selection handle vital point targeting\n priority: 10, // Maximum priority\n reason: `Signature move: ${rules.signatureMove} for ${archetype} (서명 기술: ${rules.signatureMove})`,\n };\n }\n\n // No enforcement needed - return original decision\n return decision;\n}\n\n/**\n * Get signature move ID for archetype\n * \n * Returns the technique ID of this archetype's signature move.\n * Used for technique selection in useAICombat.ts.\n * \n * @korean 서명 기술 ID 가져오기\n * \n * @param archetype - Player archetype\n * @returns Signature technique ID\n */\nexport function getSignatureMove(archetype: PlayerArchetype): string {\n return ARCHETYPE_ENFORCEMENT[archetype].signatureMove;\n}\n\n/**\n * Check if signature move condition is met\n * \n * Evaluates whether the archetype should execute its signature move\n * based on current combat context.\n * \n * @korean 서명 기술 조건 확인\n * \n * @param archetype - Player archetype\n * @param context - Current combat context\n * @returns True if signature move should be executed\n */\nexport function shouldExecuteSignatureMove(\n archetype: PlayerArchetype,\n context: CombatContext\n): boolean {\n const rules = ARCHETYPE_ENFORCEMENT[archetype];\n return rules.signatureCondition(context);\n}\n\n/**\n * Get action frequency target for archetype\n * \n * Returns the target frequency (0.0-1.0) for a specific action type\n * based on archetype combat philosophy.\n * \n * @korean 행동 빈도 목표 가져오기\n * \n * @param archetype - Player archetype\n * @param actionType - AI action type\n * @returns Target frequency for this action (0.0-1.0)\n */\nexport function getActionFrequency(\n archetype: PlayerArchetype,\n actionType: AIActionType\n): number {\n return ARCHETYPE_ENFORCEMENT[archetype].actionFrequencies[actionType] ?? 0.0;\n}\n\n/**\n * Check if action is prohibited for archetype\n * \n * Returns true if the archetype's philosophy prohibits using this action.\n * \n * @korean 금지된 행동 확인\n * \n * @param archetype - Player archetype\n * @param actionType - AI action type to check\n * @returns True if action is prohibited\n */\nexport function isActionProhibited(\n archetype: PlayerArchetype,\n actionType: AIActionType\n): boolean {\n return ARCHETYPE_ENFORCEMENT[archetype].prohibitedActions.includes(actionType);\n}\n"],"mappings":"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"}