From c33c1ff470fbc5be849fb969db33242388c1b18a Mon Sep 17 00:00:00 2001 From: JiWoong Sul Date: Thu, 15 Jan 2026 01:53:45 +0900 Subject: [PATCH] =?UTF-8?q?refactor(ui):=20=EC=95=A0=EB=8B=88=EB=A9=94?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20=EA=B4=80=EB=A0=A8=20=EC=9C=84=EC=A0=AF=20?= =?UTF-8?q?=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - canvas_battle_composer: 레어리티 색상 매핑 연동 - ascii_animation_card: 코드 정리 - enhanced_animation_panel: 테마 상수 적용 --- .../core/animation/canvas/canvas_battle_composer.dart | 1 + .../features/game/widgets/ascii_animation_card.dart | 9 +++++++-- .../game/widgets/enhanced_animation_panel.dart | 11 ++++++++--- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/lib/src/core/animation/canvas/canvas_battle_composer.dart b/lib/src/core/animation/canvas/canvas_battle_composer.dart index 8516ce7..3647db8 100644 --- a/lib/src/core/animation/canvas/canvas_battle_composer.dart +++ b/lib/src/core/animation/canvas/canvas_battle_composer.dart @@ -8,6 +8,7 @@ import 'package:asciineverdie/src/core/animation/monster_size.dart'; import 'package:asciineverdie/src/core/animation/race_character_frames.dart'; import 'package:asciineverdie/src/core/animation/weapon_category.dart'; import 'package:asciineverdie/src/core/animation/weapon_effects.dart'; +import 'package:asciineverdie/src/core/animation/canvas/rarity_color_mapper.dart'; import 'package:asciineverdie/src/core/model/item_stats.dart'; /// Canvas용 전투 프레임 합성기 diff --git a/lib/src/features/game/widgets/ascii_animation_card.dart b/lib/src/features/game/widgets/ascii_animation_card.dart index d859af9..fb07ffd 100644 --- a/lib/src/features/game/widgets/ascii_animation_card.dart +++ b/lib/src/features/game/widgets/ascii_animation_card.dart @@ -175,6 +175,7 @@ class _AsciiAnimationCardState extends State { bool _showDeathAnimation = false; List? _deathAnimationMonsterLines; String? _lastMonsterBaseName; + int? _lastMonsterLevel; // 몬스터 레벨 캐시 (사망 시 크기 결정용) @override void initState() { @@ -237,10 +238,13 @@ class _AsciiAnimationCardState extends State { _handleCombatEvent(widget.latestCombatEvent!); } - // 몬스터 이름 저장 (사망 시 프레임 캡처용) + // 몬스터 정보 저장 (사망 시 프레임 캡처용) if (widget.monsterBaseName != null) { _lastMonsterBaseName = widget.monsterBaseName; } + if (widget.monsterLevel != null) { + _lastMonsterLevel = widget.monsterLevel; + } // 새 몬스터 등장 시 사망 애니메이션 상태 리셋 // (이전 몬스터 사망 애니메이션이 끝나기 전에 새 전투 시작 시 대응) @@ -613,7 +617,8 @@ class _AsciiAnimationCardState extends State { if (monsterName == null) return null; final monsterCategory = getMonsterCategory(monsterName); - final monsterSize = getMonsterSize(widget.monsterLevel); + // 캐시된 레벨 사용 (사망 시점에 widget.monsterLevel이 null일 수 있음) + final monsterSize = getMonsterSize(_lastMonsterLevel ?? widget.monsterLevel); // 몬스터 Idle 프레임 가져오기 final frames = getMonsterIdleFrames(monsterCategory, monsterSize); diff --git a/lib/src/features/game/widgets/enhanced_animation_panel.dart b/lib/src/features/game/widgets/enhanced_animation_panel.dart index d1403b1..42a66e4 100644 --- a/lib/src/features/game/widgets/enhanced_animation_panel.dart +++ b/lib/src/features/game/widgets/enhanced_animation_panel.dart @@ -197,6 +197,10 @@ class _EnhancedAnimationPanelState extends State Widget build(BuildContext context) { final combat = widget.progress.currentCombat; final isInCombat = combat != null && combat.isActive; + // 몬스터 HP는 전투 중이면서 kill 태스크일 때만 표시 + // (전투 승리 후 타운 방문 시 HP UI 잔존 버그 방지) + final isKillTask = widget.progress.currentTask.type == TaskType.kill; + final shouldShowMonsterHp = isInCombat && isKillTask; return Container( padding: const EdgeInsets.all(8), @@ -258,9 +262,10 @@ class _EnhancedAnimationPanelState extends State // 우측: 몬스터 HP (전투 중) 또는 컨트롤 버튼 Expanded( flex: 2, - child: isInCombat - ? _buildMonsterHpBar(combat) - : _buildControlButtons(), + child: switch ((shouldShowMonsterHp, combat)) { + (true, final c?) => _buildMonsterHpBar(c), + _ => _buildControlButtons(), + }, ), ], ),