import 'package:asciineverdie/src/core/util/balance_constants.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { group('MonsterBaseStats ATK 완화 공식', () { test('ATK 레벨별 차등 공식 검증', () { // 레벨 1~5: 2 + level * 3 (초반 난이도 완화) expect(MonsterBaseStats.forLevel(1).atk, 5); // 2 + 3 expect(MonsterBaseStats.forLevel(5).atk, 17); // 2 + 15 // 레벨 6+: 3 + level * 4 expect(MonsterBaseStats.forLevel(8).atk, 35); // 3 + 32 expect(MonsterBaseStats.forLevel(10).atk, 43); // 3 + 40 expect(MonsterBaseStats.forLevel(20).atk, 83); // 3 + 80 expect(MonsterBaseStats.forLevel(100).atk, 403); // 3 + 400 }); test('레벨 8 몬스터가 플레이어에게 적절한 데미지', () { // 레벨 8 몬스터: ATK 35 // 플레이어 DEF ~40 가정 (중간 수준 장비) // 최대 데미지: 35 * 1.2 - 40 * 0.5 = 42 - 20 = 22 final level8Atk = MonsterBaseStats.forLevel(8).atk; final maxDamage = (level8Atk * 1.2 - 40 * 0.5).round(); // 플레이어 HP ~150 기준 6~7회 생존 expect(maxDamage, lessThan(50)); expect(maxDamage, greaterThan(10)); }); test('레벨 1 몬스터 데미지가 플레이어 1히트킬 방지', () { final level1Atk = MonsterBaseStats.forLevel(1).atk; // ATK 5에서 DEF 10 기준 최대 데미지 = 5 * 1.2 - 10 * 0.5 = 1 final maxDamage = (level1Atk * 1.2 - 10 * 0.5).round(); expect(maxDamage, lessThanOrEqualTo(10)); }); test('ATK 곡선이 단조 증가', () { int prevAtk = 0; for (var level = 1; level <= 50; level++) { final atk = MonsterBaseStats.forLevel(level).atk; expect( atk, greaterThan(prevAtk), reason: 'Level $level ATK should be > level ${level - 1}', ); prevAtk = atk; } }); test('기존 공식 대비 ATK 감소 확인', () { // 기존: 10 + level * 12 // 신규 (레벨 1~5): 2 + level * 3 (초반 난이도 완화) // 신규 (레벨 6+): 3 + level * 4 // 레벨 6 이상은 약 33% 수준 (기존 대비 67% 감소) for (var level in [10, 20]) { final oldAtk = 10 + level * 12; final newAtk = MonsterBaseStats.forLevel(level).atk; final ratio = newAtk / oldAtk; expect( ratio, lessThan(0.45), reason: 'Level $level should be < 45% of old', ); expect( ratio, greaterThan(0.25), reason: 'Level $level should be > 25% of old', ); } // 레벨 1~5는 추가 완화 (기존 대비 더 낮음) for (var level in [1, 5]) { final oldAtk = 10 + level * 12; final newAtk = MonsterBaseStats.forLevel(level).atk; final ratio = newAtk / oldAtk; expect( ratio, lessThan(0.35), reason: 'Early level $level should be < 35% of old', ); expect( ratio, greaterThan(0.15), reason: 'Early level $level should be > 15% of old', ); } }); }); group('PlayerScaling HP 스케일링', () { test('hpPerLevel = 18, hpPerCon = 10 검증', () { expect(PlayerScaling.hpPerLevel, 18); expect(PlayerScaling.hpPerCon, 10); }); test('레벨업당 HP 증가 검증', () { // baseHp=10, level=10, conBonus=5 final result = PlayerScaling.calculateResources( level: 10, baseHp: 10, baseMp: 20, conBonus: 5, intBonus: 5, ); // HP = 10 + (10-1)*18 + 5*10 = 10 + 162 + 50 = 222 expect(result.hpMax, 222); }); }); }