blacktrigram 0.7.44 → 0.7.45
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.
- package/lib/audio/AudioManager.d.ts +26 -0
- package/lib/audio/AudioManager.d.ts.map +1 -1
- package/lib/audio/AudioManager.js +26 -0
- package/lib/audio/AudioManager.js.map +1 -1
- package/lib/audio/index.d.ts.map +1 -1
- package/lib/audio/index.js.map +1 -1
- package/lib/audio/types.d.ts +18 -2
- package/lib/audio/types.d.ts.map +1 -1
- package/lib/audio/types.js +1 -0
- package/lib/audio/types.js.map +1 -1
- package/lib/components/effects/WindParticles3D.d.ts.map +1 -1
- package/lib/components/index.d.ts.map +1 -1
- package/lib/components/index.js.map +1 -1
- package/lib/components/screens/combat/CombatScreen3D.d.ts.map +1 -1
- package/lib/components/screens/combat/CombatScreen3D.js.map +1 -1
- package/lib/components/screens/combat/components/controls/KeyboardHints.d.ts +0 -1
- package/lib/components/screens/combat/components/controls/KeyboardHints.d.ts.map +1 -1
- package/lib/components/screens/combat/components/controls/KeyboardHints.js +0 -1
- package/lib/components/screens/combat/components/controls/KeyboardHints.js.map +1 -1
- package/lib/components/screens/combat/components/controls/PauseMenu.d.ts.map +1 -1
- package/lib/components/screens/combat/components/controls/PauseMenu.js.map +1 -1
- package/lib/components/screens/combat/components/effects/ArterialSpray3D.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodDecals3D.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodDecals3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodLossOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodLossOverlayHtml.js.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodParticles3D.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodParticles3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodViscosity3D.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodViscosity3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/BoneCrackParticles3D.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/CombatParticleEffects3D.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/CombatParticleEffects3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/ConsciousnessBlur.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/ConsciousnessBlur.js.map +1 -1
- package/lib/components/screens/combat/components/effects/DustClouds3D.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/EarthCrackEffect3D.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/EarthHealingEffect3D.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/ImpactSparks3D.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/InternalDamage3D.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/InternalDamage3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/LiPrecisionTargetingOverlay.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/NerveStrikeParticles3D.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/PainVignette.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/PainVignette.js.map +1 -1
- package/lib/components/screens/combat/components/effects/ParticleAudio3D.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/ParticleAudio3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/TraumaOverlay3D.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/TraumaOverlay3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/WaterRipple3D.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/WaterWave3D.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/index.d.ts.map +1 -1
- package/lib/components/screens/combat/components/feedback/MatchCountdown.d.ts.map +1 -1
- package/lib/components/screens/combat/components/feedback/MatchCountdown.js.map +1 -1
- package/lib/components/screens/combat/components/feedback/RoundAnnouncementOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/combat/components/feedback/RoundAnnouncementOverlayHtml.js.map +1 -1
- package/lib/components/screens/combat/components/feedback/RoundStartAnnouncementOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/combat/components/feedback/RoundStartAnnouncementOverlayHtml.js.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatBottomHUD.d.ts.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatBottomHUD.js.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatLeftHUD.d.ts.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatLeftHUD.js.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatPortraitStatusStrip.d.ts.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatPortraitStatusStrip.js.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatRightHUD.d.ts.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatRightHUD.js.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatTopHUD.d.ts.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatTopHUD.js.map +1 -1
- package/lib/components/screens/combat/components/hud/DifficultyIndicator.d.ts.map +1 -1
- package/lib/components/screens/combat/components/hud/DifficultyIndicator.js.map +1 -1
- package/lib/components/screens/combat/components/hud/FPSMonitor.d.ts.map +1 -1
- package/lib/components/screens/combat/components/hud/FPSMonitor.js.map +1 -1
- package/lib/components/screens/combat/components/hud/PlayerStateOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/combat/components/hud/PlayerStateOverlayHtml.js.map +1 -1
- package/lib/components/screens/combat/components/indicators/BalanceIndicator.d.ts.map +1 -1
- package/lib/components/screens/combat/components/indicators/BalanceIndicator.js.map +1 -1
- package/lib/components/screens/combat/components/indicators/InputBufferDisplay.d.ts +0 -1
- package/lib/components/screens/combat/components/indicators/InputBufferDisplay.d.ts.map +1 -1
- package/lib/components/screens/combat/components/indicators/InputBufferDisplay.js +0 -1
- package/lib/components/screens/combat/components/indicators/InputBufferDisplay.js.map +1 -1
- package/lib/components/screens/combat/components/indicators/StaminaWarning.d.ts.map +1 -1
- package/lib/components/screens/combat/components/indicators/StaminaWarning.js.map +1 -1
- package/lib/components/screens/combat/components/indicators/TechniqueNameDisplay.d.ts +0 -2
- package/lib/components/screens/combat/components/indicators/TechniqueNameDisplay.d.ts.map +1 -1
- package/lib/components/screens/combat/components/indicators/TechniqueNameDisplay.js +0 -1
- package/lib/components/screens/combat/components/indicators/TechniqueNameDisplay.js.map +1 -1
- package/lib/components/screens/combat/helpers/AnimationUpdater.d.ts.map +1 -1
- package/lib/components/screens/combat/helpers/AnimationUpdater.js.map +1 -1
- package/lib/components/screens/combat/helpers/combatHelpers.d.ts.map +1 -1
- package/lib/components/screens/combat/helpers/combatHelpers.js.map +1 -1
- package/lib/components/screens/combat/hooks/useAICombat.d.ts.map +1 -1
- package/lib/components/screens/combat/hooks/useAICombat.js.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatActions.d.ts.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatActions.js.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatAttackMovement.d.ts.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatAttackMovement.js.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatAudio.d.ts.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatAudio.js.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatLayout.d.ts.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatLayout.js.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatState.d.ts.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatState.js.map +1 -1
- package/lib/components/screens/combat/hooks/useGrapplingAudio.d.ts.map +1 -1
- package/lib/components/screens/combat/hooks/usePreloadCombatAudio.d.ts.map +1 -1
- package/lib/components/screens/controls/ControlsScreen3D.d.ts.map +1 -1
- package/lib/components/screens/controls/ControlsScreen3D.js.map +1 -1
- package/lib/components/screens/controls/components/ControlBindingsOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/controls/components/ControlBindingsOverlayHtml.js.map +1 -1
- package/lib/components/screens/controls/components/GamepadVisualization3D.d.ts.map +1 -1
- package/lib/components/screens/controls/components/GamepadVisualization3D.js.map +1 -1
- package/lib/components/screens/controls/components/InteractiveControlDemoOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/controls/components/InteractiveControlDemoOverlayHtml.js.map +1 -1
- package/lib/components/screens/controls/components/Key3D.d.ts.map +1 -1
- package/lib/components/screens/controls/components/Key3D.js.map +1 -1
- package/lib/components/screens/controls/components/VisualKeyboard3D.d.ts.map +1 -1
- package/lib/components/screens/controls/components/VisualKeyboard3D.js.map +1 -1
- package/lib/components/screens/controls/constants/ControlsConstants.d.ts.map +1 -1
- package/lib/components/screens/controls/constants/ControlsConstants.js.map +1 -1
- package/lib/components/screens/controls/hooks/useControlsState.d.ts.map +1 -1
- package/lib/components/screens/controls/hooks/useControlsState.js.map +1 -1
- package/lib/components/screens/endscreen/EndScreen3D.d.ts.map +1 -1
- package/lib/components/screens/endscreen/EndScreen3D.js.map +1 -1
- package/lib/components/screens/endscreen/components/DefeatAnimation3D.d.ts.map +1 -1
- package/lib/components/screens/endscreen/components/DefeatAnimation3D.js.map +1 -1
- package/lib/components/screens/endscreen/components/NavigationButtonsOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/endscreen/components/NavigationButtonsOverlayHtml.js.map +1 -1
- package/lib/components/screens/endscreen/components/PerformanceBreakdownOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/endscreen/components/PerformanceBreakdownOverlayHtml.js.map +1 -1
- package/lib/components/screens/endscreen/components/PerformanceRatingOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/endscreen/components/PerformanceRatingOverlayHtml.js.map +1 -1
- package/lib/components/screens/endscreen/components/VictoryAnimation3D.d.ts.map +1 -1
- package/lib/components/screens/endscreen/components/VictoryAnimation3D.js.map +1 -1
- package/lib/components/screens/endscreen/components/WinnerDisplayOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/endscreen/components/WinnerDisplayOverlayHtml.js.map +1 -1
- package/lib/components/screens/endscreen/components/index.d.ts.map +1 -1
- package/lib/components/screens/endscreen/index.d.ts.map +1 -1
- package/lib/components/screens/intro/IntroScreen3D.d.ts.map +1 -1
- package/lib/components/screens/intro/IntroScreen3D.js +1 -1
- package/lib/components/screens/intro/IntroScreen3D.js.map +1 -1
- package/lib/components/screens/intro/components/AbilityListOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/intro/components/AbilityListOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/ArchetypeCardGridOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/intro/components/ArchetypeCardGridOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/ArchetypeCardOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/intro/components/ArchetypeCardOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/ArchetypeDisplayOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/intro/components/ArchetypeDisplayOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/EnhancedArchetypeDisplayOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/intro/components/EnhancedArchetypeDisplayOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/MenuButtonsOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/intro/components/MenuButtonsOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/MenuSectionOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/intro/components/MenuSectionOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/StatBarOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/intro/components/StatBarOverlayHtml.js.map +1 -1
- package/lib/components/screens/philosophy/PhilosophyScreen3D.d.ts.map +1 -1
- package/lib/components/screens/philosophy/PhilosophyScreen3D.js.map +1 -1
- package/lib/components/screens/philosophy/components/InteractiveTrigramGridOverlayHtml.d.ts +0 -1
- package/lib/components/screens/philosophy/components/InteractiveTrigramGridOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/philosophy/components/PhilosophyNavigationOverlayHtml.d.ts +0 -1
- package/lib/components/screens/philosophy/components/PhilosophyNavigationOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/philosophy/components/PhilosophySectionOverlayHtml.d.ts +0 -1
- package/lib/components/screens/philosophy/components/PhilosophySectionOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/philosophy/components/PhilosophyTextOverlayHtml.d.ts +0 -1
- package/lib/components/screens/philosophy/components/PhilosophyTextOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/philosophy/components/TrigramSymbol3D.d.ts +0 -1
- package/lib/components/screens/philosophy/components/TrigramSymbol3D.d.ts.map +1 -1
- package/lib/components/screens/philosophy/components/TrigramVisualization3D.d.ts +0 -1
- package/lib/components/screens/philosophy/components/TrigramVisualization3D.d.ts.map +1 -1
- package/lib/components/screens/philosophy/hooks/usePhilosophyState.d.ts +0 -1
- package/lib/components/screens/philosophy/hooks/usePhilosophyState.d.ts.map +1 -1
- package/lib/components/screens/training/TrainingScreen3D.d.ts.map +1 -1
- package/lib/components/screens/training/TrainingScreen3D.js.map +1 -1
- package/lib/components/screens/training/components/AnatomyControlsOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/training/components/AnatomyControlsOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/AnatomyOverlay3D.d.ts.map +1 -1
- package/lib/components/screens/training/components/AnatomyOverlay3D.js.map +1 -1
- package/lib/components/screens/training/components/DamageNumber3D.d.ts.map +1 -1
- package/lib/components/screens/training/components/FootPlacementMarkers3D.d.ts.map +1 -1
- package/lib/components/screens/training/components/FootPlacementMarkers3D.js.map +1 -1
- package/lib/components/screens/training/components/FootworkDrillsOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/training/components/FootworkDrillsOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/HitFeedbackEffect3D.d.ts.map +1 -1
- package/lib/components/screens/training/components/HitFeedbackEffect3D.js.map +1 -1
- package/lib/components/screens/training/components/TrainingAICharacter3D.d.ts.map +1 -1
- package/lib/components/screens/training/components/TrainingArena3D.d.ts.map +1 -1
- package/lib/components/screens/training/components/TrainingControlsOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/training/components/TrainingControlsOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/TrainingDummy3D.d.ts.map +1 -1
- package/lib/components/screens/training/components/TrainingDummy3D.js.map +1 -1
- package/lib/components/screens/training/components/TrainingFeedbackOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/training/components/TrainingFeedbackOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/TrainingHitEffects3D.d.ts.map +1 -1
- package/lib/components/screens/training/components/TrainingModeSelectorOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/training/components/TrainingModeSelectorOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/TrainingStatsOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/training/components/TrainingStatsOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/VitalPointMarker3D.d.ts.map +1 -1
- package/lib/components/screens/training/components/VitalPointMarker3D.js.map +1 -1
- package/lib/components/screens/training/components/VitalPointTrainingOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/training/components/VitalPointTrainingOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/hud/TrainingBottomHUD.d.ts.map +1 -1
- package/lib/components/screens/training/components/hud/TrainingBottomHUD.js.map +1 -1
- package/lib/components/screens/training/components/hud/TrainingLeftHUD.d.ts.map +1 -1
- package/lib/components/screens/training/components/hud/TrainingLeftHUD.js.map +1 -1
- package/lib/components/screens/training/components/hud/TrainingRightHUD.d.ts.map +1 -1
- package/lib/components/screens/training/components/hud/TrainingRightHUD.js.map +1 -1
- package/lib/components/screens/training/components/hud/TrainingTopHUD.d.ts.map +1 -1
- package/lib/components/screens/training/components/hud/TrainingTopHUD.js.map +1 -1
- package/lib/components/screens/training/components/index.d.ts.map +1 -1
- package/lib/components/screens/training/hooks/useAttackMovement.d.ts.map +1 -1
- package/lib/components/screens/training/hooks/useAttackMovement.js.map +1 -1
- package/lib/components/screens/training/hooks/useTrainingActions.d.ts.map +1 -1
- package/lib/components/screens/training/hooks/useTrainingActions.js.map +1 -1
- package/lib/components/screens/training/hooks/useTrainingLayout.d.ts.map +1 -1
- package/lib/components/screens/training/hooks/useTrainingLayout.js.map +1 -1
- package/lib/components/screens/training/hooks/useTrainingState.d.ts.map +1 -1
- package/lib/components/screens/training/hooks/useTrainingState.js.map +1 -1
- package/lib/components/shared/base/AccessibilityProvider.d.ts.map +1 -1
- package/lib/components/shared/base/BaseButton.d.ts.map +1 -1
- package/lib/components/shared/base/BaseButton.js.map +1 -1
- package/lib/components/shared/base/BaseButtonOverlayHtml.d.ts.map +1 -1
- package/lib/components/shared/base/BaseButtonOverlayHtml.js.map +1 -1
- package/lib/components/shared/base/BasePanel.d.ts.map +1 -1
- package/lib/components/shared/base/BasePanel.js.map +1 -1
- package/lib/components/shared/base/BaseText.d.ts.map +1 -1
- package/lib/components/shared/base/BaseText.js.map +1 -1
- package/lib/components/shared/base/ResponsiveContainer.d.ts.map +1 -1
- package/lib/components/shared/base/index.d.ts.map +1 -1
- package/lib/components/shared/base/useKoreanTheme.d.ts.map +1 -1
- package/lib/components/shared/base/useKoreanTheme.js.map +1 -1
- package/lib/components/shared/debug/PerformanceDebugOverlayHtml.d.ts.map +1 -1
- package/lib/components/shared/debug/PerformanceDebugOverlayHtml.js.map +1 -1
- package/lib/components/shared/effects/ScreenFlash.d.ts.map +1 -1
- package/lib/components/shared/mobile/ActionButtons.d.ts.map +1 -1
- package/lib/components/shared/mobile/ActionButtons.js +0 -1
- package/lib/components/shared/mobile/ActionButtons.js.map +1 -1
- package/lib/components/shared/mobile/GestureRecognizerPure.d.ts +0 -1
- package/lib/components/shared/mobile/GestureRecognizerPure.d.ts.map +1 -1
- package/lib/components/shared/mobile/GestureRecognizerPure.js +0 -1
- package/lib/components/shared/mobile/GestureRecognizerPure.js.map +1 -1
- package/lib/components/shared/mobile/HapticController.d.ts +0 -13
- package/lib/components/shared/mobile/HapticController.d.ts.map +1 -1
- package/lib/components/shared/mobile/HapticController.js +0 -10
- package/lib/components/shared/mobile/HapticController.js.map +1 -1
- package/lib/components/shared/mobile/MobileControlsPure.d.ts.map +1 -1
- package/lib/components/shared/mobile/MobileControlsPure.js.map +1 -1
- package/lib/components/shared/mobile/PerformanceMonitor.d.ts +0 -15
- package/lib/components/shared/mobile/PerformanceMonitor.d.ts.map +1 -1
- package/lib/components/shared/mobile/StanceWheelPure.d.ts +0 -1
- package/lib/components/shared/mobile/StanceWheelPure.d.ts.map +1 -1
- package/lib/components/shared/mobile/StanceWheelPure.js +0 -1
- package/lib/components/shared/mobile/StanceWheelPure.js.map +1 -1
- package/lib/components/shared/mobile/TouchOptimizer.d.ts +0 -4
- package/lib/components/shared/mobile/TouchOptimizer.d.ts.map +1 -1
- package/lib/components/shared/mobile/TouchOptimizer.js +0 -3
- package/lib/components/shared/mobile/TouchOptimizer.js.map +1 -1
- package/lib/components/shared/mobile/VirtualDPad.d.ts.map +1 -1
- package/lib/components/shared/mobile/VirtualDPad.js +0 -1
- package/lib/components/shared/mobile/VirtualDPad.js.map +1 -1
- package/lib/components/shared/mobile/index.d.ts.map +1 -1
- package/lib/components/shared/three/anatomy/BodySurface.d.ts.map +1 -1
- package/lib/components/shared/three/anatomy/BodySurface.js.map +1 -1
- package/lib/components/shared/three/anatomy/BoneAttachedMuscles.d.ts.map +1 -1
- package/lib/components/shared/three/anatomy/BoneAttachedMuscles.js.map +1 -1
- package/lib/components/shared/three/anatomy/BoneClothing.d.ts.map +1 -1
- package/lib/components/shared/three/anatomy/BoneClothing.js.map +1 -1
- package/lib/components/shared/three/anatomy/BoneRenderer.d.ts +0 -1
- package/lib/components/shared/three/anatomy/BoneRenderer.d.ts.map +1 -1
- package/lib/components/shared/three/anatomy/BoneRenderer.js.map +1 -1
- package/lib/components/shared/three/anatomy/Face3D.d.ts.map +1 -1
- package/lib/components/shared/three/anatomy/Face3D.js.map +1 -1
- package/lib/components/shared/three/anatomy/Foot3D.d.ts +0 -1
- package/lib/components/shared/three/anatomy/Foot3D.d.ts.map +1 -1
- package/lib/components/shared/three/anatomy/Foot3D.js.map +1 -1
- package/lib/components/shared/three/anatomy/Hand3D.d.ts +0 -1
- package/lib/components/shared/three/anatomy/Hand3D.d.ts.map +1 -1
- package/lib/components/shared/three/anatomy/Hand3D.js.map +1 -1
- package/lib/components/shared/three/effects/ActionFeedback.d.ts.map +1 -1
- package/lib/components/shared/three/effects/ActionFeedback.js.map +1 -1
- package/lib/components/shared/three/effects/DamageNumbers.d.ts.map +1 -1
- package/lib/components/shared/three/effects/DamageNumbers.js.map +1 -1
- package/lib/components/shared/three/effects/ExplosiveBurstEffect3D.d.ts.map +1 -1
- package/lib/components/shared/three/effects/GrapplingIndicator3D.d.ts.map +1 -1
- package/lib/components/shared/three/effects/HitEffects3D.d.ts.map +1 -1
- package/lib/components/shared/three/effects/HitEffects3D.js.map +1 -1
- package/lib/components/shared/three/effects/LimbExposureIndicator3D.d.ts.map +1 -1
- package/lib/components/shared/three/effects/NerveDisruptionEffect3D.d.ts.map +1 -1
- package/lib/components/shared/three/effects/PlayerStateIndicators.d.ts.map +1 -1
- package/lib/components/shared/three/effects/PlayerStateIndicators.js.map +1 -1
- package/lib/components/shared/three/effects/StanceSymbol3D.d.ts.map +1 -1
- package/lib/components/shared/three/effects/StanceSymbol3D.js.map +1 -1
- package/lib/components/shared/three/effects/StanceTransitionEffect.d.ts.map +1 -1
- package/lib/components/shared/three/effects/StanceTransitionEffect.js.map +1 -1
- package/lib/components/shared/three/effects/ThunderEffect3D.d.ts.map +1 -1
- package/lib/components/shared/three/effects/VitalPointMarkers3D.d.ts.map +1 -1
- package/lib/components/shared/three/effects/VitalPointMarkers3D.js.map +1 -1
- package/lib/components/shared/three/index.d.ts.map +1 -1
- package/lib/components/shared/three/indicators/ElementalColorSystem.d.ts +0 -6
- package/lib/components/shared/three/indicators/ElementalColorSystem.d.ts.map +1 -1
- package/lib/components/shared/three/indicators/ElementalColorSystem.js +0 -4
- package/lib/components/shared/three/indicators/ElementalColorSystem.js.map +1 -1
- package/lib/components/shared/three/indicators/GuardIndicator.d.ts +0 -1
- package/lib/components/shared/three/indicators/GuardIndicator.d.ts.map +1 -1
- package/lib/components/shared/three/indicators/GuardIndicator.js +0 -1
- package/lib/components/shared/three/indicators/GuardIndicator.js.map +1 -1
- package/lib/components/shared/three/indicators/HapticFeedback.d.ts +0 -7
- package/lib/components/shared/three/indicators/HapticFeedback.d.ts.map +1 -1
- package/lib/components/shared/three/indicators/HapticFeedback.js +0 -2
- package/lib/components/shared/three/indicators/HapticFeedback.js.map +1 -1
- package/lib/components/shared/three/indicators/StanceChangeIndicator.d.ts +0 -1
- package/lib/components/shared/three/indicators/StanceChangeIndicator.d.ts.map +1 -1
- package/lib/components/shared/three/indicators/StanceChangeIndicator.js +0 -1
- package/lib/components/shared/three/indicators/StanceChangeIndicator.js.map +1 -1
- package/lib/components/shared/three/indicators/TrigramSymbol3D.d.ts +0 -1
- package/lib/components/shared/three/indicators/TrigramSymbol3D.d.ts.map +1 -1
- package/lib/components/shared/three/models/Player3DWithTransitions.d.ts.map +1 -1
- package/lib/components/shared/three/models/Player3DWithTransitions.js.map +1 -1
- package/lib/components/shared/three/models/SkeletalPlayer3D.d.ts.map +1 -1
- package/lib/components/shared/three/models/SkeletalPlayer3D.js.map +1 -1
- package/lib/components/shared/three/optimization/AdaptiveQuality.d.ts.map +1 -1
- package/lib/components/shared/three/optimization/AdaptiveQuality.js.map +1 -1
- package/lib/components/shared/three/optimization/InstancedGeometry.d.ts.map +1 -1
- package/lib/components/shared/three/optimization/LODSystem.d.ts.map +1 -1
- package/lib/components/shared/three/scene/AtmosphericParticles3D.d.ts.map +1 -1
- package/lib/components/shared/three/scene/AtmosphericParticles3D.js.map +1 -1
- package/lib/components/shared/three/scene/BackgroundScene3D.d.ts.map +1 -1
- package/lib/components/shared/three/scene/BackgroundScene3D.js.map +1 -1
- package/lib/components/shared/three/scene/CombatArena3D.d.ts.map +1 -1
- package/lib/components/shared/three/scene/CombatArena3D.js.map +1 -1
- package/lib/components/shared/three/scene/DebugCollision.d.ts +0 -2
- package/lib/components/shared/three/scene/DebugCollision.d.ts.map +1 -1
- package/lib/components/shared/three/scene/KoreanSignage3D.d.ts.map +1 -1
- package/lib/components/shared/three/scene/KoreanSignage3D.js.map +1 -1
- package/lib/components/shared/three/ui/ArchetypeCard.d.ts.map +1 -1
- package/lib/components/shared/three/ui/ArchetypeCard.js.map +1 -1
- package/lib/components/shared/three/ui/BodyPartHealthDisplay.d.ts.map +1 -1
- package/lib/components/shared/three/ui/BodyPartHealthDisplay.js.map +1 -1
- package/lib/components/shared/three/ui/BreathingIndicator.d.ts.map +1 -1
- package/lib/components/shared/three/ui/BreathingIndicator2.js.map +1 -1
- package/lib/components/shared/three/ui/CombatReadinessBar.d.ts.map +1 -1
- package/lib/components/shared/three/ui/CombatReadinessBar.js.map +1 -1
- package/lib/components/shared/three/ui/ComboCounter.d.ts.map +1 -1
- package/lib/components/shared/three/ui/ComboCounter.js.map +1 -1
- package/lib/components/shared/three/ui/HealthBar.d.ts.map +1 -1
- package/lib/components/shared/three/ui/HealthBar.js.map +1 -1
- package/lib/components/shared/three/ui/KoreanButton.d.ts.map +1 -1
- package/lib/components/shared/three/ui/KoreanButton.js.map +1 -1
- package/lib/components/shared/three/ui/KoreanPanel.d.ts.map +1 -1
- package/lib/components/shared/three/ui/KoreanPanel.js.map +1 -1
- package/lib/components/shared/three/ui/KoreanText.d.ts.map +1 -1
- package/lib/components/shared/three/ui/KoreanText.js.map +1 -1
- package/lib/components/shared/three/ui/MenuList.d.ts.map +1 -1
- package/lib/components/shared/three/ui/MenuList.js.map +1 -1
- package/lib/components/shared/three/ui/PlayerHUD.d.ts.map +1 -1
- package/lib/components/shared/three/ui/PlayerHUD.js.map +1 -1
- package/lib/components/shared/three/ui/ProgressBar.d.ts.map +1 -1
- package/lib/components/shared/three/ui/ProgressBar.js.map +1 -1
- package/lib/components/shared/three/ui/SpeedIndicatorHUD.d.ts +0 -1
- package/lib/components/shared/three/ui/SpeedIndicatorHUD.d.ts.map +1 -1
- package/lib/components/shared/three/ui/SpeedIndicatorHUD.js +0 -1
- package/lib/components/shared/three/ui/SpeedIndicatorHUD.js.map +1 -1
- package/lib/components/shared/three/ui/StaminaBar.d.ts.map +1 -1
- package/lib/components/shared/three/ui/StaminaBar.js.map +1 -1
- package/lib/components/shared/three/ui/TechniqueBar.d.ts.map +1 -1
- package/lib/components/shared/three/ui/TechniqueBar.js.map +1 -1
- package/lib/components/shared/three/ui/TechniqueBarContainer.d.ts.map +1 -1
- package/lib/components/shared/three/ui/TechniqueCard.d.ts.map +1 -1
- package/lib/components/shared/three/ui/TechniqueCard.js.map +1 -1
- package/lib/components/shared/three/ui/VitalPointOverlayControlsHtml.d.ts.map +1 -1
- package/lib/components/shared/three/ui/VitalPointOverlayControlsHtml.js.map +1 -1
- package/lib/components/shared/three/ui/VulnerabilityWindowHUD.d.ts.map +1 -1
- package/lib/components/shared/ui/BaseHUDContainer.d.ts.map +1 -1
- package/lib/components/shared/ui/BaseHUDContainer.js.map +1 -1
- package/lib/components/shared/ui/CombatTimer.d.ts.map +1 -1
- package/lib/components/shared/ui/CombatTimer.js.map +1 -1
- package/lib/components/shared/ui/ErrorBoundary.d.ts.map +1 -1
- package/lib/components/shared/ui/ErrorModal.d.ts.map +1 -1
- package/lib/components/shared/ui/ErrorModal.js.map +1 -1
- package/lib/components/shared/ui/HUDSection.d.ts.map +1 -1
- package/lib/components/shared/ui/LoadingState.d.ts.map +1 -1
- package/lib/components/shared/ui/LoadingState.js.map +1 -1
- package/lib/components/shared/ui/MobileHUDLayout.d.ts +0 -1
- package/lib/components/shared/ui/MobileHUDLayout.d.ts.map +1 -1
- package/lib/components/shared/ui/ResponsiveContainer.d.ts +0 -1
- package/lib/components/shared/ui/ResponsiveContainer.d.ts.map +1 -1
- package/lib/components/shared/ui/SplashScreen.d.ts.map +1 -1
- package/lib/components/shared/ui/SplashScreen.js +2 -2
- package/lib/components/shared/ui/SplashScreen.js.map +1 -1
- package/lib/components/shared/ui/StyledHUDPanel.d.ts.map +1 -1
- package/lib/components/shared/ui/VitalPointOverlayControlsPure.d.ts.map +1 -1
- package/lib/components/shared/ui/VitalPointOverlayControlsPure.js.map +1 -1
- package/lib/components/shared/ui/VolumeControl.d.ts.map +1 -1
- package/lib/components/shared/ui/VolumeControl.js.map +1 -1
- package/lib/components/shared/ui/shared/ConfirmDialog.d.ts.map +1 -1
- package/lib/components/shared/ui/shared/ConfirmDialog.js.map +1 -1
- package/lib/components/test/Hello3D.d.ts.map +1 -1
- package/lib/components/ui/combat/BalanceIndicatorOverlayHtml.d.ts.map +1 -1
- package/lib/components/ui/combat/BalanceIndicatorOverlayHtml.js.map +1 -1
- package/lib/components/ui/combat/ComboCounter.d.ts.map +1 -1
- package/lib/components/ui/combat/PressureMeter.d.ts.map +1 -1
- package/lib/systems/CombatSystem.d.ts +0 -6
- package/lib/systems/CombatSystem.d.ts.map +1 -1
- package/lib/systems/CombatSystem.js +0 -6
- package/lib/systems/CombatSystem.js.map +1 -1
- package/lib/systems/EffectCalculator.d.ts +0 -7
- package/lib/systems/EffectCalculator.d.ts.map +1 -1
- package/lib/systems/EffectCalculator.js +0 -4
- package/lib/systems/EffectCalculator.js.map +1 -1
- package/lib/systems/LayoutSystem.d.ts +0 -1
- package/lib/systems/LayoutSystem.d.ts.map +1 -1
- package/lib/systems/LayoutSystem.js +0 -1
- package/lib/systems/LayoutSystem.js.map +1 -1
- package/lib/systems/PlayerEffectManager.d.ts +0 -10
- package/lib/systems/PlayerEffectManager.d.ts.map +1 -1
- package/lib/systems/PlayerEffectManager.js +0 -3
- package/lib/systems/PlayerEffectManager.js.map +1 -1
- package/lib/systems/ResponsiveScaling.d.ts +0 -12
- package/lib/systems/ResponsiveScaling.d.ts.map +1 -1
- package/lib/systems/ResponsiveScaling.js +0 -12
- package/lib/systems/ResponsiveScaling.js.map +1 -1
- package/lib/systems/TrigramSystem.d.ts +0 -13
- package/lib/systems/TrigramSystem.d.ts.map +1 -1
- package/lib/systems/TrigramSystem.js +0 -13
- package/lib/systems/TrigramSystem.js.map +1 -1
- package/lib/systems/VitalPointSystem.d.ts +0 -10
- package/lib/systems/VitalPointSystem.d.ts.map +1 -1
- package/lib/systems/VitalPointSystem.js +0 -10
- package/lib/systems/VitalPointSystem.js.map +1 -1
- package/lib/systems/animation/builders/KeyframeInterpolation.d.ts +0 -4
- package/lib/systems/animation/builders/KeyframeInterpolation.d.ts.map +1 -1
- package/lib/systems/animation/builders/KeyframeInterpolation.js +0 -1
- package/lib/systems/animation/builders/KeyframeInterpolation.js.map +1 -1
- package/lib/systems/animation/builders/SkeletonRig.d.ts +0 -4
- package/lib/systems/animation/builders/SkeletonRig.d.ts.map +1 -1
- package/lib/systems/animation/builders/SkeletonRig.js +0 -3
- package/lib/systems/animation/builders/SkeletonRig.js.map +1 -1
- package/lib/systems/animation/catalogs/RecoveryAnimations.d.ts +0 -5
- package/lib/systems/animation/catalogs/RecoveryAnimations.d.ts.map +1 -1
- package/lib/systems/animation/catalogs/RecoveryAnimations.js +0 -5
- package/lib/systems/animation/catalogs/RecoveryAnimations.js.map +1 -1
- package/lib/systems/animation/core/AnimationHitTiming.d.ts +0 -6
- package/lib/systems/animation/core/AnimationHitTiming.d.ts.map +1 -1
- package/lib/systems/animation/core/AnimationHitTiming.js +0 -4
- package/lib/systems/animation/core/AnimationHitTiming.js.map +1 -1
- package/lib/systems/animation/core/AnimationTransitions.d.ts +0 -3
- package/lib/systems/animation/core/AnimationTransitions.d.ts.map +1 -1
- package/lib/systems/animation/core/AnimationTransitions.js.map +1 -1
- package/lib/systems/animation/core/LateralityTransform.d.ts +0 -3
- package/lib/systems/animation/core/LateralityTransform.d.ts.map +1 -1
- package/lib/systems/animation/core/LateralityTransform.js +0 -1
- package/lib/systems/animation/core/LateralityTransform.js.map +1 -1
- package/lib/systems/animation/core/RecoveryPhaseEnhancer.d.ts +0 -1
- package/lib/systems/animation/core/RecoveryPhaseEnhancer.d.ts.map +1 -1
- package/lib/systems/animation/core/RecoveryPhaseEnhancer.js.map +1 -1
- package/lib/systems/animation/core/TechniqueAnimationMapper.d.ts +0 -10
- package/lib/systems/animation/core/TechniqueAnimationMapper.d.ts.map +1 -1
- package/lib/systems/animation/core/TechniqueAnimationMapper.js +0 -8
- package/lib/systems/animation/core/TechniqueAnimationMapper.js.map +1 -1
- package/lib/systems/animation/core/TrigramAnimationMapping.d.ts +0 -10
- package/lib/systems/animation/core/TrigramAnimationMapping.d.ts.map +1 -1
- package/lib/systems/animation/core/TrigramStanceTransitions.d.ts +0 -2
- package/lib/systems/animation/core/TrigramStanceTransitions.d.ts.map +1 -1
- package/lib/systems/animation/core/types.d.ts +0 -39
- package/lib/systems/animation/core/types.d.ts.map +1 -1
- package/lib/systems/animation/core/types.js +0 -9
- package/lib/systems/animation/core/types.js.map +1 -1
- package/lib/systems/animation/systems/AdvancedJointMovements.d.ts +0 -27
- package/lib/systems/animation/systems/AdvancedJointMovements.d.ts.map +1 -1
- package/lib/systems/animation/systems/AdvancedJointMovements.js +0 -1
- package/lib/systems/animation/systems/AdvancedJointMovements.js.map +1 -1
- package/lib/systems/animation/systems/BodyFacingSystem.d.ts +0 -19
- package/lib/systems/animation/systems/BodyFacingSystem.d.ts.map +1 -1
- package/lib/systems/animation/systems/BodyFacingSystem.js +0 -14
- package/lib/systems/animation/systems/BodyFacingSystem.js.map +1 -1
- package/lib/systems/animation/systems/FacialExpressions.d.ts +0 -10
- package/lib/systems/animation/systems/FacialExpressions.d.ts.map +1 -1
- package/lib/systems/animation/systems/FacialExpressions.js +0 -2
- package/lib/systems/animation/systems/FacialExpressions.js.map +1 -1
- package/lib/systems/animation/systems/FallAnimations.d.ts +0 -4
- package/lib/systems/animation/systems/FallAnimations.d.ts.map +1 -1
- package/lib/systems/animation/systems/FallAnimations.js +0 -2
- package/lib/systems/animation/systems/FallAnimations.js.map +1 -1
- package/lib/systems/animation/systems/HeadMovements.d.ts +0 -10
- package/lib/systems/animation/systems/HeadMovements.d.ts.map +1 -1
- package/lib/systems/bodypart/BodyPartDamageIntegration.d.ts +0 -7
- package/lib/systems/bodypart/BodyPartDamageIntegration.d.ts.map +1 -1
- package/lib/systems/bodypart/BodyPartDamageIntegration.js +0 -7
- package/lib/systems/bodypart/BodyPartDamageIntegration.js.map +1 -1
- package/lib/systems/bodypart/BodyPartHealthSystem.d.ts +0 -13
- package/lib/systems/bodypart/BodyPartHealthSystem.d.ts.map +1 -1
- package/lib/systems/bodypart/BodyPartHealthSystem.js +0 -13
- package/lib/systems/bodypart/BodyPartHealthSystem.js.map +1 -1
- package/lib/systems/bodypart/BodyPartPositionMapping.d.ts +0 -6
- package/lib/systems/bodypart/BodyPartPositionMapping.d.ts.map +1 -1
- package/lib/systems/bodypart/BodyPartPositionMapping.js +0 -6
- package/lib/systems/bodypart/BodyPartPositionMapping.js.map +1 -1
- package/lib/systems/bodypart/CombatInjuryIntegration.d.ts +0 -10
- package/lib/systems/bodypart/CombatInjuryIntegration.d.ts.map +1 -1
- package/lib/systems/bodypart/CombatInjuryIntegration.js +0 -8
- package/lib/systems/bodypart/CombatInjuryIntegration.js.map +1 -1
- package/lib/systems/bodypart/InjuryIntegration.d.ts +0 -2
- package/lib/systems/bodypart/InjuryIntegration.d.ts.map +1 -1
- package/lib/systems/bodypart/InjuryIntegration.js +0 -2
- package/lib/systems/bodypart/InjuryIntegration.js.map +1 -1
- package/lib/systems/bodypart/InjuryTracker.d.ts +0 -14
- package/lib/systems/bodypart/InjuryTracker.d.ts.map +1 -1
- package/lib/systems/bodypart/InjuryTracker.js +0 -12
- package/lib/systems/bodypart/InjuryTracker.js.map +1 -1
- package/lib/systems/bodypart/MovementPenaltySystem.d.ts +0 -8
- package/lib/systems/bodypart/MovementPenaltySystem.d.ts.map +1 -1
- package/lib/systems/bodypart/MovementPenaltySystem.js +0 -8
- package/lib/systems/bodypart/MovementPenaltySystem.js.map +1 -1
- package/lib/systems/bodypart/PlayerInjuryTrackingManager.d.ts +0 -8
- package/lib/systems/bodypart/PlayerInjuryTrackingManager.d.ts.map +1 -1
- package/lib/systems/bodypart/PlayerInjuryTrackingManager.js +0 -8
- package/lib/systems/bodypart/PlayerInjuryTrackingManager.js.map +1 -1
- package/lib/systems/bodypart/types.d.ts +0 -13
- package/lib/systems/bodypart/types.d.ts.map +1 -1
- package/lib/systems/bodypart/types.js +0 -5
- package/lib/systems/bodypart/types.js.map +1 -1
- package/lib/systems/breathing/BreathingDisruptionSystem.d.ts +0 -3
- package/lib/systems/breathing/BreathingDisruptionSystem.d.ts.map +1 -1
- package/lib/systems/breathing/BreathingDisruptionSystem.js +0 -2
- package/lib/systems/breathing/BreathingDisruptionSystem.js.map +1 -1
- package/lib/systems/combat/BalanceSystem.d.ts +0 -25
- package/lib/systems/combat/BalanceSystem.d.ts.map +1 -1
- package/lib/systems/combat/BalanceSystem.js +0 -25
- package/lib/systems/combat/BalanceSystem.js.map +1 -1
- package/lib/systems/combat/BreakingStatusEffects.d.ts +0 -4
- package/lib/systems/combat/BreakingStatusEffects.d.ts.map +1 -1
- package/lib/systems/combat/BreakingStatusEffects.js +0 -3
- package/lib/systems/combat/BreakingStatusEffects.js.map +1 -1
- package/lib/systems/combat/CombatStateSystem.d.ts +0 -9
- package/lib/systems/combat/CombatStateSystem.d.ts.map +1 -1
- package/lib/systems/combat/CombatStateSystem.js +0 -9
- package/lib/systems/combat/CombatStateSystem.js.map +1 -1
- package/lib/systems/combat/ConsciousnessSystem.d.ts +0 -16
- package/lib/systems/combat/ConsciousnessSystem.d.ts.map +1 -1
- package/lib/systems/combat/ConsciousnessSystem.js +0 -16
- package/lib/systems/combat/ConsciousnessSystem.js.map +1 -1
- package/lib/systems/combat/FallIntegration.d.ts +0 -3
- package/lib/systems/combat/FallIntegration.d.ts.map +1 -1
- package/lib/systems/combat/FallIntegration.js +0 -3
- package/lib/systems/combat/FallIntegration.js.map +1 -1
- package/lib/systems/combat/GrappleSystem.d.ts +0 -2
- package/lib/systems/combat/GrappleSystem.d.ts.map +1 -1
- package/lib/systems/combat/GrappleSystem.js +0 -2
- package/lib/systems/combat/GrappleSystem.js.map +1 -1
- package/lib/systems/combat/LimbExposureSystem.d.ts +0 -7
- package/lib/systems/combat/LimbExposureSystem.d.ts.map +1 -1
- package/lib/systems/combat/LimbExposureSystem.js +0 -7
- package/lib/systems/combat/LimbExposureSystem.js.map +1 -1
- package/lib/systems/combat/PainResponseSystem.d.ts +0 -11
- package/lib/systems/combat/PainResponseSystem.d.ts.map +1 -1
- package/lib/systems/combat/PainResponseSystem.js +0 -11
- package/lib/systems/combat/PainResponseSystem.js.map +1 -1
- package/lib/systems/combat/painConsciousnessUtils.d.ts +0 -7
- package/lib/systems/combat/painConsciousnessUtils.d.ts.map +1 -1
- package/lib/systems/combat/painConsciousnessUtils.js +0 -7
- package/lib/systems/combat/painConsciousnessUtils.js.map +1 -1
- package/lib/systems/effects.d.ts +11 -0
- package/lib/systems/effects.d.ts.map +1 -1
- package/lib/systems/effects.js +10 -0
- package/lib/systems/effects.js.map +1 -1
- package/lib/systems/game.d.ts +16 -0
- package/lib/systems/game.d.ts.map +1 -1
- package/lib/systems/game.js +1 -0
- package/lib/systems/game.js.map +1 -1
- package/lib/systems/index.d.ts +5 -1
- package/lib/systems/index.d.ts.map +1 -1
- package/lib/systems/index.js.map +1 -1
- package/lib/systems/movement/InjuryMovementModifier.d.ts +0 -10
- package/lib/systems/movement/InjuryMovementModifier.d.ts.map +1 -1
- package/lib/systems/movement/InjuryMovementModifier.js +0 -7
- package/lib/systems/movement/InjuryMovementModifier.js.map +1 -1
- package/lib/systems/movement/integration.d.ts +0 -3
- package/lib/systems/movement/integration.d.ts.map +1 -1
- package/lib/systems/movement/integration.js +0 -3
- package/lib/systems/movement/integration.js.map +1 -1
- package/lib/systems/physics/AttackMovementPhysics.d.ts +0 -9
- package/lib/systems/physics/AttackMovementPhysics.d.ts.map +1 -1
- package/lib/systems/physics/AttackMovementPhysics.js +0 -7
- package/lib/systems/physics/AttackMovementPhysics.js.map +1 -1
- package/lib/systems/physics/CollisionDetection.d.ts +0 -6
- package/lib/systems/physics/CollisionDetection.d.ts.map +1 -1
- package/lib/systems/physics/CollisionDetection.js +0 -6
- package/lib/systems/physics/CollisionDetection.js.map +1 -1
- package/lib/systems/physics/CoordinateMapper.d.ts +0 -1
- package/lib/systems/physics/CoordinateMapper.d.ts.map +1 -1
- package/lib/systems/physics/CoordinateMapper.js +0 -1
- package/lib/systems/physics/CoordinateMapper.js.map +1 -1
- package/lib/systems/physics/KnockbackPhysics.d.ts +0 -11
- package/lib/systems/physics/KnockbackPhysics.d.ts.map +1 -1
- package/lib/systems/physics/KnockbackPhysics.js +0 -8
- package/lib/systems/physics/KnockbackPhysics.js.map +1 -1
- package/lib/systems/physics/MovementPhysics.d.ts +0 -10
- package/lib/systems/physics/MovementPhysics.d.ts.map +1 -1
- package/lib/systems/physics/MovementPhysics.js +0 -8
- package/lib/systems/physics/MovementPhysics.js.map +1 -1
- package/lib/systems/physics/PhysicalReachCalculator.d.ts +0 -6
- package/lib/systems/physics/PhysicalReachCalculator.d.ts.map +1 -1
- package/lib/systems/physics/PhysicalReachCalculator.js +0 -5
- package/lib/systems/physics/PhysicalReachCalculator.js.map +1 -1
- package/lib/systems/physics/SpeedModifierSystem.d.ts +0 -5
- package/lib/systems/physics/SpeedModifierSystem.d.ts.map +1 -1
- package/lib/systems/physics/SpeedModifierSystem.js +0 -4
- package/lib/systems/physics/SpeedModifierSystem.js.map +1 -1
- package/lib/systems/player.d.ts +0 -5
- package/lib/systems/player.d.ts.map +1 -1
- package/lib/systems/trigram/TrigramCalculator.d.ts +0 -1
- package/lib/systems/trigram/TrigramCalculator.d.ts.map +1 -1
- package/lib/systems/trigram/TrigramCalculator.js +0 -1
- package/lib/systems/trigram/TrigramCalculator.js.map +1 -1
- package/lib/systems/trigram/types.d.ts +0 -4
- package/lib/systems/trigram/types.d.ts.map +1 -1
- package/lib/systems/trigram/types.js +0 -2
- package/lib/systems/trigram/types.js.map +1 -1
- package/lib/systems/types.d.ts +7 -2
- package/lib/systems/types.d.ts.map +1 -1
- package/lib/systems/types.js.map +1 -1
- package/lib/systems/vitalpoint/DamageCalculator.d.ts +0 -3
- package/lib/systems/vitalpoint/DamageCalculator.d.ts.map +1 -1
- package/lib/systems/vitalpoint/DamageCalculator.js +0 -3
- package/lib/systems/vitalpoint/DamageCalculator.js.map +1 -1
- package/lib/systems/vitalpoint/KoreanVitalPoints.d.ts +0 -8
- package/lib/systems/vitalpoint/KoreanVitalPoints.d.ts.map +1 -1
- package/lib/systems/vitalpoint/KoreanVitalPoints.js +0 -8
- package/lib/systems/vitalpoint/KoreanVitalPoints.js.map +1 -1
- package/lib/systems/vitalpoint/VitalPointsData.d.ts +0 -3
- package/lib/systems/vitalpoint/VitalPointsData.d.ts.map +1 -1
- package/lib/systems/vitalpoint/VitalPointsData.js +0 -1
- package/lib/systems/vitalpoint/VitalPointsData.js.map +1 -1
- package/lib/types/PhysicsTypes.d.ts +21 -78
- package/lib/types/PhysicsTypes.d.ts.map +1 -1
- package/lib/types/PhysicsTypes.js +17 -63
- package/lib/types/PhysicsTypes.js.map +1 -1
- package/lib/types/clothing.d.ts +0 -9
- package/lib/types/clothing.d.ts.map +1 -1
- package/lib/types/constants/animations.d.ts +35 -1
- package/lib/types/constants/animations.d.ts.map +1 -1
- package/lib/types/constants/animations.js +12 -1
- package/lib/types/constants/animations.js.map +1 -1
- package/lib/types/constants/colors.d.ts +28 -2
- package/lib/types/constants/colors.d.ts.map +1 -1
- package/lib/types/constants/colors.js +30 -4
- package/lib/types/constants/colors.js.map +1 -1
- package/lib/types/constants/index.d.ts +5 -1
- package/lib/types/constants/index.d.ts.map +1 -1
- package/lib/types/constants/index.js.map +1 -1
- package/lib/types/constants/performance.d.ts +0 -2
- package/lib/types/constants/performance.d.ts.map +1 -1
- package/lib/types/constants/performance.js +0 -2
- package/lib/types/constants/performance.js.map +1 -1
- package/lib/types/constants/typography.d.ts +40 -2
- package/lib/types/constants/typography.d.ts.map +1 -1
- package/lib/types/constants/typography.js +40 -2
- package/lib/types/constants/typography.js.map +1 -1
- package/lib/types/constants/ui.d.ts +89 -1
- package/lib/types/constants/ui.d.ts.map +1 -1
- package/lib/types/constants/ui.js +33 -1
- package/lib/types/constants/ui.js.map +1 -1
- package/lib/types/facial.d.ts +0 -15
- package/lib/types/facial.d.ts.map +1 -1
- package/lib/types/facial.js +0 -8
- package/lib/types/facial.js.map +1 -1
- package/lib/types/hand-animation.d.ts +34 -147
- package/lib/types/hand-animation.d.ts.map +1 -1
- package/lib/types/hand-animation.js +0 -2
- package/lib/types/hand-animation.js.map +1 -1
- package/lib/types/injury.d.ts +0 -2
- package/lib/types/injury.d.ts.map +1 -1
- package/lib/types/injury.js +0 -1
- package/lib/types/injury.js.map +1 -1
- package/lib/types/physics.d.ts +0 -21
- package/lib/types/physics.d.ts.map +1 -1
- package/lib/types/physics.js +0 -6
- package/lib/types/physics.js.map +1 -1
- package/lib/types/physicsConstants.d.ts +0 -12
- package/lib/types/physicsConstants.d.ts.map +1 -1
- package/lib/types/physicsConstants.js +0 -12
- package/lib/types/physicsConstants.js.map +1 -1
- package/lib/types/player-visual.d.ts +45 -189
- package/lib/types/player-visual.d.ts.map +1 -1
- package/lib/types/technique.d.ts +1 -5
- package/lib/types/technique.d.ts.map +1 -1
- package/lib/types/techniqueId.d.ts +0 -1
- package/lib/types/techniqueId.d.ts.map +1 -1
- package/lib/types/techniqueId.js +0 -1
- package/lib/types/techniqueId.js.map +1 -1
- package/lib/utils/arenaWorldDimensions.d.ts +0 -11
- package/lib/utils/arenaWorldDimensions.d.ts.map +1 -1
- package/lib/utils/arenaWorldDimensions.js +0 -6
- package/lib/utils/arenaWorldDimensions.js.map +1 -1
- package/lib/utils/controlMapping.d.ts +3 -4
- package/lib/utils/controlMapping.d.ts.map +1 -1
- package/lib/utils/controlMapping.js +1 -2
- package/lib/utils/controlMapping.js.map +1 -1
- package/lib/utils/deviceDetection.d.ts +0 -5
- package/lib/utils/deviceDetection.d.ts.map +1 -1
- package/lib/utils/deviceDetection.js +0 -5
- package/lib/utils/deviceDetection.js.map +1 -1
- package/lib/utils/hapticFeedback.d.ts +23 -95
- package/lib/utils/hapticFeedback.d.ts.map +1 -1
- package/lib/utils/hapticFeedback.js +9 -39
- package/lib/utils/hapticFeedback.js.map +1 -1
- package/lib/utils/haptics.d.ts +0 -3
- package/lib/utils/haptics.d.ts.map +1 -1
- package/lib/utils/haptics.js +0 -1
- package/lib/utils/haptics.js.map +1 -1
- package/lib/utils/math.d.ts +0 -3
- package/lib/utils/math.d.ts.map +1 -1
- package/lib/utils/math.js +0 -2
- package/lib/utils/math.js.map +1 -1
- package/lib/utils/mobileLayoutHelpers.d.ts +0 -3
- package/lib/utils/mobileLayoutHelpers.d.ts.map +1 -1
- package/lib/utils/mobileLayoutHelpers.js +0 -1
- package/lib/utils/mobileLayoutHelpers.js.map +1 -1
- package/lib/utils/mobileUIUtils.d.ts +5 -100
- package/lib/utils/mobileUIUtils.d.ts.map +1 -1
- package/lib/utils/mobileUIUtils.js +0 -9
- package/lib/utils/mobileUIUtils.js.map +1 -1
- package/lib/utils/physicalAttributeValidation.d.ts.map +1 -1
- package/lib/utils/player3DHelpers.d.ts.map +1 -1
- package/lib/utils/player3DHelpers.js.map +1 -1
- package/lib/utils/responsiveLayoutHelpers.d.ts +0 -65
- package/lib/utils/responsiveLayoutHelpers.d.ts.map +1 -1
- package/lib/utils/responsiveLayoutHelpers.js +0 -65
- package/lib/utils/responsiveLayoutHelpers.js.map +1 -1
- package/lib/utils/responsiveOrientationConstants.d.ts +0 -7
- package/lib/utils/responsiveOrientationConstants.d.ts.map +1 -1
- package/lib/utils/responsiveOrientationConstants.js +0 -7
- package/lib/utils/responsiveOrientationConstants.js.map +1 -1
- package/lib/utils/safeAreaUtils.d.ts +0 -6
- package/lib/utils/safeAreaUtils.d.ts.map +1 -1
- package/lib/utils/safeAreaUtils.js +0 -2
- package/lib/utils/safeAreaUtils.js.map +1 -1
- package/lib/utils/sharedPhysicsConfig.d.ts +0 -4
- package/lib/utils/sharedPhysicsConfig.d.ts.map +1 -1
- package/lib/utils/sharedPhysicsConfig.js +0 -2
- package/lib/utils/sharedPhysicsConfig.js.map +1 -1
- package/lib/utils/skeletonScaling.d.ts +0 -9
- package/lib/utils/skeletonScaling.d.ts.map +1 -1
- package/lib/utils/skeletonScaling.js +0 -1
- package/lib/utils/skeletonScaling.js.map +1 -1
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GrappleSystem.js","names":[],"sources":["../../../src/systems/combat/GrappleSystem.ts"],"sourcesContent":["/**\n * Grappling System for Korean Martial Arts Combat\n *\n * **Korean**: 잡기 시스템 (Grapple System)\n *\n * Implements realistic grappling and takedown mechanics based on:\n * - **Hapkido (합기도)**: Joint locks and control techniques\n * - **Ssireum (씨름)**: Traditional Korean wrestling\n * - **GON Stance (곤괘)**: Earth stance grounding and control\n *\n * ## Core Mechanics\n *\n * 1. **Grab Initiation**: Establish grip on opponent's limb/body\n * 2. **Control Duration**: Maintain control with stamina cost\n * 3. **Grip Strength**: Affects escape difficulty and follow-up options\n * 4. **Escape Mechanics**: Based on strength, technique, and stamina\n * 5. **Follow-up Techniques**: Throws, takedowns, joint locks from control\n *\n * ## Phase 2 Enhancement\n *\n * Enhanced with Gon (Earth) trigram metadata integration:\n * - Uses `controlDuration` from ExtendedGonTechnique\n * - Supports authentic Ssireum/Hapkido control durations\n * - Maintains backward compatibility with non-Gon techniques\n *\n * @module systems/combat/GrappleSystem\n * @category Combat System\n * @korean 잡기시스템\n */\n\nimport type { PlayerState } from \"@/systems/player\";\nimport {\n CombatState,\n GrappleControl,\n GrappleState,\n GrappleTarget,\n TrigramStance,\n} from \"@/types\";\nimport { asExtendedGonTechnique } from \"../trigram/types/GonTechniqueExtensions\";\nimport type { KoreanTechnique } from \"../vitalpoint/types\";\n\n/**\n * Configuration for grappling mechanics.\n *\n * **Korean**: 잡기 설정 (Grapple Configuration)\n */\nexport interface GrappleConfig {\n /** Base stamina cost per second to maintain control */\n readonly baseStaminaCostPerSecond: number;\n /** Minimum grip strength to maintain control */\n readonly minGripStrength: number;\n /** Maximum grip strength value */\n readonly maxGripStrength: number;\n /** Base escape difficulty multiplier */\n readonly baseEscapeDifficulty: number;\n /** Stamina cost to attempt escape */\n readonly escapeStaminaCost: number;\n /** Minimum duration before escape is possible (ms) */\n readonly minControlDuration: number;\n}\n\n/**\n * Default grappling configuration values.\n */\nexport const DEFAULT_GRAPPLE_CONFIG: GrappleConfig = {\n baseStaminaCostPerSecond: 5,\n minGripStrength: 20,\n maxGripStrength: 100,\n baseEscapeDifficulty: 1.5,\n escapeStaminaCost: 15,\n minControlDuration: 500, // 0.5 seconds\n};\n\n/**\n * Grapple attempt result.\n *\n * **Korean**: 잡기 시도 결과 (Grapple Attempt Result)\n */\nexport interface GrappleAttemptResult {\n /** Whether the grapple was successful */\n readonly success: boolean;\n /** New grapple control state if successful */\n readonly grappleControl?: GrappleControl;\n /** Reason for failure if unsuccessful */\n readonly reason?: string;\n /** Stamina cost for the attempt */\n readonly staminaCost: number;\n}\n\n/**\n * Escape attempt result.\n *\n * **Korean**: 탈출 시도 결과 (Escape Attempt Result)\n */\nexport interface EscapeAttemptResult {\n /** Whether the escape was successful */\n readonly success: boolean;\n /** Updated grapple control state */\n readonly grappleControl: GrappleControl | null;\n /** Reason for failure if unsuccessful */\n readonly reason?: string;\n /** Stamina cost for the attempt */\n readonly staminaCost: number;\n}\n\n/**\n * Grappling System for control and hold mechanics.\n *\n * **Korean**: 잡기 시스템 (Grapple System)\n *\n * Manages grappling state between combatants, including grip strength,\n * control duration, escape mechanics, and follow-up techniques.\n */\nexport class GrappleSystem {\n private readonly config: GrappleConfig;\n\n constructor(config: Partial<GrappleConfig> = {}) {\n this.config = { ...DEFAULT_GRAPPLE_CONFIG, ...config };\n }\n\n /**\n * Attempt to initiate a grapple on target.\n *\n * **Korean**: 잡기 시도 (Attempt Grapple)\n *\n * @param attacker - Player attempting the grapple\n * @param defender - Target player\n * @param target - Body part to grapple\n * @param currentTime - Current game time in milliseconds\n * @returns Result of the grapple attempt\n */\n attemptGrapple(\n attacker: PlayerState,\n defender: PlayerState,\n target: GrappleTarget,\n currentTime: number\n ): GrappleAttemptResult {\n // Check if attacker can grapple\n if (attacker.combatState === CombatState.STUNNED) {\n return {\n success: false,\n reason: \"Attacker is stunned\",\n staminaCost: 0,\n };\n }\n\n // Check if attacker is already grappling someone else\n if (attacker.combatState === CombatState.GRAPPLING) {\n return {\n success: false,\n reason: \"Attacker is already grappling another opponent\",\n staminaCost: 0,\n };\n }\n\n if (attacker.stamina < this.config.escapeStaminaCost) {\n return {\n success: false,\n reason: \"Insufficient stamina\",\n staminaCost: 0,\n };\n }\n\n // Check if defender is already being grappled\n if (defender.combatState === CombatState.GRAPPLED) {\n return {\n success: false,\n reason: \"Target is already being grappled\",\n staminaCost: 0,\n };\n }\n\n // Calculate grip strength based on attacker attributes and stance\n const gripStrength = this.calculateGripStrength(attacker, target);\n\n // Calculate success chance based on attributes\n const successChance = this.calculateGrappleSuccessChance(\n attacker,\n defender,\n target\n );\n\n const roll = Math.random();\n const success = roll < successChance;\n\n if (success) {\n // Create grapple control - start with GRABBING state during initiation\n const grappleControl: GrappleControl = {\n state: GrappleState.GRABBING,\n target,\n controllerId: attacker.id,\n targetId: defender.id,\n gripStrength,\n duration: 0,\n startTime: currentTime,\n canEscape: false, // Initially cannot escape\n staminaCostPerSecond: this.calculateStaminaCost(target, gripStrength),\n };\n\n return {\n success: true,\n grappleControl,\n staminaCost: this.config.escapeStaminaCost,\n };\n }\n\n return {\n success: false,\n reason: `Grapple attempt failed (${Math.round(successChance * 100)}% chance)`,\n staminaCost: this.config.escapeStaminaCost * 0.5, // Half cost on failure\n };\n }\n\n /**\n * Update grapple control state over time.\n *\n * **Korean**: 잡기 업데이트 (Update Grapple)\n *\n * @param grappleControl - Current grapple control state\n * @param controller - Player maintaining control\n * @param target - Player being controlled\n * @param deltaTime - Time elapsed since last update (seconds)\n * @param currentTime - Current game time in milliseconds\n * @returns Updated grapple control or null if broken\n */\n updateGrapple(\n grappleControl: GrappleControl,\n controller: PlayerState,\n _target: PlayerState,\n deltaTime: number,\n currentTime: number\n ): GrappleControl | null {\n // Check if controller can maintain control\n if (\n controller.stamina < grappleControl.staminaCostPerSecond * deltaTime ||\n controller.combatState === CombatState.STUNNED\n ) {\n // Control broken due to stamina or state\n return null;\n }\n\n // Update duration\n const newDuration = currentTime - grappleControl.startTime;\n\n // Transition from GRABBING to CONTROLLING after initial establishment\n let newState = grappleControl.state;\n if (grappleControl.state === GrappleState.GRABBING && newDuration > 0) {\n newState = GrappleState.CONTROLLING;\n }\n\n // Decay grip strength slightly over time\n const gripDecayRate = 2; // points per second\n const rawGripStrength = grappleControl.gripStrength - gripDecayRate * deltaTime;\n\n // Check if grip strength has dropped too low\n if (rawGripStrength < this.config.minGripStrength) {\n return null;\n }\n\n const newGripStrength = rawGripStrength;\n\n // Allow escape attempts after minimum duration\n const canEscape = newDuration >= this.config.minControlDuration;\n\n return {\n ...grappleControl,\n state: newState,\n gripStrength: newGripStrength,\n duration: newDuration,\n canEscape,\n };\n }\n\n /**\n * Attempt to escape from a grapple.\n *\n * **Korean**: 탈출 시도 (Attempt Escape)\n *\n * @param grappleControl - Current grapple control state\n * @param controller - Player maintaining control\n * @param target - Player attempting to escape\n * @returns Result of the escape attempt\n */\n attemptEscape(\n grappleControl: GrappleControl,\n controller: PlayerState,\n target: PlayerState\n ): EscapeAttemptResult {\n // Check if escape is possible\n if (!grappleControl.canEscape) {\n return {\n success: false,\n grappleControl,\n reason: \"Cannot escape yet\",\n staminaCost: 0,\n };\n }\n\n // Check stamina\n if (target.stamina < this.config.escapeStaminaCost) {\n return {\n success: false,\n grappleControl,\n reason: \"Insufficient stamina\",\n staminaCost: 0,\n };\n }\n\n // Calculate escape chance\n const escapeChance = this.calculateEscapeChance(\n grappleControl,\n controller,\n target\n );\n\n const roll = Math.random();\n const success = roll < escapeChance;\n\n if (success) {\n return {\n success: true,\n grappleControl: null, // Escape successful, control broken\n staminaCost: this.config.escapeStaminaCost,\n };\n }\n\n // Escape failed, weaken grip slightly\n const weakenedGripStrength = Math.max(\n this.config.minGripStrength,\n grappleControl.gripStrength - 10\n );\n\n return {\n success: false,\n grappleControl: {\n ...grappleControl,\n gripStrength: weakenedGripStrength,\n },\n reason: `Escape failed (${Math.round(escapeChance * 100)}% chance)`,\n staminaCost: this.config.escapeStaminaCost,\n };\n }\n\n /**\n * Calculate grip strength based on attacker attributes and target.\n *\n * **Korean**: 악력 계산 (Calculate Grip Strength)\n *\n * @private\n */\n private calculateGripStrength(\n attacker: PlayerState,\n target: GrappleTarget\n ): number {\n // Base strength from attack power\n let strength = attacker.attackPower * 3;\n\n // Stance modifiers\n if (attacker.currentStance === TrigramStance.GON) {\n strength *= 1.3; // GON stance excels at grappling\n } else if (attacker.currentStance === TrigramStance.GAN) {\n strength *= 1.15; // GAN stance is also good for control\n }\n\n // Target modifiers\n switch (target) {\n case GrappleTarget.HAND:\n strength *= 1.1; // Easier to control hand\n break;\n case GrappleTarget.ARM:\n strength *= 1.0; // Standard difficulty\n break;\n case GrappleTarget.LEG:\n strength *= 0.9; // Harder to control leg\n break;\n case GrappleTarget.TORSO:\n strength *= 0.85; // Harder to control torso\n break;\n case GrappleTarget.NECK:\n strength *= 1.2; // High control but risky\n break;\n case GrappleTarget.BOTH_ARMS:\n strength *= 0.7; // Very hard to control both arms\n break;\n }\n\n return Math.min(this.config.maxGripStrength, strength);\n }\n\n /**\n * Calculate grapple success chance.\n *\n * **Korean**: 잡기 성공률 계산 (Calculate Grapple Success Chance)\n *\n * @private\n */\n private calculateGrappleSuccessChance(\n attacker: PlayerState,\n defender: PlayerState,\n target: GrappleTarget\n ): number {\n // Base chance from technique vs defense\n const attributeDiff = attacker.technique - defender.defense;\n let baseChance = 0.5 + attributeDiff * 0.02; // ±2% per point difference\n\n // Speed advantage\n if (attacker.speed > defender.speed) {\n baseChance += (attacker.speed - defender.speed) * 0.01;\n }\n\n // Stance modifiers\n if (attacker.currentStance === TrigramStance.GON) {\n baseChance += 0.15; // GON stance excels at grappling\n }\n\n if (defender.combatState === CombatState.ATTACKING) {\n baseChance += 0.2; // Easier to grapple during attack\n } else if (defender.combatState === CombatState.DEFENDING) {\n baseChance -= 0.15; // Harder to grapple defensive opponent\n }\n\n // Target difficulty\n switch (target) {\n case GrappleTarget.HAND:\n baseChance += 0.1; // Easier to grab hand\n break;\n case GrappleTarget.BOTH_ARMS:\n baseChance -= 0.2; // Much harder to grab both arms\n break;\n case GrappleTarget.NECK:\n baseChance -= 0.1; // Risky target\n break;\n }\n\n // Clamp between 0.05 and 0.95\n return Math.max(0.05, Math.min(0.95, baseChance));\n }\n\n /**\n * Calculate escape chance from grapple.\n *\n * **Korean**: 탈출 성공률 계산 (Calculate Escape Chance)\n *\n * @private\n */\n private calculateEscapeChance(\n grappleControl: GrappleControl,\n controller: PlayerState,\n target: PlayerState\n ): number {\n // Base chance from strength vs grip\n const gripFactor = grappleControl.gripStrength / this.config.maxGripStrength;\n let baseChance = 0.5 - gripFactor * 0.3; // Stronger grip = harder escape\n\n // Attribute comparison\n const strengthDiff = target.attackPower - controller.attackPower;\n baseChance += strengthDiff * 0.02;\n\n // Speed advantage helps escape\n if (target.speed > controller.speed) {\n baseChance += (target.speed - controller.speed) * 0.015;\n }\n\n // Technique helps find weaknesses in grip\n baseChance += target.technique * 0.005;\n\n // Stance modifiers - certain stances are better at escaping grapples\n // **Korean**: 곤(坤) 자세는 탈출에 유리 (+30%), 간(艮) 자세는 방어적인 탈출 (+15%)\n if (target.currentStance === TrigramStance.GON) {\n baseChance += 0.3; // GON stance excels at grounding and escape\n } else if (target.currentStance === TrigramStance.GAN) {\n baseChance += 0.15; // GAN stance has defensive escape advantage\n }\n\n // Time factor - longer control makes escape harder\n const durationSeconds = grappleControl.duration / 1000;\n const timePenalty = Math.min(0.2, durationSeconds * 0.02);\n baseChance -= timePenalty;\n\n // Clamp between 0.05 and 0.85\n return Math.max(0.05, Math.min(0.85, baseChance));\n }\n\n /**\n * Calculate stamina cost to maintain control.\n *\n * **Korean**: 체력 소모 계산 (Calculate Stamina Cost)\n *\n * @private\n */\n private calculateStaminaCost(\n target: GrappleTarget,\n gripStrength: number\n ): number {\n let cost = this.config.baseStaminaCostPerSecond;\n\n // Target affects stamina cost\n switch (target) {\n case GrappleTarget.HAND:\n cost *= 0.8; // Easier to maintain\n break;\n case GrappleTarget.ARM:\n cost *= 1.0; // Standard\n break;\n case GrappleTarget.LEG:\n cost *= 1.2; // Harder to maintain\n break;\n case GrappleTarget.TORSO:\n cost *= 1.3; // Much harder to maintain\n break;\n case GrappleTarget.NECK:\n cost *= 1.5; // Very demanding\n break;\n case GrappleTarget.BOTH_ARMS:\n cost *= 1.8; // Extremely demanding\n break;\n }\n\n // Higher grip strength costs more stamina\n const gripFactor = gripStrength / this.config.maxGripStrength;\n cost *= 0.7 + gripFactor * 0.6; // 70-130% based on grip\n\n return cost;\n }\n\n /**\n * Check if a grapple can be transitioned to a throw.\n *\n * **Korean**: 던지기 전환 확인 (Check Throw Transition)\n *\n * @param grappleControl - Current grapple control state\n * @param controller - Player attempting throw\n * @returns Whether throw transition is possible\n */\n canTransitionToThrow(\n grappleControl: GrappleControl,\n controller: PlayerState\n ): boolean {\n // Need sufficient control duration\n if (grappleControl.duration < 1000) {\n return false; // Need at least 1 second of control\n }\n\n // Need sufficient grip strength\n if (grappleControl.gripStrength < 60) {\n return false;\n }\n\n // Need sufficient stamina for throw\n if (controller.stamina < 20) {\n return false;\n }\n\n // Certain targets are better for throws\n const goodThrowTargets = [\n GrappleTarget.ARM,\n GrappleTarget.TORSO,\n GrappleTarget.BOTH_ARMS,\n ];\n\n return goodThrowTargets.includes(grappleControl.target);\n }\n\n /**\n * Check if a grapple can be transitioned to a joint lock.\n *\n * **Korean**: 관절기 전환 확인 (Check Joint Lock Transition)\n *\n * @param grappleControl - Current grapple control state\n * @param controller - Player attempting lock\n * @returns Whether joint lock transition is possible\n */\n canTransitionToJointLock(\n grappleControl: GrappleControl,\n controller: PlayerState\n ): boolean {\n // Need sufficient control duration\n if (grappleControl.duration < 800) {\n return false;\n }\n\n // Need high technique for joint locks\n if (controller.technique < 10) {\n return false;\n }\n\n // Joint locks work on limbs\n const lockTargets = [\n GrappleTarget.HAND,\n GrappleTarget.ARM,\n GrappleTarget.LEG,\n ];\n\n return lockTargets.includes(grappleControl.target);\n }\n\n /**\n * Get technique-specific control duration from Gon metadata.\n *\n * **Korean**: 기술별 제어 시간 조회 (Get Technique Control Duration)\n *\n * Retrieves the post-throw positional advantage duration from\n * ExtendedGonTechnique metadata. Falls back to default duration\n * if technique doesn't have Gon-specific enhancements.\n *\n * **Control Duration Philosophy**:\n * - Traditional Ssireum techniques (800-2000ms) provide longer control\n * - Aggressive slam techniques (800-1200ms) provide brief control\n * - Sacrifice throws (1500-2000ms) provide extended ground control\n *\n * **Use Cases**:\n * - Determining follow-up attack windows after throws\n * - Calculating defender recovery time before counterattack\n * - Applying post-throw positional advantage in game state\n *\n * @param technique - Korean martial arts technique (checks for ExtendedGonTechnique)\n * @param defaultDuration - Fallback duration if technique has no metadata (default: 1000ms)\n * @returns Control duration in milliseconds\n *\n * @example\n * ```typescript\n * const controlTime = grappleSystem.getTechniqueControlDuration(\n * ssireumThrowTechnique, // controlDuration: 1800\n * 1000 // default fallback\n * );\n * // Result: 1800ms (uses technique metadata)\n * ```\n *\n * @public\n * @korean 기술별제어시간조회\n */\n getTechniqueControlDuration(\n technique: KoreanTechnique,\n defaultDuration: number = 1000,\n ): number {\n // Use helper function for safe type casting\n const gonTechnique = asExtendedGonTechnique(technique);\n if (!gonTechnique) {\n // Non-Gon technique: use default duration\n return defaultDuration;\n }\n\n // Extract control duration from validated Gon technique\n return gonTechnique.controlDuration;\n }\n\n /**\n * Apply post-throw control advantage window.\n *\n * **Korean**: 던지기 후 우세 적용 (Apply Post-Throw Advantage)\n *\n * Creates a control advantage state after a successful throw,\n * using the technique's `controlDuration` to determine how long\n * the attacker maintains positional dominance.\n *\n * **Advantage Effects**:\n * - Attacker gains priority for follow-up attacks\n * - Defender must wait for control duration to expire\n * - Applies to throw transitions from grapple control\n *\n * @param technique - Throw technique executed\n * @param attackerId - Player who executed throw\n * @param defenderId - Player who was thrown\n * @param currentTime - Current game time in milliseconds\n * @returns Control advantage state with duration from technique metadata\n *\n * @example\n * ```typescript\n * const advantage = grappleSystem.applyPostThrowAdvantage(\n * ssireumThrowTechnique,\n * \"player1\",\n * \"player2\",\n * Date.now()\n * );\n * // advantage.duration = 1800ms (from technique metadata)\n * ```\n *\n * @public\n * @korean 던지기후우세적용\n */\n applyPostThrowAdvantage(\n technique: KoreanTechnique,\n attackerId: string,\n defenderId: string,\n currentTime: number,\n ): {\n controllerId: string;\n targetId: string;\n duration: number;\n startTime: number;\n endTime: number;\n } {\n // Get technique-specific control duration with 1200ms fallback\n const controlDuration = this.getTechniqueControlDuration(technique, 1200);\n\n return {\n controllerId: attackerId,\n targetId: defenderId,\n duration: controlDuration,\n startTime: currentTime,\n endTime: currentTime + controlDuration,\n };\n }\n}\n\nexport default GrappleSystem;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"GrappleSystem.js","names":[],"sources":["../../../src/systems/combat/GrappleSystem.ts"],"sourcesContent":["/**\n * Grappling System for Korean Martial Arts Combat\n *\n * **Korean**: 잡기 시스템 (Grapple System)\n *\n * Implements realistic grappling and takedown mechanics based on:\n * - **Hapkido (합기도)**: Joint locks and control techniques\n * - **Ssireum (씨름)**: Traditional Korean wrestling\n * - **GON Stance (곤괘)**: Earth stance grounding and control\n *\n * ## Core Mechanics\n *\n * 1. **Grab Initiation**: Establish grip on opponent's limb/body\n * 2. **Control Duration**: Maintain control with stamina cost\n * 3. **Grip Strength**: Affects escape difficulty and follow-up options\n * 4. **Escape Mechanics**: Based on strength, technique, and stamina\n * 5. **Follow-up Techniques**: Throws, takedowns, joint locks from control\n *\n * ## Phase 2 Enhancement\n *\n * Enhanced with Gon (Earth) trigram metadata integration:\n * - Uses `controlDuration` from ExtendedGonTechnique\n * - Supports authentic Ssireum/Hapkido control durations\n * - Maintains backward compatibility with non-Gon techniques\n *\n * @module systems/combat/GrappleSystem\n * @category Combat System\n * @korean 잡기시스템\n */\n\nimport type { PlayerState } from \"@/systems/player\";\nimport {\n CombatState,\n GrappleControl,\n GrappleState,\n GrappleTarget,\n TrigramStance,\n} from \"@/types\";\nimport { asExtendedGonTechnique } from \"../trigram/types/GonTechniqueExtensions\";\nimport type { KoreanTechnique } from \"../vitalpoint/types\";\n\n/**\n * Configuration for grappling mechanics.\n *\n * **Korean**: 잡기 설정 (Grapple Configuration)\n */\nexport interface GrappleConfig {\n /** Base stamina cost per second to maintain control */\n readonly baseStaminaCostPerSecond: number;\n /** Minimum grip strength to maintain control */\n readonly minGripStrength: number;\n /** Maximum grip strength value */\n readonly maxGripStrength: number;\n /** Base escape difficulty multiplier */\n readonly baseEscapeDifficulty: number;\n /** Stamina cost to attempt escape */\n readonly escapeStaminaCost: number;\n /** Minimum duration before escape is possible (ms) */\n readonly minControlDuration: number;\n}\n\n/**\n * Default grappling configuration values.\n */\nexport const DEFAULT_GRAPPLE_CONFIG: GrappleConfig = {\n baseStaminaCostPerSecond: 5,\n minGripStrength: 20,\n maxGripStrength: 100,\n baseEscapeDifficulty: 1.5,\n escapeStaminaCost: 15,\n minControlDuration: 500, // 0.5 seconds\n};\n\n/**\n * Grapple attempt result.\n *\n * **Korean**: 잡기 시도 결과 (Grapple Attempt Result)\n */\nexport interface GrappleAttemptResult {\n /** Whether the grapple was successful */\n readonly success: boolean;\n /** New grapple control state if successful */\n readonly grappleControl?: GrappleControl;\n /** Reason for failure if unsuccessful */\n readonly reason?: string;\n /** Stamina cost for the attempt */\n readonly staminaCost: number;\n}\n\n/**\n * Escape attempt result.\n *\n * **Korean**: 탈출 시도 결과 (Escape Attempt Result)\n */\nexport interface EscapeAttemptResult {\n /** Whether the escape was successful */\n readonly success: boolean;\n /** Updated grapple control state */\n readonly grappleControl: GrappleControl | null;\n /** Reason for failure if unsuccessful */\n readonly reason?: string;\n /** Stamina cost for the attempt */\n readonly staminaCost: number;\n}\n\n/**\n * Grappling System for control and hold mechanics.\n *\n * **Korean**: 잡기 시스템 (Grapple System)\n *\n * Manages grappling state between combatants, including grip strength,\n * control duration, escape mechanics, and follow-up techniques.\n */\nexport class GrappleSystem {\n private readonly config: GrappleConfig;\n\n constructor(config: Partial<GrappleConfig> = {}) {\n this.config = { ...DEFAULT_GRAPPLE_CONFIG, ...config };\n }\n\n /**\n * Attempt to initiate a grapple on target.\n *\n * **Korean**: 잡기 시도 (Attempt Grapple)\n *\n * @param attacker - Player attempting the grapple\n * @param defender - Target player\n * @param target - Body part to grapple\n * @param currentTime - Current game time in milliseconds\n * @returns Result of the grapple attempt\n */\n attemptGrapple(\n attacker: PlayerState,\n defender: PlayerState,\n target: GrappleTarget,\n currentTime: number\n ): GrappleAttemptResult {\n // Check if attacker can grapple\n if (attacker.combatState === CombatState.STUNNED) {\n return {\n success: false,\n reason: \"Attacker is stunned\",\n staminaCost: 0,\n };\n }\n\n // Check if attacker is already grappling someone else\n if (attacker.combatState === CombatState.GRAPPLING) {\n return {\n success: false,\n reason: \"Attacker is already grappling another opponent\",\n staminaCost: 0,\n };\n }\n\n if (attacker.stamina < this.config.escapeStaminaCost) {\n return {\n success: false,\n reason: \"Insufficient stamina\",\n staminaCost: 0,\n };\n }\n\n // Check if defender is already being grappled\n if (defender.combatState === CombatState.GRAPPLED) {\n return {\n success: false,\n reason: \"Target is already being grappled\",\n staminaCost: 0,\n };\n }\n\n // Calculate grip strength based on attacker attributes and stance\n const gripStrength = this.calculateGripStrength(attacker, target);\n\n // Calculate success chance based on attributes\n const successChance = this.calculateGrappleSuccessChance(\n attacker,\n defender,\n target\n );\n\n const roll = Math.random();\n const success = roll < successChance;\n\n if (success) {\n // Create grapple control - start with GRABBING state during initiation\n const grappleControl: GrappleControl = {\n state: GrappleState.GRABBING,\n target,\n controllerId: attacker.id,\n targetId: defender.id,\n gripStrength,\n duration: 0,\n startTime: currentTime,\n canEscape: false, // Initially cannot escape\n staminaCostPerSecond: this.calculateStaminaCost(target, gripStrength),\n };\n\n return {\n success: true,\n grappleControl,\n staminaCost: this.config.escapeStaminaCost,\n };\n }\n\n return {\n success: false,\n reason: `Grapple attempt failed (${Math.round(successChance * 100)}% chance)`,\n staminaCost: this.config.escapeStaminaCost * 0.5, // Half cost on failure\n };\n }\n\n /**\n * Update grapple control state over time.\n *\n * **Korean**: 잡기 업데이트 (Update Grapple)\n *\n * @param grappleControl - Current grapple control state\n * @param controller - Player maintaining control\n * @param target - Player being controlled\n * @param deltaTime - Time elapsed since last update (seconds)\n * @param currentTime - Current game time in milliseconds\n * @returns Updated grapple control or null if broken\n */\n updateGrapple(\n grappleControl: GrappleControl,\n controller: PlayerState,\n _target: PlayerState,\n deltaTime: number,\n currentTime: number\n ): GrappleControl | null {\n // Check if controller can maintain control\n if (\n controller.stamina < grappleControl.staminaCostPerSecond * deltaTime ||\n controller.combatState === CombatState.STUNNED\n ) {\n // Control broken due to stamina or state\n return null;\n }\n\n // Update duration\n const newDuration = currentTime - grappleControl.startTime;\n\n // Transition from GRABBING to CONTROLLING after initial establishment\n let newState = grappleControl.state;\n if (grappleControl.state === GrappleState.GRABBING && newDuration > 0) {\n newState = GrappleState.CONTROLLING;\n }\n\n // Decay grip strength slightly over time\n const gripDecayRate = 2; // points per second\n const rawGripStrength = grappleControl.gripStrength - gripDecayRate * deltaTime;\n\n // Check if grip strength has dropped too low\n if (rawGripStrength < this.config.minGripStrength) {\n return null;\n }\n\n const newGripStrength = rawGripStrength;\n\n // Allow escape attempts after minimum duration\n const canEscape = newDuration >= this.config.minControlDuration;\n\n return {\n ...grappleControl,\n state: newState,\n gripStrength: newGripStrength,\n duration: newDuration,\n canEscape,\n };\n }\n\n /**\n * Attempt to escape from a grapple.\n *\n * **Korean**: 탈출 시도 (Attempt Escape)\n *\n * @param grappleControl - Current grapple control state\n * @param controller - Player maintaining control\n * @param target - Player attempting to escape\n * @returns Result of the escape attempt\n */\n attemptEscape(\n grappleControl: GrappleControl,\n controller: PlayerState,\n target: PlayerState\n ): EscapeAttemptResult {\n // Check if escape is possible\n if (!grappleControl.canEscape) {\n return {\n success: false,\n grappleControl,\n reason: \"Cannot escape yet\",\n staminaCost: 0,\n };\n }\n\n // Check stamina\n if (target.stamina < this.config.escapeStaminaCost) {\n return {\n success: false,\n grappleControl,\n reason: \"Insufficient stamina\",\n staminaCost: 0,\n };\n }\n\n // Calculate escape chance\n const escapeChance = this.calculateEscapeChance(\n grappleControl,\n controller,\n target\n );\n\n const roll = Math.random();\n const success = roll < escapeChance;\n\n if (success) {\n return {\n success: true,\n grappleControl: null, // Escape successful, control broken\n staminaCost: this.config.escapeStaminaCost,\n };\n }\n\n // Escape failed, weaken grip slightly\n const weakenedGripStrength = Math.max(\n this.config.minGripStrength,\n grappleControl.gripStrength - 10\n );\n\n return {\n success: false,\n grappleControl: {\n ...grappleControl,\n gripStrength: weakenedGripStrength,\n },\n reason: `Escape failed (${Math.round(escapeChance * 100)}% chance)`,\n staminaCost: this.config.escapeStaminaCost,\n };\n }\n\n /**\n * Calculate grip strength based on attacker attributes and target.\n *\n * **Korean**: 악력 계산 (Calculate Grip Strength)\n *\n * @private\n */\n private calculateGripStrength(\n attacker: PlayerState,\n target: GrappleTarget\n ): number {\n // Base strength from attack power\n let strength = attacker.attackPower * 3;\n\n // Stance modifiers\n if (attacker.currentStance === TrigramStance.GON) {\n strength *= 1.3; // GON stance excels at grappling\n } else if (attacker.currentStance === TrigramStance.GAN) {\n strength *= 1.15; // GAN stance is also good for control\n }\n\n // Target modifiers\n switch (target) {\n case GrappleTarget.HAND:\n strength *= 1.1; // Easier to control hand\n break;\n case GrappleTarget.ARM:\n strength *= 1.0; // Standard difficulty\n break;\n case GrappleTarget.LEG:\n strength *= 0.9; // Harder to control leg\n break;\n case GrappleTarget.TORSO:\n strength *= 0.85; // Harder to control torso\n break;\n case GrappleTarget.NECK:\n strength *= 1.2; // High control but risky\n break;\n case GrappleTarget.BOTH_ARMS:\n strength *= 0.7; // Very hard to control both arms\n break;\n }\n\n return Math.min(this.config.maxGripStrength, strength);\n }\n\n /**\n * Calculate grapple success chance.\n *\n * **Korean**: 잡기 성공률 계산 (Calculate Grapple Success Chance)\n *\n * @private\n */\n private calculateGrappleSuccessChance(\n attacker: PlayerState,\n defender: PlayerState,\n target: GrappleTarget\n ): number {\n // Base chance from technique vs defense\n const attributeDiff = attacker.technique - defender.defense;\n let baseChance = 0.5 + attributeDiff * 0.02; // ±2% per point difference\n\n // Speed advantage\n if (attacker.speed > defender.speed) {\n baseChance += (attacker.speed - defender.speed) * 0.01;\n }\n\n // Stance modifiers\n if (attacker.currentStance === TrigramStance.GON) {\n baseChance += 0.15; // GON stance excels at grappling\n }\n\n if (defender.combatState === CombatState.ATTACKING) {\n baseChance += 0.2; // Easier to grapple during attack\n } else if (defender.combatState === CombatState.DEFENDING) {\n baseChance -= 0.15; // Harder to grapple defensive opponent\n }\n\n // Target difficulty\n switch (target) {\n case GrappleTarget.HAND:\n baseChance += 0.1; // Easier to grab hand\n break;\n case GrappleTarget.BOTH_ARMS:\n baseChance -= 0.2; // Much harder to grab both arms\n break;\n case GrappleTarget.NECK:\n baseChance -= 0.1; // Risky target\n break;\n }\n\n // Clamp between 0.05 and 0.95\n return Math.max(0.05, Math.min(0.95, baseChance));\n }\n\n /**\n * Calculate escape chance from grapple.\n *\n * **Korean**: 탈출 성공률 계산 (Calculate Escape Chance)\n *\n * @private\n */\n private calculateEscapeChance(\n grappleControl: GrappleControl,\n controller: PlayerState,\n target: PlayerState\n ): number {\n // Base chance from strength vs grip\n const gripFactor = grappleControl.gripStrength / this.config.maxGripStrength;\n let baseChance = 0.5 - gripFactor * 0.3; // Stronger grip = harder escape\n\n // Attribute comparison\n const strengthDiff = target.attackPower - controller.attackPower;\n baseChance += strengthDiff * 0.02;\n\n // Speed advantage helps escape\n if (target.speed > controller.speed) {\n baseChance += (target.speed - controller.speed) * 0.015;\n }\n\n // Technique helps find weaknesses in grip\n baseChance += target.technique * 0.005;\n\n // Stance modifiers - certain stances are better at escaping grapples\n // **Korean**: 곤(坤) 자세는 탈출에 유리 (+30%), 간(艮) 자세는 방어적인 탈출 (+15%)\n if (target.currentStance === TrigramStance.GON) {\n baseChance += 0.3; // GON stance excels at grounding and escape\n } else if (target.currentStance === TrigramStance.GAN) {\n baseChance += 0.15; // GAN stance has defensive escape advantage\n }\n\n // Time factor - longer control makes escape harder\n const durationSeconds = grappleControl.duration / 1000;\n const timePenalty = Math.min(0.2, durationSeconds * 0.02);\n baseChance -= timePenalty;\n\n // Clamp between 0.05 and 0.85\n return Math.max(0.05, Math.min(0.85, baseChance));\n }\n\n /**\n * Calculate stamina cost to maintain control.\n *\n * **Korean**: 체력 소모 계산 (Calculate Stamina Cost)\n *\n * @private\n */\n private calculateStaminaCost(\n target: GrappleTarget,\n gripStrength: number\n ): number {\n let cost = this.config.baseStaminaCostPerSecond;\n\n // Target affects stamina cost\n switch (target) {\n case GrappleTarget.HAND:\n cost *= 0.8; // Easier to maintain\n break;\n case GrappleTarget.ARM:\n cost *= 1.0; // Standard\n break;\n case GrappleTarget.LEG:\n cost *= 1.2; // Harder to maintain\n break;\n case GrappleTarget.TORSO:\n cost *= 1.3; // Much harder to maintain\n break;\n case GrappleTarget.NECK:\n cost *= 1.5; // Very demanding\n break;\n case GrappleTarget.BOTH_ARMS:\n cost *= 1.8; // Extremely demanding\n break;\n }\n\n // Higher grip strength costs more stamina\n const gripFactor = gripStrength / this.config.maxGripStrength;\n cost *= 0.7 + gripFactor * 0.6; // 70-130% based on grip\n\n return cost;\n }\n\n /**\n * Check if a grapple can be transitioned to a throw.\n *\n * **Korean**: 던지기 전환 확인 (Check Throw Transition)\n *\n * @param grappleControl - Current grapple control state\n * @param controller - Player attempting throw\n * @returns Whether throw transition is possible\n */\n canTransitionToThrow(\n grappleControl: GrappleControl,\n controller: PlayerState\n ): boolean {\n // Need sufficient control duration\n if (grappleControl.duration < 1000) {\n return false; // Need at least 1 second of control\n }\n\n // Need sufficient grip strength\n if (grappleControl.gripStrength < 60) {\n return false;\n }\n\n // Need sufficient stamina for throw\n if (controller.stamina < 20) {\n return false;\n }\n\n // Certain targets are better for throws\n const goodThrowTargets = [\n GrappleTarget.ARM,\n GrappleTarget.TORSO,\n GrappleTarget.BOTH_ARMS,\n ];\n\n return goodThrowTargets.includes(grappleControl.target);\n }\n\n /**\n * Check if a grapple can be transitioned to a joint lock.\n *\n * **Korean**: 관절기 전환 확인 (Check Joint Lock Transition)\n *\n * @param grappleControl - Current grapple control state\n * @param controller - Player attempting lock\n * @returns Whether joint lock transition is possible\n */\n canTransitionToJointLock(\n grappleControl: GrappleControl,\n controller: PlayerState\n ): boolean {\n // Need sufficient control duration\n if (grappleControl.duration < 800) {\n return false;\n }\n\n // Need high technique for joint locks\n if (controller.technique < 10) {\n return false;\n }\n\n // Joint locks work on limbs\n const lockTargets = [\n GrappleTarget.HAND,\n GrappleTarget.ARM,\n GrappleTarget.LEG,\n ];\n\n return lockTargets.includes(grappleControl.target);\n }\n\n /**\n * Get technique-specific control duration from Gon metadata.\n *\n * **Korean**: 기술별 제어 시간 조회 (Get Technique Control Duration)\n *\n * Retrieves the post-throw positional advantage duration from\n * ExtendedGonTechnique metadata. Falls back to default duration\n * if technique doesn't have Gon-specific enhancements.\n *\n * **Control Duration Philosophy**:\n * - Traditional Ssireum techniques (800-2000ms) provide longer control\n * - Aggressive slam techniques (800-1200ms) provide brief control\n * - Sacrifice throws (1500-2000ms) provide extended ground control\n *\n * **Use Cases**:\n * - Determining follow-up attack windows after throws\n * - Calculating defender recovery time before counterattack\n * - Applying post-throw positional advantage in game state\n *\n * @param technique - Korean martial arts technique (checks for ExtendedGonTechnique)\n * @param defaultDuration - Fallback duration if technique has no metadata (default: 1000ms)\n * @returns Control duration in milliseconds\n *\n * @example\n * ```typescript\n * const controlTime = grappleSystem.getTechniqueControlDuration(\n * ssireumThrowTechnique, // controlDuration: 1800\n * 1000 // default fallback\n * );\n * // Result: 1800ms (uses technique metadata)\n * ```\n *\n * @korean 기술별제어시간조회\n */\n getTechniqueControlDuration(\n technique: KoreanTechnique,\n defaultDuration: number = 1000,\n ): number {\n // Use helper function for safe type casting\n const gonTechnique = asExtendedGonTechnique(technique);\n if (!gonTechnique) {\n // Non-Gon technique: use default duration\n return defaultDuration;\n }\n\n // Extract control duration from validated Gon technique\n return gonTechnique.controlDuration;\n }\n\n /**\n * Apply post-throw control advantage window.\n *\n * **Korean**: 던지기 후 우세 적용 (Apply Post-Throw Advantage)\n *\n * Creates a control advantage state after a successful throw,\n * using the technique's `controlDuration` to determine how long\n * the attacker maintains positional dominance.\n *\n * **Advantage Effects**:\n * - Attacker gains priority for follow-up attacks\n * - Defender must wait for control duration to expire\n * - Applies to throw transitions from grapple control\n *\n * @param technique - Throw technique executed\n * @param attackerId - Player who executed throw\n * @param defenderId - Player who was thrown\n * @param currentTime - Current game time in milliseconds\n * @returns Control advantage state with duration from technique metadata\n *\n * @example\n * ```typescript\n * const advantage = grappleSystem.applyPostThrowAdvantage(\n * ssireumThrowTechnique,\n * \"player1\",\n * \"player2\",\n * Date.now()\n * );\n * // advantage.duration = 1800ms (from technique metadata)\n * ```\n *\n * @korean 던지기후우세적용\n */\n applyPostThrowAdvantage(\n technique: KoreanTechnique,\n attackerId: string,\n defenderId: string,\n currentTime: number,\n ): {\n controllerId: string;\n targetId: string;\n duration: number;\n startTime: number;\n endTime: number;\n } {\n // Get technique-specific control duration with 1200ms fallback\n const controlDuration = this.getTechniqueControlDuration(technique, 1200);\n\n return {\n controllerId: attackerId,\n targetId: defenderId,\n duration: controlDuration,\n startTime: currentTime,\n endTime: currentTime + controlDuration,\n };\n }\n}\n\nexport default GrappleSystem;\n"],"mappings":"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"}
|
|
@@ -31,7 +31,6 @@ import type { BreakingResult, BreakingTarget, CounterOpportunity, ExposedLimbTyp
|
|
|
31
31
|
* @param currentTime - Current time in technique execution (ms)
|
|
32
32
|
* @returns Counter opportunity if one exists, undefined otherwise
|
|
33
33
|
*
|
|
34
|
-
* @public
|
|
35
34
|
* @korean 반격기회계산
|
|
36
35
|
*/
|
|
37
36
|
export declare function calculateCounterOpportunity(technique: KoreanTechnique, currentTime: number): CounterOpportunity | undefined;
|
|
@@ -47,7 +46,6 @@ export declare function calculateCounterOpportunity(technique: KoreanTechnique,
|
|
|
47
46
|
* @param currentTime - Current time in technique execution (ms)
|
|
48
47
|
* @returns Vulnerability multiplier (1.0 = normal, >1.0 = more vulnerable)
|
|
49
48
|
*
|
|
50
|
-
* @public
|
|
51
49
|
* @korean 취약성배수계산
|
|
52
50
|
*/
|
|
53
51
|
export declare function calculateVulnerabilityMultiplier(technique: KoreanTechnique, currentTime: number): number;
|
|
@@ -63,7 +61,6 @@ export declare function calculateVulnerabilityMultiplier(technique: KoreanTechni
|
|
|
63
61
|
* @param isLeftSided - Whether the technique uses the left side
|
|
64
62
|
* @returns The exposed limb type
|
|
65
63
|
*
|
|
66
|
-
* @public
|
|
67
64
|
* @korean 노출사지결정
|
|
68
65
|
*/
|
|
69
66
|
export declare function determineExposedLimb(technique: KoreanTechnique, isLeftSided?: boolean): ExposedLimbType;
|
|
@@ -78,7 +75,6 @@ export declare function determineExposedLimb(technique: KoreanTechnique, isLeftS
|
|
|
78
75
|
* @param exposedLimb - The exposed limb
|
|
79
76
|
* @returns The breaking target joint/bone
|
|
80
77
|
*
|
|
81
|
-
* @public
|
|
82
78
|
* @korean 파쇄목표매핑
|
|
83
79
|
*/
|
|
84
80
|
export declare function mapLimbToBreakingTarget(exposedLimb: ExposedLimbType): BreakingTarget;
|
|
@@ -100,7 +96,6 @@ export declare function mapLimbToBreakingTarget(exposedLimb: ExposedLimbType): B
|
|
|
100
96
|
* extensibility. It may be used to apply technique-specific modifiers or
|
|
101
97
|
* validate technique compatibility with the breaking target.
|
|
102
98
|
*
|
|
103
|
-
* @public
|
|
104
99
|
* @korean 파쇄기술효과계산
|
|
105
100
|
*/
|
|
106
101
|
export declare function calculateBreakingResult(breakingTechnique: KoreanTechnique, counterOpportunity: CounterOpportunity, force: number): BreakingResult;
|
|
@@ -117,7 +112,6 @@ export declare function calculateBreakingResult(breakingTechnique: KoreanTechniq
|
|
|
117
112
|
* @param distance - Distance between attacker and defender (meters)
|
|
118
113
|
* @returns Whether the counter can be executed
|
|
119
114
|
*
|
|
120
|
-
* @public
|
|
121
115
|
* @korean 반격실행가능확인
|
|
122
116
|
*/
|
|
123
117
|
export declare function canExecuteCounter(defenderStamina: number, counterTechnique: KoreanTechnique, distance: number): boolean;
|
|
@@ -133,7 +127,6 @@ export declare function canExecuteCounter(defenderStamina: number, counterTechni
|
|
|
133
127
|
* @param technique - The technique to generate exposure for
|
|
134
128
|
* @returns Generated limb exposure window
|
|
135
129
|
*
|
|
136
|
-
* @public
|
|
137
130
|
* @korean 사지노출시간생성
|
|
138
131
|
*/
|
|
139
132
|
export declare function generateLimbExposureWindow(technique: KoreanTechnique): LimbExposureWindow;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LimbExposureSystem.d.ts","sourceRoot":"","sources":["../../../src/systems/combat/LimbExposureSystem.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAEnB,MAAM,qBAAqB,CAAC;AA8B7B
|
|
1
|
+
{"version":3,"file":"LimbExposureSystem.d.ts","sourceRoot":"","sources":["../../../src/systems/combat/LimbExposureSystem.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAEnB,MAAM,qBAAqB,CAAC;AA8B7B;;;;;;;;;;;;;GAaG;AACH,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,eAAe,EAC1B,WAAW,EAAE,MAAM,GAClB,kBAAkB,GAAG,SAAS,CAkChC;AA2DD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gCAAgC,CAC9C,SAAS,EAAE,eAAe,EAC1B,WAAW,EAAE,MAAM,GAClB,MAAM,CAoCR;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,eAAe,EAC1B,WAAW,GAAE,OAAe,GAC3B,eAAe,CAuCjB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,eAAe,GAC3B,cAAc,CAWhB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,uBAAuB,CACrC,iBAAiB,EAAE,eAAe,EAClC,kBAAkB,EAAE,kBAAkB,EACtC,KAAK,EAAE,MAAM,GACZ,cAAc,CA4EhB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAC/B,eAAe,EAAE,MAAM,EACvB,gBAAgB,EAAE,eAAe,EACjC,QAAQ,EAAE,MAAM,GACf,OAAO,CAYT;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,eAAe,GACzB,kBAAkB,CAqCpB;;;;;;;;;;AAED,wBAQE"}
|
|
@@ -35,7 +35,6 @@ var MAX_COUNTER_RANGE_METERS = 1;
|
|
|
35
35
|
* @param currentTime - Current time in technique execution (ms)
|
|
36
36
|
* @returns Counter opportunity if one exists, undefined otherwise
|
|
37
37
|
*
|
|
38
|
-
* @public
|
|
39
38
|
* @korean 반격기회계산
|
|
40
39
|
*/
|
|
41
40
|
function calculateCounterOpportunity(technique, currentTime) {
|
|
@@ -101,7 +100,6 @@ function getRecommendedCounters(exposedLimb, reachConfig, allowsBreaking) {
|
|
|
101
100
|
* @param currentTime - Current time in technique execution (ms)
|
|
102
101
|
* @returns Vulnerability multiplier (1.0 = normal, >1.0 = more vulnerable)
|
|
103
102
|
*
|
|
104
|
-
* @public
|
|
105
103
|
* @korean 취약성배수계산
|
|
106
104
|
*/
|
|
107
105
|
function calculateVulnerabilityMultiplier(technique, currentTime) {
|
|
@@ -132,7 +130,6 @@ function calculateVulnerabilityMultiplier(technique, currentTime) {
|
|
|
132
130
|
* @param isLeftSided - Whether the technique uses the left side
|
|
133
131
|
* @returns The exposed limb type
|
|
134
132
|
*
|
|
135
|
-
* @public
|
|
136
133
|
* @korean 노출사지결정
|
|
137
134
|
*/
|
|
138
135
|
function determineExposedLimb(technique, isLeftSided = false) {
|
|
@@ -161,7 +158,6 @@ function determineExposedLimb(technique, isLeftSided = false) {
|
|
|
161
158
|
* @param exposedLimb - The exposed limb
|
|
162
159
|
* @returns The breaking target joint/bone
|
|
163
160
|
*
|
|
164
|
-
* @public
|
|
165
161
|
* @korean 파쇄목표매핑
|
|
166
162
|
*/
|
|
167
163
|
function mapLimbToBreakingTarget(exposedLimb) {
|
|
@@ -191,7 +187,6 @@ function mapLimbToBreakingTarget(exposedLimb) {
|
|
|
191
187
|
* extensibility. It may be used to apply technique-specific modifiers or
|
|
192
188
|
* validate technique compatibility with the breaking target.
|
|
193
189
|
*
|
|
194
|
-
* @public
|
|
195
190
|
* @korean 파쇄기술효과계산
|
|
196
191
|
*/
|
|
197
192
|
function calculateBreakingResult(breakingTechnique, counterOpportunity, force) {
|
|
@@ -254,7 +249,6 @@ function calculateBreakingResult(breakingTechnique, counterOpportunity, force) {
|
|
|
254
249
|
* @param distance - Distance between attacker and defender (meters)
|
|
255
250
|
* @returns Whether the counter can be executed
|
|
256
251
|
*
|
|
257
|
-
* @public
|
|
258
252
|
* @korean 반격실행가능확인
|
|
259
253
|
*/
|
|
260
254
|
function canExecuteCounter(defenderStamina, counterTechnique, distance) {
|
|
@@ -274,7 +268,6 @@ function canExecuteCounter(defenderStamina, counterTechnique, distance) {
|
|
|
274
268
|
* @param technique - The technique to generate exposure for
|
|
275
269
|
* @returns Generated limb exposure window
|
|
276
270
|
*
|
|
277
|
-
* @public
|
|
278
271
|
* @korean 사지노출시간생성
|
|
279
272
|
*/
|
|
280
273
|
function generateLimbExposureWindow(technique) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LimbExposureSystem.js","names":[],"sources":["../../../src/systems/combat/LimbExposureSystem.ts"],"sourcesContent":["/**\n * Limb Exposure System for Counter-Attack Detection\n *\n * **Korean**: 사지 노출 시스템 (Saji Nochul System)\n *\n * Analyzes technique animations to determine when limbs become exposed and vulnerable\n * during attack execution. This enables:\n * - Defensive counter-attacks (반격 - banggyeok)\n * - Breaking techniques (파쇄기 - paswaegi)\n * - Exploiting overextension (과다신장 약점 - gwada sinjang yakjeom)\n *\n * **Martial Arts Philosophy**:\n * - **허점공격** (Heojeom Gonggyeok) - Attacking openings/weaknesses\n * - **후수필승** (Husu Pilseung) - Victory through counter-attack timing\n * - **이순응변** (Isun Eungbyeon) - Adapt and exploit opponent's mistakes\n *\n * @module systems/combat/LimbExposureSystem\n * @korean 사지노출시스템\n */\n\nimport type { KoreanTechnique } from \"../vitalpoint/types\";\nimport type {\n BreakingResult,\n BreakingTarget,\n CounterOpportunity,\n ExposedLimbType,\n LimbExposureWindow,\n PhysicalReachConfig,\n} from \"../../types/physics\";\nimport { BREAKING_STATUS_EFFECT_IDS } from \"./BreakingStatusEffects\";\n\n/**\n * Breaking technique constants\n * **Korean**: 파쇄기술 상수\n */\n\n/**\n * Minimum effective force required to successfully execute a breaking technique.\n * Force below this threshold will not break joints/bones.\n * Typical damage values range from 20-80, with 40 being the minimum for effective breaks.\n * @korean 파쇄최소힘\n */\nconst BREAKING_FORCE_THRESHOLD = 40;\n\n/**\n * Maximum effective force for calculating break severity on 0-1 scale.\n * Force values above 80 are clamped to 1.0 severity (complete break).\n * @korean 파쇄최대힘\n */\nconst BREAKING_MAX_FORCE = 80;\n\n/**\n * Maximum range in meters for executing counter-attacks.\n * Counter-attacks are close-range defensive techniques requiring proximity.\n * @korean 반격최대거리\n */\nconst MAX_COUNTER_RANGE_METERS = 1.0;\n\n/**\n * Calculate counter-attack opportunities from a technique's reach configuration.\n *\n * **Korean**: 반격 기회 계산\n *\n * Analyzes the technique's execution timeline and limb exposure to identify\n * windows where the opponent is vulnerable to counter-attacks.\n *\n * @param technique - The technique being executed\n * @param currentTime - Current time in technique execution (ms)\n * @returns Counter opportunity if one exists, undefined otherwise\n *\n * @public\n * @korean 반격기회계산\n */\nexport function calculateCounterOpportunity(\n technique: KoreanTechnique,\n currentTime: number\n): CounterOpportunity | undefined {\n const { reachConfig, executionTime } = technique;\n\n // No exposure window defined, no counter opportunity\n if (!reachConfig.exposureWindow) {\n return undefined;\n }\n\n const exposure = reachConfig.exposureWindow;\n\n // Calculate absolute timing of exposure window\n const windowStart = executionTime * exposure.startTime;\n const windowEnd = windowStart + exposure.duration;\n\n // Check if current time is within the exposure window\n if (currentTime < windowStart || currentTime > windowEnd) {\n return undefined;\n }\n\n // Determine recommended counter techniques based on exposed limb\n const recommendedCounters = getRecommendedCounters(\n exposure.exposedLimb,\n reachConfig,\n exposure.allowsBreaking\n );\n\n return {\n exposedLimb: exposure.exposedLimb,\n windowStart,\n windowDuration: exposure.duration,\n vulnerabilityMultiplier: exposure.vulnerabilityMultiplier,\n allowsBreaking: exposure.allowsBreaking,\n recommendedCounters,\n };\n}\n\n/**\n * Get recommended counter-technique IDs for an exposed limb.\n *\n * **Korean**: 추천 반격 기술 조회\n *\n * Returns technique IDs that would be effective against the exposed limb.\n * These IDs are string-based and should match techniques in the game's\n * technique library. When implementing, validate these IDs exist.\n *\n * **Note**: These are example/placeholder IDs. Actual implementation should\n * reference real technique definitions or use a typed enum of technique IDs.\n *\n * @param exposedLimb - The limb that is exposed\n * @param reachConfig - Reach configuration of the attacking technique\n * @param allowsBreaking - Whether breaking techniques are viable\n * @returns Array of recommended counter-technique IDs (unvalidated strings)\n *\n * @internal\n * @korean 추천반격기술조회\n */\nfunction getRecommendedCounters(\n exposedLimb: ExposedLimbType,\n reachConfig: PhysicalReachConfig,\n allowsBreaking: boolean\n): readonly string[] {\n const counters: string[] = [];\n\n // Breaking techniques for overextended limbs\n if (allowsBreaking) {\n if (exposedLimb.includes(\"leg\") || exposedLimb.includes(\"ankle\")) {\n counters.push(\"leg_sweep\", \"ankle_break\", \"knee_stomp\");\n } else if (exposedLimb.includes(\"knee\")) {\n counters.push(\"knee_break\", \"hyperextension_kick\");\n } else if (exposedLimb.includes(\"arm\") || exposedLimb.includes(\"elbow\")) {\n counters.push(\"arm_bar\", \"elbow_break\", \"joint_lock\");\n } else if (exposedLimb.includes(\"wrist\")) {\n counters.push(\"wrist_lock\", \"wrist_break\");\n }\n }\n\n // Vital point strikes on exposed limbs\n if (exposedLimb.includes(\"arm\")) {\n counters.push(\"ulnar_nerve_strike\", \"radial_nerve_pressure\");\n } else if (exposedLimb.includes(\"leg\")) {\n counters.push(\"peroneal_nerve_strike\", \"thigh_pressure_point\");\n }\n\n // Counter-strikes based on body part type\n if (reachConfig.bodyPart === \"leg\") {\n counters.push(\"leg_parry_counter\", \"inside_leg_kick\");\n } else if (reachConfig.bodyPart === \"arm\") {\n counters.push(\"arm_trap_counter\", \"redirect_punch\");\n }\n\n return counters;\n}\n\n/**\n * Calculate vulnerability multiplier for a technique at a specific time.\n *\n * **Korean**: 취약성 배수 계산\n *\n * Determines how vulnerable the attacker is at a given point in their\n * technique execution. Useful for damage calculation during counter-attacks.\n *\n * @param technique - The technique being executed\n * @param currentTime - Current time in technique execution (ms)\n * @returns Vulnerability multiplier (1.0 = normal, >1.0 = more vulnerable)\n *\n * @public\n * @korean 취약성배수계산\n */\nexport function calculateVulnerabilityMultiplier(\n technique: KoreanTechnique,\n currentTime: number\n): number {\n const { reachConfig, executionTime, recoveryTime } = technique;\n\n // No exposure window, return baseline vulnerability\n if (!reachConfig.exposureWindow) {\n return 1.0;\n }\n\n const exposure = reachConfig.exposureWindow;\n const windowStart = executionTime * exposure.startTime;\n const windowEnd = windowStart + exposure.duration;\n\n // Before exposure window: slight vulnerability during wind-up\n if (currentTime < windowStart) {\n return 1.1;\n }\n\n // Within exposure window: maximum vulnerability\n if (currentTime <= windowEnd) {\n return exposure.vulnerabilityMultiplier;\n }\n\n // Recovery phase: moderate vulnerability\n const recoveryStart = executionTime;\n const recoveryEnd = executionTime + recoveryTime;\n if (currentTime > recoveryStart && currentTime <= recoveryEnd) {\n const recoveryProgress = (currentTime - recoveryStart) / recoveryTime;\n // Linearly decrease from max vulnerability to baseline\n return (\n exposure.vulnerabilityMultiplier -\n (exposure.vulnerabilityMultiplier - 1.0) * recoveryProgress\n );\n }\n\n // After recovery: baseline vulnerability\n return 1.0;\n}\n\n/**\n * Determine which limb is exposed based on technique and animation state.\n *\n * **Korean**: 노출된 사지 결정\n *\n * Analyzes the technique's body part and animation to determine which\n * specific limb (left/right) is currently exposed.\n *\n * @param technique - The technique being executed\n * @param isLeftSided - Whether the technique uses the left side\n * @returns The exposed limb type\n *\n * @public\n * @korean 노출사지결정\n */\nexport function determineExposedLimb(\n technique: KoreanTechnique,\n isLeftSided: boolean = false\n): ExposedLimbType {\n const { reachConfig } = technique;\n\n // If exposure window explicitly defines the limb, use it\n if (reachConfig.exposureWindow?.exposedLimb) {\n return reachConfig.exposureWindow.exposedLimb;\n }\n\n // Otherwise, infer from body part and sidedness\n const side = isLeftSided ? \"left\" : \"right\";\n\n switch (reachConfig.bodyPart) {\n case \"arm\":\n // Determine joint based on reach extension\n if (reachConfig.baseExtension > 0.8) {\n return `${side}_arm` as ExposedLimbType;\n } else if (reachConfig.baseExtension > 0.5) {\n return `${side}_elbow` as ExposedLimbType;\n } else {\n return `${side}_wrist` as ExposedLimbType;\n }\n\n case \"leg\":\n // Kicks expose different parts based on extension\n if (reachConfig.baseExtension > 1.0) {\n return `${side}_leg` as ExposedLimbType;\n } else if (reachConfig.baseExtension > 0.7) {\n return `${side}_knee` as ExposedLimbType;\n } else {\n return `${side}_ankle` as ExposedLimbType;\n }\n\n case \"torso\":\n // Torso techniques typically expose arms\n return `${side}_arm` as ExposedLimbType;\n\n default:\n return \"right_arm\";\n }\n}\n\n/**\n * Map exposed limb to breaking technique target.\n *\n * **Korean**: 노출 사지를 파쇄 목표로 매핑\n *\n * Converts an exposed limb type to the appropriate breaking target\n * for joint and limb breaking techniques.\n *\n * @param exposedLimb - The exposed limb\n * @returns The breaking target joint/bone\n *\n * @public\n * @korean 파쇄목표매핑\n */\nexport function mapLimbToBreakingTarget(\n exposedLimb: ExposedLimbType\n): BreakingTarget {\n if (exposedLimb.includes(\"ankle\")) return \"ankle\";\n if (exposedLimb.includes(\"knee\")) return \"knee\";\n if (exposedLimb.includes(\"elbow\")) return \"elbow\";\n if (exposedLimb.includes(\"wrist\")) return \"wrist\";\n\n // Default mapping for general limbs\n if (exposedLimb.includes(\"leg\")) return \"knee\";\n if (exposedLimb.includes(\"arm\")) return \"elbow\";\n\n return \"elbow\"; // Default fallback\n}\n\n/**\n * Calculate breaking technique effectiveness.\n *\n * **Korean**: 파쇄 기술 효과 계산\n *\n * Determines the result of a breaking technique applied to an exposed limb,\n * considering the vulnerability window, force applied, and target joint.\n *\n * @param breakingTechnique - The breaking technique being applied (reserved for future use)\n * @param counterOpportunity - The counter opportunity being exploited\n * @param force - Force/damage of the breaking technique (typically 20-80 range)\n * @returns Result of the breaking attempt\n *\n * @remarks\n * The breakingTechnique parameter is currently unused but reserved for future\n * extensibility. It may be used to apply technique-specific modifiers or\n * validate technique compatibility with the breaking target.\n *\n * @public\n * @korean 파쇄기술효과계산\n */\nexport function calculateBreakingResult(\n breakingTechnique: KoreanTechnique,\n counterOpportunity: CounterOpportunity,\n force: number\n): BreakingResult {\n // Note: breakingTechnique parameter reserved for future use\n // (e.g., technique-specific breaking modifiers)\n void breakingTechnique;\n const target = mapLimbToBreakingTarget(counterOpportunity.exposedLimb);\n\n // Breaking only works during valid windows\n if (!counterOpportunity.allowsBreaking) {\n return {\n success: false,\n target,\n severity: 0,\n damage: force * 0.5, // Reduced damage without breaking\n mobilityReduction: 0,\n statusEffects: [],\n };\n }\n\n // Calculate breaking severity based on force and vulnerability\n const effectiveForce = force * counterOpportunity.vulnerabilityMultiplier;\n const baseSuccess = effectiveForce > BREAKING_FORCE_THRESHOLD;\n const severity = Math.min(effectiveForce / BREAKING_MAX_FORCE, 1.0);\n\n if (!baseSuccess) {\n return {\n success: false,\n target,\n severity: 0,\n damage: effectiveForce * 0.7,\n mobilityReduction: 0,\n statusEffects: [],\n };\n }\n\n // Successful break - apply appropriate effects\n // Status effect IDs from BREAKING_STATUS_EFFECT_IDS constants\n // See src/systems/combat/BreakingStatusEffects.ts for all available IDs\n const statusEffects: string[] = [BREAKING_STATUS_EFFECT_IDS.PAIN];\n let mobilityReduction: number;\n\n // Severity-based effects\n if (severity > 0.8) {\n // Severe break - dislocation or fracture\n statusEffects.push(\n BREAKING_STATUS_EFFECT_IDS.SEVERE_INJURY,\n BREAKING_STATUS_EFFECT_IDS.DISABLED_LIMB\n );\n mobilityReduction = 0.6;\n\n if (target === \"ankle\" || target === \"knee\") {\n statusEffects.push(BREAKING_STATUS_EFFECT_IDS.IMPAIRED_MOBILITY);\n mobilityReduction = 0.8; // Leg breaks severely impact movement\n }\n } else if (severity > 0.5) {\n // Moderate break\n statusEffects.push(BREAKING_STATUS_EFFECT_IDS.INJURED_LIMB);\n mobilityReduction = 0.4;\n } else {\n // Minor break - sprain or strain\n statusEffects.push(BREAKING_STATUS_EFFECT_IDS.SPRAINED_JOINT);\n mobilityReduction = 0.2;\n }\n\n // Bleeding for bone breaks\n if (severity > 0.6) {\n statusEffects.push(BREAKING_STATUS_EFFECT_IDS.BLEEDING);\n }\n\n return {\n success: true,\n target,\n severity,\n damage: effectiveForce,\n mobilityReduction,\n statusEffects,\n };\n}\n\n/**\n * Check if a defender can execute a counter-attack.\n *\n * **Korean**: 반격 실행 가능 여부 확인\n *\n * Validates whether a defender is in position and has the resources\n * to execute a counter-attack against an exposed limb.\n *\n * @param defenderStamina - Defender's current stamina\n * @param counterTechnique - The counter technique to execute\n * @param distance - Distance between attacker and defender (meters)\n * @returns Whether the counter can be executed\n *\n * @public\n * @korean 반격실행가능확인\n */\nexport function canExecuteCounter(\n defenderStamina: number,\n counterTechnique: KoreanTechnique,\n distance: number\n): boolean {\n // Check stamina requirement\n if (defenderStamina < counterTechnique.staminaCost) {\n return false;\n }\n\n // Counter must be executable at current distance\n if (distance > MAX_COUNTER_RANGE_METERS) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Generate limb exposure window for a technique.\n *\n * **Korean**: 사지 노출 시간 생성\n *\n * Creates a default limb exposure window for techniques that don't\n * explicitly define one, based on heuristics from the technique type\n * and reach configuration.\n *\n * @param technique - The technique to generate exposure for\n * @returns Generated limb exposure window\n *\n * @public\n * @korean 사지노출시간생성\n */\nexport function generateLimbExposureWindow(\n technique: KoreanTechnique\n): LimbExposureWindow {\n const { reachConfig, executionTime } = technique;\n const exposedLimb = determineExposedLimb(technique);\n\n // High extension = high vulnerability\n const isHighExtension = reachConfig.baseExtension > 1.0;\n const isMediumExtension = reachConfig.baseExtension > 0.8;\n\n // Determine vulnerability based on extension\n let vulnerabilityMultiplier: number;\n let allowsBreaking: boolean;\n\n if (isHighExtension) {\n vulnerabilityMultiplier = 2.2; // Very vulnerable\n allowsBreaking = true;\n } else if (isMediumExtension) {\n vulnerabilityMultiplier = 1.6;\n allowsBreaking = false;\n } else {\n vulnerabilityMultiplier = 1.2; // Low extension, low vulnerability\n allowsBreaking = false;\n }\n\n // Exposure starts during peak extension (typically 40-60% of execution)\n const startTime = 0.5;\n\n // Duration scales with execution time (20-40% of execution)\n const durationRatio = isHighExtension ? 0.4 : 0.25;\n const duration = Math.floor(executionTime * durationRatio);\n\n return {\n exposedLimb,\n startTime,\n duration,\n vulnerabilityMultiplier,\n allowsBreaking,\n };\n}\n\nexport default {\n calculateCounterOpportunity,\n calculateVulnerabilityMultiplier,\n determineExposedLimb,\n mapLimbToBreakingTarget,\n calculateBreakingResult,\n canExecuteCounter,\n generateLimbExposureWindow,\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LimbExposureSystem.js","names":[],"sources":["../../../src/systems/combat/LimbExposureSystem.ts"],"sourcesContent":["/**\n * Limb Exposure System for Counter-Attack Detection\n *\n * **Korean**: 사지 노출 시스템 (Saji Nochul System)\n *\n * Analyzes technique animations to determine when limbs become exposed and vulnerable\n * during attack execution. This enables:\n * - Defensive counter-attacks (반격 - banggyeok)\n * - Breaking techniques (파쇄기 - paswaegi)\n * - Exploiting overextension (과다신장 약점 - gwada sinjang yakjeom)\n *\n * **Martial Arts Philosophy**:\n * - **허점공격** (Heojeom Gonggyeok) - Attacking openings/weaknesses\n * - **후수필승** (Husu Pilseung) - Victory through counter-attack timing\n * - **이순응변** (Isun Eungbyeon) - Adapt and exploit opponent's mistakes\n *\n * @module systems/combat/LimbExposureSystem\n * @korean 사지노출시스템\n */\n\nimport type { KoreanTechnique } from \"../vitalpoint/types\";\nimport type {\n BreakingResult,\n BreakingTarget,\n CounterOpportunity,\n ExposedLimbType,\n LimbExposureWindow,\n PhysicalReachConfig,\n} from \"../../types/physics\";\nimport { BREAKING_STATUS_EFFECT_IDS } from \"./BreakingStatusEffects\";\n\n/**\n * Breaking technique constants\n * **Korean**: 파쇄기술 상수\n */\n\n/**\n * Minimum effective force required to successfully execute a breaking technique.\n * Force below this threshold will not break joints/bones.\n * Typical damage values range from 20-80, with 40 being the minimum for effective breaks.\n * @korean 파쇄최소힘\n */\nconst BREAKING_FORCE_THRESHOLD = 40;\n\n/**\n * Maximum effective force for calculating break severity on 0-1 scale.\n * Force values above 80 are clamped to 1.0 severity (complete break).\n * @korean 파쇄최대힘\n */\nconst BREAKING_MAX_FORCE = 80;\n\n/**\n * Maximum range in meters for executing counter-attacks.\n * Counter-attacks are close-range defensive techniques requiring proximity.\n * @korean 반격최대거리\n */\nconst MAX_COUNTER_RANGE_METERS = 1.0;\n\n/**\n * Calculate counter-attack opportunities from a technique's reach configuration.\n *\n * **Korean**: 반격 기회 계산\n *\n * Analyzes the technique's execution timeline and limb exposure to identify\n * windows where the opponent is vulnerable to counter-attacks.\n *\n * @param technique - The technique being executed\n * @param currentTime - Current time in technique execution (ms)\n * @returns Counter opportunity if one exists, undefined otherwise\n *\n * @korean 반격기회계산\n */\nexport function calculateCounterOpportunity(\n technique: KoreanTechnique,\n currentTime: number\n): CounterOpportunity | undefined {\n const { reachConfig, executionTime } = technique;\n\n // No exposure window defined, no counter opportunity\n if (!reachConfig.exposureWindow) {\n return undefined;\n }\n\n const exposure = reachConfig.exposureWindow;\n\n // Calculate absolute timing of exposure window\n const windowStart = executionTime * exposure.startTime;\n const windowEnd = windowStart + exposure.duration;\n\n // Check if current time is within the exposure window\n if (currentTime < windowStart || currentTime > windowEnd) {\n return undefined;\n }\n\n // Determine recommended counter techniques based on exposed limb\n const recommendedCounters = getRecommendedCounters(\n exposure.exposedLimb,\n reachConfig,\n exposure.allowsBreaking\n );\n\n return {\n exposedLimb: exposure.exposedLimb,\n windowStart,\n windowDuration: exposure.duration,\n vulnerabilityMultiplier: exposure.vulnerabilityMultiplier,\n allowsBreaking: exposure.allowsBreaking,\n recommendedCounters,\n };\n}\n\n/**\n * Get recommended counter-technique IDs for an exposed limb.\n *\n * **Korean**: 추천 반격 기술 조회\n *\n * Returns technique IDs that would be effective against the exposed limb.\n * These IDs are string-based and should match techniques in the game's\n * technique library. When implementing, validate these IDs exist.\n *\n * **Note**: These are example/placeholder IDs. Actual implementation should\n * reference real technique definitions or use a typed enum of technique IDs.\n *\n * @param exposedLimb - The limb that is exposed\n * @param reachConfig - Reach configuration of the attacking technique\n * @param allowsBreaking - Whether breaking techniques are viable\n * @returns Array of recommended counter-technique IDs (unvalidated strings)\n *\n * @internal\n * @korean 추천반격기술조회\n */\nfunction getRecommendedCounters(\n exposedLimb: ExposedLimbType,\n reachConfig: PhysicalReachConfig,\n allowsBreaking: boolean\n): readonly string[] {\n const counters: string[] = [];\n\n // Breaking techniques for overextended limbs\n if (allowsBreaking) {\n if (exposedLimb.includes(\"leg\") || exposedLimb.includes(\"ankle\")) {\n counters.push(\"leg_sweep\", \"ankle_break\", \"knee_stomp\");\n } else if (exposedLimb.includes(\"knee\")) {\n counters.push(\"knee_break\", \"hyperextension_kick\");\n } else if (exposedLimb.includes(\"arm\") || exposedLimb.includes(\"elbow\")) {\n counters.push(\"arm_bar\", \"elbow_break\", \"joint_lock\");\n } else if (exposedLimb.includes(\"wrist\")) {\n counters.push(\"wrist_lock\", \"wrist_break\");\n }\n }\n\n // Vital point strikes on exposed limbs\n if (exposedLimb.includes(\"arm\")) {\n counters.push(\"ulnar_nerve_strike\", \"radial_nerve_pressure\");\n } else if (exposedLimb.includes(\"leg\")) {\n counters.push(\"peroneal_nerve_strike\", \"thigh_pressure_point\");\n }\n\n // Counter-strikes based on body part type\n if (reachConfig.bodyPart === \"leg\") {\n counters.push(\"leg_parry_counter\", \"inside_leg_kick\");\n } else if (reachConfig.bodyPart === \"arm\") {\n counters.push(\"arm_trap_counter\", \"redirect_punch\");\n }\n\n return counters;\n}\n\n/**\n * Calculate vulnerability multiplier for a technique at a specific time.\n *\n * **Korean**: 취약성 배수 계산\n *\n * Determines how vulnerable the attacker is at a given point in their\n * technique execution. Useful for damage calculation during counter-attacks.\n *\n * @param technique - The technique being executed\n * @param currentTime - Current time in technique execution (ms)\n * @returns Vulnerability multiplier (1.0 = normal, >1.0 = more vulnerable)\n *\n * @korean 취약성배수계산\n */\nexport function calculateVulnerabilityMultiplier(\n technique: KoreanTechnique,\n currentTime: number\n): number {\n const { reachConfig, executionTime, recoveryTime } = technique;\n\n // No exposure window, return baseline vulnerability\n if (!reachConfig.exposureWindow) {\n return 1.0;\n }\n\n const exposure = reachConfig.exposureWindow;\n const windowStart = executionTime * exposure.startTime;\n const windowEnd = windowStart + exposure.duration;\n\n // Before exposure window: slight vulnerability during wind-up\n if (currentTime < windowStart) {\n return 1.1;\n }\n\n // Within exposure window: maximum vulnerability\n if (currentTime <= windowEnd) {\n return exposure.vulnerabilityMultiplier;\n }\n\n // Recovery phase: moderate vulnerability\n const recoveryStart = executionTime;\n const recoveryEnd = executionTime + recoveryTime;\n if (currentTime > recoveryStart && currentTime <= recoveryEnd) {\n const recoveryProgress = (currentTime - recoveryStart) / recoveryTime;\n // Linearly decrease from max vulnerability to baseline\n return (\n exposure.vulnerabilityMultiplier -\n (exposure.vulnerabilityMultiplier - 1.0) * recoveryProgress\n );\n }\n\n // After recovery: baseline vulnerability\n return 1.0;\n}\n\n/**\n * Determine which limb is exposed based on technique and animation state.\n *\n * **Korean**: 노출된 사지 결정\n *\n * Analyzes the technique's body part and animation to determine which\n * specific limb (left/right) is currently exposed.\n *\n * @param technique - The technique being executed\n * @param isLeftSided - Whether the technique uses the left side\n * @returns The exposed limb type\n *\n * @korean 노출사지결정\n */\nexport function determineExposedLimb(\n technique: KoreanTechnique,\n isLeftSided: boolean = false\n): ExposedLimbType {\n const { reachConfig } = technique;\n\n // If exposure window explicitly defines the limb, use it\n if (reachConfig.exposureWindow?.exposedLimb) {\n return reachConfig.exposureWindow.exposedLimb;\n }\n\n // Otherwise, infer from body part and sidedness\n const side = isLeftSided ? \"left\" : \"right\";\n\n switch (reachConfig.bodyPart) {\n case \"arm\":\n // Determine joint based on reach extension\n if (reachConfig.baseExtension > 0.8) {\n return `${side}_arm` as ExposedLimbType;\n } else if (reachConfig.baseExtension > 0.5) {\n return `${side}_elbow` as ExposedLimbType;\n } else {\n return `${side}_wrist` as ExposedLimbType;\n }\n\n case \"leg\":\n // Kicks expose different parts based on extension\n if (reachConfig.baseExtension > 1.0) {\n return `${side}_leg` as ExposedLimbType;\n } else if (reachConfig.baseExtension > 0.7) {\n return `${side}_knee` as ExposedLimbType;\n } else {\n return `${side}_ankle` as ExposedLimbType;\n }\n\n case \"torso\":\n // Torso techniques typically expose arms\n return `${side}_arm` as ExposedLimbType;\n\n default:\n return \"right_arm\";\n }\n}\n\n/**\n * Map exposed limb to breaking technique target.\n *\n * **Korean**: 노출 사지를 파쇄 목표로 매핑\n *\n * Converts an exposed limb type to the appropriate breaking target\n * for joint and limb breaking techniques.\n *\n * @param exposedLimb - The exposed limb\n * @returns The breaking target joint/bone\n *\n * @korean 파쇄목표매핑\n */\nexport function mapLimbToBreakingTarget(\n exposedLimb: ExposedLimbType\n): BreakingTarget {\n if (exposedLimb.includes(\"ankle\")) return \"ankle\";\n if (exposedLimb.includes(\"knee\")) return \"knee\";\n if (exposedLimb.includes(\"elbow\")) return \"elbow\";\n if (exposedLimb.includes(\"wrist\")) return \"wrist\";\n\n // Default mapping for general limbs\n if (exposedLimb.includes(\"leg\")) return \"knee\";\n if (exposedLimb.includes(\"arm\")) return \"elbow\";\n\n return \"elbow\"; // Default fallback\n}\n\n/**\n * Calculate breaking technique effectiveness.\n *\n * **Korean**: 파쇄 기술 효과 계산\n *\n * Determines the result of a breaking technique applied to an exposed limb,\n * considering the vulnerability window, force applied, and target joint.\n *\n * @param breakingTechnique - The breaking technique being applied (reserved for future use)\n * @param counterOpportunity - The counter opportunity being exploited\n * @param force - Force/damage of the breaking technique (typically 20-80 range)\n * @returns Result of the breaking attempt\n *\n * @remarks\n * The breakingTechnique parameter is currently unused but reserved for future\n * extensibility. It may be used to apply technique-specific modifiers or\n * validate technique compatibility with the breaking target.\n *\n * @korean 파쇄기술효과계산\n */\nexport function calculateBreakingResult(\n breakingTechnique: KoreanTechnique,\n counterOpportunity: CounterOpportunity,\n force: number\n): BreakingResult {\n // Note: breakingTechnique parameter reserved for future use\n // (e.g., technique-specific breaking modifiers)\n void breakingTechnique;\n const target = mapLimbToBreakingTarget(counterOpportunity.exposedLimb);\n\n // Breaking only works during valid windows\n if (!counterOpportunity.allowsBreaking) {\n return {\n success: false,\n target,\n severity: 0,\n damage: force * 0.5, // Reduced damage without breaking\n mobilityReduction: 0,\n statusEffects: [],\n };\n }\n\n // Calculate breaking severity based on force and vulnerability\n const effectiveForce = force * counterOpportunity.vulnerabilityMultiplier;\n const baseSuccess = effectiveForce > BREAKING_FORCE_THRESHOLD;\n const severity = Math.min(effectiveForce / BREAKING_MAX_FORCE, 1.0);\n\n if (!baseSuccess) {\n return {\n success: false,\n target,\n severity: 0,\n damage: effectiveForce * 0.7,\n mobilityReduction: 0,\n statusEffects: [],\n };\n }\n\n // Successful break - apply appropriate effects\n // Status effect IDs from BREAKING_STATUS_EFFECT_IDS constants\n // See src/systems/combat/BreakingStatusEffects.ts for all available IDs\n const statusEffects: string[] = [BREAKING_STATUS_EFFECT_IDS.PAIN];\n let mobilityReduction: number;\n\n // Severity-based effects\n if (severity > 0.8) {\n // Severe break - dislocation or fracture\n statusEffects.push(\n BREAKING_STATUS_EFFECT_IDS.SEVERE_INJURY,\n BREAKING_STATUS_EFFECT_IDS.DISABLED_LIMB\n );\n mobilityReduction = 0.6;\n\n if (target === \"ankle\" || target === \"knee\") {\n statusEffects.push(BREAKING_STATUS_EFFECT_IDS.IMPAIRED_MOBILITY);\n mobilityReduction = 0.8; // Leg breaks severely impact movement\n }\n } else if (severity > 0.5) {\n // Moderate break\n statusEffects.push(BREAKING_STATUS_EFFECT_IDS.INJURED_LIMB);\n mobilityReduction = 0.4;\n } else {\n // Minor break - sprain or strain\n statusEffects.push(BREAKING_STATUS_EFFECT_IDS.SPRAINED_JOINT);\n mobilityReduction = 0.2;\n }\n\n // Bleeding for bone breaks\n if (severity > 0.6) {\n statusEffects.push(BREAKING_STATUS_EFFECT_IDS.BLEEDING);\n }\n\n return {\n success: true,\n target,\n severity,\n damage: effectiveForce,\n mobilityReduction,\n statusEffects,\n };\n}\n\n/**\n * Check if a defender can execute a counter-attack.\n *\n * **Korean**: 반격 실행 가능 여부 확인\n *\n * Validates whether a defender is in position and has the resources\n * to execute a counter-attack against an exposed limb.\n *\n * @param defenderStamina - Defender's current stamina\n * @param counterTechnique - The counter technique to execute\n * @param distance - Distance between attacker and defender (meters)\n * @returns Whether the counter can be executed\n *\n * @korean 반격실행가능확인\n */\nexport function canExecuteCounter(\n defenderStamina: number,\n counterTechnique: KoreanTechnique,\n distance: number\n): boolean {\n // Check stamina requirement\n if (defenderStamina < counterTechnique.staminaCost) {\n return false;\n }\n\n // Counter must be executable at current distance\n if (distance > MAX_COUNTER_RANGE_METERS) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Generate limb exposure window for a technique.\n *\n * **Korean**: 사지 노출 시간 생성\n *\n * Creates a default limb exposure window for techniques that don't\n * explicitly define one, based on heuristics from the technique type\n * and reach configuration.\n *\n * @param technique - The technique to generate exposure for\n * @returns Generated limb exposure window\n *\n * @korean 사지노출시간생성\n */\nexport function generateLimbExposureWindow(\n technique: KoreanTechnique\n): LimbExposureWindow {\n const { reachConfig, executionTime } = technique;\n const exposedLimb = determineExposedLimb(technique);\n\n // High extension = high vulnerability\n const isHighExtension = reachConfig.baseExtension > 1.0;\n const isMediumExtension = reachConfig.baseExtension > 0.8;\n\n // Determine vulnerability based on extension\n let vulnerabilityMultiplier: number;\n let allowsBreaking: boolean;\n\n if (isHighExtension) {\n vulnerabilityMultiplier = 2.2; // Very vulnerable\n allowsBreaking = true;\n } else if (isMediumExtension) {\n vulnerabilityMultiplier = 1.6;\n allowsBreaking = false;\n } else {\n vulnerabilityMultiplier = 1.2; // Low extension, low vulnerability\n allowsBreaking = false;\n }\n\n // Exposure starts during peak extension (typically 40-60% of execution)\n const startTime = 0.5;\n\n // Duration scales with execution time (20-40% of execution)\n const durationRatio = isHighExtension ? 0.4 : 0.25;\n const duration = Math.floor(executionTime * durationRatio);\n\n return {\n exposedLimb,\n startTime,\n duration,\n vulnerabilityMultiplier,\n allowsBreaking,\n };\n}\n\nexport default {\n calculateCounterOpportunity,\n calculateVulnerabilityMultiplier,\n determineExposedLimb,\n mapLimbToBreakingTarget,\n calculateBreakingResult,\n canExecuteCounter,\n generateLimbExposureWindow,\n};\n"],"mappings":";;;;;;;;;;;;AA0CA,IAAM,2BAA2B;;;;;;AAOjC,IAAM,qBAAqB;;;;;;AAO3B,IAAM,2BAA2B;;;;;;;;;;;;;;;AAgBjC,SAAgB,4BACd,WACA,aACgC;CAChC,MAAM,EAAE,aAAa,kBAAkB;CAGvC,IAAI,CAAC,YAAY,gBACf;CAGF,MAAM,WAAW,YAAY;CAG7B,MAAM,cAAc,gBAAgB,SAAS;CAC7C,MAAM,YAAY,cAAc,SAAS;CAGzC,IAAI,cAAc,eAAe,cAAc,WAC7C;CAIF,MAAM,sBAAsB,uBAC1B,SAAS,aACT,aACA,SAAS,eACV;CAED,OAAO;EACL,aAAa,SAAS;EACtB;EACA,gBAAgB,SAAS;EACzB,yBAAyB,SAAS;EAClC,gBAAgB,SAAS;EACzB;EACD;;;;;;;;;;;;;;;;;;;;;;AAuBH,SAAS,uBACP,aACA,aACA,gBACmB;CACnB,MAAM,WAAqB,EAAE;CAG7B,IAAI;MACE,YAAY,SAAS,MAAM,IAAI,YAAY,SAAS,QAAQ,EAC9D,SAAS,KAAK,aAAa,eAAe,aAAa;OAClD,IAAI,YAAY,SAAS,OAAO,EACrC,SAAS,KAAK,cAAc,sBAAsB;OAC7C,IAAI,YAAY,SAAS,MAAM,IAAI,YAAY,SAAS,QAAQ,EACrE,SAAS,KAAK,WAAW,eAAe,aAAa;OAChD,IAAI,YAAY,SAAS,QAAQ,EACtC,SAAS,KAAK,cAAc,cAAc;;CAK9C,IAAI,YAAY,SAAS,MAAM,EAC7B,SAAS,KAAK,sBAAsB,wBAAwB;MACvD,IAAI,YAAY,SAAS,MAAM,EACpC,SAAS,KAAK,yBAAyB,uBAAuB;CAIhE,IAAI,YAAY,aAAa,OAC3B,SAAS,KAAK,qBAAqB,kBAAkB;MAChD,IAAI,YAAY,aAAa,OAClC,SAAS,KAAK,oBAAoB,iBAAiB;CAGrD,OAAO;;;;;;;;;;;;;;;;AAiBT,SAAgB,iCACd,WACA,aACQ;CACR,MAAM,EAAE,aAAa,eAAe,iBAAiB;CAGrD,IAAI,CAAC,YAAY,gBACf,OAAO;CAGT,MAAM,WAAW,YAAY;CAC7B,MAAM,cAAc,gBAAgB,SAAS;CAC7C,MAAM,YAAY,cAAc,SAAS;CAGzC,IAAI,cAAc,aAChB,OAAO;CAIT,IAAI,eAAe,WACjB,OAAO,SAAS;CAIlB,MAAM,gBAAgB;CACtB,MAAM,cAAc,gBAAgB;CACpC,IAAI,cAAc,iBAAiB,eAAe,aAAa;EAC7D,MAAM,oBAAoB,cAAc,iBAAiB;EAEzD,OACE,SAAS,2BACR,SAAS,0BAA0B,KAAO;;CAK/C,OAAO;;;;;;;;;;;;;;;;AAiBT,SAAgB,qBACd,WACA,cAAuB,OACN;CACjB,MAAM,EAAE,gBAAgB;CAGxB,IAAI,YAAY,gBAAgB,aAC9B,OAAO,YAAY,eAAe;CAIpC,MAAM,OAAO,cAAc,SAAS;CAEpC,QAAQ,YAAY,UAApB;EACE,KAAK,OAEH,IAAI,YAAY,gBAAgB,IAC9B,OAAO,GAAG,KAAK;OACV,IAAI,YAAY,gBAAgB,IACrC,OAAO,GAAG,KAAK;OAEf,OAAO,GAAG,KAAK;EAGnB,KAAK,OAEH,IAAI,YAAY,gBAAgB,GAC9B,OAAO,GAAG,KAAK;OACV,IAAI,YAAY,gBAAgB,IACrC,OAAO,GAAG,KAAK;OAEf,OAAO,GAAG,KAAK;EAGnB,KAAK,SAEH,OAAO,GAAG,KAAK;EAEjB,SACE,OAAO;;;;;;;;;;;;;;;;AAiBb,SAAgB,wBACd,aACgB;CAChB,IAAI,YAAY,SAAS,QAAQ,EAAE,OAAO;CAC1C,IAAI,YAAY,SAAS,OAAO,EAAE,OAAO;CACzC,IAAI,YAAY,SAAS,QAAQ,EAAE,OAAO;CAC1C,IAAI,YAAY,SAAS,QAAQ,EAAE,OAAO;CAG1C,IAAI,YAAY,SAAS,MAAM,EAAE,OAAO;CACxC,IAAI,YAAY,SAAS,MAAM,EAAE,OAAO;CAExC,OAAO;;;;;;;;;;;;;;;;;;;;;;AAuBT,SAAgB,wBACd,mBACA,oBACA,OACgB;CAIhB,MAAM,SAAS,wBAAwB,mBAAmB,YAAY;CAGtE,IAAI,CAAC,mBAAmB,gBACtB,OAAO;EACL,SAAS;EACT;EACA,UAAU;EACV,QAAQ,QAAQ;EAChB,mBAAmB;EACnB,eAAe,EAAE;EAClB;CAIH,MAAM,iBAAiB,QAAQ,mBAAmB;CAClD,MAAM,cAAc,iBAAiB;CACrC,MAAM,WAAW,KAAK,IAAI,iBAAiB,oBAAoB,EAAI;CAEnE,IAAI,CAAC,aACH,OAAO;EACL,SAAS;EACT;EACA,UAAU;EACV,QAAQ,iBAAiB;EACzB,mBAAmB;EACnB,eAAe,EAAE;EAClB;CAMH,MAAM,gBAA0B,CAAC,2BAA2B,KAAK;CACjE,IAAI;CAGJ,IAAI,WAAW,IAAK;EAElB,cAAc,KACZ,2BAA2B,eAC3B,2BAA2B,cAC5B;EACD,oBAAoB;EAEpB,IAAI,WAAW,WAAW,WAAW,QAAQ;GAC3C,cAAc,KAAK,2BAA2B,kBAAkB;GAChE,oBAAoB;;QAEjB,IAAI,WAAW,IAAK;EAEzB,cAAc,KAAK,2BAA2B,aAAa;EAC3D,oBAAoB;QACf;EAEL,cAAc,KAAK,2BAA2B,eAAe;EAC7D,oBAAoB;;CAItB,IAAI,WAAW,IACb,cAAc,KAAK,2BAA2B,SAAS;CAGzD,OAAO;EACL,SAAS;EACT;EACA;EACA,QAAQ;EACR;EACA;EACD;;;;;;;;;;;;;;;;;AAkBH,SAAgB,kBACd,iBACA,kBACA,UACS;CAET,IAAI,kBAAkB,iBAAiB,aACrC,OAAO;CAIT,IAAI,WAAW,0BACb,OAAO;CAGT,OAAO;;;;;;;;;;;;;;;;AAiBT,SAAgB,2BACd,WACoB;CACpB,MAAM,EAAE,aAAa,kBAAkB;CACvC,MAAM,cAAc,qBAAqB,UAAU;CAGnD,MAAM,kBAAkB,YAAY,gBAAgB;CACpD,MAAM,oBAAoB,YAAY,gBAAgB;CAGtD,IAAI;CACJ,IAAI;CAEJ,IAAI,iBAAiB;EACnB,0BAA0B;EAC1B,iBAAiB;QACZ,IAAI,mBAAmB;EAC5B,0BAA0B;EAC1B,iBAAiB;QACZ;EACL,0BAA0B;EAC1B,iBAAiB;;CAUnB,OAAO;EACL;EACA,WAAA;EACA,UALe,KAAK,MAAM,iBADN,kBAAkB,KAAM,KAM5C;EACA;EACA;EACD"}
|
|
@@ -98,7 +98,6 @@ interface PainEffects {
|
|
|
98
98
|
* const recovered = painSystem.applyDissipation(newPlayer, 1000);
|
|
99
99
|
* ```
|
|
100
100
|
*
|
|
101
|
-
* @public
|
|
102
101
|
* @korean 고통반응시스템
|
|
103
102
|
*/
|
|
104
103
|
export declare class PainResponseSystem {
|
|
@@ -174,7 +173,6 @@ export declare class PainResponseSystem {
|
|
|
174
173
|
* }
|
|
175
174
|
* ```
|
|
176
175
|
*
|
|
177
|
-
* @public
|
|
178
176
|
* @korean 고통적용
|
|
179
177
|
*/
|
|
180
178
|
applyPain(player: PlayerState, damage: number, severity?: VitalPointSeverity, category?: VitalPointCategory): {
|
|
@@ -197,7 +195,6 @@ export declare class PainResponseSystem {
|
|
|
197
195
|
* player = system.applyDissipation(player, 16);
|
|
198
196
|
* ```
|
|
199
197
|
*
|
|
200
|
-
* @public
|
|
201
198
|
* @korean 고통감소
|
|
202
199
|
*/
|
|
203
200
|
applyDissipation(player: PlayerState, deltaTime: number): PlayerState;
|
|
@@ -207,7 +204,6 @@ export declare class PainResponseSystem {
|
|
|
207
204
|
* @param pain - Pain value (0-100)
|
|
208
205
|
* @returns Current pain level
|
|
209
206
|
*
|
|
210
|
-
* @public
|
|
211
207
|
* @korean 고통수준확인
|
|
212
208
|
*/
|
|
213
209
|
getPainLevel(pain: number): PainLevel;
|
|
@@ -217,7 +213,6 @@ export declare class PainResponseSystem {
|
|
|
217
213
|
* @param level - Pain level
|
|
218
214
|
* @returns Effects applied at that level
|
|
219
215
|
*
|
|
220
|
-
* @public
|
|
221
216
|
* @korean 고통효과
|
|
222
217
|
*/
|
|
223
218
|
getEffects(level: PainLevel): PainEffects;
|
|
@@ -231,7 +226,6 @@ export declare class PainResponseSystem {
|
|
|
231
226
|
* @param shockEffect - Optional active shock pain effect
|
|
232
227
|
* @returns Modified player state with pain effects
|
|
233
228
|
*
|
|
234
|
-
* @public
|
|
235
229
|
* @korean 고통효과적용
|
|
236
230
|
*/
|
|
237
231
|
applyEffects(player: PlayerState, shockEffect?: ShockPainEffect): PlayerState;
|
|
@@ -244,7 +238,6 @@ export declare class PainResponseSystem {
|
|
|
244
238
|
* @param player - Current player state
|
|
245
239
|
* @returns True if player should be stunned from pain
|
|
246
240
|
*
|
|
247
|
-
* @public
|
|
248
241
|
* @korean 고통기절확인
|
|
249
242
|
*/
|
|
250
243
|
shouldTriggerStun(player: PlayerState): boolean;
|
|
@@ -254,7 +247,6 @@ export declare class PainResponseSystem {
|
|
|
254
247
|
* @param player - Current player state
|
|
255
248
|
* @returns True if pain is above overload threshold
|
|
256
249
|
*
|
|
257
|
-
* @public
|
|
258
250
|
* @korean 고통과부하확인
|
|
259
251
|
*/
|
|
260
252
|
isInPainOverload(player: PlayerState): boolean;
|
|
@@ -264,7 +256,6 @@ export declare class PainResponseSystem {
|
|
|
264
256
|
* @param player - Current player state
|
|
265
257
|
* @returns True if pain is at overload level
|
|
266
258
|
*
|
|
267
|
-
* @public
|
|
268
259
|
* @korean 고통무력화확인
|
|
269
260
|
*/
|
|
270
261
|
isIncapacitated(player: PlayerState): boolean;
|
|
@@ -274,7 +265,6 @@ export declare class PainResponseSystem {
|
|
|
274
265
|
* @param level - Pain level
|
|
275
266
|
* @returns Korean and English level names
|
|
276
267
|
*
|
|
277
|
-
* @public
|
|
278
268
|
* @korean 고통이름
|
|
279
269
|
*/
|
|
280
270
|
getLevelName(level: PainLevel): {
|
|
@@ -287,7 +277,6 @@ export declare class PainResponseSystem {
|
|
|
287
277
|
* @param level - Pain level
|
|
288
278
|
* @returns Bilingual description
|
|
289
279
|
*
|
|
290
|
-
* @public
|
|
291
280
|
* @korean 고통설명
|
|
292
281
|
*/
|
|
293
282
|
getLevelDescription(level: PainLevel): {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PainResponseSystem.d.ts","sourceRoot":"","sources":["../../../src/systems/combat/PainResponseSystem.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAEjE;;GAEG;AACH,oBAAY,SAAS;IACnB,mDAAmD;IACnD,OAAO,YAAY;IACnB,kEAAkE;IAClE,QAAQ,aAAa;IACrB,8DAA8D;IAC9D,WAAW,gBAAgB;IAC3B,qDAAqD;IACrD,MAAM,WAAW;IACjB,yFAAyF;IACzF,QAAQ,aAAa;CACtB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,6DAA6D;IAC7D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,uDAAuD;IACvD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,4CAA4C;IAC5C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,yCAAyC;IACzC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED;;GAEG;AACH,UAAU,WAAW;IACnB,uBAAuB;IACvB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,6CAA6C;IAC7C,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,yBAAyB;IACzB,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,8BAA8B;IAC9B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,+BAA+B;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,uCAAuC;IACvC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED
|
|
1
|
+
{"version":3,"file":"PainResponseSystem.d.ts","sourceRoot":"","sources":["../../../src/systems/combat/PainResponseSystem.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,7 +37,6 @@ var PainLevel = /* @__PURE__ */ function(PainLevel) {
|
|
|
37
37
|
* const recovered = painSystem.applyDissipation(newPlayer, 1000);
|
|
38
38
|
* ```
|
|
39
39
|
*
|
|
40
|
-
* @public
|
|
41
40
|
* @korean 고통반응시스템
|
|
42
41
|
*/
|
|
43
42
|
var PainResponseSystem = class {
|
|
@@ -173,7 +172,6 @@ var PainResponseSystem = class {
|
|
|
173
172
|
* }
|
|
174
173
|
* ```
|
|
175
174
|
*
|
|
176
|
-
* @public
|
|
177
175
|
* @korean 고통적용
|
|
178
176
|
*/
|
|
179
177
|
applyPain(player, damage, severity, category) {
|
|
@@ -212,7 +210,6 @@ var PainResponseSystem = class {
|
|
|
212
210
|
* player = system.applyDissipation(player, 16);
|
|
213
211
|
* ```
|
|
214
212
|
*
|
|
215
|
-
* @public
|
|
216
213
|
* @korean 고통감소
|
|
217
214
|
*/
|
|
218
215
|
applyDissipation(player, deltaTime) {
|
|
@@ -231,7 +228,6 @@ var PainResponseSystem = class {
|
|
|
231
228
|
* @param pain - Pain value (0-100)
|
|
232
229
|
* @returns Current pain level
|
|
233
230
|
*
|
|
234
|
-
* @public
|
|
235
231
|
* @korean 고통수준확인
|
|
236
232
|
*/
|
|
237
233
|
getPainLevel(pain) {
|
|
@@ -247,7 +243,6 @@ var PainResponseSystem = class {
|
|
|
247
243
|
* @param level - Pain level
|
|
248
244
|
* @returns Effects applied at that level
|
|
249
245
|
*
|
|
250
|
-
* @public
|
|
251
246
|
* @korean 고통효과
|
|
252
247
|
*/
|
|
253
248
|
getEffects(level) {
|
|
@@ -263,7 +258,6 @@ var PainResponseSystem = class {
|
|
|
263
258
|
* @param shockEffect - Optional active shock pain effect
|
|
264
259
|
* @returns Modified player state with pain effects
|
|
265
260
|
*
|
|
266
|
-
* @public
|
|
267
261
|
* @korean 고통효과적용
|
|
268
262
|
*/
|
|
269
263
|
applyEffects(player, shockEffect) {
|
|
@@ -294,7 +288,6 @@ var PainResponseSystem = class {
|
|
|
294
288
|
* @param player - Current player state
|
|
295
289
|
* @returns True if player should be stunned from pain
|
|
296
290
|
*
|
|
297
|
-
* @public
|
|
298
291
|
* @korean 고통기절확인
|
|
299
292
|
*/
|
|
300
293
|
shouldTriggerStun(player) {
|
|
@@ -309,7 +302,6 @@ var PainResponseSystem = class {
|
|
|
309
302
|
* @param player - Current player state
|
|
310
303
|
* @returns True if pain is above overload threshold
|
|
311
304
|
*
|
|
312
|
-
* @public
|
|
313
305
|
* @korean 고통과부하확인
|
|
314
306
|
*/
|
|
315
307
|
isInPainOverload(player) {
|
|
@@ -321,7 +313,6 @@ var PainResponseSystem = class {
|
|
|
321
313
|
* @param player - Current player state
|
|
322
314
|
* @returns True if pain is at overload level
|
|
323
315
|
*
|
|
324
|
-
* @public
|
|
325
316
|
* @korean 고통무력화확인
|
|
326
317
|
*/
|
|
327
318
|
isIncapacitated(player) {
|
|
@@ -333,7 +324,6 @@ var PainResponseSystem = class {
|
|
|
333
324
|
* @param level - Pain level
|
|
334
325
|
* @returns Korean and English level names
|
|
335
326
|
*
|
|
336
|
-
* @public
|
|
337
327
|
* @korean 고통이름
|
|
338
328
|
*/
|
|
339
329
|
getLevelName(level) {
|
|
@@ -366,7 +356,6 @@ var PainResponseSystem = class {
|
|
|
366
356
|
* @param level - Pain level
|
|
367
357
|
* @returns Bilingual description
|
|
368
358
|
*
|
|
369
|
-
* @public
|
|
370
359
|
* @korean 고통설명
|
|
371
360
|
*/
|
|
372
361
|
getLevelDescription(level) {
|