feat(ui): HP/MP 바 개선 및 전투 시스템 UI 업데이트

- HP/MP 변화 시 플래시 효과 및 변화량 표시 추가
- 전투 중 몬스터 HP 바 표시 기능 추가
- 몬스터 HP 바 Row 오버플로우 버그 수정 (Flexible 적용)
- 전투 상태 및 이벤트 모델 개선
- 캐릭터 애니메이션 및 전투 컴포저 업데이트
This commit is contained in:
JiWoong Sul
2025-12-18 18:10:22 +09:00
parent 45147da5ec
commit cf8fdaecde
14 changed files with 1220 additions and 153 deletions

View File

@@ -0,0 +1,191 @@
/// 전투 이벤트 타입 (Combat Event Type)
enum CombatEventType {
/// 플레이어가 몬스터 공격
playerAttack,
/// 몬스터가 플레이어 공격
monsterAttack,
/// 플레이어 회피
playerEvade,
/// 몬스터 회피
monsterEvade,
/// 플레이어 방패 방어
playerBlock,
/// 플레이어 무기 쳐내기
playerParry,
/// 플레이어 스킬 사용
playerSkill,
/// 플레이어 회복
playerHeal,
/// 플레이어 버프
playerBuff,
}
/// 전투 이벤트 (Combat Event)
///
/// 개별 공격/방어/스킬 사용 등의 전투 행동을 기록
class CombatEvent {
const CombatEvent({
required this.type,
required this.timestamp,
this.damage = 0,
this.healAmount = 0,
this.isCritical = false,
this.skillName,
this.targetName,
});
/// 이벤트 타입
final CombatEventType type;
/// 발생 시간 (elapsedMs)
final int timestamp;
/// 데미지 (0이면 미스/회피)
final int damage;
/// 회복량 (회복 이벤트용)
final int healAmount;
/// 크리티컬 여부
final bool isCritical;
/// 사용한 스킬 이름 (스킬 이벤트용)
final String? skillName;
/// 대상 이름 (몬스터 또는 플레이어)
final String? targetName;
/// 플레이어 공격 이벤트 생성
factory CombatEvent.playerAttack({
required int timestamp,
required int damage,
required String targetName,
bool isCritical = false,
}) {
return CombatEvent(
type: CombatEventType.playerAttack,
timestamp: timestamp,
damage: damage,
targetName: targetName,
isCritical: isCritical,
);
}
/// 몬스터 공격 이벤트 생성
factory CombatEvent.monsterAttack({
required int timestamp,
required int damage,
required String attackerName,
}) {
return CombatEvent(
type: CombatEventType.monsterAttack,
timestamp: timestamp,
damage: damage,
targetName: attackerName,
);
}
/// 플레이어 회피 이벤트 생성
factory CombatEvent.playerEvade({
required int timestamp,
required String attackerName,
}) {
return CombatEvent(
type: CombatEventType.playerEvade,
timestamp: timestamp,
targetName: attackerName,
);
}
/// 몬스터 회피 이벤트 생성
factory CombatEvent.monsterEvade({
required int timestamp,
required String targetName,
}) {
return CombatEvent(
type: CombatEventType.monsterEvade,
timestamp: timestamp,
targetName: targetName,
);
}
/// 플레이어 방패 방어 이벤트 생성
factory CombatEvent.playerBlock({
required int timestamp,
required int reducedDamage,
required String attackerName,
}) {
return CombatEvent(
type: CombatEventType.playerBlock,
timestamp: timestamp,
damage: reducedDamage,
targetName: attackerName,
);
}
/// 플레이어 무기 쳐내기 이벤트 생성
factory CombatEvent.playerParry({
required int timestamp,
required int reducedDamage,
required String attackerName,
}) {
return CombatEvent(
type: CombatEventType.playerParry,
timestamp: timestamp,
damage: reducedDamage,
targetName: attackerName,
);
}
/// 스킬 사용 이벤트 생성
factory CombatEvent.playerSkill({
required int timestamp,
required String skillName,
required int damage,
required String targetName,
bool isCritical = false,
}) {
return CombatEvent(
type: CombatEventType.playerSkill,
timestamp: timestamp,
skillName: skillName,
damage: damage,
targetName: targetName,
isCritical: isCritical,
);
}
/// 회복 이벤트 생성
factory CombatEvent.playerHeal({
required int timestamp,
required int healAmount,
String? skillName,
}) {
return CombatEvent(
type: CombatEventType.playerHeal,
timestamp: timestamp,
healAmount: healAmount,
skillName: skillName,
);
}
/// 버프 이벤트 생성
factory CombatEvent.playerBuff({
required int timestamp,
required String skillName,
}) {
return CombatEvent(
type: CombatEventType.playerBuff,
timestamp: timestamp,
skillName: skillName,
);
}
}