blacktrigram 0.7.47 → 0.7.49
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/App2.js.map +1 -1
- package/lib/audio/AudioAssetLoader.js.map +1 -1
- package/lib/audio/AudioAssetRegistry.js.map +1 -1
- package/lib/audio/AudioCache.js.map +1 -1
- package/lib/audio/AudioManager.js.map +1 -1
- package/lib/audio/AudioMonitor.js.map +1 -1
- package/lib/audio/AudioPool.js.map +1 -1
- package/lib/audio/AudioProvider.js.map +1 -1
- package/lib/audio/AudioUtils.js.map +1 -1
- package/lib/audio/BoneImpactAudioMap.js.map +1 -1
- package/lib/audio/VariantSelector.js.map +1 -1
- package/lib/audio/types.js.map +1 -1
- package/lib/components/screens/combat/CombatScreen3D.d.ts.map +1 -1
- package/lib/components/screens/combat/CombatScreen3D.js +29 -25
- package/lib/components/screens/combat/CombatScreen3D.js.map +1 -1
- package/lib/components/screens/combat/components/controls/CombatButtons.js.map +1 -1
- package/lib/components/screens/combat/components/controls/CombatControlsPanel.js.map +1 -1
- package/lib/components/screens/combat/components/controls/ControlsGuide.js.map +1 -1
- package/lib/components/screens/combat/components/controls/KeyboardHints.js.map +1 -1
- package/lib/components/screens/combat/components/controls/PauseMenu.js.map +1 -1
- package/lib/components/screens/combat/components/controls/PauseMenuButton.js.map +1 -1
- package/lib/components/screens/combat/components/controls/QuickSettings.js.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodDecals3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodLossOverlayHtml.js.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodParticles3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodViscosity3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/CombatParticleEffects3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/ConsciousnessBlur.js.map +1 -1
- package/lib/components/screens/combat/components/effects/InternalDamage3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/PainVignette.js.map +1 -1
- package/lib/components/screens/combat/components/effects/ParticleAudio3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/TraumaOverlay3D.js.map +1 -1
- package/lib/components/screens/combat/components/feedback/MatchCountdown.js.map +1 -1
- package/lib/components/screens/combat/components/feedback/RoundAnnouncementOverlayHtml.js.map +1 -1
- package/lib/components/screens/combat/components/feedback/RoundDisplayStatus.js.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 +2 -2
- package/lib/components/screens/combat/components/hud/CombatBottomHUD.js.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatLeftHUD.js.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatPortraitStatusStrip.js +1 -1
- package/lib/components/screens/combat/components/hud/CombatPortraitStatusStrip.js.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 +2 -1
- package/lib/components/screens/combat/components/hud/CombatTopHUD.js.map +1 -1
- package/lib/components/screens/combat/components/hud/DifficultyIndicator.js.map +1 -1
- package/lib/components/screens/combat/components/hud/FPSMonitor.js.map +1 -1
- package/lib/components/screens/combat/components/hud/MobileControlsWrapper.js.map +1 -1
- package/lib/components/screens/combat/components/hud/PlayerStateOverlayHtml.js.map +1 -1
- package/lib/components/screens/combat/components/indicators/BalanceIndicator.js.map +1 -1
- package/lib/components/screens/combat/components/indicators/InputBufferDisplay.js.map +1 -1
- package/lib/components/screens/combat/components/indicators/StaminaWarning.js.map +1 -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 +4 -2
- package/lib/components/screens/combat/helpers/AnimationUpdater.js.map +1 -1
- package/lib/components/screens/combat/helpers/combatHelpers.js.map +1 -1
- package/lib/components/screens/combat/hooks/useAICombat.js.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatActions.js.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatAttackMovement.js.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 +11 -5
- package/lib/components/screens/combat/hooks/useCombatLayout.js.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatState.js.map +1 -1
- package/lib/components/screens/controls/ControlsScreen3D.js +1 -1
- package/lib/components/screens/controls/ControlsScreen3D.js.map +1 -1
- package/lib/components/screens/controls/components/ControlBindingsOverlayHtml.js.map +1 -1
- package/lib/components/screens/controls/components/ControlCategoryTabsOverlayHtml.js.map +1 -1
- package/lib/components/screens/controls/components/GamepadVisualization3D.js.map +1 -1
- package/lib/components/screens/controls/components/InteractiveControlDemoOverlayHtml.js.map +1 -1
- package/lib/components/screens/controls/components/Key3D.js.map +1 -1
- package/lib/components/screens/controls/components/VisualKeyboard3D.js.map +1 -1
- package/lib/components/screens/controls/constants/ControlsConstants.js.map +1 -1
- package/lib/components/screens/controls/hooks/useControlsState.js.map +1 -1
- package/lib/components/screens/endscreen/EndScreen3D.js.map +1 -1
- package/lib/components/screens/endscreen/components/DefeatAnimation3D.js.map +1 -1
- package/lib/components/screens/endscreen/components/MatchStatisticsDisplayOverlayHtml.js.map +1 -1
- package/lib/components/screens/endscreen/components/NavigationButtonsOverlayHtml.js.map +1 -1
- package/lib/components/screens/endscreen/components/PerformanceBreakdownOverlayHtml.js.map +1 -1
- package/lib/components/screens/endscreen/components/PerformanceRatingOverlayHtml.js.map +1 -1
- package/lib/components/screens/endscreen/components/VictoryAnimation3D.js.map +1 -1
- package/lib/components/screens/endscreen/components/WinnerDisplayOverlayHtml.js.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.js.map +1 -1
- package/lib/components/screens/intro/components/ArchetypeCardGridOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/ArchetypeCardOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/ArchetypeDisplayOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/EnhancedArchetypeDisplayOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/MenuButtonsOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/MenuSectionOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/StatBarOverlayHtml.js.map +1 -1
- package/lib/components/screens/philosophy/PhilosophyScreen3D.js +1 -1
- package/lib/components/screens/philosophy/PhilosophyScreen3D.js.map +1 -1
- package/lib/components/screens/training/TrainingScreen3D.d.ts.map +1 -1
- package/lib/components/screens/training/TrainingScreen3D.js +3 -11
- package/lib/components/screens/training/TrainingScreen3D.js.map +1 -1
- package/lib/components/screens/training/components/AnatomyControlsOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/AnatomyOverlay3D.js.map +1 -1
- package/lib/components/screens/training/components/FootPlacementMarkers3D.js.map +1 -1
- package/lib/components/screens/training/components/FootworkDrillsOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/HitFeedbackEffect3D.js.map +1 -1
- package/lib/components/screens/training/components/TrainingButtonsOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/TrainingControlsOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/TrainingDummy3D.js.map +1 -1
- package/lib/components/screens/training/components/TrainingFeedbackOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/TrainingModeSelectorOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/TrainingStatsOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/VitalPointMarker3D.js.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 +2 -2
- package/lib/components/screens/training/components/hud/TrainingBottomHUD.js.map +1 -1
- package/lib/components/screens/training/components/hud/TrainingLeftHUD.js.map +1 -1
- package/lib/components/screens/training/components/hud/TrainingRightHUD.js.map +1 -1
- package/lib/components/screens/training/components/hud/TrainingTopHUD.js.map +1 -1
- package/lib/components/screens/training/hooks/useAttackMovement.js.map +1 -1
- package/lib/components/screens/training/hooks/useTrainingActions.d.ts +1 -0
- package/lib/components/screens/training/hooks/useTrainingActions.d.ts.map +1 -1
- package/lib/components/screens/training/hooks/useTrainingActions.js +6 -4
- 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 +11 -5
- package/lib/components/screens/training/hooks/useTrainingLayout.js.map +1 -1
- package/lib/components/screens/training/hooks/useTrainingState.js.map +1 -1
- package/lib/components/shared/base/BaseButton.js.map +1 -1
- package/lib/components/shared/base/BaseButtonOverlayHtml.js.map +1 -1
- package/lib/components/shared/base/BasePanel.js.map +1 -1
- package/lib/components/shared/base/BaseText.js.map +1 -1
- package/lib/components/shared/base/useKoreanTheme.js.map +1 -1
- package/lib/components/shared/debug/PerformanceDebugOverlayHtml.js.map +1 -1
- package/lib/components/shared/mobile/ActionButtons.js.map +1 -1
- package/lib/components/shared/mobile/GestureRecognizerPure.js.map +1 -1
- package/lib/components/shared/mobile/HapticController.js.map +1 -1
- package/lib/components/shared/mobile/MobileControlsPure.js.map +1 -1
- package/lib/components/shared/mobile/StanceWheelPure.js.map +1 -1
- package/lib/components/shared/mobile/TouchOptimizer.js.map +1 -1
- package/lib/components/shared/mobile/VirtualDPad.js.map +1 -1
- package/lib/components/shared/three/anatomy/BodySurface.js.map +1 -1
- package/lib/components/shared/three/anatomy/BoneAttachedMuscles.js.map +1 -1
- package/lib/components/shared/three/anatomy/BoneClothing.js.map +1 -1
- package/lib/components/shared/three/anatomy/BoneRenderer.js.map +1 -1
- package/lib/components/shared/three/anatomy/Face3D.js.map +1 -1
- package/lib/components/shared/three/anatomy/Foot3D.js.map +1 -1
- package/lib/components/shared/three/anatomy/Hand3D.js.map +1 -1
- package/lib/components/shared/three/effects/ActionFeedback.js.map +1 -1
- package/lib/components/shared/three/effects/DamageNumbers.js.map +1 -1
- package/lib/components/shared/three/effects/HitEffects3D.js.map +1 -1
- package/lib/components/shared/three/effects/PlayerStateIndicators.js.map +1 -1
- package/lib/components/shared/three/effects/StanceSymbol3D.js.map +1 -1
- package/lib/components/shared/three/effects/StanceTransitionEffect.js.map +1 -1
- package/lib/components/shared/three/effects/VitalPointMarkers3D.js.map +1 -1
- package/lib/components/shared/three/indicators/ElementalColorSystem.js.map +1 -1
- package/lib/components/shared/three/indicators/GuardIndicator.js.map +1 -1
- package/lib/components/shared/three/indicators/HapticFeedback.js.map +1 -1
- package/lib/components/shared/three/indicators/StanceChangeIndicator.js.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 +7 -5
- package/lib/components/shared/three/models/SkeletalPlayer3D.js.map +1 -1
- package/lib/components/shared/three/optimization/AdaptiveQuality.js.map +1 -1
- package/lib/components/shared/three/scene/AtmosphericParticles3D.js.map +1 -1
- package/lib/components/shared/three/scene/BackgroundScene3D.js.map +1 -1
- package/lib/components/shared/three/scene/CombatArena3D.js.map +1 -1
- package/lib/components/shared/three/scene/KoreanSignage3D.js.map +1 -1
- package/lib/components/shared/three/ui/ArchetypeCard.js.map +1 -1
- package/lib/components/shared/three/ui/BodyPartHealthDisplay.js.map +1 -1
- package/lib/components/shared/three/ui/BreathingIndicator2.js.map +1 -1
- package/lib/components/shared/three/ui/CombatReadinessBar.js.map +1 -1
- package/lib/components/shared/three/ui/ComboCounter.js.map +1 -1
- package/lib/components/shared/three/ui/HealthBar.js.map +1 -1
- package/lib/components/shared/three/ui/KoreanButton.js.map +1 -1
- package/lib/components/shared/three/ui/KoreanPanel.js.map +1 -1
- package/lib/components/shared/three/ui/KoreanText.js.map +1 -1
- package/lib/components/shared/three/ui/MenuList.js.map +1 -1
- package/lib/components/shared/three/ui/PlayerHUD.js.map +1 -1
- package/lib/components/shared/three/ui/ProgressBar.js.map +1 -1
- package/lib/components/shared/three/ui/SpeedIndicatorHUD.js.map +1 -1
- package/lib/components/shared/three/ui/StaminaBar.js.map +1 -1
- package/lib/components/shared/three/ui/TechniqueBar.js.map +1 -1
- package/lib/components/shared/three/ui/TechniqueCard.js.map +1 -1
- package/lib/components/shared/three/ui/VitalPointOverlayControlsHtml.js.map +1 -1
- package/lib/components/shared/ui/BackButton.js.map +1 -1
- package/lib/components/shared/ui/BaseHUDContainer.js.map +1 -1
- package/lib/components/shared/ui/CombatTimer.js.map +1 -1
- package/lib/components/shared/ui/ErrorModal.js.map +1 -1
- package/lib/components/shared/ui/LoadingState.js.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/VitalPointOverlayControlsPure.js.map +1 -1
- package/lib/components/shared/ui/VolumeControl.js.map +1 -1
- package/lib/components/shared/ui/shared/ConfirmDialog.js.map +1 -1
- package/lib/components/ui/combat/BalanceIndicatorOverlayHtml.js.map +1 -1
- package/lib/constants/bodyDimensions.js.map +1 -1
- package/lib/constants/bodyRenderingConstants.js.map +1 -1
- package/lib/data/archetypeClothing.js.map +1 -1
- package/lib/data/archetypePhysicalAttributes.js.map +1 -1
- package/lib/data/techniqueMappings.js.map +1 -1
- package/lib/data/techniques.js.map +1 -1
- package/lib/hooks/useActionFeedback.js.map +1 -1
- package/lib/hooks/useBalanceAnimations.js.map +1 -1
- package/lib/hooks/useCombatTimer.js.map +1 -1
- package/lib/hooks/useDebounce.js.map +1 -1
- package/lib/hooks/useHUDLayout.d.ts.map +1 -1
- package/lib/hooks/useHUDLayout.js +3 -2
- package/lib/hooks/useHUDLayout.js.map +1 -1
- package/lib/hooks/useHandPoseTransitions.js.map +1 -1
- package/lib/hooks/useKeyboardControls.js.map +1 -1
- package/lib/hooks/useMatchCountdown.js.map +1 -1
- package/lib/hooks/useMuscleActivation.js.map +1 -1
- package/lib/hooks/usePauseMenu.js.map +1 -1
- package/lib/hooks/usePlayerAnimation.js.map +1 -1
- package/lib/hooks/useResponsiveLayout.js.map +1 -1
- package/lib/hooks/useRoundTransition.js.map +1 -1
- package/lib/hooks/useSkeletalAnimation.d.ts.map +1 -1
- package/lib/hooks/useSkeletalAnimation.js +1 -1
- package/lib/hooks/useSkeletalAnimation.js.map +1 -1
- package/lib/hooks/useTechniqueSelection.js.map +1 -1
- package/lib/hooks/useThrottle.js.map +1 -1
- package/lib/hooks/useTouchControls.js.map +1 -1
- package/lib/hooks/useWebGLContextLossHandler.js.map +1 -1
- package/lib/hooks/useWindowSize.js.map +1 -1
- package/lib/systems/CombatSystem.js.map +1 -1
- package/lib/systems/EffectCalculator.js.map +1 -1
- package/lib/systems/LayoutSystem.js.map +1 -1
- package/lib/systems/PlayerEffectManager.js.map +1 -1
- package/lib/systems/ResponsiveScaling.js.map +1 -1
- package/lib/systems/TrigramSystem.js.map +1 -1
- package/lib/systems/VitalPointSystem.js.map +1 -1
- package/lib/systems/ai/AIPersonality.js.map +1 -1
- package/lib/systems/ai/AdaptiveDifficulty.js +16 -16
- package/lib/systems/ai/AdaptiveDifficulty.js.map +1 -1
- package/lib/systems/ai/ArchetypeEnforcer.js.map +1 -1
- package/lib/systems/ai/ComboSystem.js.map +1 -1
- package/lib/systems/ai/DecisionTree.js.map +1 -1
- package/lib/systems/ai/TrainingAI.js.map +1 -1
- package/lib/systems/ai/types.js.map +1 -1
- package/lib/systems/animation/builders/AnimationBuilder.js.map +1 -1
- package/lib/systems/animation/builders/HandPoseApplicator.js.map +1 -1
- package/lib/systems/animation/builders/HandPoses.js.map +1 -1
- package/lib/systems/animation/builders/KeyframeConfig.js.map +1 -1
- package/lib/systems/animation/builders/KeyframeInterpolation.js.map +1 -1
- package/lib/systems/animation/builders/KickPhaseApplicator.d.ts +6 -0
- package/lib/systems/animation/builders/KickPhaseApplicator.d.ts.map +1 -1
- package/lib/systems/animation/builders/KickPhaseApplicator.js +16 -9
- package/lib/systems/animation/builders/KickPhaseApplicator.js.map +1 -1
- package/lib/systems/animation/builders/KoreanGuardPositions.d.ts +4 -4
- package/lib/systems/animation/builders/KoreanGuardPositions.js.map +1 -1
- package/lib/systems/animation/builders/MartialArtsAnimationBuilder.d.ts +1 -1
- package/lib/systems/animation/builders/MartialArtsAnimationBuilder.d.ts.map +1 -1
- package/lib/systems/animation/builders/MartialArtsAnimationBuilder.js +5 -5
- package/lib/systems/animation/builders/MartialArtsAnimationBuilder.js.map +1 -1
- package/lib/systems/animation/builders/MartialArtsConstants.d.ts +112 -71
- package/lib/systems/animation/builders/MartialArtsConstants.d.ts.map +1 -1
- package/lib/systems/animation/builders/MartialArtsConstants.js +113 -72
- package/lib/systems/animation/builders/MartialArtsConstants.js.map +1 -1
- package/lib/systems/animation/builders/MartialPoseApplicator.js.map +1 -1
- package/lib/systems/animation/builders/PunchPhaseApplicator.js.map +1 -1
- package/lib/systems/animation/builders/SkeletonRig.js.map +1 -1
- package/lib/systems/animation/builders/TrigramGuardApplicator.js.map +1 -1
- package/lib/systems/animation/catalogs/AttackAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/BasicAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/ComboAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/DarkOpsAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/DefensiveAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/ElbowKneeAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/EnhancedAttackAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/EnhancedElbowKneeAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/FootworkSkeletalAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/GamRedirectionAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/GamStanceAnimations.js +21 -0
- package/lib/systems/animation/catalogs/GamStanceAnimations.js.map +1 -0
- package/lib/systems/animation/catalogs/GamTechniqueAnimations.js +34 -2
- package/lib/systems/animation/catalogs/GamTechniqueAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/GanStanceAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/GanTechniqueAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/GeonStanceAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/GonTechniqueAnimations.d.ts +9 -0
- package/lib/systems/animation/catalogs/GonTechniqueAnimations.d.ts.map +1 -1
- package/lib/systems/animation/catalogs/GonTechniqueAnimations.js +288 -0
- package/lib/systems/animation/catalogs/GonTechniqueAnimations.js.map +1 -0
- package/lib/systems/animation/catalogs/GrapplingAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/JinStanceAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/JinTechniqueAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/KickAnimations.d.ts +2 -2
- package/lib/systems/animation/catalogs/KickAnimations.js +2 -2
- package/lib/systems/animation/catalogs/KickAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/LiStanceAnimations.js +14 -1
- package/lib/systems/animation/catalogs/LiStanceAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/LiTechniqueAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/MovementAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/PunchAnimations.d.ts +1 -1
- package/lib/systems/animation/catalogs/PunchAnimations.js +1 -1
- package/lib/systems/animation/catalogs/PunchAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/RecoveryAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/SonStanceAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/SonTechniqueAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/SpecializedPunchAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/StanceAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/StanceAttackAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/StanceGuardPoses.d.ts +6 -6
- package/lib/systems/animation/catalogs/StanceGuardPoses.js +36 -36
- package/lib/systems/animation/catalogs/StanceGuardPoses.js.map +1 -1
- package/lib/systems/animation/catalogs/StanceIdleAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/StanceLocomotionAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/StepSkeletalAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/TaeJointLockAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/TaeStanceAnimations.js.map +1 -1
- package/lib/systems/animation/constants/AnatomicalLimits.js.map +1 -1
- package/lib/systems/animation/core/AnimationHitTiming.js.map +1 -1
- package/lib/systems/animation/core/AnimationOptimizations.js.map +1 -1
- package/lib/systems/animation/core/AnimationPriority.js +15 -15
- package/lib/systems/animation/core/AnimationPriority.js.map +1 -1
- package/lib/systems/animation/core/AnimationRegistry.d.ts +30 -0
- package/lib/systems/animation/core/AnimationRegistry.d.ts.map +1 -1
- package/lib/systems/animation/core/AnimationRegistry.js +74 -12
- package/lib/systems/animation/core/AnimationRegistry.js.map +1 -1
- package/lib/systems/animation/core/AnimationStateMachine.js +16 -16
- package/lib/systems/animation/core/AnimationStateMachine.js.map +1 -1
- package/lib/systems/animation/core/AnimationTransitions.d.ts.map +1 -1
- package/lib/systems/animation/core/AnimationTransitions.js +34 -0
- package/lib/systems/animation/core/AnimationTransitions.js.map +1 -1
- package/lib/systems/animation/core/LateralityTransform.js.map +1 -1
- package/lib/systems/animation/core/RecoveryPhaseEnhancer.js.map +1 -1
- package/lib/systems/animation/core/TechniqueAnimationMapper.js.map +1 -1
- package/lib/systems/animation/core/TechniqueAnimationMapping.js.map +1 -1
- package/lib/systems/animation/core/index.d.ts +1 -1
- package/lib/systems/animation/core/index.d.ts.map +1 -1
- package/lib/systems/animation/core/types.d.ts +24 -0
- package/lib/systems/animation/core/types.d.ts.map +1 -1
- package/lib/systems/animation/core/types.js +27 -11
- package/lib/systems/animation/core/types.js.map +1 -1
- package/lib/systems/animation/systems/AdvancedJointMovements.js.map +1 -1
- package/lib/systems/animation/systems/BodyFacingSystem.js.map +1 -1
- package/lib/systems/animation/systems/FacialExpressions.js.map +1 -1
- package/lib/systems/animation/systems/FallAnimations.js.map +1 -1
- package/lib/systems/animation/systems/MuscleActivation.js.map +1 -1
- package/lib/systems/bodypart/BodyPartDamageIntegration.js.map +1 -1
- package/lib/systems/bodypart/BodyPartHealthSystem.js.map +1 -1
- package/lib/systems/bodypart/BodyPartPositionMapping.js.map +1 -1
- package/lib/systems/bodypart/CombatInjuryIntegration.js.map +1 -1
- package/lib/systems/bodypart/InjuryIntegration.js.map +1 -1
- package/lib/systems/bodypart/InjuryTracker.js.map +1 -1
- package/lib/systems/bodypart/MovementPenaltySystem.js.map +1 -1
- package/lib/systems/bodypart/PlayerInjuryTrackingManager.js.map +1 -1
- package/lib/systems/bodypart/types.js.map +1 -1
- package/lib/systems/breathing/BreathingDisruptionSystem.js +19 -19
- package/lib/systems/breathing/BreathingDisruptionSystem.js.map +1 -1
- package/lib/systems/breathing/feedback.js.map +1 -1
- package/lib/systems/breathing/integration.js.map +1 -1
- package/lib/systems/combat/BalanceSystem.js +19 -19
- package/lib/systems/combat/BalanceSystem.js.map +1 -1
- package/lib/systems/combat/BreakingStatusEffects.js.map +1 -1
- package/lib/systems/combat/CombatStateSystem.js +17 -17
- package/lib/systems/combat/CombatStateSystem.js.map +1 -1
- package/lib/systems/combat/ConsciousnessSystem.js +24 -24
- package/lib/systems/combat/ConsciousnessSystem.js.map +1 -1
- package/lib/systems/combat/FallIntegration.js.map +1 -1
- package/lib/systems/combat/GrappleSystem.js.map +1 -1
- package/lib/systems/combat/LimbExposureSystem.js.map +1 -1
- package/lib/systems/combat/PainResponseSystem.js +21 -21
- package/lib/systems/combat/PainResponseSystem.js.map +1 -1
- package/lib/systems/combat/TrainingCombatSystem.js.map +1 -1
- package/lib/systems/combat/painConsciousnessUtils.js.map +1 -1
- package/lib/systems/combat/typeGuards.js.map +1 -1
- package/lib/systems/effects.js.map +1 -1
- package/lib/systems/game.js.map +1 -1
- package/lib/systems/movement/InjuryMovementModifier.js.map +1 -1
- package/lib/systems/movement/helpers/AccelerationUpdater.js.map +1 -1
- package/lib/systems/movement/helpers/accelerationUtils.js.map +1 -1
- package/lib/systems/movement/integration.js.map +1 -1
- package/lib/systems/physics/AttackMovementPhysics.js.map +1 -1
- package/lib/systems/physics/CollisionDetection.js.map +1 -1
- package/lib/systems/physics/CoordinateMapper.js.map +1 -1
- package/lib/systems/physics/KnockbackPhysics.js.map +1 -1
- package/lib/systems/physics/MovementPhysics.js.map +1 -1
- package/lib/systems/physics/PhysicalReachCalculator.js.map +1 -1
- package/lib/systems/physics/SpeedModifierSystem.js +6 -6
- package/lib/systems/physics/SpeedModifierSystem.js.map +1 -1
- package/lib/systems/trigram/KoreanCulture.js.map +1 -1
- package/lib/systems/trigram/KoreanTechniques.js.map +1 -1
- package/lib/systems/trigram/StanceManager.js.map +1 -1
- package/lib/systems/trigram/TransitionCalculator.js.map +1 -1
- package/lib/systems/trigram/TrigramCalculator.js.map +1 -1
- package/lib/systems/trigram/techniques/DarkOpsTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/GamTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/GanTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/GeonTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/GonTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/JinTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/LiTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/SonTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/TaeTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/TechniqueConfig.js.map +1 -1
- package/lib/systems/trigram/techniques/index.js.map +1 -1
- package/lib/systems/trigram/types/GonTechniqueExtensions.js.map +1 -1
- package/lib/systems/trigram/types.js.map +1 -1
- package/lib/systems/types.js.map +1 -1
- package/lib/systems/vitalpoint/DamageCalculator.js.map +1 -1
- package/lib/systems/vitalpoint/HitDetection.js.map +1 -1
- package/lib/systems/vitalpoint/KoreanAnatomy.js.map +1 -1
- package/lib/systems/vitalpoint/KoreanVitalPoints.js.map +1 -1
- package/lib/systems/vitalpoint/MeridianVitalPointMapping.js.map +1 -1
- package/lib/systems/vitalpoint/VitalPointsData.js.map +1 -1
- package/lib/types/AccessibilityTypes.js.map +1 -1
- package/lib/types/LayoutTypes.js.map +1 -1
- package/lib/types/PhysicsTypes.js.map +1 -1
- package/lib/types/common.js.map +1 -1
- package/lib/types/constants/animations.js.map +1 -1
- package/lib/types/constants/colors.js.map +1 -1
- package/lib/types/constants/designSystem.js.map +1 -1
- package/lib/types/constants/index.js.map +1 -1
- package/lib/types/constants/layout.d.ts +21 -0
- package/lib/types/constants/layout.d.ts.map +1 -1
- package/lib/types/constants/layout.js +22 -1
- package/lib/types/constants/layout.js.map +1 -1
- package/lib/types/constants/performance.js.map +1 -1
- package/lib/types/constants/typography.js.map +1 -1
- package/lib/types/constants/ui.js.map +1 -1
- package/lib/types/facial.js +19 -19
- package/lib/types/facial.js.map +1 -1
- package/lib/types/hand-animation.js.map +1 -1
- package/lib/types/injury.js.map +1 -1
- package/lib/types/muscle.js.map +1 -1
- package/lib/types/physics.js.map +1 -1
- package/lib/types/physicsConstants.js.map +1 -1
- package/lib/types/player-visual.d.ts +1 -1
- package/lib/types/player-visual.d.ts.map +1 -1
- package/lib/types/skeletal.js.map +1 -1
- package/lib/types/techniqueId.js.map +1 -1
- package/lib/utils/accessibility.js.map +1 -1
- package/lib/utils/arenaWorldDimensions.js.map +1 -1
- package/lib/utils/assetConfig.js.map +1 -1
- package/lib/utils/characterScaling.js.map +1 -1
- package/lib/utils/colorHelpers.js.map +1 -1
- package/lib/utils/colorUtils.js.map +1 -1
- package/lib/utils/combatReadiness.js.map +1 -1
- package/lib/utils/controlMapping.js.map +1 -1
- package/lib/utils/deviceDetection.js +6 -7
- package/lib/utils/deviceDetection.js.map +1 -1
- package/lib/utils/effectUtils.js.map +1 -1
- package/lib/utils/fabricTextures.js.map +1 -1
- package/lib/utils/hapticFeedback.js.map +1 -1
- package/lib/utils/haptics.js.map +1 -1
- package/lib/utils/htmlOverlayHelpers.js.map +1 -1
- package/lib/utils/inputSystem.js.map +1 -1
- package/lib/utils/koreanThemeHelpers.js.map +1 -1
- package/lib/utils/math.js.map +1 -1
- package/lib/utils/mobileLayoutHelpers.js.map +1 -1
- package/lib/utils/mobileUIUtils.js.map +1 -1
- package/lib/utils/performance/PerformanceMonitor.js.map +1 -1
- package/lib/utils/performance/PerformanceOverlay3D.js.map +1 -1
- package/lib/utils/performance/usePerformanceMonitor.js.map +1 -1
- package/lib/utils/performanceOptimization.js.map +1 -1
- package/lib/utils/player3DHelpers.js.map +1 -1
- package/lib/utils/playerUtils.js.map +1 -1
- package/lib/utils/responsiveLayout.js.map +1 -1
- package/lib/utils/responsiveLayoutHelpers.d.ts +7 -0
- package/lib/utils/responsiveLayoutHelpers.d.ts.map +1 -1
- package/lib/utils/responsiveLayoutHelpers.js +16 -2
- package/lib/utils/responsiveLayoutHelpers.js.map +1 -1
- package/lib/utils/responsiveOrientationConstants.js.map +1 -1
- package/lib/utils/safeAreaUtils.js.map +1 -1
- package/lib/utils/sharedPhysicsConfig.js.map +1 -1
- package/lib/utils/skeletonScaling.js.map +1 -1
- package/lib/utils/stanceHelpers.js.map +1 -1
- package/lib/utils/threeObjectPool.js.map +1 -1
- package/lib/utils/visualEffects.js.map +1 -1
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BalanceIndicatorOverlayHtml.js","names":[],"sources":["../../../../src/components/ui/combat/BalanceIndicatorOverlayHtml.tsx"],"sourcesContent":["/**\n * BalanceIndicatorOverlayHtml Component - 3D Html overlay for balance state\n *\n * Displays balance state with vulnerability indicators using Html from @react-three/drei.\n * Shows:\n * - Current balance percentage\n * - Vulnerability state (red border + shake effect)\n * - Bilingual Korean/English tooltips\n * - Stance transition vulnerability\n * - Rapid change penalty indicator\n *\n * @module components/ui/combat/BalanceIndicatorOverlayHtml\n * @category Combat UI\n * @korean 균형표시오버레이\n */\n\nimport React, { useMemo } from \"react\";\nimport { Html } from \"@react-three/drei\";\nimport { KOREAN_COLORS, FONT_FAMILY } from \"@/types/constants\";\nimport type { BalancePlayerState } from \"@/systems/combat/BalanceSystem\";\n\nexport interface BalanceIndicatorOverlayHtmlProps {\n /**\n * Player state with balance and transition data\n * @korean 플레이어상태\n */\n readonly player: BalancePlayerState;\n\n /**\n * Current game time in milliseconds\n * @korean 현재시간\n */\n readonly currentTime: number;\n\n /**\n * Position in 3D space [x, y, z]\n * @korean 3D위치\n */\n readonly position?: [number, number, number];\n\n /**\n * Mobile responsive mode\n * @korean 모바일여부\n */\n readonly isMobile?: boolean;\n}\n\n/**\n * Get balance color based on percentage\n */\nfunction getBalanceColor(balance: number): string {\n if (balance >= 80) return `#${KOREAN_COLORS.POSITIVE_GREEN.toString(16).padStart(6, \"0\")}`;\n if (balance >= 50) return `#${KOREAN_COLORS.WARNING_YELLOW.toString(16).padStart(6, \"0\")}`;\n if (balance >= 20) return `#${KOREAN_COLORS.WARNING_ORANGE.toString(16).padStart(6, \"0\")}`;\n return `#${KOREAN_COLORS.ACCENT_RED.toString(16).padStart(6, \"0\")}`;\n}\n\n/**\n * Get balance state label (bilingual)\n */\nfunction getBalanceLabel(balance: number): {\n korean: string;\n english: string;\n} {\n if (balance >= 80)\n return { korean: \"안정\", english: \"Stable\" };\n if (balance >= 50)\n return { korean: \"불안정\", english: \"Unsteady\" };\n if (balance >= 20)\n return { korean: \"균형상실\", english: \"Off-Balance\" };\n return { korean: \"낙하중\", english: \"Falling\" };\n}\n\n/**\n * BalanceIndicatorOverlayHtml - 3D Html overlay for balance visualization\n *\n * Renders above player character in 3D space using Html from @react-three/drei.\n * Shows balance percentage, vulnerability state, and active modifiers.\n *\n * Features:\n * - Red border + shake animation when vulnerable\n * - Bilingual Korean/English labels\n * - Transition vulnerability indicator\n * - Rapid change penalty warning\n *\n * @example\n * ```tsx\n * <BalanceIndicatorOverlayHtml\n * player={playerState}\n * currentTime={Date.now()}\n * position={[0, 2.5, 0]}\n * isMobile={false}\n * />\n * ```\n */\nexport const BalanceIndicatorOverlayHtml: React.FC<\n BalanceIndicatorOverlayHtmlProps\n> = ({ player, currentTime, position = [0, 2, 0], isMobile = false }) => {\n const isVulnerable = useMemo(() => {\n const isTransitioning = player.transitionState?.isTransitioning ?? false;\n const isLowBalance = player.balance < 50; // Off-balance or worse\n const hasPenalty =\n player.rapidChangePenaltyEnd !== undefined &&\n currentTime < player.rapidChangePenaltyEnd;\n return isTransitioning ?? isLowBalance ?? hasPenalty;\n }, [player.balance, player.transitionState, player.rapidChangePenaltyEnd, currentTime]);\n\n const balanceColor = useMemo(\n () => getBalanceColor(player.balance),\n [player.balance]\n );\n\n const balanceLabel = useMemo(\n () => getBalanceLabel(player.balance),\n [player.balance]\n );\n\n const vulnerableColorHex = `#${KOREAN_COLORS.ACCENT_RED.toString(16).padStart(6, \"0\")}`;\n\n const containerStyle = useMemo(() => {\n const baseStyle: React.CSSProperties = {\n border: isVulnerable\n ? `2px solid ${vulnerableColorHex}`\n : `2px solid ${balanceColor}`,\n padding: isMobile ? \"6px 10px\" : \"8px 12px\",\n backgroundColor: \"rgba(10, 10, 10, 0.85)\",\n borderRadius: \"8px\",\n boxShadow: isVulnerable\n ? `0 0 16px ${vulnerableColorHex}`\n : `0 0 12px ${balanceColor}`,\n transition: \"all 0.3s ease-out\",\n fontFamily: FONT_FAMILY.KOREAN,\n fontSize: isMobile ? \"12px\" : \"14px\",\n minWidth: isMobile ? \"140px\" : \"180px\",\n textAlign: \"center\" as const,\n userSelect: \"none\" as const,\n pointerEvents: \"none\" as const,\n };\n\n if (isVulnerable) {\n baseStyle.animation = \"shake 0.3s infinite\";\n }\n\n return baseStyle;\n }, [isVulnerable, balanceColor, vulnerableColorHex, isMobile]);\n\n const balancePercentage = Math.round(player.balance);\n\n return (\n <>\n {/* Inject keyframes for shake animation */}\n <Html position={position} center>\n <style>\n {`\n @keyframes shake {\n 0%, 100% { transform: translateX(0); }\n 25% { transform: translateX(-2px); }\n 75% { transform: translateX(2px); }\n }\n `}\n </style>\n <div style={containerStyle} data-testid=\"balance-indicator-overlay\">\n {/* Balance percentage and label */}\n <div\n style={{\n color: balanceColor,\n fontWeight: \"bold\",\n marginBottom: \"4px\",\n }}\n >\n 균형 | Balance: {balancePercentage}%\n </div>\n\n {/* Balance state label */}\n <div\n style={{\n color: `#${KOREAN_COLORS.TEXT_SECONDARY.toString(16).padStart(6, \"0\")}`,\n fontSize: isMobile ? \"10px\" : \"12px\",\n }}\n >\n {balanceLabel.korean} | {balanceLabel.english}\n </div>\n\n {/* Vulnerability indicators */}\n {player.transitionState?.isTransitioning && (\n <div\n style={{\n color: vulnerableColorHex,\n fontSize: isMobile ? \"10px\" : \"11px\",\n marginTop: \"4px\",\n fontWeight: \"bold\",\n }}\n >\n 취약 | Vulnerable!\n </div>\n )}\n\n {/* Rapid change penalty indicator */}\n {player.rapidChangePenaltyEnd && currentTime < player.rapidChangePenaltyEnd && (\n <div\n style={{\n color: `#${KOREAN_COLORS.WARNING_ORANGE.toString(16).padStart(6, \"0\")}`,\n fontSize: isMobile ? \"9px\" : \"10px\",\n marginTop: \"2px\",\n }}\n >\n 급속변경 벌칙 | Rapid Change Penalty\n </div>\n )}\n </div>\n </Html>\n </>\n );\n};\n\nBalanceIndicatorOverlayHtml.displayName = \"BalanceIndicatorOverlayHtml\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAkDA,SAAS,gBAAgB,SAAyB;CAChD,IAAI,WAAW,IAAI,OAAO,IAAI,cAAc,eAAe,SAAS,
|
|
1
|
+
{"version":3,"file":"BalanceIndicatorOverlayHtml.js","names":[],"sources":["../../../../src/components/ui/combat/BalanceIndicatorOverlayHtml.tsx"],"sourcesContent":["/**\n * BalanceIndicatorOverlayHtml Component - 3D Html overlay for balance state\n *\n * Displays balance state with vulnerability indicators using Html from @react-three/drei.\n * Shows:\n * - Current balance percentage\n * - Vulnerability state (red border + shake effect)\n * - Bilingual Korean/English tooltips\n * - Stance transition vulnerability\n * - Rapid change penalty indicator\n *\n * @module components/ui/combat/BalanceIndicatorOverlayHtml\n * @category Combat UI\n * @korean 균형표시오버레이\n */\n\nimport React, { useMemo } from \"react\";\nimport { Html } from \"@react-three/drei\";\nimport { KOREAN_COLORS, FONT_FAMILY } from \"@/types/constants\";\nimport type { BalancePlayerState } from \"@/systems/combat/BalanceSystem\";\n\nexport interface BalanceIndicatorOverlayHtmlProps {\n /**\n * Player state with balance and transition data\n * @korean 플레이어상태\n */\n readonly player: BalancePlayerState;\n\n /**\n * Current game time in milliseconds\n * @korean 현재시간\n */\n readonly currentTime: number;\n\n /**\n * Position in 3D space [x, y, z]\n * @korean 3D위치\n */\n readonly position?: [number, number, number];\n\n /**\n * Mobile responsive mode\n * @korean 모바일여부\n */\n readonly isMobile?: boolean;\n}\n\n/**\n * Get balance color based on percentage\n */\nfunction getBalanceColor(balance: number): string {\n if (balance >= 80) return `#${KOREAN_COLORS.POSITIVE_GREEN.toString(16).padStart(6, \"0\")}`;\n if (balance >= 50) return `#${KOREAN_COLORS.WARNING_YELLOW.toString(16).padStart(6, \"0\")}`;\n if (balance >= 20) return `#${KOREAN_COLORS.WARNING_ORANGE.toString(16).padStart(6, \"0\")}`;\n return `#${KOREAN_COLORS.ACCENT_RED.toString(16).padStart(6, \"0\")}`;\n}\n\n/**\n * Get balance state label (bilingual)\n */\nfunction getBalanceLabel(balance: number): {\n korean: string;\n english: string;\n} {\n if (balance >= 80)\n return { korean: \"안정\", english: \"Stable\" };\n if (balance >= 50)\n return { korean: \"불안정\", english: \"Unsteady\" };\n if (balance >= 20)\n return { korean: \"균형상실\", english: \"Off-Balance\" };\n return { korean: \"낙하중\", english: \"Falling\" };\n}\n\n/**\n * BalanceIndicatorOverlayHtml - 3D Html overlay for balance visualization\n *\n * Renders above player character in 3D space using Html from @react-three/drei.\n * Shows balance percentage, vulnerability state, and active modifiers.\n *\n * Features:\n * - Red border + shake animation when vulnerable\n * - Bilingual Korean/English labels\n * - Transition vulnerability indicator\n * - Rapid change penalty warning\n *\n * @example\n * ```tsx\n * <BalanceIndicatorOverlayHtml\n * player={playerState}\n * currentTime={Date.now()}\n * position={[0, 2.5, 0]}\n * isMobile={false}\n * />\n * ```\n */\nexport const BalanceIndicatorOverlayHtml: React.FC<\n BalanceIndicatorOverlayHtmlProps\n> = ({ player, currentTime, position = [0, 2, 0], isMobile = false }) => {\n const isVulnerable = useMemo(() => {\n const isTransitioning = player.transitionState?.isTransitioning ?? false;\n const isLowBalance = player.balance < 50; // Off-balance or worse\n const hasPenalty =\n player.rapidChangePenaltyEnd !== undefined &&\n currentTime < player.rapidChangePenaltyEnd;\n return isTransitioning ?? isLowBalance ?? hasPenalty;\n }, [player.balance, player.transitionState, player.rapidChangePenaltyEnd, currentTime]);\n\n const balanceColor = useMemo(\n () => getBalanceColor(player.balance),\n [player.balance]\n );\n\n const balanceLabel = useMemo(\n () => getBalanceLabel(player.balance),\n [player.balance]\n );\n\n const vulnerableColorHex = `#${KOREAN_COLORS.ACCENT_RED.toString(16).padStart(6, \"0\")}`;\n\n const containerStyle = useMemo(() => {\n const baseStyle: React.CSSProperties = {\n border: isVulnerable\n ? `2px solid ${vulnerableColorHex}`\n : `2px solid ${balanceColor}`,\n padding: isMobile ? \"6px 10px\" : \"8px 12px\",\n backgroundColor: \"rgba(10, 10, 10, 0.85)\",\n borderRadius: \"8px\",\n boxShadow: isVulnerable\n ? `0 0 16px ${vulnerableColorHex}`\n : `0 0 12px ${balanceColor}`,\n transition: \"all 0.3s ease-out\",\n fontFamily: FONT_FAMILY.KOREAN,\n fontSize: isMobile ? \"12px\" : \"14px\",\n minWidth: isMobile ? \"140px\" : \"180px\",\n textAlign: \"center\" as const,\n userSelect: \"none\" as const,\n pointerEvents: \"none\" as const,\n };\n\n if (isVulnerable) {\n baseStyle.animation = \"shake 0.3s infinite\";\n }\n\n return baseStyle;\n }, [isVulnerable, balanceColor, vulnerableColorHex, isMobile]);\n\n const balancePercentage = Math.round(player.balance);\n\n return (\n <>\n {/* Inject keyframes for shake animation */}\n <Html position={position} center>\n <style>\n {`\n @keyframes shake {\n 0%, 100% { transform: translateX(0); }\n 25% { transform: translateX(-2px); }\n 75% { transform: translateX(2px); }\n }\n `}\n </style>\n <div style={containerStyle} data-testid=\"balance-indicator-overlay\">\n {/* Balance percentage and label */}\n <div\n style={{\n color: balanceColor,\n fontWeight: \"bold\",\n marginBottom: \"4px\",\n }}\n >\n 균형 | Balance: {balancePercentage}%\n </div>\n\n {/* Balance state label */}\n <div\n style={{\n color: `#${KOREAN_COLORS.TEXT_SECONDARY.toString(16).padStart(6, \"0\")}`,\n fontSize: isMobile ? \"10px\" : \"12px\",\n }}\n >\n {balanceLabel.korean} | {balanceLabel.english}\n </div>\n\n {/* Vulnerability indicators */}\n {player.transitionState?.isTransitioning && (\n <div\n style={{\n color: vulnerableColorHex,\n fontSize: isMobile ? \"10px\" : \"11px\",\n marginTop: \"4px\",\n fontWeight: \"bold\",\n }}\n >\n 취약 | Vulnerable!\n </div>\n )}\n\n {/* Rapid change penalty indicator */}\n {player.rapidChangePenaltyEnd && currentTime < player.rapidChangePenaltyEnd && (\n <div\n style={{\n color: `#${KOREAN_COLORS.WARNING_ORANGE.toString(16).padStart(6, \"0\")}`,\n fontSize: isMobile ? \"9px\" : \"10px\",\n marginTop: \"2px\",\n }}\n >\n 급속변경 벌칙 | Rapid Change Penalty\n </div>\n )}\n </div>\n </Html>\n </>\n );\n};\n\nBalanceIndicatorOverlayHtml.displayName = \"BalanceIndicatorOverlayHtml\";\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bodyDimensions.js","names":[],"sources":["../../src/constants/bodyDimensions.ts"],"sourcesContent":["/**\n * Centralized body dimensions for consistent rendering across muscles and clothing.\n *\n * **Korean**: 신체 치수 (Body Dimensions)\n *\n * This module provides a single source of truth for body part radii and lengths.\n * Both the muscle system (BoneAttachedMuscles) and clothing system (BoneClothing)\n * import these values to ensure clothing properly wraps around muscles.\n *\n * ## Design Philosophy\n *\n * - All values are tuned for muscular Korean martial arts fighter proportions\n * - Radii represent the thickness of each body part\n * - Lengths represent the extent along the bone axis\n * - Clothing should add a thin layer OUTSIDE these dimensions\n *\n * @module constants/bodyDimensions\n * @category Rendering\n * @korean 신체치수\n */\n\n// ============================================================================\n// SHOULDER DIMENSIONS (어깨 치수)\n// ============================================================================\n\n/**\n * Shoulder (deltoid) muscle radius.\n * Athletic martial artist proportions.\n * @korean 어깨반지름\n */\nexport const SHOULDER_RADIUS = 0.08;\n\n/**\n * Shoulder muscle length along bone axis.\n * @korean 어깨길이\n */\nexport const SHOULDER_LENGTH = 0.15;\n\n// ============================================================================\n// UPPER ARM DIMENSIONS (상완 치수)\n// ============================================================================\n\n/**\n * Bicep muscle radius.\n * Muscular martial artist proportions.\n * @korean 이두근반지름\n */\nexport const BICEP_RADIUS = 0.06;\n\n/**\n * Bicep muscle length.\n * @korean 이두근길이\n */\nexport const BICEP_LENGTH = 0.25;\n\n/**\n * Tricep muscle radius.\n * Slightly smaller than bicep.\n * @korean 삼두근반지름\n */\nexport const TRICEP_RADIUS = 0.055;\n\n/**\n * Tricep muscle length.\n * @korean 삼두근길이\n */\nexport const TRICEP_LENGTH = 0.22;\n\n/**\n * Combined upper arm radius for clothing calculations.\n * Uses the larger of bicep/tricep for proper fit.\n * @korean 상완반지름\n */\nexport const UPPER_ARM_RADIUS = Math.max(BICEP_RADIUS, TRICEP_RADIUS);\n\n// ============================================================================\n// FOREARM DIMENSIONS (전완 치수)\n// ============================================================================\n\n/**\n * Forearm muscle radius.\n * Athletic martial artist proportions.\n * @korean 전완반지름\n */\nexport const FOREARM_RADIUS = 0.045;\n\n/**\n * Forearm muscle length.\n * @korean 전완길이\n */\nexport const FOREARM_LENGTH = 0.2;\n\n// ============================================================================\n// TORSO DIMENSIONS (몸통 치수)\n// ============================================================================\n\n/**\n * Pectorals (chest) muscle radius/depth.\n * Athletic chest depth.\n * @korean 가슴반지름\n */\nexport const PECTORALS_RADIUS = 0.12;\n\n/**\n * Pectorals width (length in capsule terms).\n * @korean 가슴너비\n */\nexport const PECTORALS_LENGTH = 0.28;\n\n/**\n * Core (midsection) muscle radius.\n * Athletic core depth.\n * @korean 코어반지름\n */\nexport const CORE_RADIUS = 0.1;\n\n/**\n * Core muscle length.\n * @korean 코어길이\n */\nexport const CORE_LENGTH = 0.25;\n\n/**\n * Abdominals muscle radius.\n * Athletic abs depth.\n * @korean 복근반지름\n */\nexport const ABS_RADIUS = 0.08;\n\n/**\n * Abdominals muscle length.\n * @korean 복근길이\n */\nexport const ABS_LENGTH = 0.22;\n\n/**\n * Obliques muscle radius.\n * @korean 복사근반지름\n */\nexport const OBLIQUES_RADIUS = 0.06;\n\n/**\n * Obliques muscle length.\n * @korean 복사근길이\n */\nexport const OBLIQUES_LENGTH = 0.2;\n\n// ============================================================================\n// HIP/GLUTE DIMENSIONS (엉덩이 치수)\n// ============================================================================\n\n/**\n * Hip flexor muscle radius.\n * @korean 고관절굴근반지름\n */\nexport const HIP_FLEXOR_RADIUS = 0.04;\n\n/**\n * Hip flexor muscle length.\n * @korean 고관절굴근길이\n */\nexport const HIP_FLEXOR_LENGTH = 0.12;\n\n/**\n * Glute muscle radius.\n * Athletic glute proportions.\n * @korean 둔근반지름\n */\nexport const GLUTE_RADIUS = 0.06;\n\n/**\n * Glute muscle length.\n * @korean 둔근길이\n */\nexport const GLUTE_LENGTH = 0.14;\n\n// ============================================================================\n// THIGH DIMENSIONS (허벅지 치수)\n// ============================================================================\n\n/**\n * Quadriceps muscle radius.\n * Athletic thigh proportions.\n * @korean 대퇴사두근반지름\n */\nexport const QUAD_RADIUS = 0.055;\n\n/**\n * Quadriceps muscle length.\n * @korean 대퇴사두근길이\n */\nexport const QUAD_LENGTH = 0.25;\n\n/**\n * Hamstring muscle radius.\n * @korean 햄스트링반지름\n */\nexport const HAMSTRING_RADIUS = 0.05;\n\n/**\n * Hamstring muscle length.\n * @korean 햄스트링길이\n */\nexport const HAMSTRING_LENGTH = 0.23;\n\n/**\n * Combined thigh radius for clothing calculations.\n * Uses the larger of quad/hamstring for proper fit.\n * @korean 허벅지반지름\n */\nexport const THIGH_RADIUS = Math.max(QUAD_RADIUS, HAMSTRING_RADIUS);\n\n// ============================================================================\n// LOWER LEG DIMENSIONS (종아리 치수)\n// ============================================================================\n\n/**\n * Calf muscle radius.\n * Athletic calf proportions.\n * @korean 종아리반지름\n */\nexport const CALF_RADIUS = 0.04;\n\n/**\n * Calf muscle length.\n * @korean 종아리길이\n */\nexport const CALF_LENGTH = 0.2;\n\n// ============================================================================\n// BACK DIMENSIONS (등 치수)\n// ============================================================================\n\n/**\n * Latissimus dorsi muscle radius.\n * @korean 광배근반지름\n */\nexport const LAT_RADIUS = 0.05;\n\n/**\n * Latissimus dorsi muscle length.\n * @korean 광배근길이\n */\nexport const LAT_LENGTH = 0.2;\n\n/**\n * Trapezius muscle radius.\n * @korean 승모근반지름\n */\nexport const TRAPEZIUS_RADIUS = 0.045;\n\n/**\n * Trapezius muscle length.\n * @korean 승모근길이\n */\nexport const TRAPEZIUS_LENGTH = 0.14;\n\n/**\n * Erector spinae muscle radius.\n * @korean 척추기립근반지름\n */\nexport const ERECTOR_SPINAE_RADIUS = 0.035;\n\n/**\n * Erector spinae muscle length.\n * @korean 척추기립근길이\n */\nexport const ERECTOR_SPINAE_LENGTH = 0.18;\n\n// ============================================================================\n// CLOTHING CONSTANTS (의류 상수)\n// ============================================================================\n\n/**\n * Standard fabric thickness for tight-fitting clothing.\n * @korean 밀착의류두께\n */\nexport const CLOTHING_THICKNESS_TIGHT = 0.01;\n\n/**\n * Standard fabric thickness for fitted clothing.\n * @korean 맞춤의류두께\n */\nexport const CLOTHING_THICKNESS_FITTED = 0.015;\n\n/**\n * Standard fabric thickness for loose clothing.\n * @korean 헐렁한의류두께\n */\nexport const CLOTHING_THICKNESS_LOOSE = 0.025;\n\n/**\n * Standard fabric thickness for oversized clothing.\n * @korean 오버사이즈의류두께\n */\nexport const CLOTHING_THICKNESS_OVERSIZED = 0.04;\n\n/**\n * Get clothing thickness based on fit type.\n * @param fit - Clothing fit type\n * @returns Fabric thickness in meters\n * @korean 의류두께가져오기\n */\nexport const getClothingThickness = (\n fit: \"tight\" | \"fitted\" | \"loose\" | \"oversized\",\n): number => {\n switch (fit) {\n case \"tight\":\n return CLOTHING_THICKNESS_TIGHT;\n case \"fitted\":\n return CLOTHING_THICKNESS_FITTED;\n case \"loose\":\n return CLOTHING_THICKNESS_LOOSE;\n case \"oversized\":\n return CLOTHING_THICKNESS_OVERSIZED;\n default:\n return CLOTHING_THICKNESS_FITTED;\n }\n};\n\n/**\n * Calculate clothing radius for a body part.\n * Adds fabric thickness to body radius with body thickness scaling.\n *\n * @param bodyRadius - Base body part radius\n * @param bodyThickness - Body thickness multiplier (from muscle/fat mass)\n * @param clothingThickness - Fabric thickness\n * @returns Total clothing radius\n * @korean 의류반지름계산\n */\nexport const calculateClothingRadius = (\n bodyRadius: number,\n bodyThickness: number,\n clothingThickness: number,\n): number => {\n return bodyRadius * bodyThickness + clothingThickness;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,IAAa,kBAAkB;;;;;AAM/B,IAAa,kBAAkB;;;;;;AAW/B,IAAa,eAAe;;;;;AAM5B,IAAa,eAAe;;;;;;AAO5B,IAAa,gBAAgB;;;;;AAM7B,IAAa,gBAAgB;;;;;;AAkB7B,IAAa,iBAAiB;;;;;AAM9B,IAAa,iBAAiB;;;;;;AAW9B,IAAa,mBAAmB;;;;;AAMhC,IAAa,mBAAmB;;;;;;AAOhC,IAAa,cAAc;;;;;AAM3B,IAAa,cAAc;;;;;;AAO3B,IAAa,aAAa;;;;;AAM1B,IAAa,aAAa;;;;;AAM1B,IAAa,kBAAkB;;;;;AAM/B,IAAa,kBAAkB;;;;;AAU/B,IAAa,oBAAoB;;;;;AAMjC,IAAa,oBAAoB;;;;;;AAOjC,IAAa,eAAe;;;;;AAM5B,IAAa,eAAe;;;;;;AAW5B,IAAa,cAAc;;;;;AAM3B,IAAa,cAAc;;;;;AAM3B,IAAa,mBAAmB;;;;;AAMhC,IAAa,mBAAmB;;;;;;AAkBhC,IAAa,cAAc;;;;;AAM3B,IAAa,cAAc;;;;;AAU3B,IAAa,aAAa;;;;;AAM1B,IAAa,aAAa;;;;;AAM1B,IAAa,mBAAmB;;;;;AAMhC,IAAa,mBAAmB;;;;;AAMhC,IAAa,wBAAwB;;;;;AAMrC,IAAa,wBAAwB;;;;;AAgBrC,IAAa,4BAA4B;;;;;;;;;;;AA+CzC,IAAa,2BACX,YACA,eACA,sBACW;CACX,OAAO,aAAa,gBAAgB"}
|
|
1
|
+
{"version":3,"file":"bodyDimensions.js","names":[],"sources":["../../src/constants/bodyDimensions.ts"],"sourcesContent":["/**\n * Centralized body dimensions for consistent rendering across muscles and clothing.\n *\n * **Korean**: 신체 치수 (Body Dimensions)\n *\n * This module provides a single source of truth for body part radii and lengths.\n * Both the muscle system (BoneAttachedMuscles) and clothing system (BoneClothing)\n * import these values to ensure clothing properly wraps around muscles.\n *\n * ## Design Philosophy\n *\n * - All values are tuned for muscular Korean martial arts fighter proportions\n * - Radii represent the thickness of each body part\n * - Lengths represent the extent along the bone axis\n * - Clothing should add a thin layer OUTSIDE these dimensions\n *\n * @module constants/bodyDimensions\n * @category Rendering\n * @korean 신체치수\n */\n\n// ============================================================================\n// SHOULDER DIMENSIONS (어깨 치수)\n// ============================================================================\n\n/**\n * Shoulder (deltoid) muscle radius.\n * Athletic martial artist proportions.\n * @korean 어깨반지름\n */\nexport const SHOULDER_RADIUS = 0.08;\n\n/**\n * Shoulder muscle length along bone axis.\n * @korean 어깨길이\n */\nexport const SHOULDER_LENGTH = 0.15;\n\n// ============================================================================\n// UPPER ARM DIMENSIONS (상완 치수)\n// ============================================================================\n\n/**\n * Bicep muscle radius.\n * Muscular martial artist proportions.\n * @korean 이두근반지름\n */\nexport const BICEP_RADIUS = 0.06;\n\n/**\n * Bicep muscle length.\n * @korean 이두근길이\n */\nexport const BICEP_LENGTH = 0.25;\n\n/**\n * Tricep muscle radius.\n * Slightly smaller than bicep.\n * @korean 삼두근반지름\n */\nexport const TRICEP_RADIUS = 0.055;\n\n/**\n * Tricep muscle length.\n * @korean 삼두근길이\n */\nexport const TRICEP_LENGTH = 0.22;\n\n/**\n * Combined upper arm radius for clothing calculations.\n * Uses the larger of bicep/tricep for proper fit.\n * @korean 상완반지름\n */\nexport const UPPER_ARM_RADIUS = Math.max(BICEP_RADIUS, TRICEP_RADIUS);\n\n// ============================================================================\n// FOREARM DIMENSIONS (전완 치수)\n// ============================================================================\n\n/**\n * Forearm muscle radius.\n * Athletic martial artist proportions.\n * @korean 전완반지름\n */\nexport const FOREARM_RADIUS = 0.045;\n\n/**\n * Forearm muscle length.\n * @korean 전완길이\n */\nexport const FOREARM_LENGTH = 0.2;\n\n// ============================================================================\n// TORSO DIMENSIONS (몸통 치수)\n// ============================================================================\n\n/**\n * Pectorals (chest) muscle radius/depth.\n * Athletic chest depth.\n * @korean 가슴반지름\n */\nexport const PECTORALS_RADIUS = 0.12;\n\n/**\n * Pectorals width (length in capsule terms).\n * @korean 가슴너비\n */\nexport const PECTORALS_LENGTH = 0.28;\n\n/**\n * Core (midsection) muscle radius.\n * Athletic core depth.\n * @korean 코어반지름\n */\nexport const CORE_RADIUS = 0.1;\n\n/**\n * Core muscle length.\n * @korean 코어길이\n */\nexport const CORE_LENGTH = 0.25;\n\n/**\n * Abdominals muscle radius.\n * Athletic abs depth.\n * @korean 복근반지름\n */\nexport const ABS_RADIUS = 0.08;\n\n/**\n * Abdominals muscle length.\n * @korean 복근길이\n */\nexport const ABS_LENGTH = 0.22;\n\n/**\n * Obliques muscle radius.\n * @korean 복사근반지름\n */\nexport const OBLIQUES_RADIUS = 0.06;\n\n/**\n * Obliques muscle length.\n * @korean 복사근길이\n */\nexport const OBLIQUES_LENGTH = 0.2;\n\n// ============================================================================\n// HIP/GLUTE DIMENSIONS (엉덩이 치수)\n// ============================================================================\n\n/**\n * Hip flexor muscle radius.\n * @korean 고관절굴근반지름\n */\nexport const HIP_FLEXOR_RADIUS = 0.04;\n\n/**\n * Hip flexor muscle length.\n * @korean 고관절굴근길이\n */\nexport const HIP_FLEXOR_LENGTH = 0.12;\n\n/**\n * Glute muscle radius.\n * Athletic glute proportions.\n * @korean 둔근반지름\n */\nexport const GLUTE_RADIUS = 0.06;\n\n/**\n * Glute muscle length.\n * @korean 둔근길이\n */\nexport const GLUTE_LENGTH = 0.14;\n\n// ============================================================================\n// THIGH DIMENSIONS (허벅지 치수)\n// ============================================================================\n\n/**\n * Quadriceps muscle radius.\n * Athletic thigh proportions.\n * @korean 대퇴사두근반지름\n */\nexport const QUAD_RADIUS = 0.055;\n\n/**\n * Quadriceps muscle length.\n * @korean 대퇴사두근길이\n */\nexport const QUAD_LENGTH = 0.25;\n\n/**\n * Hamstring muscle radius.\n * @korean 햄스트링반지름\n */\nexport const HAMSTRING_RADIUS = 0.05;\n\n/**\n * Hamstring muscle length.\n * @korean 햄스트링길이\n */\nexport const HAMSTRING_LENGTH = 0.23;\n\n/**\n * Combined thigh radius for clothing calculations.\n * Uses the larger of quad/hamstring for proper fit.\n * @korean 허벅지반지름\n */\nexport const THIGH_RADIUS = Math.max(QUAD_RADIUS, HAMSTRING_RADIUS);\n\n// ============================================================================\n// LOWER LEG DIMENSIONS (종아리 치수)\n// ============================================================================\n\n/**\n * Calf muscle radius.\n * Athletic calf proportions.\n * @korean 종아리반지름\n */\nexport const CALF_RADIUS = 0.04;\n\n/**\n * Calf muscle length.\n * @korean 종아리길이\n */\nexport const CALF_LENGTH = 0.2;\n\n// ============================================================================\n// BACK DIMENSIONS (등 치수)\n// ============================================================================\n\n/**\n * Latissimus dorsi muscle radius.\n * @korean 광배근반지름\n */\nexport const LAT_RADIUS = 0.05;\n\n/**\n * Latissimus dorsi muscle length.\n * @korean 광배근길이\n */\nexport const LAT_LENGTH = 0.2;\n\n/**\n * Trapezius muscle radius.\n * @korean 승모근반지름\n */\nexport const TRAPEZIUS_RADIUS = 0.045;\n\n/**\n * Trapezius muscle length.\n * @korean 승모근길이\n */\nexport const TRAPEZIUS_LENGTH = 0.14;\n\n/**\n * Erector spinae muscle radius.\n * @korean 척추기립근반지름\n */\nexport const ERECTOR_SPINAE_RADIUS = 0.035;\n\n/**\n * Erector spinae muscle length.\n * @korean 척추기립근길이\n */\nexport const ERECTOR_SPINAE_LENGTH = 0.18;\n\n// ============================================================================\n// CLOTHING CONSTANTS (의류 상수)\n// ============================================================================\n\n/**\n * Standard fabric thickness for tight-fitting clothing.\n * @korean 밀착의류두께\n */\nexport const CLOTHING_THICKNESS_TIGHT = 0.01;\n\n/**\n * Standard fabric thickness for fitted clothing.\n * @korean 맞춤의류두께\n */\nexport const CLOTHING_THICKNESS_FITTED = 0.015;\n\n/**\n * Standard fabric thickness for loose clothing.\n * @korean 헐렁한의류두께\n */\nexport const CLOTHING_THICKNESS_LOOSE = 0.025;\n\n/**\n * Standard fabric thickness for oversized clothing.\n * @korean 오버사이즈의류두께\n */\nexport const CLOTHING_THICKNESS_OVERSIZED = 0.04;\n\n/**\n * Get clothing thickness based on fit type.\n * @param fit - Clothing fit type\n * @returns Fabric thickness in meters\n * @korean 의류두께가져오기\n */\nexport const getClothingThickness = (\n fit: \"tight\" | \"fitted\" | \"loose\" | \"oversized\",\n): number => {\n switch (fit) {\n case \"tight\":\n return CLOTHING_THICKNESS_TIGHT;\n case \"fitted\":\n return CLOTHING_THICKNESS_FITTED;\n case \"loose\":\n return CLOTHING_THICKNESS_LOOSE;\n case \"oversized\":\n return CLOTHING_THICKNESS_OVERSIZED;\n default:\n return CLOTHING_THICKNESS_FITTED;\n }\n};\n\n/**\n * Calculate clothing radius for a body part.\n * Adds fabric thickness to body radius with body thickness scaling.\n *\n * @param bodyRadius - Base body part radius\n * @param bodyThickness - Body thickness multiplier (from muscle/fat mass)\n * @param clothingThickness - Fabric thickness\n * @returns Total clothing radius\n * @korean 의류반지름계산\n */\nexport const calculateClothingRadius = (\n bodyRadius: number,\n bodyThickness: number,\n clothingThickness: number,\n): number => {\n return bodyRadius * bodyThickness + clothingThickness;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,IAAa,kBAAkB;;;;;AAM/B,IAAa,kBAAkB;;;;;;AAW/B,IAAa,eAAe;;;;;AAM5B,IAAa,eAAe;;;;;;AAO5B,IAAa,gBAAgB;;;;;AAM7B,IAAa,gBAAgB;;;;;;AAkB7B,IAAa,iBAAiB;;;;;AAM9B,IAAa,iBAAiB;;;;;;AAW9B,IAAa,mBAAmB;;;;;AAMhC,IAAa,mBAAmB;;;;;;AAOhC,IAAa,cAAc;;;;;AAM3B,IAAa,cAAc;;;;;;AAO3B,IAAa,aAAa;;;;;AAM1B,IAAa,aAAa;;;;;AAM1B,IAAa,kBAAkB;;;;;AAM/B,IAAa,kBAAkB;;;;;AAU/B,IAAa,oBAAoB;;;;;AAMjC,IAAa,oBAAoB;;;;;;AAOjC,IAAa,eAAe;;;;;AAM5B,IAAa,eAAe;;;;;;AAW5B,IAAa,cAAc;;;;;AAM3B,IAAa,cAAc;;;;;AAM3B,IAAa,mBAAmB;;;;;AAMhC,IAAa,mBAAmB;;;;;;AAkBhC,IAAa,cAAc;;;;;AAM3B,IAAa,cAAc;;;;;AAU3B,IAAa,aAAa;;;;;AAM1B,IAAa,aAAa;;;;;AAM1B,IAAa,mBAAmB;;;;;AAMhC,IAAa,mBAAmB;;;;;AAMhC,IAAa,wBAAwB;;;;;AAMrC,IAAa,wBAAwB;;;;;AAgBrC,IAAa,4BAA4B;;;;;;;;;;;AA+CzC,IAAa,2BACX,YACA,eACA,sBACW;CACX,OAAO,aAAa,gBAAgB;AACtC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bodyRenderingConstants.js","names":[],"sources":["../../src/constants/bodyRenderingConstants.ts"],"sourcesContent":["/**\n * Centralized body rendering constants for Black Trigram.\n *\n * **Korean**: 신체 렌더링 상수 (Body Rendering Constants)\n *\n * This module consolidates all constants related to character body rendering,\n * including bone thickness, muscle scaling, and visual amplification factors.\n * Having them centralized makes it easier to tune the visual appearance.\n *\n * ## Design Philosophy\n *\n * - All values are tuned for realistic Korean martial arts fighter proportions\n * - Constants are grouped by system (bones, muscles, clothing, etc.)\n * - Amplification is kept minimal for anatomical accuracy\n *\n * @module constants/bodyRenderingConstants\n * @category Rendering\n * @korean 신체렌더링상수\n */\n\n// ============================================================================\n// BONE RENDERING CONSTANTS (뼈 렌더링)\n// ============================================================================\n\n/**\n * Base bone radius as fraction of bone length.\n *\n * Anatomically, limb bones have diameter roughly 8-12% of their length.\n * Using 0.10 for realistic slim proportions - athletic fighter build.\n * Reduced from 0.16 which was too puffy/bubble-like.\n *\n * @korean 기본뼈반지름비율\n */\nexport const BASE_BONE_RADIUS_RATIO = 0.1;\n\n/**\n * Minimum bone thickness multiplier.\n *\n * Ensures even lean archetypes maintain visible body mass.\n * Using 0.75 for lean athletic appearance.\n *\n * @korean 최소뼈두께배수\n */\nexport const MIN_BONE_THICKNESS_MULTIPLIER = 0.75;\n\n/**\n * Maximum bone thickness multiplier.\n *\n * Prevents overly bulky appearance for high muscle mass archetypes.\n *\n * @korean 최대뼈두께배수\n */\nexport const MAX_BONE_THICKNESS_MULTIPLIER = 1.3;\n\n/**\n * Visual amplification for bone thickness differences.\n *\n * Amplifies the visual difference between lean and muscular archetypes.\n * Lower values = more subtle differences, higher = more dramatic.\n *\n * @korean 뼈두께시각적증폭\n */\nexport const BONE_THICKNESS_AMPLIFICATION = 1.5;\n\n/**\n * Reference muscle mass for bone thickness calculation (kg).\n *\n * @korean 기준근육량\n */\nexport const REFERENCE_MUSCLE_MASS = 35;\n\n/**\n * Reference fat mass for bone thickness calculation (kg).\n *\n * @korean 기준지방량\n */\nexport const REFERENCE_FAT_MASS = 12;\n\n/**\n * Muscle contribution percentage to bone thickness.\n *\n * @korean 근육기여율\n */\nexport const MUSCLE_THICKNESS_CONTRIBUTION = 0.7;\n\n/**\n * Fat contribution percentage to bone thickness.\n *\n * @korean 지방기여율\n */\nexport const FAT_THICKNESS_CONTRIBUTION = 0.3;\n\n// ============================================================================\n// MUSCLE RENDERING CONSTANTS (근육 렌더링)\n// ============================================================================\n\n/**\n * Muscle geometry normalization factor.\n *\n * When muscles are the primary body shape (bones hidden), this should be 1.0\n * to use radius values directly. The muscle radii (0.10-0.16) are already\n * sized appropriately for athletic martial artist proportions.\n *\n * Previous values (0.35, 0.55) caused double-scaling issues when combined\n * with mesh scale transforms, resulting in skeleton showing through muscles.\n *\n * @korean 근육정규화계수\n */\nexport const MUSCLE_GEOMETRY_NORMALIZATION = 1.0;\n\n/**\n * Base muscle amplification factor for visual differences.\n *\n * Amplifies muscle size differences between archetypes.\n * Previous: 4.0 (caused 0.64x-1.91x range, too extreme)\n * Current: 0.8 (produces 0.84x-1.30x range, realistic)\n *\n * @korean 근육증폭기본계수\n */\nexport const MUSCLE_AMPLIFICATION_BASE = 0.8;\n\n/**\n * Exponent for muscle scaling curve.\n *\n * Previous: 1.5 (exponential, too extreme for lean archetypes)\n * Current: 1.0 (linear, proportional differences)\n *\n * @korean 근육증폭지수\n */\nexport const MUSCLE_AMPLIFICATION_EXPONENT = 1.0;\n\n/**\n * Minimum muscle scale factor.\n *\n * Floor to prevent muscles from vanishing on lean archetypes.\n * 0.82 ensures Hacker (28kg) still has visible musculature.\n *\n * @korean 최소근육크기\n */\nexport const MIN_MUSCLE_SCALE = 0.82;\n\n/**\n * Muscle contraction intensity during combat.\n *\n * How much muscles visually contract during attacks/blocks.\n *\n * @korean 근육수축강도\n */\nexport const MUSCLE_CONTRACTION_INTENSITY = 0.15;\n\n// ============================================================================\n// SKELETON SCALING CONSTANTS (골격 스케일링)\n// ============================================================================\n\n/**\n * Visual amplification for archetype dimension differences.\n *\n * Raw physical attribute differences are subtle (2-12%).\n * This factor amplifies them for more visible silhouettes.\n *\n * @korean 시각적증폭계수\n */\nexport const VISUAL_AMPLIFICATION_FACTOR = 1.2;\n\n/**\n * Height scaling amplification (kept subtle for realism).\n *\n * @korean 키증폭계수\n */\nexport const HEIGHT_AMPLIFICATION = 1.5;\n\n/**\n * Shoulder width amplification for silhouette distinction.\n *\n * @korean 어깨증폭계수\n */\nexport const SHOULDER_AMPLIFICATION = 1.15;\n\n// ============================================================================\n// REFERENCE PHYSICAL ATTRIBUTES (기준 신체 속성)\n// ============================================================================\n\n/**\n * Reference Korean male fighter attributes.\n *\n * Used as baseline for all scaling calculations.\n *\n * @korean 기준신체속성\n */\nexport const REFERENCE_ATTRIBUTES = {\n weight: 75, // kg\n totalHeight: 178, // cm\n legLength: 95, // cm\n armLength: 75, // cm\n torsoLength: 58, // cm\n headSize: 22, // cm\n neckLength: 10, // cm\n shoulderWidth: 43, // cm\n muscleMass: 35, // kg\n fatMass: 12, // kg\n age: 30,\n walkSpeed: 6.0, // m/s\n runSpeed: 9.5, // m/s\n acceleration: 12.0, // m/s²\n} as const;\n\n// ============================================================================\n// ANATOMICAL PROPORTION RATIOS (해부학적 비율)\n// ============================================================================\n\n/**\n * Body proportions as fractions of total height.\n *\n * Based on 8-head canon anatomical proportions.\n *\n * @korean 신체비율\n */\nexport const BODY_PROPORTIONS = {\n HEAD_RATIO: 0.125, // Head is 1/8 of height\n NECK_RATIO: 0.055, // Neck is ~5.5% of height\n TORSO_RATIO: 0.33, // Torso is ~33% of height\n LEG_RATIO: 0.48, // Legs are ~48% of height\n UPPER_ARM_RATIO: 0.55, // Upper arm is 55% of total arm\n FOREARM_RATIO: 0.45, // Forearm is 45% of total arm\n THIGH_RATIO: 0.55, // Thigh is 55% of leg length\n SHIN_RATIO: 0.45, // Shin is 45% of leg length\n HAND_RATIO: 0.105, // Hand is ~10.5% of height\n FOOT_RATIO: 0.15, // Foot length is ~15% of height\n SHOULDER_WIDTH_RATIO: 0.255, // Shoulder width 23-25% of height\n HIP_WIDTH_RATIO: 0.17, // Hip width 16-18% of height\n} as const;\n\n// ============================================================================\n// KOREAN ANATOMY SPECIFICS (한국인 해부학적 특성)\n// ============================================================================\n\n/**\n * Korean adult male anatomical adjustments.\n *\n * Based on Korean physical anthropology studies.\n * These modify proportions for authentic Korean body types.\n *\n * @korean 한국인체형비율\n */\nexport const KOREAN_ANATOMY_ADJUSTMENTS = {\n /** Slightly shorter torso relative to Western proportions */\n TORSO_ADJUSTMENT: 0.98,\n /** Proportionally longer legs for height */\n LEG_ADJUSTMENT: 1.02,\n /** Narrower shoulder width relative to height */\n SHOULDER_ADJUSTMENT: 0.97,\n /** More compact hip structure */\n HIP_ADJUSTMENT: 0.95,\n /** Flatter chest profile */\n CHEST_DEPTH_ADJUSTMENT: 0.92,\n} as const;\n\n// ============================================================================\n// CLOTHING RENDERING CONSTANTS (의복 렌더링)\n// ============================================================================\n\n/**\n * Base clothing offset from body surface.\n *\n * Gap between body and clothing geometry for natural appearance.\n *\n * @korean 의복기본오프셋\n */\nexport const CLOTHING_OFFSET = 0.01; // 1cm gap\n\n/**\n * Clothing thickness (affects layering).\n *\n * @korean 의복두께\n */\nexport const CLOTHING_THICKNESS = 0.005; // 5mm\n\n/**\n * Clothing drape factor for loose garments.\n *\n * @korean 의복드레이프계수\n */\nexport const CLOTHING_DRAPE_FACTOR = 1.1;\n\n// ============================================================================\n// FOOT RENDERING CONSTANTS (발 렌더링)\n// ============================================================================\n\n/**\n * Base foot length in meters (for average 180cm person).\n *\n * @korean 기본발길이\n */\nexport const BASE_FOOT_LENGTH = 0.26; // 26cm\n\n/**\n * Foot width ratio relative to length.\n *\n * @korean 발너비비율\n */\nexport const FOOT_WIDTH_RATIO = 0.385; // ~10cm for 26cm foot\n\n/**\n * Foot height ratio at ankle.\n *\n * @korean 발높이비율\n */\nexport const FOOT_HEIGHT_RATIO = 0.308; // ~8cm for 26cm foot\n\n// ============================================================================\n// HAND RENDERING CONSTANTS (손 렌더링)\n// ============================================================================\n\n/**\n * Base palm width in meters.\n *\n * @korean 기본손바닥너비\n */\nexport const BASE_PALM_WIDTH = 0.085; // 8.5cm\n\n/**\n * Palm length as ratio of palm width.\n *\n * @korean 손바닥길이비율\n */\nexport const PALM_LENGTH_RATIO = 1.12; // ~9.5cm\n\n/**\n * Palm thickness as ratio of width.\n *\n * @korean 손바닥두께비율\n */\nexport const PALM_THICKNESS_RATIO = 0.294; // ~2.5cm\n\n// ============================================================================\n// HELPER FUNCTIONS (도우미 함수)\n// ============================================================================\n\n/**\n * Calculate bone thickness multiplier from physical attributes.\n *\n * @param muscleMass - Muscle mass in kg\n * @param fatMass - Fat mass in kg\n * @returns Thickness multiplier (0.85 - 1.3)\n * @korean 뼈두께배수계산\n */\nexport function calculateBoneThickness(\n muscleMass: number,\n fatMass: number,\n): number {\n const muscleRatio = muscleMass / REFERENCE_MUSCLE_MASS;\n const fatRatio = fatMass / REFERENCE_FAT_MASS;\n\n const muscleContribution =\n Math.sqrt(muscleRatio) * MUSCLE_THICKNESS_CONTRIBUTION;\n const fatContribution = Math.sqrt(fatRatio) * FAT_THICKNESS_CONTRIBUTION;\n\n const rawMultiplier = muscleContribution + fatContribution;\n const deviation = rawMultiplier - 1.0;\n const amplified = 1.0 + deviation * BONE_THICKNESS_AMPLIFICATION;\n\n return Math.max(\n MIN_BONE_THICKNESS_MULTIPLIER,\n Math.min(MAX_BONE_THICKNESS_MULTIPLIER, amplified),\n );\n}\n\n/**\n * Calculate muscle scale factor from muscle mass.\n *\n * @param muscleMass - Muscle mass in kg\n * @returns Scale factor (0.5 - 2.0+)\n * @korean 근육크기계산\n */\nexport function calculateMuscleScale(muscleMass: number): number {\n const massRatio = muscleMass / REFERENCE_MUSCLE_MASS;\n const deviation = massRatio - 1.0;\n\n const exponentialDeviation =\n Math.sign(deviation) *\n Math.pow(Math.abs(deviation), MUSCLE_AMPLIFICATION_EXPONENT);\n\n return Math.max(\n MIN_MUSCLE_SCALE,\n 1.0 + exponentialDeviation * MUSCLE_AMPLIFICATION_BASE,\n );\n}\n\n/**\n * Apply visual amplification to a scaling factor.\n *\n * @param rawFactor - Raw scaling factor (1.0 = reference)\n * @returns Amplified scaling factor\n * @korean 시각적증폭적용\n */\nexport function amplifyScaling(rawFactor: number): number {\n const deviation = rawFactor - 1.0;\n return 1.0 + deviation * VISUAL_AMPLIFICATION_FACTOR;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCA,IAAa,yBAAyB;;;;;;;;;AAUtC,IAAa,gCAAgC;;;;;;;;AAS7C,IAAa,gCAAgC;;;;;;;;;AAU7C,IAAa,+BAA+B;;;;;;AAqB5C,IAAa,gCAAgC;;;;;;AAO7C,IAAa,6BAA6B;;;;;;;;;;AA6B1C,IAAa,4BAA4B;;;;;;;;;AAoBzC,IAAa,mBAAmB;;;;;;;;AAkDhC,IAAa,uBAAuB;CAClC,QAAQ;CACR,aAAa;CACb,WAAW;CACX,WAAW;CACX,aAAa;CACb,UAAU;CACV,YAAY;CACZ,eAAe;CACf,YAAY;CACZ,SAAS;CACT,KAAK;CACL,WAAW;CACX,UAAU;CACV,cAAc;CACf;;;;;;;;;AA8ID,SAAgB,uBACd,YACA,SACQ;CACR,MAAM,cAAc,aAAA;CACpB,MAAM,WAAW,UAAA;CAQjB,MAAM,YAAY,KALhB,KAAK,KAAK,YAAY,GAAG,gCACH,KAAK,KAAK,SAAS,GAAG,6BAGZ,KACE;CAEpC,OAAO,KAAK,IACV,+BACA,KAAK,IAAI,+BAA+B,UAAU,CACnD"}
|
|
1
|
+
{"version":3,"file":"bodyRenderingConstants.js","names":[],"sources":["../../src/constants/bodyRenderingConstants.ts"],"sourcesContent":["/**\n * Centralized body rendering constants for Black Trigram.\n *\n * **Korean**: 신체 렌더링 상수 (Body Rendering Constants)\n *\n * This module consolidates all constants related to character body rendering,\n * including bone thickness, muscle scaling, and visual amplification factors.\n * Having them centralized makes it easier to tune the visual appearance.\n *\n * ## Design Philosophy\n *\n * - All values are tuned for realistic Korean martial arts fighter proportions\n * - Constants are grouped by system (bones, muscles, clothing, etc.)\n * - Amplification is kept minimal for anatomical accuracy\n *\n * @module constants/bodyRenderingConstants\n * @category Rendering\n * @korean 신체렌더링상수\n */\n\n// ============================================================================\n// BONE RENDERING CONSTANTS (뼈 렌더링)\n// ============================================================================\n\n/**\n * Base bone radius as fraction of bone length.\n *\n * Anatomically, limb bones have diameter roughly 8-12% of their length.\n * Using 0.10 for realistic slim proportions - athletic fighter build.\n * Reduced from 0.16 which was too puffy/bubble-like.\n *\n * @korean 기본뼈반지름비율\n */\nexport const BASE_BONE_RADIUS_RATIO = 0.1;\n\n/**\n * Minimum bone thickness multiplier.\n *\n * Ensures even lean archetypes maintain visible body mass.\n * Using 0.75 for lean athletic appearance.\n *\n * @korean 최소뼈두께배수\n */\nexport const MIN_BONE_THICKNESS_MULTIPLIER = 0.75;\n\n/**\n * Maximum bone thickness multiplier.\n *\n * Prevents overly bulky appearance for high muscle mass archetypes.\n *\n * @korean 최대뼈두께배수\n */\nexport const MAX_BONE_THICKNESS_MULTIPLIER = 1.3;\n\n/**\n * Visual amplification for bone thickness differences.\n *\n * Amplifies the visual difference between lean and muscular archetypes.\n * Lower values = more subtle differences, higher = more dramatic.\n *\n * @korean 뼈두께시각적증폭\n */\nexport const BONE_THICKNESS_AMPLIFICATION = 1.5;\n\n/**\n * Reference muscle mass for bone thickness calculation (kg).\n *\n * @korean 기준근육량\n */\nexport const REFERENCE_MUSCLE_MASS = 35;\n\n/**\n * Reference fat mass for bone thickness calculation (kg).\n *\n * @korean 기준지방량\n */\nexport const REFERENCE_FAT_MASS = 12;\n\n/**\n * Muscle contribution percentage to bone thickness.\n *\n * @korean 근육기여율\n */\nexport const MUSCLE_THICKNESS_CONTRIBUTION = 0.7;\n\n/**\n * Fat contribution percentage to bone thickness.\n *\n * @korean 지방기여율\n */\nexport const FAT_THICKNESS_CONTRIBUTION = 0.3;\n\n// ============================================================================\n// MUSCLE RENDERING CONSTANTS (근육 렌더링)\n// ============================================================================\n\n/**\n * Muscle geometry normalization factor.\n *\n * When muscles are the primary body shape (bones hidden), this should be 1.0\n * to use radius values directly. The muscle radii (0.10-0.16) are already\n * sized appropriately for athletic martial artist proportions.\n *\n * Previous values (0.35, 0.55) caused double-scaling issues when combined\n * with mesh scale transforms, resulting in skeleton showing through muscles.\n *\n * @korean 근육정규화계수\n */\nexport const MUSCLE_GEOMETRY_NORMALIZATION = 1.0;\n\n/**\n * Base muscle amplification factor for visual differences.\n *\n * Amplifies muscle size differences between archetypes.\n * Previous: 4.0 (caused 0.64x-1.91x range, too extreme)\n * Current: 0.8 (produces 0.84x-1.30x range, realistic)\n *\n * @korean 근육증폭기본계수\n */\nexport const MUSCLE_AMPLIFICATION_BASE = 0.8;\n\n/**\n * Exponent for muscle scaling curve.\n *\n * Previous: 1.5 (exponential, too extreme for lean archetypes)\n * Current: 1.0 (linear, proportional differences)\n *\n * @korean 근육증폭지수\n */\nexport const MUSCLE_AMPLIFICATION_EXPONENT = 1.0;\n\n/**\n * Minimum muscle scale factor.\n *\n * Floor to prevent muscles from vanishing on lean archetypes.\n * 0.82 ensures Hacker (28kg) still has visible musculature.\n *\n * @korean 최소근육크기\n */\nexport const MIN_MUSCLE_SCALE = 0.82;\n\n/**\n * Muscle contraction intensity during combat.\n *\n * How much muscles visually contract during attacks/blocks.\n *\n * @korean 근육수축강도\n */\nexport const MUSCLE_CONTRACTION_INTENSITY = 0.15;\n\n// ============================================================================\n// SKELETON SCALING CONSTANTS (골격 스케일링)\n// ============================================================================\n\n/**\n * Visual amplification for archetype dimension differences.\n *\n * Raw physical attribute differences are subtle (2-12%).\n * This factor amplifies them for more visible silhouettes.\n *\n * @korean 시각적증폭계수\n */\nexport const VISUAL_AMPLIFICATION_FACTOR = 1.2;\n\n/**\n * Height scaling amplification (kept subtle for realism).\n *\n * @korean 키증폭계수\n */\nexport const HEIGHT_AMPLIFICATION = 1.5;\n\n/**\n * Shoulder width amplification for silhouette distinction.\n *\n * @korean 어깨증폭계수\n */\nexport const SHOULDER_AMPLIFICATION = 1.15;\n\n// ============================================================================\n// REFERENCE PHYSICAL ATTRIBUTES (기준 신체 속성)\n// ============================================================================\n\n/**\n * Reference Korean male fighter attributes.\n *\n * Used as baseline for all scaling calculations.\n *\n * @korean 기준신체속성\n */\nexport const REFERENCE_ATTRIBUTES = {\n weight: 75, // kg\n totalHeight: 178, // cm\n legLength: 95, // cm\n armLength: 75, // cm\n torsoLength: 58, // cm\n headSize: 22, // cm\n neckLength: 10, // cm\n shoulderWidth: 43, // cm\n muscleMass: 35, // kg\n fatMass: 12, // kg\n age: 30,\n walkSpeed: 6.0, // m/s\n runSpeed: 9.5, // m/s\n acceleration: 12.0, // m/s²\n} as const;\n\n// ============================================================================\n// ANATOMICAL PROPORTION RATIOS (해부학적 비율)\n// ============================================================================\n\n/**\n * Body proportions as fractions of total height.\n *\n * Based on 8-head canon anatomical proportions.\n *\n * @korean 신체비율\n */\nexport const BODY_PROPORTIONS = {\n HEAD_RATIO: 0.125, // Head is 1/8 of height\n NECK_RATIO: 0.055, // Neck is ~5.5% of height\n TORSO_RATIO: 0.33, // Torso is ~33% of height\n LEG_RATIO: 0.48, // Legs are ~48% of height\n UPPER_ARM_RATIO: 0.55, // Upper arm is 55% of total arm\n FOREARM_RATIO: 0.45, // Forearm is 45% of total arm\n THIGH_RATIO: 0.55, // Thigh is 55% of leg length\n SHIN_RATIO: 0.45, // Shin is 45% of leg length\n HAND_RATIO: 0.105, // Hand is ~10.5% of height\n FOOT_RATIO: 0.15, // Foot length is ~15% of height\n SHOULDER_WIDTH_RATIO: 0.255, // Shoulder width 23-25% of height\n HIP_WIDTH_RATIO: 0.17, // Hip width 16-18% of height\n} as const;\n\n// ============================================================================\n// KOREAN ANATOMY SPECIFICS (한국인 해부학적 특성)\n// ============================================================================\n\n/**\n * Korean adult male anatomical adjustments.\n *\n * Based on Korean physical anthropology studies.\n * These modify proportions for authentic Korean body types.\n *\n * @korean 한국인체형비율\n */\nexport const KOREAN_ANATOMY_ADJUSTMENTS = {\n /** Slightly shorter torso relative to Western proportions */\n TORSO_ADJUSTMENT: 0.98,\n /** Proportionally longer legs for height */\n LEG_ADJUSTMENT: 1.02,\n /** Narrower shoulder width relative to height */\n SHOULDER_ADJUSTMENT: 0.97,\n /** More compact hip structure */\n HIP_ADJUSTMENT: 0.95,\n /** Flatter chest profile */\n CHEST_DEPTH_ADJUSTMENT: 0.92,\n} as const;\n\n// ============================================================================\n// CLOTHING RENDERING CONSTANTS (의복 렌더링)\n// ============================================================================\n\n/**\n * Base clothing offset from body surface.\n *\n * Gap between body and clothing geometry for natural appearance.\n *\n * @korean 의복기본오프셋\n */\nexport const CLOTHING_OFFSET = 0.01; // 1cm gap\n\n/**\n * Clothing thickness (affects layering).\n *\n * @korean 의복두께\n */\nexport const CLOTHING_THICKNESS = 0.005; // 5mm\n\n/**\n * Clothing drape factor for loose garments.\n *\n * @korean 의복드레이프계수\n */\nexport const CLOTHING_DRAPE_FACTOR = 1.1;\n\n// ============================================================================\n// FOOT RENDERING CONSTANTS (발 렌더링)\n// ============================================================================\n\n/**\n * Base foot length in meters (for average 180cm person).\n *\n * @korean 기본발길이\n */\nexport const BASE_FOOT_LENGTH = 0.26; // 26cm\n\n/**\n * Foot width ratio relative to length.\n *\n * @korean 발너비비율\n */\nexport const FOOT_WIDTH_RATIO = 0.385; // ~10cm for 26cm foot\n\n/**\n * Foot height ratio at ankle.\n *\n * @korean 발높이비율\n */\nexport const FOOT_HEIGHT_RATIO = 0.308; // ~8cm for 26cm foot\n\n// ============================================================================\n// HAND RENDERING CONSTANTS (손 렌더링)\n// ============================================================================\n\n/**\n * Base palm width in meters.\n *\n * @korean 기본손바닥너비\n */\nexport const BASE_PALM_WIDTH = 0.085; // 8.5cm\n\n/**\n * Palm length as ratio of palm width.\n *\n * @korean 손바닥길이비율\n */\nexport const PALM_LENGTH_RATIO = 1.12; // ~9.5cm\n\n/**\n * Palm thickness as ratio of width.\n *\n * @korean 손바닥두께비율\n */\nexport const PALM_THICKNESS_RATIO = 0.294; // ~2.5cm\n\n// ============================================================================\n// HELPER FUNCTIONS (도우미 함수)\n// ============================================================================\n\n/**\n * Calculate bone thickness multiplier from physical attributes.\n *\n * @param muscleMass - Muscle mass in kg\n * @param fatMass - Fat mass in kg\n * @returns Thickness multiplier (0.85 - 1.3)\n * @korean 뼈두께배수계산\n */\nexport function calculateBoneThickness(\n muscleMass: number,\n fatMass: number,\n): number {\n const muscleRatio = muscleMass / REFERENCE_MUSCLE_MASS;\n const fatRatio = fatMass / REFERENCE_FAT_MASS;\n\n const muscleContribution =\n Math.sqrt(muscleRatio) * MUSCLE_THICKNESS_CONTRIBUTION;\n const fatContribution = Math.sqrt(fatRatio) * FAT_THICKNESS_CONTRIBUTION;\n\n const rawMultiplier = muscleContribution + fatContribution;\n const deviation = rawMultiplier - 1.0;\n const amplified = 1.0 + deviation * BONE_THICKNESS_AMPLIFICATION;\n\n return Math.max(\n MIN_BONE_THICKNESS_MULTIPLIER,\n Math.min(MAX_BONE_THICKNESS_MULTIPLIER, amplified),\n );\n}\n\n/**\n * Calculate muscle scale factor from muscle mass.\n *\n * @param muscleMass - Muscle mass in kg\n * @returns Scale factor (0.5 - 2.0+)\n * @korean 근육크기계산\n */\nexport function calculateMuscleScale(muscleMass: number): number {\n const massRatio = muscleMass / REFERENCE_MUSCLE_MASS;\n const deviation = massRatio - 1.0;\n\n const exponentialDeviation =\n Math.sign(deviation) *\n Math.pow(Math.abs(deviation), MUSCLE_AMPLIFICATION_EXPONENT);\n\n return Math.max(\n MIN_MUSCLE_SCALE,\n 1.0 + exponentialDeviation * MUSCLE_AMPLIFICATION_BASE,\n );\n}\n\n/**\n * Apply visual amplification to a scaling factor.\n *\n * @param rawFactor - Raw scaling factor (1.0 = reference)\n * @returns Amplified scaling factor\n * @korean 시각적증폭적용\n */\nexport function amplifyScaling(rawFactor: number): number {\n const deviation = rawFactor - 1.0;\n return 1.0 + deviation * VISUAL_AMPLIFICATION_FACTOR;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCA,IAAa,yBAAyB;;;;;;;;;AAUtC,IAAa,gCAAgC;;;;;;;;AAS7C,IAAa,gCAAgC;;;;;;;;;AAU7C,IAAa,+BAA+B;;;;;;AAqB5C,IAAa,gCAAgC;;;;;;AAO7C,IAAa,6BAA6B;;;;;;;;;;AA6B1C,IAAa,4BAA4B;;;;;;;;;AAoBzC,IAAa,mBAAmB;;;;;;;;AAkDhC,IAAa,uBAAuB;CAClC,QAAQ;CACR,aAAa;CACb,WAAW;CACX,WAAW;CACX,aAAa;CACb,UAAU;CACV,YAAY;CACZ,eAAe;CACf,YAAY;CACZ,SAAS;CACT,KAAK;CACL,WAAW;CACX,UAAU;CACV,cAAc;AAChB;;;;;;;;;AA8IA,SAAgB,uBACd,YACA,SACQ;CACR,MAAM,cAAc,aAAA;CACpB,MAAM,WAAW,UAAA;CAQjB,MAAM,YAAY,KALhB,KAAK,KAAK,WAAW,IAAI,gCACH,KAAK,KAAK,QAAQ,IAAI,6BAGZ,KACE;CAEpC,OAAO,KAAK,IACV,+BACA,KAAK,IAAI,+BAA+B,SAAS,CACnD;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"archetypeClothing.js","names":[],"sources":["../../src/data/archetypeClothing.ts"],"sourcesContent":["/**\n * Archetype-specific clothing configurations\n *\n * **Korean**: 원형별 의류 설정 (Archetype Clothing Configurations)\n *\n * Defines characteristic clothing sets for each of the five player archetypes,\n * combining traditional Korean martial arts attire with cyberpunk aesthetics.\n *\n * @module data/archetypeClothing\n * @category Player & Archetypes\n * @korean 원형의류데이터\n */\n\nimport { PlayerArchetype } from \"@/types\";\nimport { KOREAN_COLORS } from \"@/types/constants/colors\";\nimport type { ClothingSet, ClothingItem } from \"@/types/clothing\";\n\n/**\n * 무사 (Musa) - Traditional Warrior Clothing Set\n *\n * **Philosophy**: Honor through disciplined strength\n * **Style**: Military dobok with tactical enhancements\n * **Aesthetic**: Traditional Korean martial arts uniform modernized with military elements\n *\n * @korean 무사의류\n */\nconst MUSA_CLOTHING_ITEMS: readonly ClothingItem[] = [\n {\n id: \"musa_torso_gi\",\n nameKorean: \"전투 도복 상의\",\n nameEnglish: \"Combat Dobok Top\",\n type: \"torso\",\n material: \"fabric\",\n fit: \"fitted\",\n colorPrimary: KOREAN_COLORS.UI_BACKGROUND_MEDIUM, // Dark gray base\n colorSecondary: KOREAN_COLORS.ACCENT_GOLD,\n colorEmissive: KOREAN_COLORS.ACCENT_GOLD,\n emissiveIntensity: 0.1,\n metalness: 0.1,\n roughness: 0.8,\n attachedBones: [\"torso\", \"left_upper_arm\", \"right_upper_arm\", \"left_shoulder\", \"right_shoulder\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"musa_pants\",\n nameKorean: \"전투 도복 하의\",\n nameEnglish: \"Combat Dobok Pants\",\n type: \"pants\",\n material: \"fabric\",\n fit: \"fitted\",\n colorPrimary: KOREAN_COLORS.UI_BACKGROUND_MEDIUM,\n colorSecondary: KOREAN_COLORS.ACCENT_GOLD,\n metalness: 0.1,\n roughness: 0.8,\n attachedBones: [\"pelvis\", \"left_upper_leg\", \"right_upper_leg\", \"left_lower_leg\", \"right_lower_leg\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"musa_belt\",\n nameKorean: \"검은 띠\",\n nameEnglish: \"Black Belt\",\n type: \"belt\",\n material: \"fabric\",\n fit: \"tight\",\n colorPrimary: KOREAN_COLORS.KOREAN_BLACK,\n colorSecondary: KOREAN_COLORS.ACCENT_GOLD,\n colorEmissive: KOREAN_COLORS.ACCENT_GOLD,\n emissiveIntensity: 0.2,\n metalness: 0.0,\n roughness: 0.9,\n attachedBones: [\"pelvis\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"musa_boots\",\n nameKorean: \"전투 부츠\",\n nameEnglish: \"Combat Boots\",\n type: \"boots\",\n material: \"leather\",\n fit: \"fitted\",\n colorPrimary: KOREAN_COLORS.KOREAN_BLACK,\n metalness: 0.3,\n roughness: 0.7,\n attachedBones: [\"left_foot\", \"right_foot\"],\n castShadow: true,\n receiveShadow: true,\n },\n];\n\nexport const MUSA_CLOTHING: ClothingSet = {\n archetype: PlayerArchetype.MUSA,\n nameKorean: \"무사 군복\",\n nameEnglish: \"Military Warrior Uniform\",\n descriptionKorean: \"전통 도복과 현대 군복을 결합한 전사의 의상\",\n descriptionEnglish: \"Traditional dobok combined with modern military uniform\",\n items: MUSA_CLOTHING_ITEMS,\n themeColors: {\n primary: KOREAN_COLORS.UI_BACKGROUND_MEDIUM,\n secondary: KOREAN_COLORS.ACCENT_GOLD,\n accent: KOREAN_COLORS.KOREAN_BLACK,\n },\n};\n\n/**\n * 암살자 (Amsalja) - Shadow Assassin Clothing Set\n *\n * **Philosophy**: Efficiency through invisibility\n * **Style**: Stealth bodysuit with cyber enhancements\n * **Aesthetic**: Sleek, form-fitting with neon cyan accents\n *\n * @korean 암살자의류\n */\nconst AMSALJA_CLOTHING_ITEMS: readonly ClothingItem[] = [\n {\n id: \"amsalja_bodysuit\",\n nameKorean: \"스텔스 바디슈트\",\n nameEnglish: \"Stealth Bodysuit\",\n type: \"torso\",\n material: \"synthetic\",\n fit: \"tight\",\n colorPrimary: KOREAN_COLORS.KOREAN_BLACK,\n colorSecondary: KOREAN_COLORS.PRIMARY_CYAN,\n colorEmissive: KOREAN_COLORS.PRIMARY_CYAN,\n emissiveIntensity: 0.3,\n metalness: 0.4,\n roughness: 0.5,\n attachedBones: [\"torso\", \"left_upper_arm\", \"right_upper_arm\", \"left_lower_arm\", \"right_lower_arm\", \"left_shoulder\", \"right_shoulder\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"amsalja_pants\",\n nameKorean: \"스텔스 팬츠\",\n nameEnglish: \"Stealth Pants\",\n type: \"pants\",\n material: \"synthetic\",\n fit: \"tight\",\n colorPrimary: KOREAN_COLORS.KOREAN_BLACK,\n colorSecondary: KOREAN_COLORS.PRIMARY_CYAN,\n colorEmissive: KOREAN_COLORS.PRIMARY_CYAN,\n emissiveIntensity: 0.2,\n metalness: 0.4,\n roughness: 0.5,\n attachedBones: [\"pelvis\", \"left_upper_leg\", \"right_upper_leg\", \"left_lower_leg\", \"right_lower_leg\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"amsalja_vest\",\n nameKorean: \"사이버 조끼\",\n nameEnglish: \"Cyber Vest\",\n type: \"vest\",\n material: \"armored\",\n fit: \"fitted\",\n colorPrimary: KOREAN_COLORS.UI_BACKGROUND_DARK,\n colorSecondary: KOREAN_COLORS.PRIMARY_CYAN,\n colorEmissive: KOREAN_COLORS.PRIMARY_CYAN,\n emissiveIntensity: 0.4,\n metalness: 0.7,\n roughness: 0.3,\n attachedBones: [\"torso\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"amsalja_boots\",\n nameKorean: \"스텔스 부츠\",\n nameEnglish: \"Stealth Boots\",\n type: \"boots\",\n material: \"synthetic\",\n fit: \"tight\",\n colorPrimary: KOREAN_COLORS.KOREAN_BLACK,\n colorEmissive: KOREAN_COLORS.PRIMARY_CYAN,\n emissiveIntensity: 0.15,\n metalness: 0.5,\n roughness: 0.4,\n attachedBones: [\"left_foot\", \"right_foot\"],\n castShadow: true,\n receiveShadow: true,\n },\n];\n\nexport const AMSALJA_CLOTHING: ClothingSet = {\n archetype: PlayerArchetype.AMSALJA,\n nameKorean: \"암살자 전투복\",\n nameEnglish: \"Shadow Assassin Suit\",\n descriptionKorean: \"사이버 기술이 통합된 은밀한 암살자 복장\",\n descriptionEnglish: \"Stealthy assassin outfit with integrated cyber technology\",\n items: AMSALJA_CLOTHING_ITEMS,\n themeColors: {\n primary: KOREAN_COLORS.KOREAN_BLACK,\n secondary: KOREAN_COLORS.PRIMARY_CYAN,\n accent: KOREAN_COLORS.UI_BACKGROUND_DARK,\n },\n};\n\n/**\n * 해커 (Hacker) - Cyber Warrior Clothing Set\n *\n * **Philosophy**: Information as power through technology\n * **Style**: Casual tech wear with augmented reality elements\n * **Aesthetic**: Street style with holographic accents\n *\n * @korean 해커의류\n */\nconst HACKER_CLOTHING_ITEMS: readonly ClothingItem[] = [\n {\n id: \"hacker_hoodie\",\n nameKorean: \"사이버 후드티\",\n nameEnglish: \"Cyber Hoodie\",\n type: \"torso\",\n material: \"synthetic\",\n fit: \"loose\",\n colorPrimary: KOREAN_COLORS.UI_BACKGROUND_MEDIUM,\n colorSecondary: KOREAN_COLORS.SECONDARY_PURPLE,\n colorEmissive: KOREAN_COLORS.SECONDARY_PURPLE,\n emissiveIntensity: 0.25,\n metalness: 0.2,\n roughness: 0.7,\n attachedBones: [\"torso\", \"left_upper_arm\", \"right_upper_arm\", \"left_shoulder\", \"right_shoulder\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"hacker_pants\",\n nameKorean: \"테크 팬츠\",\n nameEnglish: \"Tech Pants\",\n type: \"pants\",\n material: \"tactical\",\n fit: \"fitted\",\n colorPrimary: KOREAN_COLORS.KOREAN_BLACK,\n colorSecondary: KOREAN_COLORS.SECONDARY_PURPLE,\n colorEmissive: KOREAN_COLORS.SECONDARY_PURPLE,\n emissiveIntensity: 0.15,\n metalness: 0.3,\n roughness: 0.6,\n attachedBones: [\"pelvis\", \"left_upper_leg\", \"right_upper_leg\", \"left_lower_leg\", \"right_lower_leg\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"hacker_gloves\",\n nameKorean: \"데이터 글러브\",\n nameEnglish: \"Data Gloves\",\n type: \"gloves\",\n material: \"cybernetic\",\n fit: \"tight\",\n colorPrimary: KOREAN_COLORS.KOREAN_BLACK,\n colorSecondary: KOREAN_COLORS.SECONDARY_PURPLE,\n colorEmissive: KOREAN_COLORS.SECONDARY_PURPLE,\n emissiveIntensity: 0.5,\n metalness: 0.8,\n roughness: 0.2,\n attachedBones: [\"left_hand\", \"right_hand\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"hacker_boots\",\n nameKorean: \"스마트 스니커즈\",\n nameEnglish: \"Smart Sneakers\",\n type: \"boots\",\n material: \"synthetic\",\n fit: \"fitted\",\n colorPrimary: KOREAN_COLORS.UI_BACKGROUND_DARK,\n colorSecondary: KOREAN_COLORS.SECONDARY_PURPLE,\n colorEmissive: KOREAN_COLORS.SECONDARY_PURPLE,\n emissiveIntensity: 0.2,\n metalness: 0.4,\n roughness: 0.5,\n attachedBones: [\"left_foot\", \"right_foot\"],\n castShadow: true,\n receiveShadow: true,\n },\n];\n\nexport const HACKER_CLOTHING: ClothingSet = {\n archetype: PlayerArchetype.HACKER,\n nameKorean: \"해커 전투복\",\n nameEnglish: \"Hacker Combat Wear\",\n descriptionKorean: \"첨단 기술이 융합된 사이버 전사 복장\",\n descriptionEnglish: \"Cyber warrior outfit with cutting-edge technology\",\n items: HACKER_CLOTHING_ITEMS,\n themeColors: {\n primary: KOREAN_COLORS.UI_BACKGROUND_MEDIUM,\n secondary: KOREAN_COLORS.SECONDARY_PURPLE,\n accent: KOREAN_COLORS.KOREAN_BLACK,\n },\n};\n\n/**\n * 정보요원 (Jeongbo Yowon) - Intelligence Operative Clothing Set\n *\n * **Philosophy**: Knowledge through observation and strategy\n * **Style**: Professional tactical suit\n * **Aesthetic**: Clean, functional, government operative\n *\n * @korean 정보요원의류\n */\nconst JEONGBO_CLOTHING_ITEMS: readonly ClothingItem[] = [\n {\n id: \"jeongbo_jacket\",\n nameKorean: \"작전 재킷\",\n nameEnglish: \"Tactical Jacket\",\n type: \"torso\",\n material: \"tactical\",\n fit: \"fitted\",\n colorPrimary: KOREAN_COLORS.UI_BACKGROUND_DARK,\n colorSecondary: KOREAN_COLORS.ACCENT_BLUE,\n colorEmissive: KOREAN_COLORS.ACCENT_BLUE,\n emissiveIntensity: 0.15,\n metalness: 0.2,\n roughness: 0.7,\n attachedBones: [\"torso\", \"left_upper_arm\", \"right_upper_arm\", \"left_shoulder\", \"right_shoulder\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"jeongbo_pants\",\n nameKorean: \"작전 팬츠\",\n nameEnglish: \"Tactical Pants\",\n type: \"pants\",\n material: \"tactical\",\n fit: \"fitted\",\n colorPrimary: KOREAN_COLORS.UI_BACKGROUND_DARK,\n colorSecondary: KOREAN_COLORS.ACCENT_BLUE,\n metalness: 0.2,\n roughness: 0.7,\n attachedBones: [\"pelvis\", \"left_upper_leg\", \"right_upper_leg\", \"left_lower_leg\", \"right_lower_leg\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"jeongbo_vest\",\n nameKorean: \"작전 조끼\",\n nameEnglish: \"Tactical Vest\",\n type: \"vest\",\n material: \"armored\",\n fit: \"fitted\",\n colorPrimary: KOREAN_COLORS.UI_BACKGROUND_MEDIUM,\n colorSecondary: KOREAN_COLORS.ACCENT_BLUE,\n colorEmissive: KOREAN_COLORS.ACCENT_BLUE,\n emissiveIntensity: 0.2,\n metalness: 0.5,\n roughness: 0.5,\n attachedBones: [\"torso\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"jeongbo_belt\",\n nameKorean: \"전술 벨트\",\n nameEnglish: \"Tactical Belt\",\n type: \"belt\",\n material: \"tactical\",\n fit: \"tight\",\n colorPrimary: KOREAN_COLORS.UI_BACKGROUND_DARK,\n colorSecondary: KOREAN_COLORS.ACCENT_BLUE,\n metalness: 0.4,\n roughness: 0.6,\n attachedBones: [\"pelvis\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"jeongbo_boots\",\n nameKorean: \"작전 부츠\",\n nameEnglish: \"Tactical Boots\",\n type: \"boots\",\n material: \"leather\",\n fit: \"fitted\",\n colorPrimary: KOREAN_COLORS.KOREAN_BLACK,\n metalness: 0.3,\n roughness: 0.7,\n attachedBones: [\"left_foot\", \"right_foot\"],\n castShadow: true,\n receiveShadow: true,\n },\n];\n\nexport const JEONGBO_CLOTHING: ClothingSet = {\n archetype: PlayerArchetype.JEONGBO_YOWON,\n nameKorean: \"정보요원 작전복\",\n nameEnglish: \"Intelligence Operative Gear\",\n descriptionKorean: \"정부 요원을 위한 전문 작전 장비\",\n descriptionEnglish: \"Professional tactical gear for government operatives\",\n items: JEONGBO_CLOTHING_ITEMS,\n themeColors: {\n primary: KOREAN_COLORS.UI_BACKGROUND_DARK,\n secondary: KOREAN_COLORS.ACCENT_BLUE,\n accent: KOREAN_COLORS.UI_BACKGROUND_MEDIUM,\n },\n};\n\n/**\n * 조직폭력배 (Jojik Pokryeokbae) - Organized Crime Clothing Set\n *\n * **Philosophy**: Survival through ruthlessness and brutality\n * **Style**: Street gang attire with intimidating elements\n * **Aesthetic**: Heavy, brutal, street fighter\n *\n * @korean 조직폭력배의류\n */\nconst JOJIK_CLOTHING_ITEMS: readonly ClothingItem[] = [\n {\n id: \"jojik_leather_jacket\",\n nameKorean: \"가죽 재킷\",\n nameEnglish: \"Leather Jacket\",\n type: \"torso\",\n material: \"leather\",\n fit: \"oversized\",\n colorPrimary: KOREAN_COLORS.KOREAN_BLACK,\n colorSecondary: KOREAN_COLORS.ACCENT_RED,\n colorEmissive: KOREAN_COLORS.ACCENT_RED,\n emissiveIntensity: 0.2,\n metalness: 0.6,\n roughness: 0.4,\n attachedBones: [\"torso\", \"left_upper_arm\", \"right_upper_arm\", \"left_shoulder\", \"right_shoulder\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"jojik_pants\",\n nameKorean: \"카고 팬츠\",\n nameEnglish: \"Cargo Pants\",\n type: \"pants\",\n material: \"fabric\",\n fit: \"loose\",\n colorPrimary: KOREAN_COLORS.UI_BACKGROUND_DARK,\n colorSecondary: KOREAN_COLORS.ACCENT_RED,\n metalness: 0.1,\n roughness: 0.8,\n attachedBones: [\"pelvis\", \"left_upper_leg\", \"right_upper_leg\", \"left_lower_leg\", \"right_lower_leg\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"jojik_belt\",\n nameKorean: \"체인 벨트\",\n nameEnglish: \"Chain Belt\",\n type: \"belt\",\n material: \"leather\",\n fit: \"fitted\",\n colorPrimary: KOREAN_COLORS.KOREAN_BLACK,\n colorSecondary: KOREAN_COLORS.UI_STEEL_GRAY,\n colorEmissive: KOREAN_COLORS.ACCENT_RED,\n emissiveIntensity: 0.15,\n metalness: 0.8,\n roughness: 0.3,\n attachedBones: [\"pelvis\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"jojik_gloves\",\n nameKorean: \"스터드 장갑\",\n nameEnglish: \"Studded Gloves\",\n type: \"gloves\",\n material: \"leather\",\n fit: \"tight\",\n colorPrimary: KOREAN_COLORS.KOREAN_BLACK,\n colorSecondary: KOREAN_COLORS.UI_STEEL_GRAY,\n metalness: 0.7,\n roughness: 0.4,\n attachedBones: [\"left_hand\", \"right_hand\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"jojik_boots\",\n nameKorean: \"전투 부츠\",\n nameEnglish: \"Combat Boots\",\n type: \"boots\",\n material: \"leather\",\n fit: \"fitted\",\n colorPrimary: KOREAN_COLORS.KOREAN_BLACK,\n metalness: 0.4,\n roughness: 0.6,\n attachedBones: [\"left_foot\", \"right_foot\"],\n castShadow: true,\n receiveShadow: true,\n },\n];\n\nexport const JOJIK_CLOTHING: ClothingSet = {\n archetype: PlayerArchetype.JOJIK_POKRYEOKBAE,\n nameKorean: \"조직폭력배 복장\",\n nameEnglish: \"Street Fighter Gear\",\n descriptionKorean: \"거리의 무법자를 위한 위협적인 복장\",\n descriptionEnglish: \"Intimidating outfit for street-hardened fighters\",\n items: JOJIK_CLOTHING_ITEMS,\n themeColors: {\n primary: KOREAN_COLORS.KOREAN_BLACK,\n secondary: KOREAN_COLORS.ACCENT_RED,\n accent: KOREAN_COLORS.UI_BACKGROUND_DARK,\n },\n};\n\n/**\n * Archetype clothing lookup map\n *\n * **Korean**: 원형 의류 맵 (Archetype Clothing Map)\n *\n * @public\n * @korean 원형의류맵\n */\nexport const ARCHETYPE_CLOTHING: Record<PlayerArchetype, ClothingSet> = {\n [PlayerArchetype.MUSA]: MUSA_CLOTHING,\n [PlayerArchetype.AMSALJA]: AMSALJA_CLOTHING,\n [PlayerArchetype.HACKER]: HACKER_CLOTHING,\n [PlayerArchetype.JEONGBO_YOWON]: JEONGBO_CLOTHING,\n [PlayerArchetype.JOJIK_POKRYEOKBAE]: JOJIK_CLOTHING,\n};\n\n/**\n * Get clothing set for a specific archetype\n *\n * **Korean**: 원형 의류 가져오기 (Get Archetype Clothing)\n *\n * @param archetype - Player archetype\n * @returns Clothing set for the archetype\n * @public\n * @korean 원형의류가져오기\n */\nexport function getArchetypeClothing(archetype: PlayerArchetype): ClothingSet {\n return ARCHETYPE_CLOTHING[archetype];\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"archetypeClothing.js","names":[],"sources":["../../src/data/archetypeClothing.ts"],"sourcesContent":["/**\n * Archetype-specific clothing configurations\n *\n * **Korean**: 원형별 의류 설정 (Archetype Clothing Configurations)\n *\n * Defines characteristic clothing sets for each of the five player archetypes,\n * combining traditional Korean martial arts attire with cyberpunk aesthetics.\n *\n * @module data/archetypeClothing\n * @category Player & Archetypes\n * @korean 원형의류데이터\n */\n\nimport { PlayerArchetype } from \"@/types\";\nimport { KOREAN_COLORS } from \"@/types/constants/colors\";\nimport type { ClothingSet, ClothingItem } from \"@/types/clothing\";\n\n/**\n * 무사 (Musa) - Traditional Warrior Clothing Set\n *\n * **Philosophy**: Honor through disciplined strength\n * **Style**: Military dobok with tactical enhancements\n * **Aesthetic**: Traditional Korean martial arts uniform modernized with military elements\n *\n * @korean 무사의류\n */\nconst MUSA_CLOTHING_ITEMS: readonly ClothingItem[] = [\n {\n id: \"musa_torso_gi\",\n nameKorean: \"전투 도복 상의\",\n nameEnglish: \"Combat Dobok Top\",\n type: \"torso\",\n material: \"fabric\",\n fit: \"fitted\",\n colorPrimary: KOREAN_COLORS.UI_BACKGROUND_MEDIUM, // Dark gray base\n colorSecondary: KOREAN_COLORS.ACCENT_GOLD,\n colorEmissive: KOREAN_COLORS.ACCENT_GOLD,\n emissiveIntensity: 0.1,\n metalness: 0.1,\n roughness: 0.8,\n attachedBones: [\"torso\", \"left_upper_arm\", \"right_upper_arm\", \"left_shoulder\", \"right_shoulder\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"musa_pants\",\n nameKorean: \"전투 도복 하의\",\n nameEnglish: \"Combat Dobok Pants\",\n type: \"pants\",\n material: \"fabric\",\n fit: \"fitted\",\n colorPrimary: KOREAN_COLORS.UI_BACKGROUND_MEDIUM,\n colorSecondary: KOREAN_COLORS.ACCENT_GOLD,\n metalness: 0.1,\n roughness: 0.8,\n attachedBones: [\"pelvis\", \"left_upper_leg\", \"right_upper_leg\", \"left_lower_leg\", \"right_lower_leg\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"musa_belt\",\n nameKorean: \"검은 띠\",\n nameEnglish: \"Black Belt\",\n type: \"belt\",\n material: \"fabric\",\n fit: \"tight\",\n colorPrimary: KOREAN_COLORS.KOREAN_BLACK,\n colorSecondary: KOREAN_COLORS.ACCENT_GOLD,\n colorEmissive: KOREAN_COLORS.ACCENT_GOLD,\n emissiveIntensity: 0.2,\n metalness: 0.0,\n roughness: 0.9,\n attachedBones: [\"pelvis\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"musa_boots\",\n nameKorean: \"전투 부츠\",\n nameEnglish: \"Combat Boots\",\n type: \"boots\",\n material: \"leather\",\n fit: \"fitted\",\n colorPrimary: KOREAN_COLORS.KOREAN_BLACK,\n metalness: 0.3,\n roughness: 0.7,\n attachedBones: [\"left_foot\", \"right_foot\"],\n castShadow: true,\n receiveShadow: true,\n },\n];\n\nexport const MUSA_CLOTHING: ClothingSet = {\n archetype: PlayerArchetype.MUSA,\n nameKorean: \"무사 군복\",\n nameEnglish: \"Military Warrior Uniform\",\n descriptionKorean: \"전통 도복과 현대 군복을 결합한 전사의 의상\",\n descriptionEnglish: \"Traditional dobok combined with modern military uniform\",\n items: MUSA_CLOTHING_ITEMS,\n themeColors: {\n primary: KOREAN_COLORS.UI_BACKGROUND_MEDIUM,\n secondary: KOREAN_COLORS.ACCENT_GOLD,\n accent: KOREAN_COLORS.KOREAN_BLACK,\n },\n};\n\n/**\n * 암살자 (Amsalja) - Shadow Assassin Clothing Set\n *\n * **Philosophy**: Efficiency through invisibility\n * **Style**: Stealth bodysuit with cyber enhancements\n * **Aesthetic**: Sleek, form-fitting with neon cyan accents\n *\n * @korean 암살자의류\n */\nconst AMSALJA_CLOTHING_ITEMS: readonly ClothingItem[] = [\n {\n id: \"amsalja_bodysuit\",\n nameKorean: \"스텔스 바디슈트\",\n nameEnglish: \"Stealth Bodysuit\",\n type: \"torso\",\n material: \"synthetic\",\n fit: \"tight\",\n colorPrimary: KOREAN_COLORS.KOREAN_BLACK,\n colorSecondary: KOREAN_COLORS.PRIMARY_CYAN,\n colorEmissive: KOREAN_COLORS.PRIMARY_CYAN,\n emissiveIntensity: 0.3,\n metalness: 0.4,\n roughness: 0.5,\n attachedBones: [\"torso\", \"left_upper_arm\", \"right_upper_arm\", \"left_lower_arm\", \"right_lower_arm\", \"left_shoulder\", \"right_shoulder\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"amsalja_pants\",\n nameKorean: \"스텔스 팬츠\",\n nameEnglish: \"Stealth Pants\",\n type: \"pants\",\n material: \"synthetic\",\n fit: \"tight\",\n colorPrimary: KOREAN_COLORS.KOREAN_BLACK,\n colorSecondary: KOREAN_COLORS.PRIMARY_CYAN,\n colorEmissive: KOREAN_COLORS.PRIMARY_CYAN,\n emissiveIntensity: 0.2,\n metalness: 0.4,\n roughness: 0.5,\n attachedBones: [\"pelvis\", \"left_upper_leg\", \"right_upper_leg\", \"left_lower_leg\", \"right_lower_leg\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"amsalja_vest\",\n nameKorean: \"사이버 조끼\",\n nameEnglish: \"Cyber Vest\",\n type: \"vest\",\n material: \"armored\",\n fit: \"fitted\",\n colorPrimary: KOREAN_COLORS.UI_BACKGROUND_DARK,\n colorSecondary: KOREAN_COLORS.PRIMARY_CYAN,\n colorEmissive: KOREAN_COLORS.PRIMARY_CYAN,\n emissiveIntensity: 0.4,\n metalness: 0.7,\n roughness: 0.3,\n attachedBones: [\"torso\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"amsalja_boots\",\n nameKorean: \"스텔스 부츠\",\n nameEnglish: \"Stealth Boots\",\n type: \"boots\",\n material: \"synthetic\",\n fit: \"tight\",\n colorPrimary: KOREAN_COLORS.KOREAN_BLACK,\n colorEmissive: KOREAN_COLORS.PRIMARY_CYAN,\n emissiveIntensity: 0.15,\n metalness: 0.5,\n roughness: 0.4,\n attachedBones: [\"left_foot\", \"right_foot\"],\n castShadow: true,\n receiveShadow: true,\n },\n];\n\nexport const AMSALJA_CLOTHING: ClothingSet = {\n archetype: PlayerArchetype.AMSALJA,\n nameKorean: \"암살자 전투복\",\n nameEnglish: \"Shadow Assassin Suit\",\n descriptionKorean: \"사이버 기술이 통합된 은밀한 암살자 복장\",\n descriptionEnglish: \"Stealthy assassin outfit with integrated cyber technology\",\n items: AMSALJA_CLOTHING_ITEMS,\n themeColors: {\n primary: KOREAN_COLORS.KOREAN_BLACK,\n secondary: KOREAN_COLORS.PRIMARY_CYAN,\n accent: KOREAN_COLORS.UI_BACKGROUND_DARK,\n },\n};\n\n/**\n * 해커 (Hacker) - Cyber Warrior Clothing Set\n *\n * **Philosophy**: Information as power through technology\n * **Style**: Casual tech wear with augmented reality elements\n * **Aesthetic**: Street style with holographic accents\n *\n * @korean 해커의류\n */\nconst HACKER_CLOTHING_ITEMS: readonly ClothingItem[] = [\n {\n id: \"hacker_hoodie\",\n nameKorean: \"사이버 후드티\",\n nameEnglish: \"Cyber Hoodie\",\n type: \"torso\",\n material: \"synthetic\",\n fit: \"loose\",\n colorPrimary: KOREAN_COLORS.UI_BACKGROUND_MEDIUM,\n colorSecondary: KOREAN_COLORS.SECONDARY_PURPLE,\n colorEmissive: KOREAN_COLORS.SECONDARY_PURPLE,\n emissiveIntensity: 0.25,\n metalness: 0.2,\n roughness: 0.7,\n attachedBones: [\"torso\", \"left_upper_arm\", \"right_upper_arm\", \"left_shoulder\", \"right_shoulder\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"hacker_pants\",\n nameKorean: \"테크 팬츠\",\n nameEnglish: \"Tech Pants\",\n type: \"pants\",\n material: \"tactical\",\n fit: \"fitted\",\n colorPrimary: KOREAN_COLORS.KOREAN_BLACK,\n colorSecondary: KOREAN_COLORS.SECONDARY_PURPLE,\n colorEmissive: KOREAN_COLORS.SECONDARY_PURPLE,\n emissiveIntensity: 0.15,\n metalness: 0.3,\n roughness: 0.6,\n attachedBones: [\"pelvis\", \"left_upper_leg\", \"right_upper_leg\", \"left_lower_leg\", \"right_lower_leg\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"hacker_gloves\",\n nameKorean: \"데이터 글러브\",\n nameEnglish: \"Data Gloves\",\n type: \"gloves\",\n material: \"cybernetic\",\n fit: \"tight\",\n colorPrimary: KOREAN_COLORS.KOREAN_BLACK,\n colorSecondary: KOREAN_COLORS.SECONDARY_PURPLE,\n colorEmissive: KOREAN_COLORS.SECONDARY_PURPLE,\n emissiveIntensity: 0.5,\n metalness: 0.8,\n roughness: 0.2,\n attachedBones: [\"left_hand\", \"right_hand\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"hacker_boots\",\n nameKorean: \"스마트 스니커즈\",\n nameEnglish: \"Smart Sneakers\",\n type: \"boots\",\n material: \"synthetic\",\n fit: \"fitted\",\n colorPrimary: KOREAN_COLORS.UI_BACKGROUND_DARK,\n colorSecondary: KOREAN_COLORS.SECONDARY_PURPLE,\n colorEmissive: KOREAN_COLORS.SECONDARY_PURPLE,\n emissiveIntensity: 0.2,\n metalness: 0.4,\n roughness: 0.5,\n attachedBones: [\"left_foot\", \"right_foot\"],\n castShadow: true,\n receiveShadow: true,\n },\n];\n\nexport const HACKER_CLOTHING: ClothingSet = {\n archetype: PlayerArchetype.HACKER,\n nameKorean: \"해커 전투복\",\n nameEnglish: \"Hacker Combat Wear\",\n descriptionKorean: \"첨단 기술이 융합된 사이버 전사 복장\",\n descriptionEnglish: \"Cyber warrior outfit with cutting-edge technology\",\n items: HACKER_CLOTHING_ITEMS,\n themeColors: {\n primary: KOREAN_COLORS.UI_BACKGROUND_MEDIUM,\n secondary: KOREAN_COLORS.SECONDARY_PURPLE,\n accent: KOREAN_COLORS.KOREAN_BLACK,\n },\n};\n\n/**\n * 정보요원 (Jeongbo Yowon) - Intelligence Operative Clothing Set\n *\n * **Philosophy**: Knowledge through observation and strategy\n * **Style**: Professional tactical suit\n * **Aesthetic**: Clean, functional, government operative\n *\n * @korean 정보요원의류\n */\nconst JEONGBO_CLOTHING_ITEMS: readonly ClothingItem[] = [\n {\n id: \"jeongbo_jacket\",\n nameKorean: \"작전 재킷\",\n nameEnglish: \"Tactical Jacket\",\n type: \"torso\",\n material: \"tactical\",\n fit: \"fitted\",\n colorPrimary: KOREAN_COLORS.UI_BACKGROUND_DARK,\n colorSecondary: KOREAN_COLORS.ACCENT_BLUE,\n colorEmissive: KOREAN_COLORS.ACCENT_BLUE,\n emissiveIntensity: 0.15,\n metalness: 0.2,\n roughness: 0.7,\n attachedBones: [\"torso\", \"left_upper_arm\", \"right_upper_arm\", \"left_shoulder\", \"right_shoulder\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"jeongbo_pants\",\n nameKorean: \"작전 팬츠\",\n nameEnglish: \"Tactical Pants\",\n type: \"pants\",\n material: \"tactical\",\n fit: \"fitted\",\n colorPrimary: KOREAN_COLORS.UI_BACKGROUND_DARK,\n colorSecondary: KOREAN_COLORS.ACCENT_BLUE,\n metalness: 0.2,\n roughness: 0.7,\n attachedBones: [\"pelvis\", \"left_upper_leg\", \"right_upper_leg\", \"left_lower_leg\", \"right_lower_leg\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"jeongbo_vest\",\n nameKorean: \"작전 조끼\",\n nameEnglish: \"Tactical Vest\",\n type: \"vest\",\n material: \"armored\",\n fit: \"fitted\",\n colorPrimary: KOREAN_COLORS.UI_BACKGROUND_MEDIUM,\n colorSecondary: KOREAN_COLORS.ACCENT_BLUE,\n colorEmissive: KOREAN_COLORS.ACCENT_BLUE,\n emissiveIntensity: 0.2,\n metalness: 0.5,\n roughness: 0.5,\n attachedBones: [\"torso\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"jeongbo_belt\",\n nameKorean: \"전술 벨트\",\n nameEnglish: \"Tactical Belt\",\n type: \"belt\",\n material: \"tactical\",\n fit: \"tight\",\n colorPrimary: KOREAN_COLORS.UI_BACKGROUND_DARK,\n colorSecondary: KOREAN_COLORS.ACCENT_BLUE,\n metalness: 0.4,\n roughness: 0.6,\n attachedBones: [\"pelvis\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"jeongbo_boots\",\n nameKorean: \"작전 부츠\",\n nameEnglish: \"Tactical Boots\",\n type: \"boots\",\n material: \"leather\",\n fit: \"fitted\",\n colorPrimary: KOREAN_COLORS.KOREAN_BLACK,\n metalness: 0.3,\n roughness: 0.7,\n attachedBones: [\"left_foot\", \"right_foot\"],\n castShadow: true,\n receiveShadow: true,\n },\n];\n\nexport const JEONGBO_CLOTHING: ClothingSet = {\n archetype: PlayerArchetype.JEONGBO_YOWON,\n nameKorean: \"정보요원 작전복\",\n nameEnglish: \"Intelligence Operative Gear\",\n descriptionKorean: \"정부 요원을 위한 전문 작전 장비\",\n descriptionEnglish: \"Professional tactical gear for government operatives\",\n items: JEONGBO_CLOTHING_ITEMS,\n themeColors: {\n primary: KOREAN_COLORS.UI_BACKGROUND_DARK,\n secondary: KOREAN_COLORS.ACCENT_BLUE,\n accent: KOREAN_COLORS.UI_BACKGROUND_MEDIUM,\n },\n};\n\n/**\n * 조직폭력배 (Jojik Pokryeokbae) - Organized Crime Clothing Set\n *\n * **Philosophy**: Survival through ruthlessness and brutality\n * **Style**: Street gang attire with intimidating elements\n * **Aesthetic**: Heavy, brutal, street fighter\n *\n * @korean 조직폭력배의류\n */\nconst JOJIK_CLOTHING_ITEMS: readonly ClothingItem[] = [\n {\n id: \"jojik_leather_jacket\",\n nameKorean: \"가죽 재킷\",\n nameEnglish: \"Leather Jacket\",\n type: \"torso\",\n material: \"leather\",\n fit: \"oversized\",\n colorPrimary: KOREAN_COLORS.KOREAN_BLACK,\n colorSecondary: KOREAN_COLORS.ACCENT_RED,\n colorEmissive: KOREAN_COLORS.ACCENT_RED,\n emissiveIntensity: 0.2,\n metalness: 0.6,\n roughness: 0.4,\n attachedBones: [\"torso\", \"left_upper_arm\", \"right_upper_arm\", \"left_shoulder\", \"right_shoulder\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"jojik_pants\",\n nameKorean: \"카고 팬츠\",\n nameEnglish: \"Cargo Pants\",\n type: \"pants\",\n material: \"fabric\",\n fit: \"loose\",\n colorPrimary: KOREAN_COLORS.UI_BACKGROUND_DARK,\n colorSecondary: KOREAN_COLORS.ACCENT_RED,\n metalness: 0.1,\n roughness: 0.8,\n attachedBones: [\"pelvis\", \"left_upper_leg\", \"right_upper_leg\", \"left_lower_leg\", \"right_lower_leg\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"jojik_belt\",\n nameKorean: \"체인 벨트\",\n nameEnglish: \"Chain Belt\",\n type: \"belt\",\n material: \"leather\",\n fit: \"fitted\",\n colorPrimary: KOREAN_COLORS.KOREAN_BLACK,\n colorSecondary: KOREAN_COLORS.UI_STEEL_GRAY,\n colorEmissive: KOREAN_COLORS.ACCENT_RED,\n emissiveIntensity: 0.15,\n metalness: 0.8,\n roughness: 0.3,\n attachedBones: [\"pelvis\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"jojik_gloves\",\n nameKorean: \"스터드 장갑\",\n nameEnglish: \"Studded Gloves\",\n type: \"gloves\",\n material: \"leather\",\n fit: \"tight\",\n colorPrimary: KOREAN_COLORS.KOREAN_BLACK,\n colorSecondary: KOREAN_COLORS.UI_STEEL_GRAY,\n metalness: 0.7,\n roughness: 0.4,\n attachedBones: [\"left_hand\", \"right_hand\"],\n castShadow: true,\n receiveShadow: true,\n },\n {\n id: \"jojik_boots\",\n nameKorean: \"전투 부츠\",\n nameEnglish: \"Combat Boots\",\n type: \"boots\",\n material: \"leather\",\n fit: \"fitted\",\n colorPrimary: KOREAN_COLORS.KOREAN_BLACK,\n metalness: 0.4,\n roughness: 0.6,\n attachedBones: [\"left_foot\", \"right_foot\"],\n castShadow: true,\n receiveShadow: true,\n },\n];\n\nexport const JOJIK_CLOTHING: ClothingSet = {\n archetype: PlayerArchetype.JOJIK_POKRYEOKBAE,\n nameKorean: \"조직폭력배 복장\",\n nameEnglish: \"Street Fighter Gear\",\n descriptionKorean: \"거리의 무법자를 위한 위협적인 복장\",\n descriptionEnglish: \"Intimidating outfit for street-hardened fighters\",\n items: JOJIK_CLOTHING_ITEMS,\n themeColors: {\n primary: KOREAN_COLORS.KOREAN_BLACK,\n secondary: KOREAN_COLORS.ACCENT_RED,\n accent: KOREAN_COLORS.UI_BACKGROUND_DARK,\n },\n};\n\n/**\n * Archetype clothing lookup map\n *\n * **Korean**: 원형 의류 맵 (Archetype Clothing Map)\n *\n * @public\n * @korean 원형의류맵\n */\nexport const ARCHETYPE_CLOTHING: Record<PlayerArchetype, ClothingSet> = {\n [PlayerArchetype.MUSA]: MUSA_CLOTHING,\n [PlayerArchetype.AMSALJA]: AMSALJA_CLOTHING,\n [PlayerArchetype.HACKER]: HACKER_CLOTHING,\n [PlayerArchetype.JEONGBO_YOWON]: JEONGBO_CLOTHING,\n [PlayerArchetype.JOJIK_POKRYEOKBAE]: JOJIK_CLOTHING,\n};\n\n/**\n * Get clothing set for a specific archetype\n *\n * **Korean**: 원형 의류 가져오기 (Get Archetype Clothing)\n *\n * @param archetype - Player archetype\n * @returns Clothing set for the archetype\n * @public\n * @korean 원형의류가져오기\n */\nexport function getArchetypeClothing(archetype: PlayerArchetype): ClothingSet {\n return ARCHETYPE_CLOTHING[archetype];\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"archetypePhysicalAttributes.js","names":[],"sources":["../../src/data/archetypePhysicalAttributes.ts"],"sourcesContent":["/**\n * Physical attribute profiles for each player archetype.\n *\n * **Korean**: 원형별 신체 속성 (Archetype Physical Attributes)\n *\n * Defines realistic body dimensions and composition for each of the five\n * player archetypes based on their combat style and background. These\n * attributes directly affect combat calculations including reach, movement\n * speed, damage, and stamina.\n *\n * ## Design Philosophy\n *\n * Each archetype's physical profile reflects their training, lifestyle, and\n * combat specialization:\n *\n * - **무사 (Musa)**: Balanced warrior with traditional training\n * - **암살자 (Amsalja)**: Lean and agile for stealth operations\n * - **해커 (Hacker)**: Average build with tech enhancements\n * - **정보요원 (Jeongbo)**: Fit operative with intelligence background\n * - **조직폭력배 (Jojik)**: Heavy and brutal street fighter\n *\n * @module data/archetypePhysicalAttributes\n * @category Player & Archetypes\n * @korean 원형신체데이터\n */\n\nimport { PhysicalAttributes, PlayerArchetype } from \"@/types\";\n\n/**\n * 무사 (Musa) - Traditional Warrior Physical Profile\n *\n * **Philosophy**: Honor through disciplined strength\n * **Training**: Military special forces with traditional martial arts\n * **Build**: Balanced, athletic, well-conditioned warrior\n *\n * Physical characteristics reflect years of traditional Korean martial arts\n * training combined with modern military conditioning. Optimal balance between\n * strength, speed, and endurance for prolonged combat effectiveness.\n *\n * @korean 무사신체\n */\nexport const MUSA_PHYSICAL: PhysicalAttributes = {\n /**\n * Weight: 82 kg\n * Athletic military build for strength and mobility\n * Korean Special Forces standard physique\n * Optimal power-to-weight ratio for combat\n */\n weight: 82,\n\n /**\n * Leg Length: 96 cm\n * Athletic leg length for powerful kicks\n * Trained for devastating Taekwondo kicks\n * Balanced reach and stability\n */\n legLength: 96,\n\n /**\n * Arm Length: 77 cm\n * Strong arm reach for disciplined striking\n * Conditioned for both precision and power\n * Effective grappling range\n */\n armLength: 77,\n\n /**\n * Muscle Mass: 35 kg (43% of body weight)\n * High muscle mass from military training\n * Realistic for trained special forces soldier\n * Excellent functional strength\n */\n muscleMass: 35,\n\n /**\n * Fat Mass: 13 kg (16% body fat)\n * Athletic body fat percentage\n * Maintains energy reserves for combat endurance\n * Optimal for sustained operations\n */\n fatMass: 13,\n\n /**\n * Age: 32 years\n * Prime combat age combining experience and physical capability\n * Peak of martial arts mastery and physical conditioning\n * Balanced wisdom and reflexes\n */\n age: 32,\n\n /**\n * Total Height: 180 cm\n * Solid military build height\n * Above average for imposing presence\n * Good proportions for all-around combat\n */\n totalHeight: 180,\n\n /**\n * Torso Length: 59 cm\n * Strong core providing stable base\n * Optimal for breath control and Ki cultivation\n * Protected vital points\n */\n torsoLength: 59,\n\n /**\n * Head Size: 22 cm\n * Average head diameter\n * Standard vital point target area\n * Balanced consciousness vulnerability\n */\n headSize: 22,\n\n /**\n * Neck Length: 11 cm\n * Strong, trained neck\n * Moderate vulnerability to chokes\n * Conditioned for impact resistance\n */\n neckLength: 11,\n\n /**\n * Shoulder Width: 46 cm\n * Broad military shoulders\n * Strong defense coverage\n * Excellent grappling control points\n */\n shoulderWidth: 46,\n\n /**\n * Walk Speed: 6.0 m/s\n * Balanced tactical movement\n * Military conditioning for sustained mobility\n * Optimal for disciplined combat approach\n */\n walkSpeed: 6.0,\n\n /**\n * Run Speed: 9.5 m/s\n * Strong sprint capability\n * Combat-ready rapid repositioning\n * Efficient for tactical advances\n */\n runSpeed: 9.5,\n\n /**\n * Acceleration: 12.0 m/s²\n * Balanced explosiveness\n * Military conditioning for quick reactions\n * Optimal muscle-to-weight ratio for combat\n */\n acceleration: 12.0,\n};\n\n/**\n * 암살자 (Amsalja) - Shadow Assassin Physical Profile\n *\n * **Philosophy**: Efficiency through invisibility\n * **Training**: Covert operations and silent elimination specialist\n * **Build**: Lean, agile, optimized for stealth and precision\n *\n * Physical characteristics emphasize low body mass for stealth movement,\n * exceptional reach for vital point targeting, and minimal fat for maximum\n * agility. Every attribute optimized for silent, deadly efficiency.\n *\n * @korean 암살자신체\n */\nexport const AMSALJA_PHYSICAL: PhysicalAttributes = {\n /**\n * Weight: 75 kg\n * Lean athletic build like a kickboxer (Israel Adesanya type)\n * Optimized for speed, reach, and precision\n * Light enough for stealth, heavy enough for power\n */\n weight: 75,\n\n /**\n * Leg Length: 102 cm\n * Long legs for exceptional reach and stride\n * Enables precise high kicks to vital points\n * Excellent for maintaining distance\n */\n legLength: 102,\n\n /**\n * Arm Length: 82 cm\n * Extended reach for range advantage\n * Crucial for vital point precision strikes\n * Keeps opponents at safe distance\n */\n armLength: 82,\n\n /**\n * Muscle Mass: 30 kg (40% of body weight)\n * Lean, functional muscle for speed\n * Optimized for explosive movements\n * Sufficient for devastating precision strikes\n */\n muscleMass: 30,\n\n /**\n * Fat Mass: 10 kg (13% body fat)\n * Very low fat for maximum definition\n * Peak agility and flexibility\n * Athletic performance optimized\n */\n fatMass: 10,\n\n /**\n * Age: 28 years\n * Young and at peak physical agility\n * Optimal reflexes for split-second decisions\n * Experience balanced with peak conditioning\n */\n age: 28,\n\n /**\n * Total Height: 186 cm\n * Tall for exceptional reach advantage\n * Long limb ratios for vital point access\n * Intimidating presence while maintaining agility\n */\n totalHeight: 186,\n\n /**\n * Torso Length: 58 cm\n * Compact torso for lower center of gravity\n * Agile core for quick movement\n * Reduced vital point target area\n */\n torsoLength: 58,\n\n /**\n * Head Size: 22 cm\n * Normal head profile\n * Standard target area for head strikes\n * Balanced consciousness vulnerability\n */\n headSize: 22,\n\n /**\n * Neck Length: 11 cm\n * Longer neck for head movement evasion\n * Slightly increased choke vulnerability\n * Requires skilled guard positioning\n */\n neckLength: 11,\n\n /**\n * Shoulder Width: 44 cm\n * Lean but athletic shoulders\n * Good mobility with adequate coverage\n * Efficient for striking mechanics\n */\n shoulderWidth: 44,\n\n /**\n * Walk Speed: 6.5 m/s\n * FASTEST tactical movement\n * Optimized for silent, rapid repositioning\n * Assassin-level agility and speed\n */\n walkSpeed: 6.5,\n\n /**\n * Run Speed: 11.0 m/s\n * FASTEST sprint capability\n * Peak athletic conditioning for pursuit\n * Exceptional for closing distance quickly\n */\n runSpeed: 11.0,\n\n /**\n * Acceleration: 15.0 m/s²\n * HIGHEST explosiveness\n * Exceptional muscle-to-weight ratio\n * Lightning-fast direction changes\n */\n acceleration: 15.0,\n};\n\n/**\n * 해커 (Hacker) - Cyber Warrior Physical Profile\n *\n * **Philosophy**: Information as power through technology\n * **Training**: Digital native with supplemental physical training\n * **Build**: Average physique enhanced by technological augmentation\n *\n * Physical characteristics reflect a tech-focused lifestyle with functional\n * fitness rather than peak athletic conditioning. Attributes are average\n * but compensated by cybernetic enhancements and data-driven combat analysis.\n *\n * @korean 해커신체\n */\nexport const HACKER_PHYSICAL: PhysicalAttributes = {\n /**\n * Weight: 72 kg\n * Average weight for height\n * Functional fitness from regular training\n * Tech worker who maintains fitness\n */\n weight: 72,\n\n /**\n * Leg Length: 92 cm\n * Standard leg proportions\n * Adequate for tech-assisted movement\n * Compensated by augmented targeting systems\n */\n legLength: 92,\n\n /**\n * Arm Length: 73 cm\n * Average arm reach\n * Sufficient when aided by cybernetic enhancements\n * Precision compensated by data analysis\n */\n armLength: 73,\n\n /**\n * Muscle Mass: 28 kg (39% of body weight)\n * Moderate muscle mass for tech worker\n * Maintained through efficient training\n * Relies more on tech than raw strength\n */\n muscleMass: 28,\n\n /**\n * Fat Mass: 15 kg (21% body fat)\n * Average body fat from desk work\n * Still functional for combat\n * Less emphasis on peak conditioning\n */\n fatMass: 15,\n\n /**\n * Age: 26 years\n * Young digital native\n * High neuroplasticity for tech integration\n * Peak learning and adaptation capabilities\n */\n age: 26,\n\n /**\n * Total Height: 175 cm\n * Average Korean male height\n * Standard proportions for tech integration\n * Balanced body type for augmentation\n */\n totalHeight: 175,\n\n /**\n * Torso Length: 57 cm\n * Average torso length\n * Standard core for cyber implants\n * Balanced Ki flow for tech-bio integration\n */\n torsoLength: 57,\n\n /**\n * Head Size: 22 cm\n * Average head size\n * Standard neural interface compatibility\n * Balanced for augmented reality overlays\n */\n headSize: 22,\n\n /**\n * Neck Length: 10 cm\n * Average neck length\n * Standard vulnerability to chokes\n * Adequate for neural interface cables\n */\n neckLength: 10,\n\n /**\n * Shoulder Width: 43 cm\n * Average shoulder span\n * Standard defense coverage\n * Balanced for wearable tech integration\n */\n shoulderWidth: 43,\n\n /**\n * Walk Speed: 5.5 m/s\n * Average tactical movement\n * Tech-focused rather than athletic\n * Compensated by cybernetic enhancements\n */\n walkSpeed: 5.5,\n\n /**\n * Run Speed: 8.5 m/s\n * Moderate sprint capability\n * Supplemental physical training\n * Relies on tech for combat advantage\n */\n runSpeed: 8.5,\n\n /**\n * Acceleration: 10.0 m/s²\n * Moderate explosiveness\n * Average physical conditioning\n * Compensated by tech-enhanced reactions\n */\n acceleration: 10.0,\n};\n\n/**\n * 정보요원 (Jeongbo Yowon) - Intelligence Operative Physical Profile\n *\n * **Philosophy**: Knowledge through observation and strategy\n * **Training**: Government intelligence agency with specialized combat\n * **Build**: Athletic operative with strategic fitness\n *\n * Physical characteristics reflect intelligence agency fitness standards\n * with emphasis on versatility, endurance, and adaptability. Balanced\n * attributes suitable for varied operational requirements.\n *\n * @korean 정보요원신체\n */\nexport const JEONGBO_PHYSICAL: PhysicalAttributes = {\n /**\n * Weight: 78 kg\n * Fit intelligence operative build\n * Government agency fitness standard\n * Balance between capability and inconspicuousness\n */\n weight: 78,\n\n /**\n * Leg Length: 95 cm\n * Balanced leg length for varied terrain\n * Standard proportions for operational flexibility\n * Suitable for extended pursuit or evasion\n */\n legLength: 95,\n\n /**\n * Arm Length: 76 cm\n * Standard operative reach\n * Trained for weapon and hand-to-hand versatility\n * Balanced for multiple combat scenarios\n */\n armLength: 76,\n\n /**\n * Muscle Mass: 32 kg (41% of body weight)\n * Agency-required conditioning\n * Balanced strength for operational demands\n * Emphasis on functional fitness\n */\n muscleMass: 32,\n\n /**\n * Fat Mass: 12 kg (15% body fat)\n * Low but sustainable body fat\n * Maintains energy reserves for long operations\n * Within intelligence service standards\n */\n fatMass: 12,\n\n /**\n * Age: 34 years\n * Experienced operative\n * Peak of analytical and physical capability\n * Wisdom from field experience\n */\n age: 34,\n\n /**\n * Total Height: 179 cm\n * Standard government agency height\n * Balanced proportions for versatility\n * Neither imposing nor inconspicuous\n */\n totalHeight: 179,\n\n /**\n * Torso Length: 58 cm\n * Balanced torso for varied operations\n * Good breath control and stamina\n * Standard vital point distribution\n */\n torsoLength: 58,\n\n /**\n * Head Size: 22 cm\n * Average head size\n * Standard tactical gear compatibility\n * Balanced consciousness resilience\n */\n headSize: 22,\n\n /**\n * Neck Length: 10 cm\n * Average neck length\n * Trained resistance to chokes\n * Standard blood choke vulnerability\n */\n neckLength: 10,\n\n /**\n * Shoulder Width: 45 cm\n * Athletic shoulder width\n * Good defense coverage\n * Versatile grappling control\n */\n shoulderWidth: 45,\n\n /**\n * Walk Speed: 6.2 m/s\n * Fast tactical movement\n * Agency fitness standards\n * Excellent for varied operations\n */\n walkSpeed: 6.2,\n\n /**\n * Run Speed: 10.0 m/s\n * Strong sprint capability\n * Intelligence operative conditioning\n * Efficient pursuit and evasion\n */\n runSpeed: 10.0,\n\n /**\n * Acceleration: 14.0 m/s²\n * High explosiveness\n * Agency combat training\n * Quick response for tactical situations\n */\n acceleration: 14.0,\n};\n\n/**\n * 조직폭력배 (Jojik Pokryeokbae) - Organized Crime Physical Profile\n *\n * **Philosophy**: Survival through ruthlessness and brutality\n * **Training**: Street fighting and underground martial arts\n * **Build**: Heavy, powerful, intimidating presence\n *\n * Physical characteristics emphasize raw power and intimidation over\n * refined technique. Heavier build with high muscle mass for brutal\n * effectiveness and street-proven durability.\n *\n * @korean 조직폭력배신체\n */\nexport const JOJIK_PHYSICAL: PhysicalAttributes = {\n /**\n * Weight: 105 kg\n * MASSIVE build for power and intimidation\n * Like a heavyweight MMA fighter or large taekwondo practitioner\n * Dominant mass advantage in any confrontation\n */\n weight: 105,\n\n /**\n * Leg Length: 100 cm\n * Long, powerful legs despite heavy build\n * Devastating kicks with massive power\n * Surprising mobility for size\n */\n legLength: 100,\n\n /**\n * Arm Length: 84 cm\n * Long, thick arms for crushing power\n * Exceptional reach for grappling and strikes\n * Street-fighting dominance\n */\n armLength: 84,\n\n /**\n * Muscle Mass: 48 kg (46% of body weight)\n * Highest muscle mass of all archetypes\n * Built through intense street combat and heavy training\n * Raw, overwhelming power\n */\n muscleMass: 48,\n\n /**\n * Fat Mass: 20 kg (19% body fat)\n * Functional body fat for damage absorption\n * Provides padding against strikes\n * Still very fit despite bulk\n */\n fatMass: 20,\n\n /**\n * Age: 36 years\n * Veteran of street conflicts\n * Battle-scarred and experienced\n * Peak brutality and survival instincts\n */\n age: 36,\n\n /**\n * Total Height: 188 cm\n * Tall AND massive build\n * Physically imposing presence\n * Dominates any confrontation visually\n */\n totalHeight: 188,\n\n /**\n * Torso Length: 64 cm\n * Thick, powerful torso\n * Massive core strength\n * Enhanced durability and power generation\n */\n torsoLength: 64,\n\n /**\n * Head Size: 24 cm\n * Large, thick skull\n * Significant head strike resistance\n * High consciousness resilience\n */\n headSize: 24,\n\n /**\n * Neck Length: 11 cm\n * Thick, muscular neck\n * Very difficult to choke\n * Protected blood vessels\n */\n neckLength: 11,\n\n /**\n * Shoulder Width: 54 cm\n * WIDEST shoulders - intimidating presence\n * Maximum defense coverage\n * Overwhelming physical dominance\n */\n shoulderWidth: 54,\n\n /**\n * Walk Speed: 5.0 m/s\n * Slower tactical movement\n * Heavy build reduces mobility\n * Compensated by raw power and reach\n */\n walkSpeed: 5.0,\n\n /**\n * Run Speed: 8.0 m/s\n * Moderate sprint capability\n * Mass limits top speed\n * Still intimidating when charging\n */\n runSpeed: 8.0,\n\n /**\n * Acceleration: 9.0 m/s²\n * Lower explosiveness\n * Heavy mass requires more force to move\n * Compensated by devastating power on contact\n */\n acceleration: 9.0,\n};\n\n/**\n * Archetype physical attributes lookup map.\n *\n * **Korean**: 원형 신체 속성 맵 (Archetype Physical Attributes Map)\n *\n * Provides quick access to physical attribute profiles by archetype.\n * Used by combat system to retrieve realistic body dimensions and\n * composition for calculations.\n *\n * @example\n * ```typescript\n * const playerArchetype = PlayerArchetype.MUSA;\n * const physicalAttrs = ARCHETYPE_PHYSICAL_ATTRIBUTES[playerArchetype];\n * const kickRange = calculateKickRange(physicalAttrs.legLength);\n * ```\n *\n * @public\n * @korean 원형신체맵\n */\nexport const ARCHETYPE_PHYSICAL_ATTRIBUTES: Record<\n PlayerArchetype,\n PhysicalAttributes\n> = {\n [PlayerArchetype.MUSA]: MUSA_PHYSICAL,\n [PlayerArchetype.AMSALJA]: AMSALJA_PHYSICAL,\n [PlayerArchetype.HACKER]: HACKER_PHYSICAL,\n [PlayerArchetype.JEONGBO_YOWON]: JEONGBO_PHYSICAL,\n [PlayerArchetype.JOJIK_POKRYEOKBAE]: JOJIK_PHYSICAL,\n};\n\n/**\n * Get physical attributes for a specific archetype.\n *\n * **Korean**: 원형 신체 속성 가져오기 (Get Archetype Physical Attributes)\n *\n * Retrieves the physical attribute profile for the specified player archetype.\n * Returns a readonly copy to prevent accidental mutations.\n *\n * @param archetype - The player archetype to get attributes for\n * @returns Physical attributes for the specified archetype\n *\n * @example\n * ```typescript\n * const musaAttrs = getArchetypePhysicalAttributes(PlayerArchetype.MUSA);\n * console.log(`Musa weight: ${musaAttrs.weight}kg`);\n * console.log(`Musa arm reach: ${musaAttrs.armLength}cm`);\n * ```\n *\n * @public\n * @korean 원형신체가져오기\n */\nexport function getArchetypePhysicalAttributes(\n archetype: PlayerArchetype,\n): Readonly<PhysicalAttributes> {\n return ARCHETYPE_PHYSICAL_ATTRIBUTES[archetype];\n}\n\n/**\n * Calculate effective reach based on limb length and stance.\n *\n * **Korean**: 유효 거리 계산 (Calculate Effective Reach)\n *\n * Computes the effective combat reach considering limb length and\n * body positioning. Different techniques use different limbs and\n * leverage different amounts of body extension.\n *\n * @param limbLength - Length of the limb in centimeters\n * @param extension - Percentage of full extension (0.0 to 1.0)\n * @returns Effective reach in centimeters\n *\n * @example\n * ```typescript\n * // Full extension punch\n * const punchReach = calculateEffectiveReach(75, 1.0); // 75cm\n *\n * // 70% extension kick (stable stance)\n * const kickReach = calculateEffectiveReach(95, 0.7); // 66.5cm\n * ```\n *\n * @public\n * @korean 유효거리계산\n */\nexport function calculateEffectiveReach(\n limbLength: number,\n extension: number = 1.0,\n): number {\n return limbLength * Math.max(0, Math.min(1, extension));\n}\n\n/**\n * Calculate movement speed modifier based on weight and leg length.\n *\n * **Korean**: 이동 속도 계산 (Calculate Movement Speed)\n *\n * Computes movement speed modifier based on body weight (inversely)\n * and leg length (positively). Heavier fighters move slower, while\n * longer legs provide faster base movement.\n *\n * Formula: baseSpeed * (legLength / 95) * (75 / weight)\n * - Normalized around 95cm legs and 75kg weight\n *\n * @param physical - Physical attributes of the fighter\n * @param baseSpeed - Base movement speed (default: 100)\n * @returns Modified movement speed\n *\n * @example\n * ```typescript\n * const musaSpeed = calculateMovementSpeed(MUSA_PHYSICAL);\n * // Result: 100 * (95/95) * (75/75) = 100\n *\n * const jojikSpeed = calculateMovementSpeed(JOJIK_PHYSICAL);\n * // Result: 100 * (90/95) * (75/85) = ~88.2 (slower)\n * ```\n *\n * @public\n * @korean 이동속도계산\n */\nexport function calculateMovementSpeed(\n physical: PhysicalAttributes,\n baseSpeed: number = 100,\n): number {\n const legFactor = physical.legLength / 95; // Normalized to 95cm average\n const weightFactor = 75 / physical.weight; // Normalized to 75kg average\n return baseSpeed * legFactor * weightFactor;\n}\n\n/**\n * Calculate damage modifier based on muscle mass.\n *\n * **Korean**: 공격력 계산 (Calculate Damage Output)\n *\n * Computes damage output modifier based on muscle mass. More muscle\n * means more power in strikes, but with diminishing returns.\n *\n * Formula: 1.0 + ((muscleMass - 35) / 35) * 0.3\n * - Normalized around 35kg muscle mass\n * - Maximum 30% bonus from muscle\n *\n * @param physical - Physical attributes of the fighter\n * @returns Damage multiplier (typically 0.7 to 1.3)\n *\n * @example\n * ```typescript\n * const musaDamage = calculateDamageModifier(MUSA_PHYSICAL);\n * // Result: 1.0 + ((38-35)/35)*0.3 = ~1.026\n *\n * const jojikDamage = calculateDamageModifier(JOJIK_PHYSICAL);\n * // Result: 1.0 + ((42-35)/35)*0.3 = ~1.06 (stronger)\n * ```\n *\n * @public\n * @korean 공격력계산\n */\nexport function calculateDamageModifier(physical: PhysicalAttributes): number {\n const normalizedMuscle = (physical.muscleMass - 35) / 35;\n return 1.0 + normalizedMuscle * 0.3;\n}\n\n/**\n * Calculate defense modifier based on fat mass and muscle mass.\n *\n * **Korean**: 방어력 계산 (Calculate Defense)\n *\n * Computes defense modifier based on fat mass (padding) and muscle mass\n * (structural integrity). Fat absorbs blunt damage, muscle protects\n * against impact.\n *\n * Formula: 1.0 + (fatMass / 100) + (muscleMass / 200)\n *\n * @param physical - Physical attributes of the fighter\n * @returns Defense multiplier (typically 1.0 to 1.3)\n *\n * @example\n * ```typescript\n * const amsaljaDefense = calculateDefenseModifier(AMSALJA_PHYSICAL);\n * // Result: 1.0 + (9/100) + (32/200) = 1.25\n *\n * const jojikDefense = calculateDefenseModifier(JOJIK_PHYSICAL);\n * // Result: 1.0 + (18/100) + (42/200) = 1.39 (tankier)\n * ```\n *\n * @public\n * @korean 방어력계산\n */\nexport function calculateDefenseModifier(physical: PhysicalAttributes): number {\n const fatPadding = physical.fatMass / 100;\n const muscleStructure = physical.muscleMass / 200;\n return 1.0 + fatPadding + muscleStructure;\n}\n\n/**\n * Calculate stamina regeneration rate based on age and fat mass.\n *\n * **Korean**: 체력 회복 속도 (Stamina Recovery Rate)\n *\n * Computes stamina recovery speed based on age (optimal 25-35) and\n * fat mass (lower is better for recovery). Younger fighters and leaner\n * builds recover faster.\n *\n * Formula: baseRate * ageFactor * fatFactor\n * - Age factor peaks at 30 years (1.0), decreases before and after\n * - Fat factor = 1.0 - (fatMass - 10) / 50\n *\n * @param physical - Physical attributes of the fighter\n * @param baseRate - Base recovery rate (default: 10 per second)\n * @returns Modified stamina recovery rate\n *\n * @example\n * ```typescript\n * const amsaljaRecovery = calculateStaminaRecovery(AMSALJA_PHYSICAL);\n * // Age 28, fat 9kg: ~10.2 per second\n *\n * const jojikRecovery = calculateStaminaRecovery(JOJIK_PHYSICAL);\n * // Age 36, fat 18kg: ~8.4 per second (slower)\n * ```\n *\n * @public\n * @korean 체력회복계산\n */\nexport function calculateStaminaRecovery(\n physical: PhysicalAttributes,\n baseRate: number = 10,\n): number {\n // Age factor: peaks at 30, decreases before and after\n const ageOptimal = 30;\n const ageDiff = Math.abs(physical.age - ageOptimal);\n const ageFactor = Math.max(0.7, 1.0 - ageDiff / 30);\n\n // Fat factor: lower fat = faster recovery\n const fatFactor = Math.max(0.7, 1.0 - (physical.fatMass - 10) / 50);\n\n return baseRate * ageFactor * fatFactor;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"archetypePhysicalAttributes.js","names":[],"sources":["../../src/data/archetypePhysicalAttributes.ts"],"sourcesContent":["/**\n * Physical attribute profiles for each player archetype.\n *\n * **Korean**: 원형별 신체 속성 (Archetype Physical Attributes)\n *\n * Defines realistic body dimensions and composition for each of the five\n * player archetypes based on their combat style and background. These\n * attributes directly affect combat calculations including reach, movement\n * speed, damage, and stamina.\n *\n * ## Design Philosophy\n *\n * Each archetype's physical profile reflects their training, lifestyle, and\n * combat specialization:\n *\n * - **무사 (Musa)**: Balanced warrior with traditional training\n * - **암살자 (Amsalja)**: Lean and agile for stealth operations\n * - **해커 (Hacker)**: Average build with tech enhancements\n * - **정보요원 (Jeongbo)**: Fit operative with intelligence background\n * - **조직폭력배 (Jojik)**: Heavy and brutal street fighter\n *\n * @module data/archetypePhysicalAttributes\n * @category Player & Archetypes\n * @korean 원형신체데이터\n */\n\nimport { PhysicalAttributes, PlayerArchetype } from \"@/types\";\n\n/**\n * 무사 (Musa) - Traditional Warrior Physical Profile\n *\n * **Philosophy**: Honor through disciplined strength\n * **Training**: Military special forces with traditional martial arts\n * **Build**: Balanced, athletic, well-conditioned warrior\n *\n * Physical characteristics reflect years of traditional Korean martial arts\n * training combined with modern military conditioning. Optimal balance between\n * strength, speed, and endurance for prolonged combat effectiveness.\n *\n * @korean 무사신체\n */\nexport const MUSA_PHYSICAL: PhysicalAttributes = {\n /**\n * Weight: 82 kg\n * Athletic military build for strength and mobility\n * Korean Special Forces standard physique\n * Optimal power-to-weight ratio for combat\n */\n weight: 82,\n\n /**\n * Leg Length: 96 cm\n * Athletic leg length for powerful kicks\n * Trained for devastating Taekwondo kicks\n * Balanced reach and stability\n */\n legLength: 96,\n\n /**\n * Arm Length: 77 cm\n * Strong arm reach for disciplined striking\n * Conditioned for both precision and power\n * Effective grappling range\n */\n armLength: 77,\n\n /**\n * Muscle Mass: 35 kg (43% of body weight)\n * High muscle mass from military training\n * Realistic for trained special forces soldier\n * Excellent functional strength\n */\n muscleMass: 35,\n\n /**\n * Fat Mass: 13 kg (16% body fat)\n * Athletic body fat percentage\n * Maintains energy reserves for combat endurance\n * Optimal for sustained operations\n */\n fatMass: 13,\n\n /**\n * Age: 32 years\n * Prime combat age combining experience and physical capability\n * Peak of martial arts mastery and physical conditioning\n * Balanced wisdom and reflexes\n */\n age: 32,\n\n /**\n * Total Height: 180 cm\n * Solid military build height\n * Above average for imposing presence\n * Good proportions for all-around combat\n */\n totalHeight: 180,\n\n /**\n * Torso Length: 59 cm\n * Strong core providing stable base\n * Optimal for breath control and Ki cultivation\n * Protected vital points\n */\n torsoLength: 59,\n\n /**\n * Head Size: 22 cm\n * Average head diameter\n * Standard vital point target area\n * Balanced consciousness vulnerability\n */\n headSize: 22,\n\n /**\n * Neck Length: 11 cm\n * Strong, trained neck\n * Moderate vulnerability to chokes\n * Conditioned for impact resistance\n */\n neckLength: 11,\n\n /**\n * Shoulder Width: 46 cm\n * Broad military shoulders\n * Strong defense coverage\n * Excellent grappling control points\n */\n shoulderWidth: 46,\n\n /**\n * Walk Speed: 6.0 m/s\n * Balanced tactical movement\n * Military conditioning for sustained mobility\n * Optimal for disciplined combat approach\n */\n walkSpeed: 6.0,\n\n /**\n * Run Speed: 9.5 m/s\n * Strong sprint capability\n * Combat-ready rapid repositioning\n * Efficient for tactical advances\n */\n runSpeed: 9.5,\n\n /**\n * Acceleration: 12.0 m/s²\n * Balanced explosiveness\n * Military conditioning for quick reactions\n * Optimal muscle-to-weight ratio for combat\n */\n acceleration: 12.0,\n};\n\n/**\n * 암살자 (Amsalja) - Shadow Assassin Physical Profile\n *\n * **Philosophy**: Efficiency through invisibility\n * **Training**: Covert operations and silent elimination specialist\n * **Build**: Lean, agile, optimized for stealth and precision\n *\n * Physical characteristics emphasize low body mass for stealth movement,\n * exceptional reach for vital point targeting, and minimal fat for maximum\n * agility. Every attribute optimized for silent, deadly efficiency.\n *\n * @korean 암살자신체\n */\nexport const AMSALJA_PHYSICAL: PhysicalAttributes = {\n /**\n * Weight: 75 kg\n * Lean athletic build like a kickboxer (Israel Adesanya type)\n * Optimized for speed, reach, and precision\n * Light enough for stealth, heavy enough for power\n */\n weight: 75,\n\n /**\n * Leg Length: 102 cm\n * Long legs for exceptional reach and stride\n * Enables precise high kicks to vital points\n * Excellent for maintaining distance\n */\n legLength: 102,\n\n /**\n * Arm Length: 82 cm\n * Extended reach for range advantage\n * Crucial for vital point precision strikes\n * Keeps opponents at safe distance\n */\n armLength: 82,\n\n /**\n * Muscle Mass: 30 kg (40% of body weight)\n * Lean, functional muscle for speed\n * Optimized for explosive movements\n * Sufficient for devastating precision strikes\n */\n muscleMass: 30,\n\n /**\n * Fat Mass: 10 kg (13% body fat)\n * Very low fat for maximum definition\n * Peak agility and flexibility\n * Athletic performance optimized\n */\n fatMass: 10,\n\n /**\n * Age: 28 years\n * Young and at peak physical agility\n * Optimal reflexes for split-second decisions\n * Experience balanced with peak conditioning\n */\n age: 28,\n\n /**\n * Total Height: 186 cm\n * Tall for exceptional reach advantage\n * Long limb ratios for vital point access\n * Intimidating presence while maintaining agility\n */\n totalHeight: 186,\n\n /**\n * Torso Length: 58 cm\n * Compact torso for lower center of gravity\n * Agile core for quick movement\n * Reduced vital point target area\n */\n torsoLength: 58,\n\n /**\n * Head Size: 22 cm\n * Normal head profile\n * Standard target area for head strikes\n * Balanced consciousness vulnerability\n */\n headSize: 22,\n\n /**\n * Neck Length: 11 cm\n * Longer neck for head movement evasion\n * Slightly increased choke vulnerability\n * Requires skilled guard positioning\n */\n neckLength: 11,\n\n /**\n * Shoulder Width: 44 cm\n * Lean but athletic shoulders\n * Good mobility with adequate coverage\n * Efficient for striking mechanics\n */\n shoulderWidth: 44,\n\n /**\n * Walk Speed: 6.5 m/s\n * FASTEST tactical movement\n * Optimized for silent, rapid repositioning\n * Assassin-level agility and speed\n */\n walkSpeed: 6.5,\n\n /**\n * Run Speed: 11.0 m/s\n * FASTEST sprint capability\n * Peak athletic conditioning for pursuit\n * Exceptional for closing distance quickly\n */\n runSpeed: 11.0,\n\n /**\n * Acceleration: 15.0 m/s²\n * HIGHEST explosiveness\n * Exceptional muscle-to-weight ratio\n * Lightning-fast direction changes\n */\n acceleration: 15.0,\n};\n\n/**\n * 해커 (Hacker) - Cyber Warrior Physical Profile\n *\n * **Philosophy**: Information as power through technology\n * **Training**: Digital native with supplemental physical training\n * **Build**: Average physique enhanced by technological augmentation\n *\n * Physical characteristics reflect a tech-focused lifestyle with functional\n * fitness rather than peak athletic conditioning. Attributes are average\n * but compensated by cybernetic enhancements and data-driven combat analysis.\n *\n * @korean 해커신체\n */\nexport const HACKER_PHYSICAL: PhysicalAttributes = {\n /**\n * Weight: 72 kg\n * Average weight for height\n * Functional fitness from regular training\n * Tech worker who maintains fitness\n */\n weight: 72,\n\n /**\n * Leg Length: 92 cm\n * Standard leg proportions\n * Adequate for tech-assisted movement\n * Compensated by augmented targeting systems\n */\n legLength: 92,\n\n /**\n * Arm Length: 73 cm\n * Average arm reach\n * Sufficient when aided by cybernetic enhancements\n * Precision compensated by data analysis\n */\n armLength: 73,\n\n /**\n * Muscle Mass: 28 kg (39% of body weight)\n * Moderate muscle mass for tech worker\n * Maintained through efficient training\n * Relies more on tech than raw strength\n */\n muscleMass: 28,\n\n /**\n * Fat Mass: 15 kg (21% body fat)\n * Average body fat from desk work\n * Still functional for combat\n * Less emphasis on peak conditioning\n */\n fatMass: 15,\n\n /**\n * Age: 26 years\n * Young digital native\n * High neuroplasticity for tech integration\n * Peak learning and adaptation capabilities\n */\n age: 26,\n\n /**\n * Total Height: 175 cm\n * Average Korean male height\n * Standard proportions for tech integration\n * Balanced body type for augmentation\n */\n totalHeight: 175,\n\n /**\n * Torso Length: 57 cm\n * Average torso length\n * Standard core for cyber implants\n * Balanced Ki flow for tech-bio integration\n */\n torsoLength: 57,\n\n /**\n * Head Size: 22 cm\n * Average head size\n * Standard neural interface compatibility\n * Balanced for augmented reality overlays\n */\n headSize: 22,\n\n /**\n * Neck Length: 10 cm\n * Average neck length\n * Standard vulnerability to chokes\n * Adequate for neural interface cables\n */\n neckLength: 10,\n\n /**\n * Shoulder Width: 43 cm\n * Average shoulder span\n * Standard defense coverage\n * Balanced for wearable tech integration\n */\n shoulderWidth: 43,\n\n /**\n * Walk Speed: 5.5 m/s\n * Average tactical movement\n * Tech-focused rather than athletic\n * Compensated by cybernetic enhancements\n */\n walkSpeed: 5.5,\n\n /**\n * Run Speed: 8.5 m/s\n * Moderate sprint capability\n * Supplemental physical training\n * Relies on tech for combat advantage\n */\n runSpeed: 8.5,\n\n /**\n * Acceleration: 10.0 m/s²\n * Moderate explosiveness\n * Average physical conditioning\n * Compensated by tech-enhanced reactions\n */\n acceleration: 10.0,\n};\n\n/**\n * 정보요원 (Jeongbo Yowon) - Intelligence Operative Physical Profile\n *\n * **Philosophy**: Knowledge through observation and strategy\n * **Training**: Government intelligence agency with specialized combat\n * **Build**: Athletic operative with strategic fitness\n *\n * Physical characteristics reflect intelligence agency fitness standards\n * with emphasis on versatility, endurance, and adaptability. Balanced\n * attributes suitable for varied operational requirements.\n *\n * @korean 정보요원신체\n */\nexport const JEONGBO_PHYSICAL: PhysicalAttributes = {\n /**\n * Weight: 78 kg\n * Fit intelligence operative build\n * Government agency fitness standard\n * Balance between capability and inconspicuousness\n */\n weight: 78,\n\n /**\n * Leg Length: 95 cm\n * Balanced leg length for varied terrain\n * Standard proportions for operational flexibility\n * Suitable for extended pursuit or evasion\n */\n legLength: 95,\n\n /**\n * Arm Length: 76 cm\n * Standard operative reach\n * Trained for weapon and hand-to-hand versatility\n * Balanced for multiple combat scenarios\n */\n armLength: 76,\n\n /**\n * Muscle Mass: 32 kg (41% of body weight)\n * Agency-required conditioning\n * Balanced strength for operational demands\n * Emphasis on functional fitness\n */\n muscleMass: 32,\n\n /**\n * Fat Mass: 12 kg (15% body fat)\n * Low but sustainable body fat\n * Maintains energy reserves for long operations\n * Within intelligence service standards\n */\n fatMass: 12,\n\n /**\n * Age: 34 years\n * Experienced operative\n * Peak of analytical and physical capability\n * Wisdom from field experience\n */\n age: 34,\n\n /**\n * Total Height: 179 cm\n * Standard government agency height\n * Balanced proportions for versatility\n * Neither imposing nor inconspicuous\n */\n totalHeight: 179,\n\n /**\n * Torso Length: 58 cm\n * Balanced torso for varied operations\n * Good breath control and stamina\n * Standard vital point distribution\n */\n torsoLength: 58,\n\n /**\n * Head Size: 22 cm\n * Average head size\n * Standard tactical gear compatibility\n * Balanced consciousness resilience\n */\n headSize: 22,\n\n /**\n * Neck Length: 10 cm\n * Average neck length\n * Trained resistance to chokes\n * Standard blood choke vulnerability\n */\n neckLength: 10,\n\n /**\n * Shoulder Width: 45 cm\n * Athletic shoulder width\n * Good defense coverage\n * Versatile grappling control\n */\n shoulderWidth: 45,\n\n /**\n * Walk Speed: 6.2 m/s\n * Fast tactical movement\n * Agency fitness standards\n * Excellent for varied operations\n */\n walkSpeed: 6.2,\n\n /**\n * Run Speed: 10.0 m/s\n * Strong sprint capability\n * Intelligence operative conditioning\n * Efficient pursuit and evasion\n */\n runSpeed: 10.0,\n\n /**\n * Acceleration: 14.0 m/s²\n * High explosiveness\n * Agency combat training\n * Quick response for tactical situations\n */\n acceleration: 14.0,\n};\n\n/**\n * 조직폭력배 (Jojik Pokryeokbae) - Organized Crime Physical Profile\n *\n * **Philosophy**: Survival through ruthlessness and brutality\n * **Training**: Street fighting and underground martial arts\n * **Build**: Heavy, powerful, intimidating presence\n *\n * Physical characteristics emphasize raw power and intimidation over\n * refined technique. Heavier build with high muscle mass for brutal\n * effectiveness and street-proven durability.\n *\n * @korean 조직폭력배신체\n */\nexport const JOJIK_PHYSICAL: PhysicalAttributes = {\n /**\n * Weight: 105 kg\n * MASSIVE build for power and intimidation\n * Like a heavyweight MMA fighter or large taekwondo practitioner\n * Dominant mass advantage in any confrontation\n */\n weight: 105,\n\n /**\n * Leg Length: 100 cm\n * Long, powerful legs despite heavy build\n * Devastating kicks with massive power\n * Surprising mobility for size\n */\n legLength: 100,\n\n /**\n * Arm Length: 84 cm\n * Long, thick arms for crushing power\n * Exceptional reach for grappling and strikes\n * Street-fighting dominance\n */\n armLength: 84,\n\n /**\n * Muscle Mass: 48 kg (46% of body weight)\n * Highest muscle mass of all archetypes\n * Built through intense street combat and heavy training\n * Raw, overwhelming power\n */\n muscleMass: 48,\n\n /**\n * Fat Mass: 20 kg (19% body fat)\n * Functional body fat for damage absorption\n * Provides padding against strikes\n * Still very fit despite bulk\n */\n fatMass: 20,\n\n /**\n * Age: 36 years\n * Veteran of street conflicts\n * Battle-scarred and experienced\n * Peak brutality and survival instincts\n */\n age: 36,\n\n /**\n * Total Height: 188 cm\n * Tall AND massive build\n * Physically imposing presence\n * Dominates any confrontation visually\n */\n totalHeight: 188,\n\n /**\n * Torso Length: 64 cm\n * Thick, powerful torso\n * Massive core strength\n * Enhanced durability and power generation\n */\n torsoLength: 64,\n\n /**\n * Head Size: 24 cm\n * Large, thick skull\n * Significant head strike resistance\n * High consciousness resilience\n */\n headSize: 24,\n\n /**\n * Neck Length: 11 cm\n * Thick, muscular neck\n * Very difficult to choke\n * Protected blood vessels\n */\n neckLength: 11,\n\n /**\n * Shoulder Width: 54 cm\n * WIDEST shoulders - intimidating presence\n * Maximum defense coverage\n * Overwhelming physical dominance\n */\n shoulderWidth: 54,\n\n /**\n * Walk Speed: 5.0 m/s\n * Slower tactical movement\n * Heavy build reduces mobility\n * Compensated by raw power and reach\n */\n walkSpeed: 5.0,\n\n /**\n * Run Speed: 8.0 m/s\n * Moderate sprint capability\n * Mass limits top speed\n * Still intimidating when charging\n */\n runSpeed: 8.0,\n\n /**\n * Acceleration: 9.0 m/s²\n * Lower explosiveness\n * Heavy mass requires more force to move\n * Compensated by devastating power on contact\n */\n acceleration: 9.0,\n};\n\n/**\n * Archetype physical attributes lookup map.\n *\n * **Korean**: 원형 신체 속성 맵 (Archetype Physical Attributes Map)\n *\n * Provides quick access to physical attribute profiles by archetype.\n * Used by combat system to retrieve realistic body dimensions and\n * composition for calculations.\n *\n * @example\n * ```typescript\n * const playerArchetype = PlayerArchetype.MUSA;\n * const physicalAttrs = ARCHETYPE_PHYSICAL_ATTRIBUTES[playerArchetype];\n * const kickRange = calculateKickRange(physicalAttrs.legLength);\n * ```\n *\n * @public\n * @korean 원형신체맵\n */\nexport const ARCHETYPE_PHYSICAL_ATTRIBUTES: Record<\n PlayerArchetype,\n PhysicalAttributes\n> = {\n [PlayerArchetype.MUSA]: MUSA_PHYSICAL,\n [PlayerArchetype.AMSALJA]: AMSALJA_PHYSICAL,\n [PlayerArchetype.HACKER]: HACKER_PHYSICAL,\n [PlayerArchetype.JEONGBO_YOWON]: JEONGBO_PHYSICAL,\n [PlayerArchetype.JOJIK_POKRYEOKBAE]: JOJIK_PHYSICAL,\n};\n\n/**\n * Get physical attributes for a specific archetype.\n *\n * **Korean**: 원형 신체 속성 가져오기 (Get Archetype Physical Attributes)\n *\n * Retrieves the physical attribute profile for the specified player archetype.\n * Returns a readonly copy to prevent accidental mutations.\n *\n * @param archetype - The player archetype to get attributes for\n * @returns Physical attributes for the specified archetype\n *\n * @example\n * ```typescript\n * const musaAttrs = getArchetypePhysicalAttributes(PlayerArchetype.MUSA);\n * console.log(`Musa weight: ${musaAttrs.weight}kg`);\n * console.log(`Musa arm reach: ${musaAttrs.armLength}cm`);\n * ```\n *\n * @public\n * @korean 원형신체가져오기\n */\nexport function getArchetypePhysicalAttributes(\n archetype: PlayerArchetype,\n): Readonly<PhysicalAttributes> {\n return ARCHETYPE_PHYSICAL_ATTRIBUTES[archetype];\n}\n\n/**\n * Calculate effective reach based on limb length and stance.\n *\n * **Korean**: 유효 거리 계산 (Calculate Effective Reach)\n *\n * Computes the effective combat reach considering limb length and\n * body positioning. Different techniques use different limbs and\n * leverage different amounts of body extension.\n *\n * @param limbLength - Length of the limb in centimeters\n * @param extension - Percentage of full extension (0.0 to 1.0)\n * @returns Effective reach in centimeters\n *\n * @example\n * ```typescript\n * // Full extension punch\n * const punchReach = calculateEffectiveReach(75, 1.0); // 75cm\n *\n * // 70% extension kick (stable stance)\n * const kickReach = calculateEffectiveReach(95, 0.7); // 66.5cm\n * ```\n *\n * @public\n * @korean 유효거리계산\n */\nexport function calculateEffectiveReach(\n limbLength: number,\n extension: number = 1.0,\n): number {\n return limbLength * Math.max(0, Math.min(1, extension));\n}\n\n/**\n * Calculate movement speed modifier based on weight and leg length.\n *\n * **Korean**: 이동 속도 계산 (Calculate Movement Speed)\n *\n * Computes movement speed modifier based on body weight (inversely)\n * and leg length (positively). Heavier fighters move slower, while\n * longer legs provide faster base movement.\n *\n * Formula: baseSpeed * (legLength / 95) * (75 / weight)\n * - Normalized around 95cm legs and 75kg weight\n *\n * @param physical - Physical attributes of the fighter\n * @param baseSpeed - Base movement speed (default: 100)\n * @returns Modified movement speed\n *\n * @example\n * ```typescript\n * const musaSpeed = calculateMovementSpeed(MUSA_PHYSICAL);\n * // Result: 100 * (95/95) * (75/75) = 100\n *\n * const jojikSpeed = calculateMovementSpeed(JOJIK_PHYSICAL);\n * // Result: 100 * (90/95) * (75/85) = ~88.2 (slower)\n * ```\n *\n * @public\n * @korean 이동속도계산\n */\nexport function calculateMovementSpeed(\n physical: PhysicalAttributes,\n baseSpeed: number = 100,\n): number {\n const legFactor = physical.legLength / 95; // Normalized to 95cm average\n const weightFactor = 75 / physical.weight; // Normalized to 75kg average\n return baseSpeed * legFactor * weightFactor;\n}\n\n/**\n * Calculate damage modifier based on muscle mass.\n *\n * **Korean**: 공격력 계산 (Calculate Damage Output)\n *\n * Computes damage output modifier based on muscle mass. More muscle\n * means more power in strikes, but with diminishing returns.\n *\n * Formula: 1.0 + ((muscleMass - 35) / 35) * 0.3\n * - Normalized around 35kg muscle mass\n * - Maximum 30% bonus from muscle\n *\n * @param physical - Physical attributes of the fighter\n * @returns Damage multiplier (typically 0.7 to 1.3)\n *\n * @example\n * ```typescript\n * const musaDamage = calculateDamageModifier(MUSA_PHYSICAL);\n * // Result: 1.0 + ((38-35)/35)*0.3 = ~1.026\n *\n * const jojikDamage = calculateDamageModifier(JOJIK_PHYSICAL);\n * // Result: 1.0 + ((42-35)/35)*0.3 = ~1.06 (stronger)\n * ```\n *\n * @public\n * @korean 공격력계산\n */\nexport function calculateDamageModifier(physical: PhysicalAttributes): number {\n const normalizedMuscle = (physical.muscleMass - 35) / 35;\n return 1.0 + normalizedMuscle * 0.3;\n}\n\n/**\n * Calculate defense modifier based on fat mass and muscle mass.\n *\n * **Korean**: 방어력 계산 (Calculate Defense)\n *\n * Computes defense modifier based on fat mass (padding) and muscle mass\n * (structural integrity). Fat absorbs blunt damage, muscle protects\n * against impact.\n *\n * Formula: 1.0 + (fatMass / 100) + (muscleMass / 200)\n *\n * @param physical - Physical attributes of the fighter\n * @returns Defense multiplier (typically 1.0 to 1.3)\n *\n * @example\n * ```typescript\n * const amsaljaDefense = calculateDefenseModifier(AMSALJA_PHYSICAL);\n * // Result: 1.0 + (9/100) + (32/200) = 1.25\n *\n * const jojikDefense = calculateDefenseModifier(JOJIK_PHYSICAL);\n * // Result: 1.0 + (18/100) + (42/200) = 1.39 (tankier)\n * ```\n *\n * @public\n * @korean 방어력계산\n */\nexport function calculateDefenseModifier(physical: PhysicalAttributes): number {\n const fatPadding = physical.fatMass / 100;\n const muscleStructure = physical.muscleMass / 200;\n return 1.0 + fatPadding + muscleStructure;\n}\n\n/**\n * Calculate stamina regeneration rate based on age and fat mass.\n *\n * **Korean**: 체력 회복 속도 (Stamina Recovery Rate)\n *\n * Computes stamina recovery speed based on age (optimal 25-35) and\n * fat mass (lower is better for recovery). Younger fighters and leaner\n * builds recover faster.\n *\n * Formula: baseRate * ageFactor * fatFactor\n * - Age factor peaks at 30 years (1.0), decreases before and after\n * - Fat factor = 1.0 - (fatMass - 10) / 50\n *\n * @param physical - Physical attributes of the fighter\n * @param baseRate - Base recovery rate (default: 10 per second)\n * @returns Modified stamina recovery rate\n *\n * @example\n * ```typescript\n * const amsaljaRecovery = calculateStaminaRecovery(AMSALJA_PHYSICAL);\n * // Age 28, fat 9kg: ~10.2 per second\n *\n * const jojikRecovery = calculateStaminaRecovery(JOJIK_PHYSICAL);\n * // Age 36, fat 18kg: ~8.4 per second (slower)\n * ```\n *\n * @public\n * @korean 체력회복계산\n */\nexport function calculateStaminaRecovery(\n physical: PhysicalAttributes,\n baseRate: number = 10,\n): number {\n // Age factor: peaks at 30, decreases before and after\n const ageOptimal = 30;\n const ageDiff = Math.abs(physical.age - ageOptimal);\n const ageFactor = Math.max(0.7, 1.0 - ageDiff / 30);\n\n // Fat factor: lower fat = faster recovery\n const fatFactor = Math.max(0.7, 1.0 - (physical.fatMass - 10) / 50);\n\n return baseRate * ageFactor * fatFactor;\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"techniqueMappings.js","names":[],"sources":["../../src/data/techniqueMappings.ts"],"sourcesContent":["/**\n * Technique to Animation Type mappings\n *\n * **Korean**: 기술-애니메이션 매핑\n *\n * Maps each technique to its corresponding AnimationType for attack movement physics.\n * This provides a type-safe, comprehensive mapping that replaces string-based\n * substring matching.\n *\n * @module data/techniqueMappings\n * @category Combat System\n * @korean 기술매핑\n */\n\nimport { TechniqueId } from \"../types/techniqueId\";\nimport { AnimationType } from \"../systems/animation/builders/MartialArtsConstants\";\nimport { AttackAnimationType } from \"../types/skeletal\";\n\n/**\n * Maps AttackAnimationType (from technique definitions) to AnimationType (for movement physics)\n *\n * AttackAnimationType is the skeletal animation type (PUNCH_HIGH, KICK_FRONT, etc.)\n * AnimationType is the martial arts movement type for physics calculations\n *\n * @korean 공격애니메이션타입-애니메이션타입매핑\n */\nexport const ATTACK_ANIMATION_TO_MOVEMENT_TYPE: Record<\n AttackAnimationType,\n AnimationType\n> = {\n // Punches → Punch types\n [AttackAnimationType.PUNCH_HIGH]: AnimationType.CROSS,\n [AttackAnimationType.PUNCH_MID]: AnimationType.JAB,\n [AttackAnimationType.PUNCH_LOW]: AnimationType.JAB,\n\n // Kicks → Kick types\n [AttackAnimationType.KICK_FRONT]: AnimationType.FRONT_KICK,\n [AttackAnimationType.KICK_SIDE]: AnimationType.SIDE_KICK,\n [AttackAnimationType.KICK_ROUNDHOUSE]: AnimationType.ROUNDHOUSE_KICK,\n\n // Elbows → Elbow types\n [AttackAnimationType.ELBOW_STRIKE]: AnimationType.ELBOW_STRIKE,\n [AttackAnimationType.ELBOW_UPPERCUT]: AnimationType.ELBOW_UPPERCUT,\n\n // Knees → Knee types\n [AttackAnimationType.KNEE_STRIKE]: AnimationType.KNEE_STRIKE,\n [AttackAnimationType.KNEE_CLINCH]: AnimationType.CLINCH_KNEE,\n\n // Pressure points → Specialized strikes\n [AttackAnimationType.PRESSURE_POINT]: AnimationType.PRESSURE_POINT_STRIKE,\n [AttackAnimationType.PRESSURE_POINT_RAPID]: AnimationType.RAPID_BARRAGE,\n};\n\n/**\n * Maps TechniqueId to AnimationType for movement physics\n *\n * This is the primary lookup table used by CombatScreen3D to determine\n * the correct movement animation for each technique.\n *\n * Derived from technique definitions but cached here for performance.\n *\n * @korean 기술ID-애니메이션타입매핑\n */\nexport const TECHNIQUE_TO_ANIMATION_TYPE: Record<TechniqueId, AnimationType> = {\n // 무사 (Musa) - Traditional Warrior\n [TechniqueId.MUSA_THUNDER_STRIKE]: AnimationType.HEAVEN_STRIKE, // PUNCH_HIGH → powerful descending\n [TechniqueId.MUSA_IRON_DEFENSE]: AnimationType.JAB, // PUNCH_MID → defensive\n [TechniqueId.MUSA_DRAGON_FIST]: AnimationType.JAB, // PUNCH_MID → piercing\n [TechniqueId.MUSA_MOUNTAIN_BREAKER]: AnimationType.CROSS, // PUNCH_HIGH → crushing\n\n // 암살자 (Amsalja) - Shadow Assassin\n [TechniqueId.AMSALJA_SHADOW_STRIKE]: AnimationType.PRESSURE_POINT_STRIKE, // PRESSURE_POINT\n [TechniqueId.AMSALJA_NERVE_STRIKE]: AnimationType.NERVE_STRIKE, // PRESSURE_POINT → precise\n [TechniqueId.AMSALJA_DEADLY_PRECISION]: AnimationType.PRESSURE_POINT_STRIKE, // PRESSURE_POINT\n [TechniqueId.AMSALJA_SILENT_DEATH]: AnimationType.PRESSURE_POINT_STRIKE, // PRESSURE_POINT → lethal\n\n // 해커 (Hacker) - Cyber Warrior\n [TechniqueId.HACKER_ELECTRIC_SHOCK]: AnimationType.LIGHTNING_STRIKE, // PUNCH_MID → electric\n [TechniqueId.HACKER_DATA_STRIKE]: AnimationType.PRESSURE_POINT_STRIKE, // PRESSURE_POINT\n [TechniqueId.HACKER_CYBER_OVERDRIVE]: AnimationType.RAPID_BARRAGE, // PRESSURE_POINT_RAPID\n [TechniqueId.HACKER_SYSTEM_CRASH]: AnimationType.NERVE_STRIKE, // PRESSURE_POINT → system\n\n // 정보요원 (Jeongbo) - Intelligence Operative\n [TechniqueId.JEONGBO_TACTICAL_STRIKE]: AnimationType.PRESSURE_POINT_STRIKE, // PRESSURE_POINT\n [TechniqueId.JEONGBO_COUNTER_INTELLIGENCE]: AnimationType.JAB, // PUNCH_MID → counter\n [TechniqueId.JEONGBO_PSYCHOLOGICAL_WARFARE]: AnimationType.NERVE_STRIKE, // PRESSURE_POINT\n [TechniqueId.JEONGBO_PRECISION_TAKEDOWN]: AnimationType.PRESSURE_POINT_STRIKE, // PRESSURE_POINT\n [TechniqueId.JEONGBO_INTELLIGENCE_STRIKE]: AnimationType.PRESSURE_POINT_STRIKE, // PRESSURE_POINT\n\n // 조직폭력배 (Jojik) - Organized Crime\n [TechniqueId.JOJIK_STREET_BRAWL]: AnimationType.HOOK, // PUNCH_MID → brawling\n [TechniqueId.JOJIK_IMPROVISED_WEAPON]: AnimationType.HAMMER_FIST, // ELBOW_STRIKE variant\n [TechniqueId.JOJIK_RUTHLESS_ASSAULT]: AnimationType.CROSS, // PUNCH_HIGH → brutal\n [TechniqueId.JOJIK_BRUTAL_TAKEDOWN]: AnimationType.ELBOW_STRIKE, // ELBOW_STRIKE → takedown\n};\n\n/**\n * Get AnimationType for a given technique ID\n *\n * Looks up the AnimationType from the TECHNIQUE_TO_ANIMATION_TYPE mapping.\n * Currently only supports archetype techniques (TechniqueId enum).\n * Returns undefined for unknown techniques or trigram techniques.\n *\n * @param techniqueId - The technique ID\n * @returns The AnimationType for movement physics, or undefined if not found\n * @korean 기술ID로애니메이션타입가져오기\n */\nexport function getAnimationTypeForTechnique(\n techniqueId: string | undefined\n): AnimationType | undefined {\n if (!techniqueId) {\n return undefined;\n }\n \n // Check if techniqueId is in our mapping\n // Note: Only archetype techniques (TechniqueId enum) are currently mapped\n return TECHNIQUE_TO_ANIMATION_TYPE[techniqueId as TechniqueId];\n}\n\n/**\n * Get AnimationType from AttackAnimationType\n *\n * @param attackAnimationType - The attack animation type from technique definition\n * @returns The AnimationType for movement physics\n * @korean 공격애니메이션타입에서애니메이션타입가져오기\n */\nexport function getAnimationTypeFromAttackAnimation(\n attackAnimationType: AttackAnimationType\n): AnimationType {\n return ATTACK_ANIMATION_TO_MOVEMENT_TYPE[attackAnimationType];\n}\n\nexport default {\n TECHNIQUE_TO_ANIMATION_TYPE,\n ATTACK_ANIMATION_TO_MOVEMENT_TYPE,\n getAnimationTypeForTechnique,\n getAnimationTypeFromAttackAnimation,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,IAAa,oCAGT;EAED,oBAAoB,aAAa,cAAc;EAC/C,oBAAoB,YAAY,cAAc;EAC9C,oBAAoB,YAAY,cAAc;EAG9C,oBAAoB,aAAa,cAAc;EAC/C,oBAAoB,YAAY,cAAc;EAC9C,oBAAoB,kBAAkB,cAAc;EAGpD,oBAAoB,eAAe,cAAc;EACjD,oBAAoB,iBAAiB,cAAc;EAGnD,oBAAoB,cAAc,cAAc;EAChD,oBAAoB,cAAc,cAAc;EAGhD,oBAAoB,iBAAiB,cAAc;EACnD,oBAAoB,uBAAuB,cAAc;
|
|
1
|
+
{"version":3,"file":"techniqueMappings.js","names":[],"sources":["../../src/data/techniqueMappings.ts"],"sourcesContent":["/**\n * Technique to Animation Type mappings\n *\n * **Korean**: 기술-애니메이션 매핑\n *\n * Maps each technique to its corresponding AnimationType for attack movement physics.\n * This provides a type-safe, comprehensive mapping that replaces string-based\n * substring matching.\n *\n * @module data/techniqueMappings\n * @category Combat System\n * @korean 기술매핑\n */\n\nimport { TechniqueId } from \"../types/techniqueId\";\nimport { AnimationType } from \"../systems/animation/builders/MartialArtsConstants\";\nimport { AttackAnimationType } from \"../types/skeletal\";\n\n/**\n * Maps AttackAnimationType (from technique definitions) to AnimationType (for movement physics)\n *\n * AttackAnimationType is the skeletal animation type (PUNCH_HIGH, KICK_FRONT, etc.)\n * AnimationType is the martial arts movement type for physics calculations\n *\n * @korean 공격애니메이션타입-애니메이션타입매핑\n */\nexport const ATTACK_ANIMATION_TO_MOVEMENT_TYPE: Record<\n AttackAnimationType,\n AnimationType\n> = {\n // Punches → Punch types\n [AttackAnimationType.PUNCH_HIGH]: AnimationType.CROSS,\n [AttackAnimationType.PUNCH_MID]: AnimationType.JAB,\n [AttackAnimationType.PUNCH_LOW]: AnimationType.JAB,\n\n // Kicks → Kick types\n [AttackAnimationType.KICK_FRONT]: AnimationType.FRONT_KICK,\n [AttackAnimationType.KICK_SIDE]: AnimationType.SIDE_KICK,\n [AttackAnimationType.KICK_ROUNDHOUSE]: AnimationType.ROUNDHOUSE_KICK,\n\n // Elbows → Elbow types\n [AttackAnimationType.ELBOW_STRIKE]: AnimationType.ELBOW_STRIKE,\n [AttackAnimationType.ELBOW_UPPERCUT]: AnimationType.ELBOW_UPPERCUT,\n\n // Knees → Knee types\n [AttackAnimationType.KNEE_STRIKE]: AnimationType.KNEE_STRIKE,\n [AttackAnimationType.KNEE_CLINCH]: AnimationType.CLINCH_KNEE,\n\n // Pressure points → Specialized strikes\n [AttackAnimationType.PRESSURE_POINT]: AnimationType.PRESSURE_POINT_STRIKE,\n [AttackAnimationType.PRESSURE_POINT_RAPID]: AnimationType.RAPID_BARRAGE,\n};\n\n/**\n * Maps TechniqueId to AnimationType for movement physics\n *\n * This is the primary lookup table used by CombatScreen3D to determine\n * the correct movement animation for each technique.\n *\n * Derived from technique definitions but cached here for performance.\n *\n * @korean 기술ID-애니메이션타입매핑\n */\nexport const TECHNIQUE_TO_ANIMATION_TYPE: Record<TechniqueId, AnimationType> = {\n // 무사 (Musa) - Traditional Warrior\n [TechniqueId.MUSA_THUNDER_STRIKE]: AnimationType.HEAVEN_STRIKE, // PUNCH_HIGH → powerful descending\n [TechniqueId.MUSA_IRON_DEFENSE]: AnimationType.JAB, // PUNCH_MID → defensive\n [TechniqueId.MUSA_DRAGON_FIST]: AnimationType.JAB, // PUNCH_MID → piercing\n [TechniqueId.MUSA_MOUNTAIN_BREAKER]: AnimationType.CROSS, // PUNCH_HIGH → crushing\n\n // 암살자 (Amsalja) - Shadow Assassin\n [TechniqueId.AMSALJA_SHADOW_STRIKE]: AnimationType.PRESSURE_POINT_STRIKE, // PRESSURE_POINT\n [TechniqueId.AMSALJA_NERVE_STRIKE]: AnimationType.NERVE_STRIKE, // PRESSURE_POINT → precise\n [TechniqueId.AMSALJA_DEADLY_PRECISION]: AnimationType.PRESSURE_POINT_STRIKE, // PRESSURE_POINT\n [TechniqueId.AMSALJA_SILENT_DEATH]: AnimationType.PRESSURE_POINT_STRIKE, // PRESSURE_POINT → lethal\n\n // 해커 (Hacker) - Cyber Warrior\n [TechniqueId.HACKER_ELECTRIC_SHOCK]: AnimationType.LIGHTNING_STRIKE, // PUNCH_MID → electric\n [TechniqueId.HACKER_DATA_STRIKE]: AnimationType.PRESSURE_POINT_STRIKE, // PRESSURE_POINT\n [TechniqueId.HACKER_CYBER_OVERDRIVE]: AnimationType.RAPID_BARRAGE, // PRESSURE_POINT_RAPID\n [TechniqueId.HACKER_SYSTEM_CRASH]: AnimationType.NERVE_STRIKE, // PRESSURE_POINT → system\n\n // 정보요원 (Jeongbo) - Intelligence Operative\n [TechniqueId.JEONGBO_TACTICAL_STRIKE]: AnimationType.PRESSURE_POINT_STRIKE, // PRESSURE_POINT\n [TechniqueId.JEONGBO_COUNTER_INTELLIGENCE]: AnimationType.JAB, // PUNCH_MID → counter\n [TechniqueId.JEONGBO_PSYCHOLOGICAL_WARFARE]: AnimationType.NERVE_STRIKE, // PRESSURE_POINT\n [TechniqueId.JEONGBO_PRECISION_TAKEDOWN]: AnimationType.PRESSURE_POINT_STRIKE, // PRESSURE_POINT\n [TechniqueId.JEONGBO_INTELLIGENCE_STRIKE]: AnimationType.PRESSURE_POINT_STRIKE, // PRESSURE_POINT\n\n // 조직폭력배 (Jojik) - Organized Crime\n [TechniqueId.JOJIK_STREET_BRAWL]: AnimationType.HOOK, // PUNCH_MID → brawling\n [TechniqueId.JOJIK_IMPROVISED_WEAPON]: AnimationType.HAMMER_FIST, // ELBOW_STRIKE variant\n [TechniqueId.JOJIK_RUTHLESS_ASSAULT]: AnimationType.CROSS, // PUNCH_HIGH → brutal\n [TechniqueId.JOJIK_BRUTAL_TAKEDOWN]: AnimationType.ELBOW_STRIKE, // ELBOW_STRIKE → takedown\n};\n\n/**\n * Get AnimationType for a given technique ID\n *\n * Looks up the AnimationType from the TECHNIQUE_TO_ANIMATION_TYPE mapping.\n * Currently only supports archetype techniques (TechniqueId enum).\n * Returns undefined for unknown techniques or trigram techniques.\n *\n * @param techniqueId - The technique ID\n * @returns The AnimationType for movement physics, or undefined if not found\n * @korean 기술ID로애니메이션타입가져오기\n */\nexport function getAnimationTypeForTechnique(\n techniqueId: string | undefined\n): AnimationType | undefined {\n if (!techniqueId) {\n return undefined;\n }\n \n // Check if techniqueId is in our mapping\n // Note: Only archetype techniques (TechniqueId enum) are currently mapped\n return TECHNIQUE_TO_ANIMATION_TYPE[techniqueId as TechniqueId];\n}\n\n/**\n * Get AnimationType from AttackAnimationType\n *\n * @param attackAnimationType - The attack animation type from technique definition\n * @returns The AnimationType for movement physics\n * @korean 공격애니메이션타입에서애니메이션타입가져오기\n */\nexport function getAnimationTypeFromAttackAnimation(\n attackAnimationType: AttackAnimationType\n): AnimationType {\n return ATTACK_ANIMATION_TO_MOVEMENT_TYPE[attackAnimationType];\n}\n\nexport default {\n TECHNIQUE_TO_ANIMATION_TYPE,\n ATTACK_ANIMATION_TO_MOVEMENT_TYPE,\n getAnimationTypeForTechnique,\n getAnimationTypeFromAttackAnimation,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,IAAa,oCAGT;EAED,oBAAoB,aAAa,cAAc;EAC/C,oBAAoB,YAAY,cAAc;EAC9C,oBAAoB,YAAY,cAAc;EAG9C,oBAAoB,aAAa,cAAc;EAC/C,oBAAoB,YAAY,cAAc;EAC9C,oBAAoB,kBAAkB,cAAc;EAGpD,oBAAoB,eAAe,cAAc;EACjD,oBAAoB,iBAAiB,cAAc;EAGnD,oBAAoB,cAAc,cAAc;EAChD,oBAAoB,cAAc,cAAc;EAGhD,oBAAoB,iBAAiB,cAAc;EACnD,oBAAoB,uBAAuB,cAAc;AAC5D;;;;;;;;;;;AAYA,IAAa,8BAAkE;EAE5E,YAAY,sBAAsB,cAAc;EAChD,YAAY,oBAAoB,cAAc;EAC9C,YAAY,mBAAmB,cAAc;EAC7C,YAAY,wBAAwB,cAAc;EAGlD,YAAY,wBAAwB,cAAc;EAClD,YAAY,uBAAuB,cAAc;EACjD,YAAY,2BAA2B,cAAc;EACrD,YAAY,uBAAuB,cAAc;EAGjD,YAAY,wBAAwB,cAAc;EAClD,YAAY,qBAAqB,cAAc;EAC/C,YAAY,yBAAyB,cAAc;EACnD,YAAY,sBAAsB,cAAc;EAGhD,YAAY,0BAA0B,cAAc;EACpD,YAAY,+BAA+B,cAAc;EACzD,YAAY,gCAAgC,cAAc;EAC1D,YAAY,6BAA6B,cAAc;EACvD,YAAY,8BAA8B,cAAc;EAGxD,YAAY,qBAAqB,cAAc;EAC/C,YAAY,0BAA0B,cAAc;EACpD,YAAY,yBAAyB,cAAc;EACnD,YAAY,wBAAwB,cAAc;AACrD;;;;;;;;;;;;AAaA,SAAgB,6BACd,aAC2B;CAC3B,IAAI,CAAC,aACH;CAKF,OAAO,4BAA4B;AACrC;;;;;;;;AASA,SAAgB,oCACd,qBACe;CACf,OAAO,kCAAkC;AAC3C"}
|