From 8047abece4539f6dc6ee043b9b482b0698e2e9df Mon Sep 17 00:00:00 2001 From: JiWoong Sul Date: Mon, 15 Dec 2025 18:32:40 +0900 Subject: [PATCH] =?UTF-8?q?fix(animation):=20=EB=A0=88=EA=B1=B0=EC=8B=9C?= =?UTF-8?q?=20=EC=95=A0=EB=8B=88=EB=A9=94=EC=9D=B4=EC=85=98=20=EC=BA=90?= =?UTF-8?q?=EB=A6=AD=ED=84=B0=20=EC=84=B8=EB=A1=9C=20=EC=9C=84=EC=B9=98=20?= =?UTF-8?q?=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 모든 애니메이션 캐릭터 위치를 전투 기준에 맞춤 (머리=4, 몸통=5, 다리=6) - townAnimation: 건물 1줄 확장하여 베이스와 다리 같은 줄에 배치 - levelUpAnimation: 캐릭터 1줄 아래로 이동 - questCompleteAnimation: 캐릭터 2줄 아래로 이동 - actCompleteAnimation: 캐릭터 2줄 아래로 이동 --- .../core/animation/ascii_animation_data.dart | 162 +++++++++--------- 1 file changed, 83 insertions(+), 79 deletions(-) diff --git a/lib/src/core/animation/ascii_animation_data.dart b/lib/src/core/animation/ascii_animation_data.dart index b4e61bb..f6af8b3 100644 --- a/lib/src/core/animation/ascii_animation_data.dart +++ b/lib/src/core/animation/ascii_animation_data.dart @@ -208,52 +208,53 @@ const battleAnimationBeast = AsciiAnimationData( ); /// 마을/상점 애니메이션 (8줄 x 40자 고정) +/// 캐릭터 위치: 머리=4, 몸통=5, 다리=6 (전투 애니메이션 기준) const townAnimation = AsciiAnimationData( frames: [ // 프레임 1: 상점 앞 대기 - ' \n' - ' ___________ \n' - ' / SHOP \\ o \n' - ' | [======] | /|\\ \n' - ' | @@@@ | / \\ \n' - ' | ITEMS | \n' - ' |___________| \n' + ' ___________ \n' + ' / SHOP \\ \n' + ' | [======] | \n' + ' | @@@@ | \n' + ' | ITEMS | o \n' + ' | | /|\\ \n' + ' |___________| / \\ \n' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~', // 프레임 2: 이동 중 - ' \n' - ' ___________ \n' - ' / SHOP \\ o \n' - ' | [======] | /|\\ \n' - ' | @@@@ | / \\ \n' - ' | ITEMS | \n' - ' |___________| \n' + ' ___________ \n' + ' / SHOP \\ \n' + ' | [======] | \n' + ' | @@@@ | \n' + ' | ITEMS | o \n' + ' | | /|\\ \n' + ' |___________| / \\ \n' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~', // 프레임 3: 거래 시작 - ' \n' - ' ___________ \n' - ' / SHOP \\ o \$ \n' - ' | [======] | /|\\ \$ \n' - ' | @@@@ | / \\ \$ \n' - ' | ITEMS | \n' - ' |___________| \n' + ' ___________ \n' + ' / SHOP \\ \n' + ' | [======] | \$ \n' + ' | @@@@ | \$ \n' + ' | ITEMS | o \$ \n' + ' | | /|\\ \n' + ' |___________| / \\ \n' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~', // 프레임 4: 거래 중 - ' \n' - ' ___________ \n' - ' / SHOP \\ o \$\$\$ \n' - ' | [<====>] | /|\\ \$\$\$ \n' - ' | @@@@ | / \\ \n' - ' | SOLD! | \n' - ' |___________| \n' + ' ___________ \n' + ' / SHOP \\ \n' + ' | [<====>] | \$\$\$ \n' + ' | @@@@ | \$\$\$ \n' + ' | SOLD! | o \n' + ' | | /|\\ \n' + ' |___________| / \\ \n' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~', // 프레임 5: 거래 완료 - ' \n' - ' ___________ \n' - ' / SHOP \\ \\o/ + \n' - ' | [======] | /|\\ + \n' - ' | @@@@ | / \\ \n' - ' | ITEMS | \n' - ' |___________| \n' + ' ___________ \n' + ' / SHOP \\ \n' + ' | [======] | + \n' + ' | @@@@ | + \n' + ' | ITEMS | \\o/ \n' + ' | | /|\\ \n' + ' |___________| / \\ \n' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~', ], frameIntervalMs: 280, @@ -517,156 +518,159 @@ AsciiAnimationData getBattleAnimation(MonsterCategory category) { } /// 레벨업 축하 애니메이션 (8줄 x 40자 고정) +/// 캐릭터 위치: 머리=4, 몸통=5, 다리=6 (전투 애니메이션 기준) const levelUpAnimation = AsciiAnimationData( frames: [ // 프레임 1: 시작 ' * * * \n' ' * * * \n' + ' * * \n' ' \n' - ' \\O/ \n' - ' * /|\\ * \n' - ' / \\ \n' - ' * * \n' + ' * \\O/ * \n' + ' /|\\ \n' + ' * / \\ * \n' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~', // 프레임 2: 별 확산 ' * * * \n' ' * * \n' + ' * * \n' ' \n' ' * \\O/ * \n' ' /|\\ \n' ' * / \\ * \n' - ' * * \n' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~', // 프레임 3: 레벨업 텍스트 ' * L E V E L U P ! * \n' ' * * \n' + ' * * \n' ' \n' ' * \\O/ * \n' ' /|\\ \n' ' * / \\ * \n' - ' * * \n' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~', // 프레임 4: 빛나는 캐릭터 ' * * * * * \n' ' * * \n' + ' * * * * \n' ' \n' ' * \\O/ * \n' ' * /|\\ * \n' ' * / \\ * \n' - ' * * * * \n' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~', // 프레임 5: 마무리 ' + \n' ' +++ \n' ' +++++ \n' + ' \n' ' \\O/ \n' ' /|\\ \n' ' / \\ \n' - ' \n' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~', ], frameIntervalMs: 300, ); /// 퀘스트 완료 애니메이션 (8줄 x 40자 고정) +/// 캐릭터 위치: 머리=4, 몸통=5, 다리=6 (전투 애니메이션 기준) const questCompleteAnimation = AsciiAnimationData( frames: [ // 프레임 1: 퀘스트 깃발 ' [=======] \n' ' || || \n' - ' || \\O/ || \n' - ' || /|\\ || \n' - ' || / \\ || \n' + ' || || \n' ' ||_____|| \n' - ' \n' + ' \\O/ \n' + ' /|\\ \n' + ' / \\ \n' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~', // 프레임 2: 승리 ' [QUEST!] \n' ' || || \n' - ' \\\\O// \n' - ' /|\\ \n' - ' / \\ \n' + ' || || \n' ' ||_____|| \n' - ' \n' + ' \\\\O// \n' + ' /|\\ \n' + ' / \\ \n' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~', // 프레임 3: 보상 ' COMPLETE! \n' - ' \n' - ' \\O/ \$\$\$ \n' - ' /|\\ \$\$\$ \n' - ' / \\ \$\$\$ \n' ' \n' ' \n' + ' \$\$\$ \n' + ' \\O/ \$\$\$ \n' + ' /|\\ \$\$\$ \n' + ' / \\ \n' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~', // 프레임 4: 축하 ' * * * * * \n' - ' \\O/ \n' - ' /|\\ +EXP \n' - ' / \\ +GOLD \n' + ' \n' + ' \n' ' * * * * * \n' - ' \n' - ' \n' + ' \\O/ +EXP \n' + ' /|\\ +GOLD \n' + ' / \\ \n' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~', // 프레임 5: 마무리 ' [ VICTORY! ] \n' + ' \n' + ' \n' ' \n' ' \\O/ \n' ' /|\\ \n' ' / \\ \n' - ' \n' - ' \n' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~', ], frameIntervalMs: 350, ); /// Act 완료 애니메이션 (8줄 x 40자 고정) +/// 캐릭터 위치: 머리=4, 몸통=5, 다리=6 (전투 애니메이션 기준) const actCompleteAnimation = AsciiAnimationData( frames: [ // 프레임 1: 커튼 ' ______________________________ \n' - ' | | \n' ' | A C T | \n' - ' | | \n' ' | C O M P L E T E | \n' - ' | | \n' ' |______________________________| \n' + ' \n' + ' \n' + ' \n' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~', // 프레임 2: 캐릭터 등장 ' ______________________________ \n' ' | * * * * * | \n' - ' | \\O/ | \n' - ' | /|\\ | \n' - ' | / \\ | \n' ' | * * * * * | \n' ' |______________________________| \n' + ' \\O/ \n' + ' /|\\ \n' + ' / \\ \n' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~', // 프레임 3: 플롯 진행 표시 ' ______________________________ \n' ' | PROLOGUE --> ACT | \n' - ' | \\O/ | \n' - ' | /|\\ --> | \n' - ' | / \\ | \n' - ' | STORY CONTINUES | \n' + ' | STORY CONTINUES --> | \n' ' |______________________________| \n' + ' \\O/ \n' + ' /|\\ \n' + ' / \\ \n' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~', // 프레임 4: 축하 ' ______________________________ \n' ' | * * * * * | \n' - ' | * \\O/ * | \n' - ' | /|\\ | \n' - ' | * / \\ * | \n' ' | * * * * * | \n' ' |______________________________| \n' + ' * \\O/ * \n' + ' /|\\ \n' + ' * / \\ * \n' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~', // 프레임 5: 마무리 ' ______________________________ \n' ' | +---------+ | \n' ' | | NEXT | | \n' - ' | | CHAPTER | | \n' - ' | +---------+ | \n' - ' | \\O/ | \n' - ' |______________________________| \n' + ' |____| CHAPTER |_______________| \n' + ' \\O/ \n' + ' /|\\ \n' + ' / \\ \n' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~', ], frameIntervalMs: 400,