fix(animation): 종족별 캐릭터 프레임 폭 통일 (6자)

This commit is contained in:
JiWoong Sul
2025-12-26 01:31:42 +09:00
parent 431dd995bf
commit ccdef6a409
2 changed files with 65 additions and 63 deletions

View File

@@ -73,12 +73,12 @@ const _raceFrames = <String, RaceFrameData>{
CharacterFrame([r' o ', r' \| ', r' / \ ']),
CharacterFrame([r' o ', r' \|- ', r' / \ ']),
CharacterFrame([r' o ', r' \|-- ', r' / \ ']),
CharacterFrame([r' o ', r'\|-=>', r' / \ ']),
CharacterFrame([r' o ', r'\|-=> ', r' / \ ']),
CharacterFrame([r' o ', r' /|\ ', r' / \ ']),
],
hit: [
CharacterFrame([r' o ', r'/|\* ', r' / \ ']),
CharacterFrame([r' o ', r'/|\ *', r' / \ ']),
CharacterFrame([r' o ', r'/|\ * ', r' / \ ']),
CharacterFrame([r' o ', r' /|\ ', r' / \ ']),
],
recover: [
@@ -105,12 +105,12 @@ const _raceFrames = <String, RaceFrameData>{
CharacterFrame([r' o ', r' \█ ', r' / \ ']),
CharacterFrame([r' o ', r' \█- ', r' / \ ']),
CharacterFrame([r' o ', r' \█-- ', r' / \ ']),
CharacterFrame([r' o ', r'\█-=>', r' / \ ']),
CharacterFrame([r' o ', r'\█-=> ', r' / \ ']),
CharacterFrame([r' o ', r' /█\ ', r' / \ ']),
],
hit: [
CharacterFrame([r' o ', r'/█\* ', r' / \ ']),
CharacterFrame([r' o ', r'/█\ *', r' / \ ']),
CharacterFrame([r' o ', r'/█\ * ', r' / \ ']),
CharacterFrame([r' o ', r' /█\ ', r' / \ ']),
],
recover: [
@@ -140,12 +140,12 @@ const _raceFrames = <String, RaceFrameData>{
CharacterFrame([r' O ', r' \█ ', r' ┘ └ ']),
CharacterFrame([r' O ', r' \█- ', r' ┘ └ ']),
CharacterFrame([r' O ', r' \█-- ', r' ┘ └ ']),
CharacterFrame([r' O ', r'\█-=>', r' ┘ └ ']),
CharacterFrame([r' O ', r'\█-=> ', r' ┘ └ ']),
CharacterFrame([r' O ', r' /█\ ', r' ┘ └ ']),
],
hit: [
CharacterFrame([r' O ', r'/█\* ', r' ┘ └ ']),
CharacterFrame([r' O ', r'/█\ *', r' ┘ └ ']),
CharacterFrame([r' O ', r'/█\ * ', r' ┘ └ ']),
CharacterFrame([r' O ', r' /█\ ', r' ┘ └ ']),
],
recover: [
@@ -172,12 +172,12 @@ const _raceFrames = <String, RaceFrameData>{
CharacterFrame([r' Ö ', r' \▓ ', r' ┘ └ ']),
CharacterFrame([r' Ö ', r' \▓- ', r' ┘ └ ']),
CharacterFrame([r' Ö ', r' \▓-- ', r' ┘ └ ']),
CharacterFrame([r' Ö ', r'\▓-=>', r' ┘ └ ']),
CharacterFrame([r' Ö ', r'\▓-=> ', r' ┘ └ ']),
CharacterFrame([r' Ö ', r' /▓\ ', r' ┘ └ ']),
],
hit: [
CharacterFrame([r' Ö ', r'/▓\* ', r' ┘ └ ']),
CharacterFrame([r' Ö ', r'/▓\ *', r' ┘ └ ']),
CharacterFrame([r' Ö ', r'/▓\ * ', r' ┘ └ ']),
CharacterFrame([r' Ö ', r' /▓\ ', r' ┘ └ ']),
],
recover: [
@@ -207,12 +207,12 @@ const _raceFrames = <String, RaceFrameData>{
CharacterFrame([r' o ', r' \| ', r' / \ ']),
CharacterFrame([r' o ', r' \|- ', r' / \ ']),
CharacterFrame([r' o ', r' \|-- ', r' / \ ']),
CharacterFrame([r' o ', r'\|-+>', r' / \ ']),
CharacterFrame([r' o ', r'\|-+> ', r' / \ ']),
CharacterFrame([r' o ', r' /|+ ', r' / \ ']),
],
hit: [
CharacterFrame([r' o ', r'/|+* ', r' / \ ']),
CharacterFrame([r' o ', r'/|+ *', r' / \ ']),
CharacterFrame([r' o ', r'/|+ * ', r' / \ ']),
CharacterFrame([r' o ', r' /|+ ', r' / \ ']),
],
recover: [
@@ -239,12 +239,12 @@ const _raceFrames = <String, RaceFrameData>{
CharacterFrame([r' ♦ ', r' \| ', r' / \ ']),
CharacterFrame([r' ♦ ', r' \|- ', r' / \ ']),
CharacterFrame([r' ♦ ', r' \|-- ', r' / \ ']),
CharacterFrame([r' ♦ ', r'\|-->', r' / \ ']),
CharacterFrame([r' ♦ ', r'\|--> ', r' / \ ']),
CharacterFrame([r' ♦ ', r' /|] ', r' / \ ']),
],
hit: [
CharacterFrame([r' ♦ ', r'/|]* ', r' / \ ']),
CharacterFrame([r' ♦ ', r'/|] *', r' / \ ']),
CharacterFrame([r' ♦ ', r'/|] * ', r' / \ ']),
CharacterFrame([r' ♦ ', r' /|] ', r' / \ ']),
],
recover: [
@@ -271,12 +271,12 @@ const _raceFrames = <String, RaceFrameData>{
CharacterFrame([r' ö ', r' \▒ ', r' / \ ']),
CharacterFrame([r' ö ', r' \▒- ', r' / \ ']),
CharacterFrame([r' ö ', r' \▒-- ', r' / \ ']),
CharacterFrame([r' ö ', r'\▒-=>', r' / \ ']),
CharacterFrame([r' ö ', r'\▒-=> ', r' / \ ']),
CharacterFrame([r' ö ', r' /▒\ ', r' / \ ']),
],
hit: [
CharacterFrame([r' ö ', r'/▒\* ', r' / \ ']),
CharacterFrame([r' ö ', r'/▒\ *', r' / \ ']),
CharacterFrame([r' ö ', r'/▒\ * ', r' / \ ']),
CharacterFrame([r' ö ', r' /▒\ ', r' / \ ']),
],
recover: [
@@ -306,12 +306,12 @@ const _raceFrames = <String, RaceFrameData>{
CharacterFrame([r' o~ ', r' \| ', r' / \ ']),
CharacterFrame([r' o~ ', r' \|~ ', r' / \ ']),
CharacterFrame([r' o~ ', r' \|~~ ', r' / \ ']),
CharacterFrame([r' o~ ', r'\|~~*', r' / \ ']),
CharacterFrame([r' o~ ', r'\|~~* ', r' / \ ']),
CharacterFrame([r' o~ ', r' /|) ', r' / \ ']),
],
hit: [
CharacterFrame([r' o~ ', r'/|)* ', r' / \ ']),
CharacterFrame([r' o~ ', r'/|) *', r' / \ ']),
CharacterFrame([r' o~ ', r'/|) * ', r' / \ ']),
CharacterFrame([r' o~ ', r' /|) ', r' / \ ']),
],
recover: [
@@ -338,12 +338,12 @@ const _raceFrames = <String, RaceFrameData>{
CharacterFrame([r' o♣ ', r' \| ', r' / \ ']),
CharacterFrame([r' o♣ ', r' \|~ ', r' / \ ']),
CharacterFrame([r' o♣ ', r' \|~~ ', r' / \ ']),
CharacterFrame([r' o♣ ', r'\|~~♣', r' / \ ']),
CharacterFrame([r' o♣ ', r'\|~~♣ ', r' / \ ']),
CharacterFrame([r' o♣ ', r' /|) ', r' / \ ']),
],
hit: [
CharacterFrame([r' o♣ ', r'/|)* ', r' / \ ']),
CharacterFrame([r' o♣ ', r'/|) *', r' / \ ']),
CharacterFrame([r' o♣ ', r'/|) * ', r' / \ ']),
CharacterFrame([r' o♣ ', r' /|) ', r' / \ ']),
],
recover: [
@@ -370,12 +370,12 @@ const _raceFrames = <String, RaceFrameData>{
CharacterFrame([r' o∞ ', r' \| ', r' / \ ']),
CharacterFrame([r' o∞ ', r' \|~ ', r' / \ ']),
CharacterFrame([r' o∞ ', r' \|~~ ', r' / \ ']),
CharacterFrame([r' o∞ ', r'\|~~∞', r' / \ ']),
CharacterFrame([r' o∞ ', r'\|~~∞ ', r' / \ ']),
CharacterFrame([r' o∞ ', r' /|) ', r' / \ ']),
],
hit: [
CharacterFrame([r' o∞ ', r'/|)* ', r' / \ ']),
CharacterFrame([r' o∞ ', r'/|) *', r' / \ ']),
CharacterFrame([r' o∞ ', r'/|) * ', r' / \ ']),
CharacterFrame([r' o∞ ', r' /|) ', r' / \ ']),
],
recover: [
@@ -405,12 +405,12 @@ const _raceFrames = <String, RaceFrameData>{
CharacterFrame([r' ☠ ', r' \| ', r' / \ ']),
CharacterFrame([r' ☠ ', r' \|- ', r' / \ ']),
CharacterFrame([r' ☠ ', r' \|-- ', r' / \ ']),
CharacterFrame([r' ☠ ', r'\|-~>', r' / \ ']),
CharacterFrame([r' ☠ ', r'\|-~> ', r' / \ ']),
CharacterFrame([r' ☠ ', r' /|\ ', r' / \ ']),
],
hit: [
CharacterFrame([r' ☠ ', r'/|\~ ', r' / \ ']),
CharacterFrame([r' ☠ ', r'/|\ ~', r' / \ ']),
CharacterFrame([r' ☠ ', r'/|\ ~ ', r' / \ ']),
CharacterFrame([r' ☠ ', r' /|\ ', r' / \ ']),
],
recover: [
@@ -437,12 +437,12 @@ const _raceFrames = <String, RaceFrameData>{
CharacterFrame([r' ö ', r' \| ', r' / \ ']),
CharacterFrame([r' ö ', r' \|~ ', r' / \ ']),
CharacterFrame([r' ö ', r' \|~~ ', r' / \ ']),
CharacterFrame([r' ö ', r'\|~~*', r' / \ ']),
CharacterFrame([r' ö ', r'\|~~* ', r' / \ ']),
CharacterFrame([r' ö ', r' /|\ ', r' / \ ']),
],
hit: [
CharacterFrame([r' ö ', r'/|\* ', r' / \ ']),
CharacterFrame([r' ö ', r'/|\ *', r' / \ ']),
CharacterFrame([r' ö ', r'/|\ * ', r' / \ ']),
CharacterFrame([r' ö ', r' /|\ ', r' / \ ']),
],
recover: [
@@ -469,12 +469,12 @@ const _raceFrames = <String, RaceFrameData>{
CharacterFrame([r' ô ', r' \| ', r' / \ ']),
CharacterFrame([r' ô ', r' \|+ ', r' / \ ']),
CharacterFrame([r' ô ', r' \|++ ', r' / \ ']),
CharacterFrame([r' ô ', r'\|++*', r' / \ ']),
CharacterFrame([r' ô ', r'\|++* ', r' / \ ']),
CharacterFrame([r' ô ', r' /|\ ', r' / \ ']),
],
hit: [
CharacterFrame([r' ô ', r'/|\+ ', r' / \ ']),
CharacterFrame([r' ô ', r'/|\ +', r' / \ ']),
CharacterFrame([r' ô ', r'/|\ + ', r' / \ ']),
CharacterFrame([r' ô ', r' /|\ ', r' / \ ']),
],
recover: [
@@ -504,12 +504,12 @@ const _raceFrames = <String, RaceFrameData>{
CharacterFrame([r' o ', r' \| ', r' Y ']),
CharacterFrame([r' o ', r' \|- ', r' Y ']),
CharacterFrame([r' o ', r' \|-- ', r' Y ']),
CharacterFrame([r' o ', r'\|-=>', r' Y ']),
CharacterFrame([r' o ', r'\|-=> ', r' Y ']),
CharacterFrame([r' o ', r' /|\ ', r' Y ']),
],
hit: [
CharacterFrame([r' o ', r'/|\* ', r' Y ']),
CharacterFrame([r' o ', r'/|\ *', r' Y ']),
CharacterFrame([r' o ', r'/|\ * ', r' Y ']),
CharacterFrame([r' o ', r' /|\ ', r' Y ']),
],
recover: [
@@ -536,12 +536,12 @@ const _raceFrames = <String, RaceFrameData>{
CharacterFrame([r' ◦ ', r' \| ', r' Y ']),
CharacterFrame([r' ◦ ', r' \|- ', r' Y ']),
CharacterFrame([r' ◦ ', r' \|-- ', r' Y ']),
CharacterFrame([r' ◦ ', r'\|-=>', r' Y ']),
CharacterFrame([r' ◦ ', r'\|-=> ', r' Y ']),
CharacterFrame([r' ◦ ', r' /|\ ', r' Y ']),
],
hit: [
CharacterFrame([r' ◦ ', r'/|\* ', r' Y ']),
CharacterFrame([r' ◦ ', r'/|\ *', r' Y ']),
CharacterFrame([r' ◦ ', r'/|\ * ', r' Y ']),
CharacterFrame([r' ◦ ', r' /|\ ', r' Y ']),
],
recover: [
@@ -568,12 +568,12 @@ const _raceFrames = <String, RaceFrameData>{
CharacterFrame([r' ^ ', r' \| ', r' Y ']),
CharacterFrame([r' ^ ', r' \|- ', r' Y ']),
CharacterFrame([r' ^ ', r' \|-- ', r' Y ']),
CharacterFrame([r' ^ ', r'\|-->', r' Y ']),
CharacterFrame([r' ^ ', r'\|--> ', r' Y ']),
CharacterFrame([r' ^ ', r' /|\ ', r' Y ']),
],
hit: [
CharacterFrame([r' ^ ', r'/|\* ', r' Y ']),
CharacterFrame([r' ^ ', r'/|\ *', r' Y ']),
CharacterFrame([r' ^ ', r'/|\ * ', r' Y ']),
CharacterFrame([r' ^ ', r' /|\ ', r' Y ']),
],
recover: [
@@ -670,12 +670,12 @@ const _raceFrames = <String, RaceFrameData>{
CharacterFrame([r' o ', r' \| ', r' λ \ ']),
CharacterFrame([r' o ', r' \|) ', r' λ \ ']),
CharacterFrame([r' o ', r' \|)) ', r' λ \ ']),
CharacterFrame([r' o ', r'\|))>', r' λ \ ']),
CharacterFrame([r' o ', r'\|))> ', r' λ \ ']),
CharacterFrame([r' o ', r' /|\ ', r' λ \ ']),
],
hit: [
CharacterFrame([r' o ', r'/|\* ', r' λ \ ']),
CharacterFrame([r' o ', r'/|\ *', r' λ \ ']),
CharacterFrame([r' o ', r'/|\ * ', r' λ \ ']),
CharacterFrame([r' o ', r' /|\ ', r' λ \ ']),
],
recover: [
@@ -702,12 +702,12 @@ const _raceFrames = <String, RaceFrameData>{
CharacterFrame([r' o ', r' \| ', r' λ \ ']),
CharacterFrame([r' o ', r' \|- ', r' λ \ ']),
CharacterFrame([r' o ', r' \|-- ', r' λ \ ']),
CharacterFrame([r' o ', r'\|--x', r' λ \ ']),
CharacterFrame([r' o ', r'\|--x ', r' λ \ ']),
CharacterFrame([r' o ', r' /|\ ', r' λ \ ']),
],
hit: [
CharacterFrame([r' o ', r'/|\x ', r' λ \ ']),
CharacterFrame([r' o ', r'/|\ x', r' λ \ ']),
CharacterFrame([r' o ', r'/|\ x ', r' λ \ ']),
CharacterFrame([r' o ', r' /|\ ', r' λ \ ']),
],
recover: [
@@ -737,12 +737,12 @@ const _raceFrames = <String, RaceFrameData>{
CharacterFrame([r' ô ', r' \| ', r' ∧ ']),
CharacterFrame([r' ô ', r' \|* ', r' ∧ ']),
CharacterFrame([r' ô ', r' \|** ', r' ∧ ']),
CharacterFrame([r' ô ', r'\|**>', r' ∧ ']),
CharacterFrame([r' ô ', r'\|**> ', r' ∧ ']),
CharacterFrame([r' ô ', r' /|\ ', r' ∧ ']),
],
hit: [
CharacterFrame([r' ô ', r'/|\* ', r' ∧ ']),
CharacterFrame([r' ô ', r'/|\ *', r' ∧ ']),
CharacterFrame([r' ô ', r'/|\ * ', r' ∧ ']),
CharacterFrame([r' ô ', r' /|\ ', r' ∧ ']),
],
recover: [

View File

@@ -518,14 +518,16 @@ class _GamePlayScreenState extends State<GamePlayScreen>
/// 부활 처리 핸들러
Future<void> _handleResurrect() async {
// 1. 부활 처리 (HP/MP 회복, 장비 구매 - 게임 재개 없음)
await widget.controller.resurrect();
// 2. 부활 애니메이션 재생
// 1. 부활 애니메이션 먼저 설정 (DeathOverlay 사라지기 전에)
setState(() {
_specialAnimation = AsciiAnimationType.resurrection;
});
// 2. 부활 처리 (HP/MP 회복, 장비 구매 - 게임 재개 없음)
// 이 시점에서 isDead가 false가 되고 DeathOverlay가 사라지지만,
// _specialAnimation이 이미 설정되어 있어 부활 애니메이션이 표시됨
await widget.controller.resurrect();
// 3. 애니메이션 종료 후 게임 재개
final duration = getSpecialAnimationDuration(
AsciiAnimationType.resurrection,