# 종족/클래스 패시브 미반영 수정 계획 ## 1. 현황 분석 ### 반영되는 패시브 (전투 스탯 계산에 적용됨) - HP/MP 보너스, 물리/마법 데미지 보너스, 방어력/회피율/크리티컬 보너스 ### 미반영 패시브 (정의만 있고 실제 로직에서 미사용) | 패시브 | 영향받는 종족/클래스 | 수정 위치 | |--------|---------------------|-----------| | `expMultiplier` | Byte Human (+5%), Callback Seraph (+3%) | `progress_service.dart:387` | | `firstStrikeBonus` | Pointer Assassin (1.5배) | `combat_tick_service.dart` | | `multiAttack` | Refactor Monk | `combat_tick_service.dart` | | `postCombatHeal` | Garbage Collector (+5%) | `progress_service.dart:279` | | `healingBonus` | Debugger Paladin, Exception Handler, Null Checker | `potion_service.dart`, `skill_service.dart` | | `deathEquipmentPreserve` | Coredump Undead | **특성 변경 필요** | --- ## 2. 수정 내용 ### 2.1 경험치 배율 (`expMultiplier`) **파일**: `lib/src/core/engine/progress_service.dart` **위치**: 384-387줄 **현재 코드**: ```dart if (gain && nextState.traits.level < 100 && monsterExpReward > 0) { final newExpPos = progress.exp.position + monsterExpReward; ``` **수정 후**: ```dart if (gain && nextState.traits.level < 100 && monsterExpReward > 0) { // 종족 경험치 배율 적용 (예: Byte Human +5%) final race = RaceData.findById(nextState.traits.raceId); final expMultiplier = race?.expMultiplier ?? 1.0; final adjustedExp = (monsterExpReward * expMultiplier).round(); final newExpPos = progress.exp.position + adjustedExp; ``` --- ### 2.2 첫 공격 배율 (`firstStrikeBonus`) **파일**: `lib/src/core/engine/combat_tick_service.dart` **설계**: - 전투 시작 시 첫 공격인지 추적하는 플래그 필요 - 첫 공격 시 `firstStrikeBonus` 배율 적용 **수정 방안**: 1. `CombatState`에 `isFirstAttack` 플래그 추가 2. `CombatTickService`에서 첫 플레이어 공격 시 배율 적용: ```dart var damage = result.damage; if (isFirstPlayerAttack && firstStrikeBonus > 1.0) { damage = (damage * firstStrikeBonus).round(); isFirstPlayerAttack = false; } ``` --- ### 2.3 연속 공격 (`multiAttack`) **파일**: `lib/src/core/engine/combat_tick_service.dart` **설계**: - `hasMultiAttack` 패시브가 있으면 일정 확률로 추가 공격 - 예: 30% 확률로 연속 공격 (2타) **수정 방안**: ```dart // 플레이어 공격 후 if (hasMultiAttack && rng.nextDouble() < 0.3) { // 추가 공격 실행 final extraAttack = calculator.playerAttackMonster(...); // 결과 합산 } ``` --- ### 2.4 전투 후 HP 회복 (`postCombatHeal`) **파일**: `lib/src/core/engine/progress_service.dart` **위치**: 276-280줄 **현재 코드**: ```dart // 전투 승리 시 HP 회복 (50% + CON/2) final conBonus = nextState.stats.con ~/ 2; final healAmount = (maxHp * 0.5).round() + conBonus; ``` **수정 후**: ```dart // 전투 승리 시 HP 회복 (50% + CON/2 + 클래스 패시브) final conBonus = nextState.stats.con ~/ 2; var healAmount = (maxHp * 0.5).round() + conBonus; // 클래스 패시브: 전투 후 HP 회복 (Garbage Collector +5%) final klass = ClassData.findById(nextState.traits.classId); if (klass != null) { final postCombatHealRate = klass.getPassiveValue(ClassPassiveType.postCombatHeal); if (postCombatHealRate > 0) { healAmount += (maxHp * postCombatHealRate).round(); } } ``` --- ### 2.5 회복력 보너스 (`healingBonus`) 물약/스킬 사용 시 추가 회복 적용 #### 2.5.1 물약 회복 **파일**: `lib/src/core/engine/potion_service.dart` **수정 위치**: `usePotion()` 메서드 (73-81줄) **현재 코드**: ```dart if (potion.isHpPotion) { healedAmount = potion.calculateHeal(maxHp); newHp = (currentHp + healedAmount).clamp(0, maxHp); ``` **수정 후**: ```dart if (potion.isHpPotion) { var baseHeal = potion.calculateHeal(maxHp); // 회복력 보너스 적용 (클래스 패시브) baseHeal = (baseHeal * healingMultiplier).round(); newHp = (currentHp + baseHeal).clamp(0, maxHp); healedAmount = newHp - currentHp; ``` **참고**: `PotionService`에 `healingMultiplier` 파라미터 추가 필요 #### 2.5.2 스킬 회복 **파일**: `lib/src/core/engine/skill_service.dart` **수정 위치**: `useHealSkill()` 메서드 (125-132줄) **현재 코드**: ```dart int healAmount = skill.healAmount; if (skill.healPercent > 0) { healAmount += (player.hpMax * skill.healPercent).round(); } ``` **수정 후**: ```dart int healAmount = skill.healAmount; if (skill.healPercent > 0) { healAmount += (player.hpMax * skill.healPercent).round(); } // 회복력 보너스 적용 (클래스 패시브) healAmount = (healAmount * healingMultiplier).round(); ``` **참고**: `SkillService`에 `healingMultiplier` 파라미터 추가 필요 --- ### 2.6 Coredump Undead 특성 변경 **현재 특성**: `deathEquipmentPreserve` (사망 시 장비 1개 유지) - BM 침해 **대체 특성 제안** (언데드 콘셉트에 어울리는 것): | 옵션 | 설명 | 장점 | |------|------|------| | **방어력 +10%** | 언데드는 고통을 느끼지 않아 피해 감소 | 구현 간단, CON+2와 시너지 | | **HP +8%** | 불사의 육체 | 구현 간단, 생존형 콘셉트 유지 | | **HP +5% + 방어력 +5%** | 복합 생존 특화 | 다른 종족과 차별화 | **추천**: `defenseBonus: 0.10` (방어력 +10%) - 이유: 언데드의 "고통을 느끼지 않는" 콘셉트와 어울림 - 기존 CON+2, STR+1 스탯과 탱커형 시너지 **파일**: `lib/data/race_data.dart` **수정**: ```dart static const coredumpUndead = RaceTraits( raceId: 'coredump_undead', name: 'Coredump Undead', statModifiers: { StatType.con: 2, StatType.str: 1, StatType.cha: -2, StatType.dex: -1, }, passives: [ PassiveAbility( type: PassiveType.defenseBonus, // 변경 value: 0.10, // 변경 description: '방어력 +10%', // 변경 ), ], ); ``` --- ## 3. 수정 순서 1. **Coredump Undead 특성 변경** - 단순 데이터 수정 2. **경험치 배율** - 간단한 로직 추가 3. **전투 후 HP 회복** - 간단한 로직 추가 4. **회복력 보너스** - 서비스 파라미터 수정 필요 5. **첫 공격 배율** - 전투 상태 추적 필요 6. **연속 공격** - 전투 로직 수정 필요 --- ## 4. 검증 방법 1. `flutter analyze` 통과 2. 각 패시브가 적용된 종족/클래스로 캐릭터 생성 3. 실제 게임 플레이로 효과 확인: - Byte Human: 경험치 +5% (레벨업 속도) - Pointer Assassin: 첫 공격 1.5배 (전투 시작 데미지) - Refactor Monk: 연속 공격 (추가 타격) - Garbage Collector: 전투 후 +5% HP 회복 - Debugger Paladin: 물약/스킬 회복량 +10% - Coredump Undead: 방어력 +10% --- ## 5. 삭제할 코드 **파일**: `lib/src/core/model/race_traits.dart` `PassiveType.deathEquipmentPreserve` enum 삭제 (사용되지 않음) **파일**: `lib/src/core/engine/stat_calculator.dart` `calculateDeathEquipmentPreserve()` 메서드 삭제 (사용되지 않음)