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(), + }, ), ], ),