feat(ui): 사망 화면 잃은 아이템 희귀도 색상 표시
- DeathInfo에 lostItemRarity 필드 추가 - 사망 처리 시 아이템 희귀도 저장 - 사망 오버레이에서 희귀도별 색상 적용 - Common: 회색, Uncommon: 녹색, Rare: 파랑 - Epic: 보라, Legendary: 주황
This commit is contained in:
@@ -16,6 +16,7 @@ import 'package:asciineverdie/src/core/model/combat_stats.dart';
|
|||||||
import 'package:asciineverdie/src/core/model/equipment_item.dart';
|
import 'package:asciineverdie/src/core/model/equipment_item.dart';
|
||||||
import 'package:asciineverdie/src/core/model/equipment_slot.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/core/model/item_stats.dart';
|
||||||
import 'package:asciineverdie/src/core/model/monster_combat_stats.dart';
|
import 'package:asciineverdie/src/core/model/monster_combat_stats.dart';
|
||||||
import 'package:asciineverdie/src/core/model/monster_grade.dart';
|
import 'package:asciineverdie/src/core/model/monster_grade.dart';
|
||||||
import 'package:asciineverdie/src/core/model/potion.dart';
|
import 'package:asciineverdie/src/core/model/potion.dart';
|
||||||
@@ -970,6 +971,7 @@ class ProgressService {
|
|||||||
var lostCount = 0;
|
var lostCount = 0;
|
||||||
String? lostItemName;
|
String? lostItemName;
|
||||||
EquipmentSlot? lostItemSlot;
|
EquipmentSlot? lostItemSlot;
|
||||||
|
ItemRarity? lostItemRarity;
|
||||||
|
|
||||||
if (!isBossDeath) {
|
if (!isBossDeath) {
|
||||||
// 무기(슬롯 0)를 제외한 장착된 장비 중 1개를 제물로 삭제
|
// 무기(슬롯 0)를 제외한 장착된 장비 중 1개를 제물로 삭제
|
||||||
@@ -999,6 +1001,7 @@ class ProgressService {
|
|||||||
final lostItem = state.equipment.getItemByIndex(sacrificeIndex);
|
final lostItem = state.equipment.getItemByIndex(sacrificeIndex);
|
||||||
lostItemName = lostItem.name;
|
lostItemName = lostItem.name;
|
||||||
lostItemSlot = EquipmentSlot.values[sacrificeIndex];
|
lostItemSlot = EquipmentSlot.values[sacrificeIndex];
|
||||||
|
lostItemRarity = lostItem.rarity;
|
||||||
|
|
||||||
// 해당 슬롯을 빈 장비로 교체
|
// 해당 슬롯을 빈 장비로 교체
|
||||||
newEquipment = newEquipment.setItemByIndex(
|
newEquipment = newEquipment.setItemByIndex(
|
||||||
@@ -1015,6 +1018,7 @@ class ProgressService {
|
|||||||
lostEquipmentCount: lostCount,
|
lostEquipmentCount: lostCount,
|
||||||
lostItemName: lostItemName,
|
lostItemName: lostItemName,
|
||||||
lostItemSlot: lostItemSlot,
|
lostItemSlot: lostItemSlot,
|
||||||
|
lostItemRarity: lostItemRarity,
|
||||||
goldAtDeath: state.inventory.gold,
|
goldAtDeath: state.inventory.gold,
|
||||||
levelAtDeath: state.traits.level,
|
levelAtDeath: state.traits.level,
|
||||||
timestamp: state.skillSystem.elapsedMs,
|
timestamp: state.skillSystem.elapsedMs,
|
||||||
|
|||||||
@@ -132,6 +132,7 @@ class DeathInfo {
|
|||||||
required this.timestamp,
|
required this.timestamp,
|
||||||
this.lostItemName,
|
this.lostItemName,
|
||||||
this.lostItemSlot,
|
this.lostItemSlot,
|
||||||
|
this.lostItemRarity,
|
||||||
this.lastCombatEvents = const [],
|
this.lastCombatEvents = const [],
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -150,6 +151,9 @@ class DeathInfo {
|
|||||||
/// 제물로 바친 아이템 슬롯 (null이면 없음)
|
/// 제물로 바친 아이템 슬롯 (null이면 없음)
|
||||||
final EquipmentSlot? lostItemSlot;
|
final EquipmentSlot? lostItemSlot;
|
||||||
|
|
||||||
|
/// 제물로 바친 아이템 희귀도 (null이면 없음)
|
||||||
|
final ItemRarity? lostItemRarity;
|
||||||
|
|
||||||
/// 사망 시점 골드
|
/// 사망 시점 골드
|
||||||
final int goldAtDeath;
|
final int goldAtDeath;
|
||||||
|
|
||||||
@@ -168,6 +172,7 @@ class DeathInfo {
|
|||||||
int? lostEquipmentCount,
|
int? lostEquipmentCount,
|
||||||
String? lostItemName,
|
String? lostItemName,
|
||||||
EquipmentSlot? lostItemSlot,
|
EquipmentSlot? lostItemSlot,
|
||||||
|
ItemRarity? lostItemRarity,
|
||||||
int? goldAtDeath,
|
int? goldAtDeath,
|
||||||
int? levelAtDeath,
|
int? levelAtDeath,
|
||||||
int? timestamp,
|
int? timestamp,
|
||||||
@@ -179,6 +184,7 @@ class DeathInfo {
|
|||||||
lostEquipmentCount: lostEquipmentCount ?? this.lostEquipmentCount,
|
lostEquipmentCount: lostEquipmentCount ?? this.lostEquipmentCount,
|
||||||
lostItemName: lostItemName ?? this.lostItemName,
|
lostItemName: lostItemName ?? this.lostItemName,
|
||||||
lostItemSlot: lostItemSlot ?? this.lostItemSlot,
|
lostItemSlot: lostItemSlot ?? this.lostItemSlot,
|
||||||
|
lostItemRarity: lostItemRarity ?? this.lostItemRarity,
|
||||||
goldAtDeath: goldAtDeath ?? this.goldAtDeath,
|
goldAtDeath: goldAtDeath ?? this.goldAtDeath,
|
||||||
levelAtDeath: levelAtDeath ?? this.levelAtDeath,
|
levelAtDeath: levelAtDeath ?? this.levelAtDeath,
|
||||||
timestamp: timestamp ?? this.timestamp,
|
timestamp: timestamp ?? this.timestamp,
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ 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/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/core/model/item_stats.dart';
|
||||||
import 'package:asciineverdie/src/shared/retro_colors.dart';
|
import 'package:asciineverdie/src/shared/retro_colors.dart';
|
||||||
|
|
||||||
/// 사망 오버레이 위젯 (Phase 4)
|
/// 사망 오버레이 위젯 (Phase 4)
|
||||||
@@ -294,10 +295,8 @@ 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
|
final itemRarityColor = _getRarityColor(deathInfo.lostItemRarity);
|
||||||
? '[${_getSlotName(deathInfo.lostItemSlot)}] ${deathInfo.lostItemName}'
|
|
||||||
: null;
|
|
||||||
|
|
||||||
return Column(
|
return Column(
|
||||||
children: [
|
children: [
|
||||||
@@ -326,12 +325,23 @@ class DeathOverlay extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 4),
|
const SizedBox(height: 4),
|
||||||
Text(
|
// 슬롯명 (회색) + 아이템명 (희귀도 색상)
|
||||||
lostItemDisplay!,
|
Text.rich(
|
||||||
style: TextStyle(
|
TextSpan(
|
||||||
|
children: [
|
||||||
|
TextSpan(
|
||||||
|
text: '[${_getSlotName(deathInfo.lostItemSlot)}] ',
|
||||||
|
style: TextStyle(color: muted),
|
||||||
|
),
|
||||||
|
TextSpan(
|
||||||
|
text: deathInfo.lostItemName!,
|
||||||
|
style: TextStyle(color: itemRarityColor),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
style: const TextStyle(
|
||||||
fontFamily: 'PressStart2P',
|
fontFamily: 'PressStart2P',
|
||||||
fontSize: 13,
|
fontSize: 13,
|
||||||
color: hpColor,
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
@@ -695,4 +705,16 @@ class DeathOverlay extends StatelessWidget {
|
|||||||
EquipmentSlot.sollerets => l10n.slotSollerets,
|
EquipmentSlot.sollerets => l10n.slotSollerets,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// 희귀도에 따른 색상 반환
|
||||||
|
Color _getRarityColor(ItemRarity? rarity) {
|
||||||
|
if (rarity == null) return Colors.grey;
|
||||||
|
return switch (rarity) {
|
||||||
|
ItemRarity.common => Colors.grey,
|
||||||
|
ItemRarity.uncommon => Colors.green,
|
||||||
|
ItemRarity.rare => Colors.blue,
|
||||||
|
ItemRarity.epic => Colors.purple,
|
||||||
|
ItemRarity.legendary => Colors.orange,
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user