fix(ui): 사망 화면 장비 슬롯명 표시 및 기타 수정

- 사망 시 잃은 아이템에 슬롯명 표시 추가
- progress_service 마이너 수정
- 관련 테스트 업데이트
This commit is contained in:
JiWoong Sul
2026-01-15 23:23:38 +09:00
parent 9599a33a8f
commit 7e1936b34f
5 changed files with 39 additions and 4 deletions

View File

@@ -187,6 +187,7 @@ class ActProgressionService {
level: bossLevel, level: bossLevel,
atk: (bossStats.atk * 1.5).round(), // Boss 보정 (1.5배) atk: (bossStats.atk * 1.5).round(), // Boss 보정 (1.5배)
def: (bossStats.def * 1.5).round(), def: (bossStats.def * 1.5).round(),
magDef: (bossStats.def * 1.8).round(), // 보스 마법 방어 (물리 대비 1.2배)
hpMax: (bossStats.hp * 2.0).round(), // HP는 2.0배 (보스다운 전투 시간) hpMax: (bossStats.hp * 2.0).round(), // HP는 2.0배 (보스다운 전투 시간)
hpCurrent: (bossStats.hp * 2.0).round(), hpCurrent: (bossStats.hp * 2.0).round(),
criRate: 0.05, criRate: 0.05,

View File

@@ -970,6 +970,8 @@ class ProgressService {
// 보스전 사망이 아닐 경우에만 장비 손실 // 보스전 사망이 아닐 경우에만 장비 손실
var newEquipment = state.equipment; var newEquipment = state.equipment;
var lostCount = 0; var lostCount = 0;
String? lostItemName;
EquipmentSlot? lostItemSlot;
if (!isBossDeath) { if (!isBossDeath) {
// 무기(슬롯 0)를 제외한 장착된 장비 중 1개를 제물로 삭제 // 무기(슬롯 0)를 제외한 장착된 장비 중 1개를 제물로 삭제
@@ -987,12 +989,16 @@ class ProgressService {
equippedNonWeaponSlots[state.rng.nextInt( equippedNonWeaponSlots[state.rng.nextInt(
equippedNonWeaponSlots.length, equippedNonWeaponSlots.length,
)]; )];
final slot = EquipmentSlot.values[sacrificeIndex];
// 제물로 바칠 아이템 정보 저장
final lostItem = state.equipment.getItemByIndex(sacrificeIndex);
lostItemName = lostItem.name;
lostItemSlot = EquipmentSlot.values[sacrificeIndex];
// 해당 슬롯을 빈 장비로 교체 // 해당 슬롯을 빈 장비로 교체
newEquipment = newEquipment.setItemByIndex( newEquipment = newEquipment.setItemByIndex(
sacrificeIndex, sacrificeIndex,
EquipmentItem.empty(slot), EquipmentItem.empty(lostItemSlot),
); );
} }
} }
@@ -1002,6 +1008,8 @@ class ProgressService {
cause: cause, cause: cause,
killerName: killerName, killerName: killerName,
lostEquipmentCount: lostCount, lostEquipmentCount: lostCount,
lostItemName: lostItemName,
lostItemSlot: lostItemSlot,
goldAtDeath: state.inventory.gold, goldAtDeath: state.inventory.gold,
levelAtDeath: state.traits.level, levelAtDeath: state.traits.level,
timestamp: state.skillSystem.elapsedMs, timestamp: state.skillSystem.elapsedMs,

View File

@@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
import 'package:asciineverdie/data/game_text_l10n.dart' as l10n; import 'package:asciineverdie/data/game_text_l10n.dart' as l10n;
import 'package:asciineverdie/src/core/l10n/game_data_l10n.dart'; import 'package:asciineverdie/src/core/l10n/game_data_l10n.dart';
import 'package:asciineverdie/src/core/model/combat_event.dart'; import 'package:asciineverdie/src/core/model/combat_event.dart';
import 'package:asciineverdie/src/core/model/equipment_slot.dart';
import 'package:asciineverdie/src/core/model/game_state.dart'; import 'package:asciineverdie/src/core/model/game_state.dart';
import 'package:asciineverdie/src/shared/retro_colors.dart'; import 'package:asciineverdie/src/shared/retro_colors.dart';
@@ -293,6 +294,11 @@ class DeathOverlay extends StatelessWidget {
final expColor = RetroColors.expOf(context); final expColor = RetroColors.expOf(context);
final gold = RetroColors.goldOf(context); final gold = RetroColors.goldOf(context);
// 슬롯명 + 아이템명 조합
final lostItemDisplay = hasLostItem
? '[${_getSlotName(deathInfo.lostItemSlot)}] ${deathInfo.lostItemName}'
: null;
return Column( return Column(
children: [ children: [
// 제물로 바친 아이템 표시 // 제물로 바친 아이템 표시
@@ -321,10 +327,10 @@ class DeathOverlay extends StatelessWidget {
), ),
const SizedBox(height: 4), const SizedBox(height: 4),
Text( Text(
deathInfo.lostItemName!, lostItemDisplay!,
style: TextStyle( style: TextStyle(
fontFamily: 'PressStart2P', fontFamily: 'PressStart2P',
fontSize: 14, fontSize: 13,
color: hpColor, color: hpColor,
), ),
), ),
@@ -671,4 +677,22 @@ class DeathOverlay extends StatelessWidget {
), ),
}; };
} }
/// 장비 슬롯 이름 반환
String _getSlotName(EquipmentSlot? slot) {
if (slot == null) return '';
return switch (slot) {
EquipmentSlot.weapon => l10n.slotWeapon,
EquipmentSlot.shield => l10n.slotShield,
EquipmentSlot.helm => l10n.slotHelm,
EquipmentSlot.hauberk => l10n.slotHauberk,
EquipmentSlot.brassairts => l10n.slotBrassairts,
EquipmentSlot.vambraces => l10n.slotVambraces,
EquipmentSlot.gauntlets => l10n.slotGauntlets,
EquipmentSlot.gambeson => l10n.slotGambeson,
EquipmentSlot.cuisses => l10n.slotCuisses,
EquipmentSlot.greaves => l10n.slotGreaves,
EquipmentSlot.sollerets => l10n.slotSollerets,
};
}
} }

View File

@@ -23,6 +23,7 @@ void main() {
level: 1, level: 1,
atk: 10, atk: 10,
def: 5, def: 5,
magDef: 5,
hpMax: 50, hpMax: 50,
hpCurrent: 0, // 몬스터 사망 hpCurrent: 0, // 몬스터 사망
criRate: 0.05, criRate: 0.05,

View File

@@ -74,6 +74,7 @@ void main() {
level: 10, level: 10,
atk: 10, atk: 10,
def: 5, def: 5,
magDef: 5,
hpMax: 100, hpMax: 100,
hpCurrent: 0, // 몬스터 사망 상태 hpCurrent: 0, // 몬스터 사망 상태
criRate: 0.05, criRate: 0.05,