blacktrigram 0.7.98 → 0.7.99
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/AudioManager.js +2 -4
- package/lib/audio/AudioManager.js.map +1 -1
- package/lib/components/screens/combat/CombatScreen3D.js +8 -9
- 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 +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 +2 -1
- package/lib/components/screens/combat/components/effects/BloodViscosity3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/InternalDamage3D.js +3 -1
- package/lib/components/screens/combat/components/effects/InternalDamage3D.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 +16 -15
- 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.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.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatRightHUD.js.map +1 -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/PlayerStateOverlayHtml.js.map +1 -1
- package/lib/components/screens/combat/components/indicators/InputBufferDisplay.js.map +1 -1
- package/lib/components/screens/combat/components/indicators/TechniqueNameDisplay.js.map +1 -1
- package/lib/components/screens/combat/hooks/useAICombat.js +0 -1
- package/lib/components/screens/combat/hooks/useAICombat.js.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatActions.js +7 -6
- package/lib/components/screens/combat/hooks/useCombatActions.js.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatLayout.js +3 -1
- package/lib/components/screens/combat/hooks/useCombatLayout.js.map +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 +7 -6
- 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 +34 -30
- 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/endscreen/EndScreen3D.js +2 -2
- package/lib/components/screens/endscreen/EndScreen3D.js.map +1 -1
- package/lib/components/screens/endscreen/components/DefeatAnimation3D.js +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 +2 -2
- package/lib/components/screens/endscreen/components/VictoryAnimation3D.js.map +1 -1
- package/lib/components/screens/endscreen/components/WinnerDisplayOverlayHtml.js +2 -1
- package/lib/components/screens/endscreen/components/WinnerDisplayOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/IntroScreen3D.js +2 -4
- 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.map +1 -1
- package/lib/components/screens/training/TrainingScreen3D.js +10 -9
- package/lib/components/screens/training/TrainingScreen3D.js.map +1 -1
- package/lib/components/screens/training/components/AnatomyControlsOverlayHtml.js +14 -13
- 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 +8 -7
- package/lib/components/screens/training/components/VitalPointMarker3D.js.map +1 -1
- package/lib/components/screens/training/components/VitalPointTrainingOverlayHtml.js +15 -13
- package/lib/components/screens/training/components/VitalPointTrainingOverlayHtml.js.map +1 -1
- 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 +3 -2
- 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/useTrainingActions.js +1 -2
- package/lib/components/screens/training/hooks/useTrainingActions.js.map +1 -1
- package/lib/components/screens/training/hooks/useTrainingLayout.js +3 -1
- package/lib/components/screens/training/hooks/useTrainingLayout.js.map +1 -1
- package/lib/components/shared/base/BaseButton.js.map +1 -1
- package/lib/components/shared/base/BaseButtonOverlayHtml.js +59 -53
- package/lib/components/shared/base/BaseButtonOverlayHtml.js.map +1 -1
- package/lib/components/shared/base/BasePanel.js +19 -18
- package/lib/components/shared/base/BasePanel.js.map +1 -1
- package/lib/components/shared/base/BaseText.js.map +1 -1
- package/lib/components/shared/mobile/ActionButtons.js.map +1 -1
- package/lib/components/shared/mobile/GestureRecognizerPure.js +22 -18
- package/lib/components/shared/mobile/GestureRecognizerPure.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/VirtualDPad.js.map +1 -1
- package/lib/components/shared/three/anatomy/BoneAttachedMuscles.js +4 -5
- package/lib/components/shared/three/anatomy/BoneAttachedMuscles.js.map +1 -1
- package/lib/components/shared/three/anatomy/BoneClothing.js +29 -24
- 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 +3 -2
- package/lib/components/shared/three/effects/ActionFeedback.js.map +1 -1
- package/lib/components/shared/three/effects/DamageNumbers.js +2 -1
- package/lib/components/shared/three/effects/DamageNumbers.js.map +1 -1
- package/lib/components/shared/three/effects/HitEffects3D.js +3 -2
- 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 +6 -5
- package/lib/components/shared/three/effects/VitalPointMarkers3D.js.map +1 -1
- package/lib/components/shared/three/indicators/GuardIndicator.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.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/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 +3 -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/MenuList.js.map +1 -1
- package/lib/components/shared/three/ui/PlayerHUD.js +2 -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 +25 -24
- package/lib/components/shared/three/ui/TechniqueBar.js.map +1 -1
- package/lib/components/shared/three/ui/TechniqueCard.js +1 -3
- 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 +2 -1
- package/lib/components/shared/ui/BackButton.js.map +1 -1
- package/lib/components/shared/ui/BaseHUDContainer.js +69 -68
- 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/hooks/useKeyboardControls.js +0 -1
- package/lib/hooks/useKeyboardControls.js.map +1 -1
- package/lib/hooks/useSkeletalAnimation.js +12 -3
- package/lib/hooks/useSkeletalAnimation.js.map +1 -1
- package/lib/systems/CombatSystem.js +6 -2
- package/lib/systems/CombatSystem.js.map +1 -1
- package/lib/systems/PlayerEffectManager.js +0 -1
- package/lib/systems/PlayerEffectManager.js.map +1 -1
- package/lib/systems/ai/AdaptiveDifficulty.js.map +1 -1
- package/lib/systems/ai/DecisionTree.js +10 -21
- package/lib/systems/ai/DecisionTree.js.map +1 -1
- package/lib/systems/animation/core/AnimationStateMachine.js.map +1 -1
- package/lib/systems/animation/systems/AdvancedJointMovements.js +1 -3
- package/lib/systems/animation/systems/AdvancedJointMovements.js.map +1 -1
- package/lib/systems/animation/systems/MuscleActivation.js +3 -4
- package/lib/systems/animation/systems/MuscleActivation.js.map +1 -1
- package/lib/systems/bodypart/MovementPenaltySystem.js.map +1 -1
- package/lib/systems/bodypart/PlayerInjuryTrackingManager.js +2 -1
- package/lib/systems/bodypart/PlayerInjuryTrackingManager.js.map +1 -1
- package/lib/systems/breathing/BreathingDisruptionSystem.js.map +1 -1
- package/lib/systems/combat/BalanceSystem.js.map +1 -1
- package/lib/systems/combat/CombatStateSystem.js.map +1 -1
- package/lib/systems/combat/ConsciousnessSystem.js.map +1 -1
- package/lib/systems/combat/GrappleSystem.js +3 -9
- package/lib/systems/combat/GrappleSystem.js.map +1 -1
- package/lib/systems/combat/LimbExposureSystem.js.map +1 -1
- package/lib/systems/combat/PainResponseSystem.js.map +1 -1
- package/lib/systems/movement/InjuryMovementModifier.js +1 -1
- package/lib/systems/movement/InjuryMovementModifier.js.map +1 -1
- package/lib/systems/physics/CoordinateMapper.js.map +1 -1
- package/lib/systems/vitalpoint/DamageCalculator.js +8 -5
- package/lib/systems/vitalpoint/DamageCalculator.js.map +1 -1
- package/lib/types/facial.js.map +1 -1
- package/lib/utils/accessibility.js +0 -1
- package/lib/utils/accessibility.js.map +1 -1
- package/lib/utils/effectUtils.js +1 -3
- package/lib/utils/effectUtils.js.map +1 -1
- package/lib/utils/inputSystem.js +0 -2
- package/lib/utils/inputSystem.js.map +1 -1
- package/lib/utils/koreanThemeHelpers.js +6 -3
- package/lib/utils/koreanThemeHelpers.js.map +1 -1
- package/lib/utils/performance/PerformanceOverlay3D.js.map +1 -1
- package/lib/utils/playerUtils.js +4 -2
- package/lib/utils/playerUtils.js.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playerUtils.js","names":[],"sources":["../../src/utils/playerUtils.ts"],"sourcesContent":["/**\n * Player state utilities and helper functions\n */\n\nimport { getArchetypePhysicalAttributes } from \"../data/archetypePhysicalAttributes\";\nimport { PLAYER_ARCHETYPES_DATA, PlayerState, StatusEffect } from \"../systems\";\nimport {\n calculateAngleToTarget,\n createDefaultBodyFacing,\n} from \"../systems/animation\";\nimport type { BodyFacing } from \"../systems/animation/core/types\";\nimport {\n BodyPart,\n BodyPartHealth,\n BodyPartMaxHealth,\n} from \"../systems/bodypart/types\";\nimport { PlayerArchetype, Position, TrigramStance } from \"../types\";\nimport { CombatState } from \"../types/common\";\nimport { ARCHETYPE_ASSETS } from \"../types/constants\";\n\n/**\n * Default body part health values (100 HP each)\n * @korean 기본 신체부위 체력\n */\nconst DEFAULT_BODY_PART_HEALTH: BodyPartHealth = {\n [BodyPart.HEAD]: 100,\n [BodyPart.NECK]: 100,\n [BodyPart.TORSO_UPPER]: 100,\n [BodyPart.TORSO_LOWER]: 100,\n [BodyPart.ARM_LEFT]: 100,\n [BodyPart.ARM_RIGHT]: 100,\n [BodyPart.LEG_LEFT]: 100,\n [BodyPart.LEG_RIGHT]: 100,\n};\n\n/**\n * Default body part max health values\n * @korean 기본 신체부위 최대체력\n */\nconst DEFAULT_BODY_PART_MAX_HEALTH: BodyPartMaxHealth = {\n [BodyPart.HEAD]: 100,\n [BodyPart.NECK]: 100,\n [BodyPart.TORSO_UPPER]: 100,\n [BodyPart.TORSO_LOWER]: 100,\n [BodyPart.ARM_LEFT]: 100,\n [BodyPart.ARM_RIGHT]: 100,\n [BodyPart.LEG_LEFT]: 100,\n [BodyPart.LEG_RIGHT]: 100,\n};\n\n/**\n * Create a complete PlayerState from archetype and player index\n */\nexport function createPlayerFromArchetype(\n archetype: PlayerArchetype,\n playerIndex: number,\n): PlayerState {\n const archetypeData = PLAYER_ARCHETYPES_DATA[archetype];\n\n const basePosition: Position = {\n x: playerIndex === 0 ? 300 : 500,\n y: 400,\n };\n\n return {\n id: `player_${playerIndex + 1}`,\n name: archetypeData.name,\n archetype,\n\n // Physical attributes loaded from archetype defaults\n physicalAttributes: getArchetypePhysicalAttributes(archetype),\n\n // Combat stats\n health: archetypeData.baseHealth,\n maxHealth: archetypeData.baseHealth,\n bodyPartHealth: { ...DEFAULT_BODY_PART_HEALTH },\n bodyPartMaxHealth: { ...DEFAULT_BODY_PART_MAX_HEALTH },\n ki: archetypeData.baseKi,\n maxKi: archetypeData.baseKi,\n stamina: archetypeData.baseStamina,\n maxStamina: archetypeData.baseStamina,\n energy: 100,\n maxEnergy: 100,\n\n // Combat attributes\n attackPower: archetypeData.stats.attackPower,\n defense: archetypeData.stats.defense,\n speed: archetypeData.stats.speed,\n technique: archetypeData.stats.technique,\n pain: 0,\n consciousness: 100,\n balance: 100,\n momentum: 0,\n\n // Combat state\n currentStance: archetypeData.coreStance,\n combatState: CombatState.IDLE,\n position: basePosition,\n // Default to orthodox/southpaw stance\n // Player 1 starts orthodox, Player 2 starts southpaw for facing each other\n stanceSide: playerIndex === 0 ? \"orthodox\" : \"southpaw\",\n isBlocking: false,\n isStunned: false,\n isCountering: false,\n lastActionTime: 0,\n recoveryTime: 0,\n lastStanceChangeTime: 0,\n\n // Status and effects\n statusEffects: [],\n activeEffects: [],\n\n // Vital points state\n vitalPoints: [],\n\n // Match statistics\n totalDamageReceived: 0,\n totalDamageDealt: 0,\n hitsTaken: 0,\n hitsLanded: 0,\n perfectStrikes: 0,\n vitalPointHits: 0,\n };\n}\n\n/**\n * Update player state with partial updates\n */\nexport function updatePlayerState(\n player: PlayerState,\n updates: Partial<PlayerState>,\n): PlayerState {\n return {\n ...player,\n ...updates,\n // Ensure vital constraints\n health: Math.max(\n 0,\n Math.min(updates.health ?? player.health, player.maxHealth),\n ),\n ki: Math.max(0, Math.min(updates.ki ?? player.ki, player.maxKi)),\n stamina: Math.max(\n 0,\n Math.min(updates.stamina ?? player.stamina, player.maxStamina),\n ),\n consciousness: Math.max(\n 0,\n Math.min(updates.consciousness ?? player.consciousness, 100),\n ),\n balance: Math.max(0, Math.min(updates.balance ?? player.balance, 100)),\n };\n}\n\n/**\n * Apply damage to player\n */\nexport function applyDamage(\n player: PlayerState,\n damage: number,\n _damageType?: string, // Fix: Add underscore for unused parameter\n): PlayerState {\n const newHealth = Math.max(0, player.health - damage);\n const isKnockedOut = newHealth <= 0;\n\n return updatePlayerState(player, {\n health: newHealth,\n totalDamageReceived: player.totalDamageReceived + damage,\n hitsTaken: player.hitsTaken + 1,\n combatState: isKnockedOut ? CombatState.STUNNED : player.combatState,\n consciousness: isKnockedOut ? 0 : player.consciousness,\n });\n}\n\n/**\n * Apply status effect to player\n */\nexport function applyStatusEffect(\n player: PlayerState,\n effect: StatusEffect,\n): PlayerState {\n const existingEffectIndex = player.statusEffects.findIndex(\n (e) => e.type === effect.type && !e.stackable,\n );\n\n let newEffects: StatusEffect[];\n if (existingEffectIndex >= 0 && !effect.stackable) {\n // Replace existing non-stackable effect\n newEffects = [...player.statusEffects];\n newEffects[existingEffectIndex] = effect;\n } else {\n // Add new effect\n newEffects = [...player.statusEffects, effect];\n }\n\n return updatePlayerState(player, {\n statusEffects: newEffects,\n activeEffects: [...player.activeEffects, effect.type],\n });\n}\n\n/**\n * Get vital point by ID (fix return type)\n */\nexport function getVitalPointByOnPlayerId(\n player: PlayerState,\n vitalPointId: string,\n): {\n readonly id: string;\n readonly isHit: boolean;\n readonly damage: number;\n readonly lastHitTime: number;\n} | null {\n return player.vitalPoints.find((vp) => vp.id === vitalPointId) ?? null;\n}\n\n/**\n * Check if player can act\n */\nexport function canPlayerAct(player: PlayerState): boolean {\n if (player.health <= 0) return false;\n if (player.consciousness <= 0) return false;\n if (player.combatState === CombatState.STUNNED) return false;\n if (player.isStunned) return false;\n return true;\n}\n\n/**\n * Get player's current stance effectiveness against opponent\n */\nexport function getStanceEffectiveness(\n _playerStance: TrigramStance, // Fix: Add underscore to unused parameter\n _opponentStance: TrigramStance, // Fix: Add underscore to unused parameter\n): number {\n // Basic implementation - could be enhanced with stance matrix\n return 1.0;\n}\n\n/**\n * Check if player has enough resources for action\n */\nexport function hasEnoughResources(\n player: PlayerState,\n kiCost: number,\n staminaCost: number,\n): boolean {\n return player.ki >= kiCost && player.stamina >= staminaCost;\n}\n\n/**\n * Get player archetype bonuses\n */\nexport function getArchetypeBonuses(archetype: PlayerArchetype): {\n attackBonus: number;\n defenseBonus: number;\n speedBonus: number;\n techniqueBonus: number;\n} {\n const data = PLAYER_ARCHETYPES_DATA[archetype];\n return {\n attackBonus: data.stats.attackPower * 0.1,\n defenseBonus: data.stats.defense * 0.1,\n speedBonus: data.stats.speed * 0.1,\n techniqueBonus: data.stats.technique * 0.1,\n };\n}\n\n/**\n * Calculate player's current combat effectiveness\n */\nexport function calculateCombatEffectiveness(player: PlayerState): number {\n const healthFactor = player.health / player.maxHealth;\n const staminaFactor = player.stamina / player.maxStamina;\n const consciousnessFactor = player.consciousness / 100;\n const balanceFactor = player.balance / 100;\n\n return (\n (healthFactor + staminaFactor + consciousnessFactor + balanceFactor) / 4\n );\n}\n\n/**\n * Remove expired status effects\n */\nexport function updateStatusEffects(\n player: PlayerState,\n currentTime: number,\n): PlayerState {\n const activeEffects = player.statusEffects.filter(\n (effect) => effect.endTime > currentTime,\n );\n\n return updatePlayerState(player, {\n statusEffects: activeEffects,\n activeEffects: activeEffects.map((e) => e.type),\n });\n}\n\n/**\n * Reset player to starting state\n */\nexport function resetPlayerState(\n archetype: PlayerArchetype,\n playerIndex: number,\n): PlayerState {\n return createPlayerFromArchetype(archetype, playerIndex);\n}\n\n/**\n * Get archetype asset paths (image, theme music, etc.)\n *\n * Note: PlayerArchetype enum values are already lowercase (e.g., MUSA = \"musa\"),\n * so the toLowerCase() call is defensive programming for type safety.\n */\nexport function getArchetypeAssets(archetype: PlayerArchetype): {\n readonly id: string;\n readonly image: string;\n readonly theme: string;\n readonly themeId: string;\n readonly name_korean: string;\n readonly name_english: string;\n readonly textureKey: string;\n} {\n const archetypeId = archetype.toLowerCase();\n const asset = ARCHETYPE_ASSETS[archetypeId as keyof typeof ARCHETYPE_ASSETS];\n\n if (!asset) {\n console.warn(`No assets found for archetype: ${archetype}`);\n return {\n id: \"unknown\",\n image: \"/assets/visual/logo/black-trigram-256.png\",\n theme: \"/assets/audio/music/intro_theme.mp3\",\n themeId: \"intro_theme\",\n name_korean: \"알 수 없음\",\n name_english: \"Unknown\",\n textureKey: archetype,\n };\n }\n\n return asset;\n}\n\n/**\n * Initialize body facing for a player based on opponent position\n *\n * Calculates initial facing angle to point toward opponent.\n *\n * @param playerPosition - Player's position\n * @param opponentPosition - Opponent's position\n * @returns Initial BodyFacing state\n * @korean 몸향하기초기화\n *\n * @example\n * ```typescript\n * const player = {\n * ...basePlayer,\n * bodyFacing: initializeBodyFacing(\n * { x: 300, y: 400 },\n * { x: 500, y: 400 }\n * ),\n * };\n * ```\n */\nexport function initializeBodyFacing(\n playerPosition: Position,\n opponentPosition: Position,\n): BodyFacing {\n // Calculate initial angle to face opponent\n const initialAngle = calculateAngleToTarget(playerPosition, opponentPosition);\n\n return createDefaultBodyFacing(initialAngle);\n}\n\n/**\n * Toggle the player's stance side (orthodox ↔ southpaw)\n *\n * Switches between orthodox (left foot forward) and southpaw (right foot forward).\n * This is used when executing stance switches or certain techniques.\n *\n * @param player - Current player state\n * @returns Updated player state with toggled stance side\n * @korean 자세측면전환\n *\n * @example\n * ```typescript\n * // Switch from orthodox to southpaw\n * const newState = toggleStanceSide(player);\n * // newState.stanceSide === 'southpaw'\n * ```\n */\nexport function toggleStanceSide(player: PlayerState): PlayerState {\n const newStanceSide = player.stanceSide === \"orthodox\" ? \"southpaw\" : \"orthodox\";\n\n return {\n ...player,\n stanceSide: newStanceSide,\n };\n}\n\n/**\n * Get the lead foot from stance side, defaulting to orthodox if not set\n *\n * @param player - Player state\n * @returns Lead foot ('left' for orthodox, 'right' for southpaw)\n * @korean 자세측면에서선발발가져오기\n */\nexport function getPlayerLeadFoot(player: PlayerState): \"left\" | \"right\" {\n return player.stanceSide === \"southpaw\" ? \"right\" : \"left\"; // Default to orthodox\n}\n\n/**\n * Get the rear (power) foot for a player\n *\n * @param player - Player state\n * @returns Rear foot ('right' for orthodox, 'left' for southpaw)\n * @korean 후발발가져오기\n */\nexport function getPlayerRearFoot(player: PlayerState): \"left\" | \"right\" {\n return player.stanceSide === \"southpaw\" ? \"left\" : \"right\";\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"playerUtils.js","names":[],"sources":["../../src/utils/playerUtils.ts"],"sourcesContent":["/**\n * Player state utilities and helper functions\n */\n\nimport { getArchetypePhysicalAttributes } from \"../data/archetypePhysicalAttributes\";\nimport { PLAYER_ARCHETYPES_DATA, PlayerState, StatusEffect } from \"../systems\";\nimport {\n calculateAngleToTarget,\n createDefaultBodyFacing,\n} from \"../systems/animation\";\nimport type { BodyFacing } from \"../systems/animation/core/types\";\nimport {\n BodyPart,\n BodyPartHealth,\n BodyPartMaxHealth,\n} from \"../systems/bodypart/types\";\nimport { PlayerArchetype, Position, TrigramStance } from \"../types\";\nimport { CombatState } from \"../types/common\";\nimport { ARCHETYPE_ASSETS } from \"../types/constants\";\n\n/**\n * Default body part health values (100 HP each)\n * @korean 기본 신체부위 체력\n */\nconst DEFAULT_BODY_PART_HEALTH: BodyPartHealth = {\n [BodyPart.HEAD]: 100,\n [BodyPart.NECK]: 100,\n [BodyPart.TORSO_UPPER]: 100,\n [BodyPart.TORSO_LOWER]: 100,\n [BodyPart.ARM_LEFT]: 100,\n [BodyPart.ARM_RIGHT]: 100,\n [BodyPart.LEG_LEFT]: 100,\n [BodyPart.LEG_RIGHT]: 100,\n};\n\n/**\n * Default body part max health values\n * @korean 기본 신체부위 최대체력\n */\nconst DEFAULT_BODY_PART_MAX_HEALTH: BodyPartMaxHealth = {\n [BodyPart.HEAD]: 100,\n [BodyPart.NECK]: 100,\n [BodyPart.TORSO_UPPER]: 100,\n [BodyPart.TORSO_LOWER]: 100,\n [BodyPart.ARM_LEFT]: 100,\n [BodyPart.ARM_RIGHT]: 100,\n [BodyPart.LEG_LEFT]: 100,\n [BodyPart.LEG_RIGHT]: 100,\n};\n\n/**\n * Create a complete PlayerState from archetype and player index\n */\nexport function createPlayerFromArchetype(\n archetype: PlayerArchetype,\n playerIndex: number,\n): PlayerState {\n const archetypeData = PLAYER_ARCHETYPES_DATA[archetype];\n\n const basePosition: Position = {\n x: playerIndex === 0 ? 300 : 500,\n y: 400,\n };\n\n return {\n id: `player_${playerIndex + 1}`,\n name: archetypeData.name,\n archetype,\n\n // Physical attributes loaded from archetype defaults\n physicalAttributes: getArchetypePhysicalAttributes(archetype),\n\n // Combat stats\n health: archetypeData.baseHealth,\n maxHealth: archetypeData.baseHealth,\n bodyPartHealth: { ...DEFAULT_BODY_PART_HEALTH },\n bodyPartMaxHealth: { ...DEFAULT_BODY_PART_MAX_HEALTH },\n ki: archetypeData.baseKi,\n maxKi: archetypeData.baseKi,\n stamina: archetypeData.baseStamina,\n maxStamina: archetypeData.baseStamina,\n energy: 100,\n maxEnergy: 100,\n\n // Combat attributes\n attackPower: archetypeData.stats.attackPower,\n defense: archetypeData.stats.defense,\n speed: archetypeData.stats.speed,\n technique: archetypeData.stats.technique,\n pain: 0,\n consciousness: 100,\n balance: 100,\n momentum: 0,\n\n // Combat state\n currentStance: archetypeData.coreStance,\n combatState: CombatState.IDLE,\n position: basePosition,\n // Default to orthodox/southpaw stance\n // Player 1 starts orthodox, Player 2 starts southpaw for facing each other\n stanceSide: playerIndex === 0 ? \"orthodox\" : \"southpaw\",\n isBlocking: false,\n isStunned: false,\n isCountering: false,\n lastActionTime: 0,\n recoveryTime: 0,\n lastStanceChangeTime: 0,\n\n // Status and effects\n statusEffects: [],\n activeEffects: [],\n\n // Vital points state\n vitalPoints: [],\n\n // Match statistics\n totalDamageReceived: 0,\n totalDamageDealt: 0,\n hitsTaken: 0,\n hitsLanded: 0,\n perfectStrikes: 0,\n vitalPointHits: 0,\n };\n}\n\n/**\n * Update player state with partial updates\n */\nexport function updatePlayerState(\n player: PlayerState,\n updates: Partial<PlayerState>,\n): PlayerState {\n return {\n ...player,\n ...updates,\n // Ensure vital constraints\n health: Math.max(\n 0,\n Math.min(updates.health ?? player.health, player.maxHealth),\n ),\n ki: Math.max(0, Math.min(updates.ki ?? player.ki, player.maxKi)),\n stamina: Math.max(\n 0,\n Math.min(updates.stamina ?? player.stamina, player.maxStamina),\n ),\n consciousness: Math.max(\n 0,\n Math.min(updates.consciousness ?? player.consciousness, 100),\n ),\n balance: Math.max(0, Math.min(updates.balance ?? player.balance, 100)),\n };\n}\n\n/**\n * Apply damage to player\n */\nexport function applyDamage(\n player: PlayerState,\n damage: number,\n _damageType?: string, // Fix: Add underscore for unused parameter\n): PlayerState {\n const newHealth = Math.max(0, player.health - damage);\n const isKnockedOut = newHealth <= 0;\n\n return updatePlayerState(player, {\n health: newHealth,\n totalDamageReceived: player.totalDamageReceived + damage,\n hitsTaken: player.hitsTaken + 1,\n combatState: isKnockedOut ? CombatState.STUNNED : player.combatState,\n consciousness: isKnockedOut ? 0 : player.consciousness,\n });\n}\n\n/**\n * Apply status effect to player\n */\nexport function applyStatusEffect(\n player: PlayerState,\n effect: StatusEffect,\n): PlayerState {\n const existingEffectIndex = player.statusEffects.findIndex(\n (e) => e.type === effect.type && !e.stackable,\n );\n\n let newEffects: StatusEffect[];\n if (existingEffectIndex >= 0 && !effect.stackable) {\n // Replace existing non-stackable effect\n newEffects = [...player.statusEffects];\n newEffects[existingEffectIndex] = effect;\n } else {\n // Add new effect\n newEffects = [...player.statusEffects, effect];\n }\n\n return updatePlayerState(player, {\n statusEffects: newEffects,\n activeEffects: [...player.activeEffects, effect.type],\n });\n}\n\n/**\n * Get vital point by ID (fix return type)\n */\nexport function getVitalPointByOnPlayerId(\n player: PlayerState,\n vitalPointId: string,\n): {\n readonly id: string;\n readonly isHit: boolean;\n readonly damage: number;\n readonly lastHitTime: number;\n} | null {\n return player.vitalPoints.find((vp) => vp.id === vitalPointId) ?? null;\n}\n\n/**\n * Check if player can act\n */\nexport function canPlayerAct(player: PlayerState): boolean {\n if (player.health <= 0) return false;\n if (player.consciousness <= 0) return false;\n if (player.combatState === CombatState.STUNNED) return false;\n if (player.isStunned) return false;\n return true;\n}\n\n/**\n * Get player's current stance effectiveness against opponent\n */\nexport function getStanceEffectiveness(\n _playerStance: TrigramStance, // Fix: Add underscore to unused parameter\n _opponentStance: TrigramStance, // Fix: Add underscore to unused parameter\n): number {\n // Basic implementation - could be enhanced with stance matrix\n return 1.0;\n}\n\n/**\n * Check if player has enough resources for action\n */\nexport function hasEnoughResources(\n player: PlayerState,\n kiCost: number,\n staminaCost: number,\n): boolean {\n return player.ki >= kiCost && player.stamina >= staminaCost;\n}\n\n/**\n * Get player archetype bonuses\n */\nexport function getArchetypeBonuses(archetype: PlayerArchetype): {\n attackBonus: number;\n defenseBonus: number;\n speedBonus: number;\n techniqueBonus: number;\n} {\n const data = PLAYER_ARCHETYPES_DATA[archetype];\n return {\n attackBonus: data.stats.attackPower * 0.1,\n defenseBonus: data.stats.defense * 0.1,\n speedBonus: data.stats.speed * 0.1,\n techniqueBonus: data.stats.technique * 0.1,\n };\n}\n\n/**\n * Calculate player's current combat effectiveness\n */\nexport function calculateCombatEffectiveness(player: PlayerState): number {\n const healthFactor = player.health / player.maxHealth;\n const staminaFactor = player.stamina / player.maxStamina;\n const consciousnessFactor = player.consciousness / 100;\n const balanceFactor = player.balance / 100;\n\n return (\n (healthFactor + staminaFactor + consciousnessFactor + balanceFactor) / 4\n );\n}\n\n/**\n * Remove expired status effects\n */\nexport function updateStatusEffects(\n player: PlayerState,\n currentTime: number,\n): PlayerState {\n const activeEffects = player.statusEffects.filter(\n (effect) => effect.endTime > currentTime,\n );\n\n return updatePlayerState(player, {\n statusEffects: activeEffects,\n activeEffects: activeEffects.map((e) => e.type),\n });\n}\n\n/**\n * Reset player to starting state\n */\nexport function resetPlayerState(\n archetype: PlayerArchetype,\n playerIndex: number,\n): PlayerState {\n return createPlayerFromArchetype(archetype, playerIndex);\n}\n\n/**\n * Get archetype asset paths (image, theme music, etc.)\n *\n * Note: PlayerArchetype enum values are already lowercase (e.g., MUSA = \"musa\"),\n * so the toLowerCase() call is defensive programming for type safety.\n */\nexport function getArchetypeAssets(archetype: PlayerArchetype): {\n readonly id: string;\n readonly image: string;\n readonly theme: string;\n readonly themeId: string;\n readonly name_korean: string;\n readonly name_english: string;\n readonly textureKey: string;\n} {\n const archetypeId = archetype.toLowerCase();\n const asset = ARCHETYPE_ASSETS[archetypeId as keyof typeof ARCHETYPE_ASSETS];\n\n if (!asset) {\n console.warn(`No assets found for archetype: ${archetype}`);\n return {\n id: \"unknown\",\n image: \"/assets/visual/logo/black-trigram-256.png\",\n theme: \"/assets/audio/music/intro_theme.mp3\",\n themeId: \"intro_theme\",\n name_korean: \"알 수 없음\",\n name_english: \"Unknown\",\n textureKey: archetype,\n };\n }\n\n return asset;\n}\n\n/**\n * Initialize body facing for a player based on opponent position\n *\n * Calculates initial facing angle to point toward opponent.\n *\n * @param playerPosition - Player's position\n * @param opponentPosition - Opponent's position\n * @returns Initial BodyFacing state\n * @korean 몸향하기초기화\n *\n * @example\n * ```typescript\n * const player = {\n * ...basePlayer,\n * bodyFacing: initializeBodyFacing(\n * { x: 300, y: 400 },\n * { x: 500, y: 400 }\n * ),\n * };\n * ```\n */\nexport function initializeBodyFacing(\n playerPosition: Position,\n opponentPosition: Position,\n): BodyFacing {\n // Calculate initial angle to face opponent\n const initialAngle = calculateAngleToTarget(playerPosition, opponentPosition);\n\n return createDefaultBodyFacing(initialAngle);\n}\n\n/**\n * Toggle the player's stance side (orthodox ↔ southpaw)\n *\n * Switches between orthodox (left foot forward) and southpaw (right foot forward).\n * This is used when executing stance switches or certain techniques.\n *\n * @param player - Current player state\n * @returns Updated player state with toggled stance side\n * @korean 자세측면전환\n *\n * @example\n * ```typescript\n * // Switch from orthodox to southpaw\n * const newState = toggleStanceSide(player);\n * // newState.stanceSide === 'southpaw'\n * ```\n */\nexport function toggleStanceSide(player: PlayerState): PlayerState {\n const newStanceSide = player.stanceSide === \"orthodox\" ? \"southpaw\" : \"orthodox\";\n\n return {\n ...player,\n stanceSide: newStanceSide,\n };\n}\n\n/**\n * Get the lead foot from stance side, defaulting to orthodox if not set\n *\n * @param player - Player state\n * @returns Lead foot ('left' for orthodox, 'right' for southpaw)\n * @korean 자세측면에서선발발가져오기\n */\nexport function getPlayerLeadFoot(player: PlayerState): \"left\" | \"right\" {\n return player.stanceSide === \"southpaw\" ? \"right\" : \"left\"; // Default to orthodox\n}\n\n/**\n * Get the rear (power) foot for a player\n *\n * @param player - Player state\n * @returns Rear foot ('right' for orthodox, 'left' for southpaw)\n * @korean 후발발가져오기\n */\nexport function getPlayerRearFoot(player: PlayerState): \"left\" | \"right\" {\n return player.stanceSide === \"southpaw\" ? \"left\" : \"right\";\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "blacktrigram",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.99",
|
|
4
4
|
"description": "Black Trigram (흑괘) - Korean Martial Arts Combat Simulator. Reusable game systems, combat mechanics, animation framework, and Korean martial arts data built with React, Three.js, and TypeScript.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./lib/index.js",
|
|
@@ -189,7 +189,7 @@
|
|
|
189
189
|
"three": "0.185.1"
|
|
190
190
|
},
|
|
191
191
|
"devDependencies": {
|
|
192
|
-
"@aws-sdk/client-bedrock-runtime": "3.
|
|
192
|
+
"@aws-sdk/client-bedrock-runtime": "3.1098.0",
|
|
193
193
|
"@eslint/js": "10.0.1",
|
|
194
194
|
"@react-three/drei": "10.7.7",
|
|
195
195
|
"@react-three/fiber": "9.6.1",
|
|
@@ -202,7 +202,7 @@
|
|
|
202
202
|
"@types/react": "19.2.17",
|
|
203
203
|
"@types/react-dom": "19.2.3",
|
|
204
204
|
"@types/three": "0.185.1",
|
|
205
|
-
"@vitejs/plugin-react": "6.0.
|
|
205
|
+
"@vitejs/plugin-react": "6.0.5",
|
|
206
206
|
"@vitest/coverage-v8": "4.1.10",
|
|
207
207
|
"@vitest/ui": "4.1.10",
|
|
208
208
|
"cypress": "15.19.0",
|
|
@@ -221,7 +221,7 @@
|
|
|
221
221
|
"license-compliance": "3.0.1",
|
|
222
222
|
"mermaid": "11.16.0",
|
|
223
223
|
"mocha-junit-reporter": "2.2.1",
|
|
224
|
-
"mochawesome": "
|
|
224
|
+
"mochawesome": "8.0.0",
|
|
225
225
|
"mochawesome-merge": "5.1.1",
|
|
226
226
|
"mochawesome-report-generator": "6.3.2",
|
|
227
227
|
"openai": "7.1.0",
|
|
@@ -242,7 +242,7 @@
|
|
|
242
242
|
"typescript": "npm:@typescript/typescript6@6.0.2",
|
|
243
243
|
"typescript-7": "npm:typescript@7.0.2",
|
|
244
244
|
"typescript-eslint": "8.65.0",
|
|
245
|
-
"vite": "8.
|
|
245
|
+
"vite": "8.2.0",
|
|
246
246
|
"vite-bundle-analyzer": "1.3.9",
|
|
247
247
|
"vite-tsconfig-paths": "6.1.1",
|
|
248
248
|
"vitest": "4.1.10"
|