feat(phase5): 종족/클래스 시스템 균형 및 UI 통합

- 21개 종족 균형 재설계 (스탯 합계 = 0)
- 18개 클래스 균형 재설계 (스탯 합계 = +3)
- Traits에 raceId, classId 필드 추가
- 저장/불러오기에 종족/클래스 ID 추가
- 캐릭터 생성 UI에서 RaceData/ClassData 사용
- 선택 시 스탯 보정 및 패시브 정보 표시
This commit is contained in:
JiWoong Sul
2025-12-17 17:42:27 +09:00
parent e451703161
commit ec27389e9b
5 changed files with 364 additions and 159 deletions

View File

@@ -12,7 +12,7 @@ class ClassData {
// 전사 계열 (STR 기반)
// ==========================================================================
/// Bug Hunter: STR + INT
/// Bug Hunter: STR + INT (스탯 합계: +3)
static const bugHunter = ClassTraits(
classId: 'bug_hunter',
name: 'Bug Hunter',
@@ -32,12 +32,13 @@ class ClassData {
restriction: EquipmentRestriction.none,
);
/// Overflow Warrior: STR
/// Overflow Warrior: STR + CON (스탯 합계: +3)
static const overflowWarrior = ClassTraits(
classId: 'overflow_warrior',
name: 'Overflow Warrior',
statModifiers: {
StatType.str: 2,
StatType.con: 1,
},
startingSkills: ['power_strike'],
classSkills: ['power_strike', 'overflow_slash', 'buffer_break'],
@@ -51,7 +52,7 @@ class ClassData {
restriction: EquipmentRestriction.none,
);
/// Stack Crusher: STR + CON
/// Stack Crusher: STR + CON (스탯 합계: +3)
static const stackCrusher = ClassTraits(
classId: 'stack_crusher',
name: 'Stack Crusher',
@@ -76,7 +77,7 @@ class ClassData {
restriction: EquipmentRestriction.none,
);
/// Assertion Knight: STR + WIS
/// Assertion Knight: STR + WIS (스탯 합계: +3)
static const assertionKnight = ClassTraits(
classId: 'assertion_knight',
name: 'Assertion Knight',
@@ -102,7 +103,7 @@ class ClassData {
// 탱커 계열 (CON 기반)
// ==========================================================================
/// Debugger Paladin: WIS + CON
/// Debugger Paladin: WIS + CON (스탯 합계: +3)
static const debuggerPaladin = ClassTraits(
classId: 'debugger_paladin',
name: 'Debugger Paladin',
@@ -129,12 +130,13 @@ class ClassData {
),
);
/// Loop Breaker: CON
/// Loop Breaker: CON + STR (스탯 합계: +3)
static const loopBreaker = ClassTraits(
classId: 'loop_breaker',
name: 'Loop Breaker',
statModifiers: {
StatType.con: 2,
StatType.str: 1,
},
startingSkills: ['shield_bash'],
classSkills: ['shield_bash', 'infinite_guard', 'break_stance'],
@@ -150,7 +152,7 @@ class ClassData {
),
);
/// Garbage Collector: CON + STR
/// Garbage Collector: CON + STR (스탯 합계: +3)
static const garbageCollector = ClassTraits(
classId: 'garbage_collector',
name: 'Garbage Collector',
@@ -181,12 +183,13 @@ class ClassData {
// 마법사 계열 (INT 기반)
// ==========================================================================
/// Compiler Mage: INT + MP Max
/// Compiler Mage: INT + WIS (스탯 합계: +3)
static const compilerMage = ClassTraits(
classId: 'compiler_mage',
name: 'Compiler Mage',
statModifiers: {
StatType.intelligence: 2,
StatType.wis: 1,
},
startingSkills: ['fireball'],
classSkills: ['fireball', 'compile_blast', 'syntax_storm'],
@@ -202,12 +205,13 @@ class ClassData {
),
);
/// Recursion Master: INT
/// Recursion Master: INT + DEX (스탯 합계: +3)
static const recursionMaster = ClassTraits(
classId: 'recursion_master',
name: 'Recursion Master',
statModifiers: {
StatType.intelligence: 2,
StatType.dex: 1,
},
startingSkills: ['fireball'],
classSkills: ['fireball', 'recursive_bolt', 'stack_overflow'],
@@ -223,7 +227,7 @@ class ClassData {
),
);
/// Memory Leaker: INT + WIS
/// Memory Leaker: INT + WIS (스탯 합계: +3)
static const memoryLeaker = ClassTraits(
classId: 'memory_leaker',
name: 'Memory Leaker',
@@ -245,7 +249,7 @@ class ClassData {
),
);
/// Type Caster: INT + CHA
/// Type Caster: INT + CHA (스탯 합계: +3)
static const typeCaster = ClassTraits(
classId: 'type_caster',
name: 'Type Caster',
@@ -267,7 +271,7 @@ class ClassData {
),
);
/// DevOps Shaman: CON + INT
/// DevOps Shaman: CON + INT (스탯 합계: +3)
static const devOpsShaman = ClassTraits(
classId: 'devops_shaman',
name: 'DevOps Shaman',
@@ -298,12 +302,13 @@ class ClassData {
// 민첩 계열 (DEX 기반)
// ==========================================================================
/// Refactor Monk: DEX
/// Refactor Monk: DEX + CON (스탯 합계: +3)
static const refactorMonk = ClassTraits(
classId: 'refactor_monk',
name: 'Refactor Monk',
statModifiers: {
StatType.dex: 2,
StatType.con: 1,
},
startingSkills: ['flurry'],
classSkills: ['flurry', 'clean_code_strike', 'refactor_combo'],
@@ -324,12 +329,13 @@ class ClassData {
),
);
/// Pointer Assassin: DEX
/// Pointer Assassin: DEX + STR (스탯 합계: +3)
static const pointerAssassin = ClassTraits(
classId: 'pointer_assassin',
name: 'Pointer Assassin',
statModifiers: {
StatType.dex: 2,
StatType.str: 1,
},
startingSkills: ['backstab'],
classSkills: ['backstab', 'null_strike', 'dereference_kill'],
@@ -350,7 +356,7 @@ class ClassData {
),
);
/// Callback Samurai: DEX + STR
/// Callback Samurai: DEX + STR (스탯 합계: +3)
static const callbackSamurai = ClassTraits(
classId: 'callback_samurai',
name: 'Callback Samurai',
@@ -375,7 +381,7 @@ class ClassData {
restriction: EquipmentRestriction.none,
);
/// Tester Jester: DEX + CHA
/// Tester Jester: DEX + CHA (스탯 합계: +3)
static const testerJester = ClassTraits(
classId: 'tester_jester',
name: 'Tester Jester',
@@ -406,12 +412,13 @@ class ClassData {
// 지혜 계열 (WIS 기반)
// ==========================================================================
/// Exception Handler: WIS
/// Exception Handler: WIS + INT (스탯 합계: +3)
static const exceptionHandler = ClassTraits(
classId: 'exception_handler',
name: 'Exception Handler',
statModifiers: {
StatType.wis: 2,
StatType.intelligence: 1,
},
startingSkills: ['heal'],
classSkills: ['heal', 'try_catch', 'finally_heal'],
@@ -427,7 +434,7 @@ class ClassData {
),
);
/// Null Checker: WIS + INT
/// Null Checker: WIS + INT (스탯 합계: +3)
static const nullChecker = ClassTraits(
classId: 'null_checker',
name: 'Null Checker',