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,