Files
asciinevrdie/test/core/util/balance_constants_test.dart
2026-01-14 23:07:03 +09:00

109 lines
3.6 KiB
Dart

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);
});
});
}