import 'package:asciineverdie/src/core/animation/weapon_category.dart'; /// 무기 카테고리별 공격 이펙트 ASCII 프레임 /// /// 각 이펙트는 멀티라인 (최대 5줄, 24자 폭). /// 캐릭터와 몬스터 사이에 표시됨. class WeaponEffect { const WeaponEffect({ required this.prepareFrames, required this.attackFrames, required this.hitFrames, this.hitSound = '*HIT!*', this.effectHeight = 3, this.effectYStart = 2, }); /// 준비 프레임 (멀티라인) final List> prepareFrames; /// 공격 프레임 (멀티라인) final List> attackFrames; /// 히트 프레임 (멀티라인) final List> hitFrames; /// 히트 효과음 텍스트 final String hitSound; /// 이펙트 높이 (줄 수) final int effectHeight; /// 이펙트 시작 Y 위치 (0~7) final int effectYStart; } /// 카테고리별 무기 이펙트 반환 WeaponEffect getWeaponEffect(WeaponCategory category) { return switch (category) { WeaponCategory.blunt => _bluntEffect, WeaponCategory.cable => _cableEffect, WeaponCategory.projectile => _projectileEffect, WeaponCategory.energy => _energyEffect, WeaponCategory.cosmic => _cosmicEffect, WeaponCategory.unarmed => _unarmedEffect, }; } // ============================================================================ // 둔기류 - 휘두르기 (5줄) // ============================================================================ const _bluntEffect = WeaponEffect( prepareFrames: [ [r' ', r' _ ', r' / ', r' / ', r' / '], [r' ', r' _/ ', r' / ', r' / ', r' / '], ], attackFrames: [ [r' ', r' _/ ', r' / ', r' / ', r' / '], [r' ', r' _/ ', r' / ', r' /________', r'/ '], [r' ', r' _/ ', r' /________', r'/ ', r' '], [r' ', r' _/____=> ', r'/ ', r' ', r' '], ], hitFrames: [ [r' *BASH* ', r' _/____=> ', r'/ ** ', r' ** ', r' '], [r' *SMASH!* ', r' _/____ ', r' / ** ', r' ** ', r' '], ], hitSound: '*BASH*', effectHeight: 5, effectYStart: 1, ); // ============================================================================ // 케이블류 - 채찍질 (5줄) // ============================================================================ const _cableEffect = WeaponEffect( prepareFrames: [ [r' ', r'~ ', r' ~ ', r' ~ ', r' ~ '], [r' ', r'~~ ', r' ~~ ', r' ~ ', r' ~ '], ], attackFrames: [ [r' ', r'~~~ ', r' ~~~ ', r' ~~ ', r' ~ '], [r' ', r'~~~~ ', r' ~~~~ ', r' ~~', r' '], [r' ', r'~~~~~> ', r' ~~~~~', r' ', r' '], [r' ', r'~~~~~~> ', r' ~~~~', r' ', r' '], ], hitFrames: [ [r' *WHIP* ', r'~~~~~~> ', r' ~~~~', r' **', r' '], [r' *CRACK!* ', r'~~~~~> ', r' ~~~~~', r' **', r' '], ], hitSound: '*WHIP*', effectHeight: 5, effectYStart: 1, ); // ============================================================================ // 투척류 - 발사 (5줄) // ============================================================================ const _projectileEffect = WeaponEffect( prepareFrames: [ [r' ', r' ', r' [=] ', r' ', r' '], [r' ', r' _ ', r' [==] ', r' - ', r' '], ], attackFrames: [ [r' ', r' . ', r' [> ', r" ' ", r' '], [r' ', r' . ', r' [> ', r" ' ", r' '], [r' ', r' . ', r' [>', r" ' ", r' '], [ r' ', r' ', r' [>', r' ', r' ', ], ], hitFrames: [ [r' *CLANG!* ', r' ***', r' [>', r' ***', r' '], [r' *CRASH!* ', r' *** ', r' [> ', r' *** ', r' '], ], hitSound: '*CLANG*', effectHeight: 5, effectYStart: 1, ); // ============================================================================ // 에너지류 - 빔 발사 (5줄) // ============================================================================ const _energyEffect = WeaponEffect( prepareFrames: [ [r' ', r' == ', r' <**> ', r' == ', r' '], [r' ==== ', r' ====== ', r' <****> ', r' ====== ', r' ==== '], ], attackFrames: [ [r' ====== ', r' ======== ', r'===<**>===', r' ======== ', r' ====== '], [r' ======== ', r'==========', r'===<**>===', r'==========', r' ======== '], [r'==========', r'==========', r'====<**>==', r'==========', r'=========='], [r'==========', r'==========', r'=====<**>=', r'==========', r'=========='], ], hitFrames: [ [r'===*ZAP*==', r'==========', r'====<**>==', r'==========', r'===*ZAP*=='], [r'==*BZZT!*=', r'==========', r'=====<**>=', r'==========', r'==*BZZT!*='], ], hitSound: '*ZAP*', effectHeight: 5, effectYStart: 1, ); // ============================================================================ // 우주급 - 초월적 공격 (5줄) // ============================================================================ const _cosmicEffect = WeaponEffect( prepareFrames: [ [r' * ', r' @ @ ', r' @ @ ', r' @ @ ', r' * '], [r' * * ', r' @ @ ', r' @ @', r' @ @ ', r' * * '], ], attackFrames: [ [r' * ', r' * * * ', r' * * * *', r' * * * ', r' * '], [r' *** ', r' * * * *', r'* * * * ', r' * * * *', r' *** '], [r' ***** ', r' ******* ', r'*********', r' ******* ', r' ***** '], [r' **VOID**', r'*********', r'*********', r'*********', r' **VOID**'], ], hitFrames: [ [r'*SINGULAR', r'*********', r'***!!!***', r'*********', r'*DESTROY*'], [r'!!!VOID!!', r'*********', r'*********', r'*********', r'!!!VOID!!'], ], hitSound: '***VOID***', effectHeight: 5, effectYStart: 1, ); // ============================================================================ // 맨손 - 기본 펀치 (5줄) // ============================================================================ const _unarmedEffect = WeaponEffect( prepareFrames: [ [r' ', r' ', r' > ', r' ', r' '], [r' ', r' _ ', r' -> ', r' - ', r' '], ], attackFrames: [ [r' ', r' __ ', r' ---> ', r' -- ', r' '], [r' ', r' ___ ', r' -----> ', r' --- ', r' '], [r' ', r' ____', r' ======>', r' ----', r' '], ], hitFrames: [ [r' *POW!* ', r' ****', r' ======>', r' ****', r' '], [r' *PUNCH!* ', r' **** ', r' =====> ', r' **** ', r' '], ], hitSound: '*POW*', effectHeight: 5, effectYStart: 1, );